/*
 * Copyright (C) 2009 eXo Platform SAS.
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.exoplatform.services.jcr.webdav.resource;

import org.exoplatform.common.util.HierarchicalProperty;
import org.exoplatform.services.jcr.webdav.xml.WebDavNamespaceContext;

import java.net.URI;
import java.util.HashSet;
import java.util.Set;

import javax.jcr.AccessDeniedException;
import javax.jcr.PathNotFoundException;
import javax.jcr.RepositoryException;
import javax.jcr.version.Version;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
import javax.xml.namespace.QName;

/**
 * Created by The eXo Platform SARL .<br/>
 * 
 * @author Gennady Azarenkov
 * @version $Id: $
 */

public class VersionHistoryResource extends GenericResource
{

   /**
    * History of versions.
    */
   protected final VersionHistory versionHistory;

   /**
    * Versioned resource.
    */
   protected final VersionedResource versionedResource;

   /**
    * @param identifier resource identifier
    * @param versionHistory history of versions
    * @param versionedResource resource
    * @param namespaceContext namespace context
    * @throws IllegalResourceTypeException {@link IllegalResourceTypeException}
    * @throws RepositoryException {@link}
    */
   public VersionHistoryResource(final URI identifier, VersionHistory versionHistory,
      final VersionedResource versionedResource, final WebDavNamespaceContext namespaceContext)
      throws IllegalResourceTypeException, RepositoryException
   {
      super(VERSION_HISTORY, identifier, namespaceContext);
      this.versionHistory = versionHistory;
      this.versionedResource = versionedResource;
   }

   /**
    * {@inheritDoc}
    */
   public HierarchicalProperty getProperty(QName name) throws PathNotFoundException, AccessDeniedException,
      RepositoryException
   {
      return null;
   }

   /**
    * {@inheritDoc}
    */
   public final boolean isCollection()
   {
      return false;
   }

   /**
    * Returns all versions of a resource.
    * 
    * @return all versions of a resource
    * @throws RepositoryException {@link RepositoryException}
    * @throws IllegalResourceTypeException {@link IllegalResourceTypeException}
    */
   public Set<VersionResource> getVersions() throws RepositoryException, IllegalResourceTypeException
   {
      Set<VersionResource> resources = new HashSet<VersionResource>();
      VersionIterator versions = versionHistory.getAllVersions();
      while (versions.hasNext())
      {
         Version version = versions.nextVersion();
         if ("jcr:rootVersion".equals(version.getName()))
         {

            continue;
         }
         resources
            .add(new VersionResource(versionURI(version.getName()), versionedResource, version, namespaceContext));
      }
      return resources;
   }

   /**
    * Returns the version of resouce by name.
    * 
    * @param name version name
    * @return version of a resource
    * @throws RepositoryException {@link RepositoryException}
    * @throws IllegalResourceTypeException {@link IllegalResourceTypeException}
    */
   public VersionResource getVersion(String name) throws RepositoryException, IllegalResourceTypeException
   {
      return new VersionResource(versionURI(name), versionedResource, versionHistory.getVersion(name), namespaceContext);
   }

   /**
    * Returns URI of the resource version.
    * 
    * @param versionName version name
    * @return URI of the resource version
    */
   protected final URI versionURI(String versionName)
   {
      return URI.create(versionedResource.getIdentifier().toASCIIString() + "?version=" + versionName);
   }

}
