/* * Copyright (C) 2005 Alfresco, Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program 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 General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.alfresco.service.cmr.version; import java.io.Serializable; import java.util.Collection; import java.util.Map; import org.alfresco.service.Auditable; import org.alfresco.service.PublicService; import org.alfresco.service.cmr.repository.AspectMissingException; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.StoreRef; import org.alfresco.service.namespace.QName; /** * Interface for public and internal version operations. * * @author Roy Wetherall */ @PublicService public interface VersionService { /** * The version store protocol label, used in store references */ public static final String VERSION_STORE_PROTOCOL = "versionStore"; /** * Gets the reference to the version store * * @return reference to the version store */ @Auditable public StoreRef getVersionStoreReference(); /** * Creates a new version based on the referenced node. *

* If the node has not previously been versioned then a version history and * initial version will be created. *

* If the node referenced does not or can not have the version aspect * applied to it then an exception will be raised. *

* The version properties are stored as version meta-data against the newly * created version. * * @param nodeRef a node reference * @param versionProperties the version properties that are stored with the newly created * version * @return the created version object * @throws ReservedVersionNameException * thrown if a reserved property name is used int he version properties * provided * @throws AspectMissingException * thrown if the version aspect is missing */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "versionProperties"}) public Version createVersion( NodeRef nodeRef, Map versionProperties) throws ReservedVersionNameException, AspectMissingException; /** * Creates a new version based on the referenced node. *

* If the node has not previously been versioned then a version history and * initial version will be created. *

* If the node referenced does not or can not have the version aspect * applied to it then an exception will be raised. *

* The version properties are stored as version meta-data against the newly * created version. * * @param nodeRef a node reference * @param versionProperties the version properties that are stored with the newly created * version * @param versionChildren if true then the children of the referenced node are also * versioned, false otherwise * @return the created version object(s) * @throws ReservedVersionNameException * thrown if a reserved property name is used int he version properties * provided * @throws AspectMissingException * thrown if the version aspect is missing */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "versionProperties", "versionChildren"}) public Collection createVersion( NodeRef nodeRef, Map versionProperties, boolean versionChildren) throws ReservedVersionNameException, AspectMissingException; /** * Creates new versions based on the list of node references provided. * * @param nodeRefs a list of node references * @param versionProperties version property values * @return a collection of newly created versions * @throws ReservedVersionNameException * thrown if a reserved property name is used int he version properties * provided * @throws AspectMissingException * thrown if the version aspect is missing */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "versionProperties"}) public Collection createVersion( Collection nodeRefs, Map versionProperties) throws ReservedVersionNameException, AspectMissingException; /** * Gets the version history information for a node. *

* If the node has not been versioned then null is returned. *

* If the node referenced does not or can not have the version aspect * applied to it then an exception will be raised. * * @param nodeRef a node reference * @return the version history information * @throws AspectMissingException * thrown if the version aspect is missing */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"}) public VersionHistory getVersionHistory(NodeRef nodeRef) throws AspectMissingException; /** * Gets the version object for the current version of the node reference * passed. *

* Returns null if the node is not versionable or has not been versioned. * @param nodeRef the node reference * @return the version object for the current version */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"}) public Version getCurrentVersion(NodeRef nodeRef); /** * The node reference will be reverted to the current version. *

* A deep revert will be performed. * * @see VersionService#revert(NodeRef, Version, boolean) * * @param nodeRef the node reference */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"}) public void revert(NodeRef nodeRef); /** * The node reference will be reverted to the current version. * * @see VersionService#revert(NodeRef, Version, boolean) * * @param nodeRef the node reference * @param deep true if a deep revert is to be performed, flase otherwise */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "deep"}) public void revert(NodeRef nodeRef, boolean deep); /** * A deep revert will take place by default. * * @see VersionService#revert(NodeRef, Version, boolean) * * @param nodeRef the node reference * @param version the version to revert to */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "version"}) public void revert(NodeRef nodeRef, Version version); /** * Revert the state of the node to the specified version. *

* Any changes made to the node will be lost and the state of the node will reflect * that of the version specified. *

* The version label property on the node reference will remain unchanged. *

* If the node is further versioned then the new version will be created at the head of * the version history graph. A branch will not be created. *

* If a deep revert is to be performed then any child nodes that are no longer present will * be deep restored (if appropriate) otherwise child associations to deleted, versioned nodes * will not be restored. * * @param nodeRef the node reference * @param version the version to revert to * @param deep true is a deep revert is to be performed, false otherwise. */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "version", "deep"}) public void revert(NodeRef nodeRef, Version version, boolean deep); /** * By default a deep restore is performed. * * @see org.alfresco.service.cmr.version.VersionService#restore(NodeRef, NodeRef, QName, QName, boolean) * * @param nodeRef the node reference to a node that no longer exists in the store * @param parentNodeRef the new parent of the restored node * @param assocTypeQName the assoc type qname * @param assocQName the assoc qname * @return the newly restored node reference */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "parentNodeRef", "assocTypeQName", "assocQName"}) public NodeRef restore( NodeRef nodeRef, NodeRef parentNodeRef, QName assocTypeQName, QName assocQName); /** * Restores a node not currently present in the store, but that has a version * history. *

* The restored node will be at the head (most resent version). *

* Restoration will fail if there is no version history for the specified node id in * the specified store. *

* If the node already exists in the store then an exception will be raised. *

* Once the node is restored it is reverted to the head version in the appropriate * version history tree. If deep is set to true then this will be a deep revert, false * otherwise. * * @param nodeRef the node reference to a node that no longer exists in * the store * @param parentNodeRef the new parent of the restored node * @param assocTypeQName the assoc type qname * @param assocQName the assoc qname * @param deep true is a deep revert should be performed once the node has been * restored, false otherwise * @return the newly restored node reference */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef", "parentNodeRef", "assocTypeQName", "assocQName", "deep"}) public NodeRef restore( NodeRef nodeRef, NodeRef parentNodeRef, QName assocTypeQName, QName assocQName, boolean deep); /** * Delete the version history associated with a node reference. *

* This operation is permanent, all versions in the version history are * deleted and cannot be retrieved. *

* The current version label for the node reference is reset and any subsequent versions * of the node will result in a new version history being created. * * @param nodeRef the node reference * @throws AspectMissingException thrown if the version aspect is missing */ @Auditable(key = Auditable.Key.ARG_0, parameters = {"nodeRef"}) public void deleteVersionHistory(NodeRef nodeRef) throws AspectMissingException; }