blob: 5e028783993e4cb2494e37f66ea6fa632432b05c [file] [log] [blame]
/*
* Copyright 2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jackrabbit.webdav.jcr.version;
import org.apache.log4j.Logger;
import org.apache.jackrabbit.webdav.property.HrefProperty;
import org.apache.jackrabbit.webdav.property.DefaultDavProperty;
import org.apache.jackrabbit.webdav.property.ResourceType;
import org.apache.jackrabbit.webdav.jcr.ItemResourceConstants;
import org.apache.jackrabbit.webdav.jcr.JcrDavException;
import org.apache.jackrabbit.webdav.jcr.DefaultItemCollection;
import org.apache.jackrabbit.webdav.version.VersionHistoryResource;
import org.apache.jackrabbit.webdav.version.VersionResource;
import org.apache.jackrabbit.webdav.DavResourceLocator;
import org.apache.jackrabbit.webdav.DavSession;
import org.apache.jackrabbit.webdav.DavResourceFactory;
import org.apache.jackrabbit.webdav.DavResource;
import org.apache.jackrabbit.webdav.DavException;
import org.apache.jackrabbit.webdav.DavServletResponse;
import javax.jcr.RepositoryException;
import javax.jcr.Item;
import javax.jcr.version.VersionHistory;
import javax.jcr.version.VersionIterator;
import java.util.ArrayList;
/**
* <code>VersionHistoryItemCollection</code> represents a JCR version history.
*
* @see VersionHistory
*/
public class VersionHistoryItemCollection extends DefaultItemCollection
implements VersionHistoryResource {
private static Logger log = Logger.getLogger(VersionHistoryItemCollection.class);
/**
* Create a new <code>VersionHistoryItemCollection</code> resource.
*
* @param resourcePath
* @param session
* @param factory
*/
public VersionHistoryItemCollection(DavResourceLocator resourcePath,
DavSession session, DavResourceFactory factory,
Item item) {
super(resourcePath, session, factory, item);
if (item == null || !(item instanceof VersionHistory)) {
throw new IllegalArgumentException("VersionHistory item expected.");
}
}
//----------------------------------------------< DavResource interface >---
/**
* @see org.apache.jackrabbit.webdav.DavResource#getSupportedMethods()
*/
public String getSupportedMethods() {
StringBuffer sb = new StringBuffer(ItemResourceConstants.METHODS);
sb.append(", ").append(VersionHistoryResource.METHODS);
return sb.toString();
}
/**
* Removing a version resource is achieved by calling <code>removeVersion</code>
* on the versionhistory item this version belongs to.
*
* @throws DavException if the version does not exist or if an error occurs
* while deleting.
* @see DavResource#removeMember(org.apache.jackrabbit.webdav.DavResource)
*/
public void removeMember(DavResource member) throws DavException {
if (exists()) {
VersionHistory versionHistory = (VersionHistory) item;
try {
versionHistory.removeVersion(getItemName(member.getLocator().getJcrPath()));
} catch (RepositoryException e) {
throw new JcrDavException(e);
}
} else {
throw new DavException(DavServletResponse.SC_NOT_FOUND);
}
}
//-----------------------------------< VersionHistoryResource interface >---
/**
* Return an array of {@link VersionResource}s representing all versions
* present in the underlying JCR version history.
*
* @return array of {@link VersionResource}s representing all versions
* present in the underlying JCR version history.
* @throws DavException
* @see org.apache.jackrabbit.webdav.version.VersionHistoryResource#getVersions()
*/
public VersionResource[] getVersions() throws DavException {
try {
VersionIterator vIter = ((VersionHistory)item).getAllVersions();
ArrayList l = new ArrayList();
while (vIter.hasNext()) {
DavResourceLocator versionLoc = getLocatorFromItem(vIter.nextVersion());
DavResource vr = createResourceFromLocator(versionLoc);
l.add(vr);
}
return (VersionResource[]) l.toArray(new VersionResource[l.size()]);
} catch (RepositoryException e) {
throw new JcrDavException(e);
}
}
//--------------------------------------------------------------------------
/**
* Fill the property set for this resource.
*/
protected void initProperties() {
super.initProperties();
// change resourcetype defined by default item collection
properties.add(new ResourceType(ResourceType.VERSION_HISTORY));
// jcr specific property pointing to the node this history belongs to
try {
properties.add(new DefaultDavProperty(JCR_VERSIONABLEUUID, ((VersionHistory)item).getVersionableUUID()));
} catch (RepositoryException e) {
log.error(e.getMessage());
}
// required root-version property for version-history resource
try {
String rootVersionHref = getLocatorFromItem(((VersionHistory)item).getRootVersion()).getHref(true);
properties.add(new HrefProperty(VersionHistoryResource.ROOT_VERSION, rootVersionHref, true));
} catch (RepositoryException e) {
log.error(e.getMessage());
}
// required, protected version-set property for version-history resource
try {
VersionIterator vIter = ((VersionHistory)item).getAllVersions();
addHrefProperty(VersionHistoryResource.VERSION_SET, vIter, true);
} catch (RepositoryException e) {
log.error(e.getMessage());
}
}
}