You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2009/09/08 18:09:45 UTC
svn commit: r812570 [22/24] - in /jackrabbit/sandbox/JCR-1456: ./
jackrabbit-api/ jackrabbit-api/src/main/appended-resources/
jackrabbit-api/src/main/appended-resources/META-INF/
jackrabbit-api/src/main/java/org/apache/jackrabbit/api/security/ jackrabb...
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractRepositoryService.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractRepositoryService.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractRepositoryService.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/AbstractRepositoryService.java Tue Sep 8 16:09:28 2009
@@ -16,18 +16,69 @@
*/
package org.apache.jackrabbit.spi.commons;
+import java.io.InputStream;
+import java.io.Reader;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.AccessDeniedException;
+import javax.jcr.Credentials;
+import javax.jcr.InvalidItemStateException;
+import javax.jcr.ItemExistsException;
+import javax.jcr.ItemNotFoundException;
+import javax.jcr.LoginException;
+import javax.jcr.MergeException;
+import javax.jcr.NamespaceException;
+import javax.jcr.NoSuchWorkspaceException;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.PropertyType;
+import javax.jcr.ReferentialIntegrityException;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.SimpleCredentials;
+import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.ValueFormatException;
+import javax.jcr.lock.LockException;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.nodetype.InvalidNodeTypeDefinitionException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+import javax.jcr.nodetype.NodeTypeExistsException;
+import javax.jcr.query.InvalidQueryException;
+import javax.jcr.version.VersionException;
+
+import org.apache.jackrabbit.spi.Batch;
+import org.apache.jackrabbit.spi.EventBundle;
+import org.apache.jackrabbit.spi.EventFilter;
import org.apache.jackrabbit.spi.IdFactory;
+import org.apache.jackrabbit.spi.ItemId;
+import org.apache.jackrabbit.spi.LockInfo;
+import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.NameFactory;
+import org.apache.jackrabbit.spi.NodeId;
+import org.apache.jackrabbit.spi.Path;
import org.apache.jackrabbit.spi.PathFactory;
+import org.apache.jackrabbit.spi.PropertyId;
+import org.apache.jackrabbit.spi.QNodeDefinition;
+import org.apache.jackrabbit.spi.QNodeTypeDefinition;
+import org.apache.jackrabbit.spi.QPropertyDefinition;
+import org.apache.jackrabbit.spi.QValue;
import org.apache.jackrabbit.spi.QValueFactory;
+import org.apache.jackrabbit.spi.QueryInfo;
import org.apache.jackrabbit.spi.RepositoryService;
+import org.apache.jackrabbit.spi.SessionInfo;
+import org.apache.jackrabbit.spi.Subscription;
import org.apache.jackrabbit.spi.commons.identifier.IdFactoryImpl;
import org.apache.jackrabbit.spi.commons.name.NameFactoryImpl;
import org.apache.jackrabbit.spi.commons.name.PathFactoryImpl;
+import org.apache.jackrabbit.spi.commons.namespace.NamespaceMapping;
+import org.apache.jackrabbit.spi.commons.nodetype.NodeTypeStorage;
+import org.apache.jackrabbit.spi.commons.nodetype.NodeTypeStorageImpl;
+import org.apache.jackrabbit.spi.commons.nodetype.compact.CompactNodeTypeDefReader;
+import org.apache.jackrabbit.spi.commons.nodetype.compact.ParseException;
import org.apache.jackrabbit.spi.commons.value.QValueFactoryImpl;
-import javax.jcr.RepositoryException;
-
/**
* <code>AbstractRepositoryService</code> provides an abstract base class for
* repository service implementations. This class provides default
@@ -42,6 +93,26 @@
public abstract class AbstractRepositoryService implements RepositoryService {
/**
+ * The repository descriptors.
+ */
+ protected final Map<String, QValue[]> descriptors = new HashMap<String, QValue[]>();
+
+ /**
+ * The fixed set of namespaces known to the repository service.
+ */
+ protected final NamespaceMapping namespaces = new NamespaceMapping();
+
+ /**
+ * The fixed set of node type definitions known to the repository service.
+ */
+ protected final NodeTypeStorage nodeTypeDefs = new NodeTypeStorageImpl();
+
+ /**
+ * The node definition of the root node.
+ */
+ protected QNodeDefinition rootNodeDefinition;
+
+ /**
* @return {@link IdFactoryImpl#getInstance()}.
* @throws RepositoryException if an error occurs.
*/
@@ -72,4 +143,726 @@
public QValueFactory getQValueFactory() throws RepositoryException {
return QValueFactoryImpl.getInstance();
}
+
+ protected AbstractRepositoryService() throws RepositoryException {
+ QValueFactory qvf = QValueFactoryImpl.getInstance();
+ QValue[] vFalse = new QValue[] {qvf.create(false)};
+
+ descriptors.put(Repository.WRITE_SUPPORTED, vFalse);
+ descriptors.put(Repository.IDENTIFIER_STABILITY,
+ new QValue[] {qvf.create(Repository.IDENTIFIER_STABILITY_SAVE_DURATION, PropertyType.STRING)});
+ descriptors.put(Repository.OPTION_XML_IMPORT_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_XML_EXPORT_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_UNFILED_CONTENT_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_VERSIONING_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_SIMPLE_VERSIONING_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_ACCESS_CONTROL_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_LOCKING_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_OBSERVATION_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_JOURNALED_OBSERVATION_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_RETENTION_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_LIFECYCLE_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_TRANSACTIONS_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_WORKSPACE_MANAGEMENT_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_UPDATE_PRIMARY_NODE_TYPE_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_UPDATE_MIXIN_NODE_TYPES_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_SHAREABLE_NODES_SUPPORTED, vFalse);
+ descriptors.put(Repository.OPTION_NODE_TYPE_MANAGEMENT_SUPPORTED, vFalse);
+
+ descriptors.put(Repository.QUERY_LANGUAGES, new QValue[0]);
+ descriptors.put(Repository.QUERY_STORED_QUERIES_SUPPORTED, vFalse);
+ descriptors.put(Repository.QUERY_FULL_TEXT_SEARCH_SUPPORTED, vFalse);
+ descriptors.put(Repository.QUERY_JOINS,
+ new QValue[] {qvf.create(Repository.QUERY_JOINS_NONE, PropertyType.STRING)});
+
+ descriptors.putAll(descriptors);
+ }
+
+ public AbstractRepositoryService(Map<String, QValue[]> descriptors,
+ Map<String, String> namespaces,
+ QNodeTypeDefinition[] nodeTypeDefs)
+ throws RepositoryException {
+
+ this();
+ this.descriptors.putAll(descriptors);
+
+ for (Map.Entry<String, String> entry : namespaces.entrySet()) {
+ this.namespaces.setMapping(entry.getKey(), entry.getValue());
+ }
+
+ this.nodeTypeDefs.registerNodeTypes(nodeTypeDefs, true);
+ }
+
+ public AbstractRepositoryService(Map<String, QValue[]> descriptors,
+ Map<String, String> namespaces,
+ Reader cnd)
+ throws RepositoryException {
+
+ this();
+ this.descriptors.putAll(descriptors);
+
+ for (Map.Entry<String, String> entry : namespaces.entrySet()) {
+ this.namespaces.setMapping(entry.getKey(), entry.getValue());
+ }
+
+ CompactNodeTypeDefReader reader;
+ try {
+ reader = new CompactNodeTypeDefReader(cnd, "", this.namespaces);
+ List<QNodeTypeDefinition> ntds = reader.getNodeTypeDefinitions();
+ nodeTypeDefs.registerNodeTypes(ntds.toArray(new QNodeTypeDefinition[ntds.size()]), true);
+ }
+ catch (ParseException e) {
+ throw new RepositoryException("Error reading node type definitions", e);
+ }
+ }
+
+ //---------------------------< subclass responsibility >--------------------
+
+ /**
+ * Create the root node definition.
+ *
+ * @return the root node definition for a workspace.
+ * @throws RepositoryException if an error occurs.
+ */
+ protected abstract QNodeDefinition createRootNodeDefinition() throws RepositoryException;
+
+ //---------------------< may be overwritten by subclasses>------------------
+
+ /**
+ * Checks if the given <code>credentials</code> are valid. This default
+ * implementation is empty thus allowing all credentials.
+ *
+ * @param credentials the credentials to check.
+ * @param workspaceName the workspace to access.
+ * @throws LoginException if the credentials are invalid.
+ */
+ protected void checkCredentials(Credentials credentials, String workspaceName) throws LoginException {
+ // empty
+ }
+
+ /**
+ * Checks if the given workspace is available. The default implementation is empty
+ * thus admitting every workspace name.
+ * @param workspaceName Name of the workspace to check
+ * @throws NoSuchWorkspaceException If <code>workspaceName</code> is not available.
+ */
+ protected void checkWorkspace(String workspaceName) throws NoSuchWorkspaceException {
+ // empty
+ }
+
+ /**
+ * Creates a session info instance for the given <code>credentials</code> and
+ * <code>workspaceName</code>. This default implementation creates a
+ * {@link SessionInfoImpl} instance and sets the <code>userId</code> and
+ * workspaceName. The user <code>userId</code> is <code>null</code> or the
+ * <code>userId</code> from <code>credentials</code> if it is of type
+ * {@link SimpleCredentials}.
+ *
+ * @param credentials the credentials.
+ * @param workspaceName the name of the workspace to access or <code>null</code>
+ * for the default workspace.
+ * @return a session info instance for the given <code>credentials</code> and
+ * <code>workspaceName</code>.
+ * @throws RepositoryException
+ */
+ protected SessionInfo createSessionInfo(Credentials credentials, String workspaceName)
+ throws RepositoryException {
+
+ String userId = null;
+ if (credentials instanceof SimpleCredentials) {
+ userId = ((SimpleCredentials) credentials).getUserID();
+ }
+
+ SessionInfoImpl s = new SessionInfoImpl();
+ s.setUserID(userId);
+ s.setWorkspacename(workspaceName);
+ return s;
+ }
+
+ /**
+ * Creates a session info instance for the given <code>sessionInfo</code> and
+ * <code>workspaceName</code>. This default implementation creates a
+ * {@link SessionInfoImpl} instance and sets the <code>userId</code> and
+ * workspaceName. The user <code>userId</code> is set to the return value of
+ * {@link SessionInfo#getUserID()}.
+ *
+ * @param sessionInfo the sessionInfo.
+ * @param workspaceName the name of the workspace to access.
+ * @return a session info instance for the given <code>credentials</code> and
+ * <code>workspaceName</code>.
+ * @throws RepositoryException
+ */
+ protected SessionInfo createSessionInfo(SessionInfo sessionInfo, String workspaceName)
+ throws RepositoryException {
+
+ String userId = sessionInfo.getUserID();
+
+ SessionInfoImpl s = new SessionInfoImpl();
+ s.setUserID(userId);
+ s.setWorkspacename(workspaceName);
+ return s;
+ }
+
+ /**
+ * Checks the type of the <code>sessionInfo</code> instance. This default
+ * implementation checks if <code>sessionInfo</code> is of type
+ * {@link SessionInfoImpl}, otherwise throws a {@link RepositoryException}.
+ *
+ * @param sessionInfo the session info to check.
+ * @throws RepositoryException if the given <code>sessionInfo</code> is not
+ * of the required type for this repository
+ * service implementation.
+ */
+ protected void checkSessionInfo(SessionInfo sessionInfo)
+ throws RepositoryException {
+ if (sessionInfo instanceof SessionInfoImpl) {
+ return;
+ }
+ throw new RepositoryException("SessionInfo not of type "
+ + SessionInfoImpl.class.getName());
+ }
+
+ //--------------------------< descriptors >---------------------------------
+
+ /**
+ * This default implementation returns the descriptors that were passed
+ * to the constructor of this repository service.
+ */
+ public Map<String, QValue[]> getRepositoryDescriptors() throws RepositoryException {
+ return descriptors;
+ }
+
+ //----------------------------< login >-------------------------------------
+
+ /**
+ * This default implementation does:
+ * <ul>
+ * <li>calls {@link #checkCredentials(Credentials, String)}</li>
+ * <li>calls {@link #checkWorkspace(String)}</li>
+ * <li>calls {@link #createSessionInfo(Credentials, String)}</li>.
+ * </ul>
+ * @param credentials the credentials for the login.
+ * @param workspaceName the name of the workspace to log in.
+ * @return the session info.
+ * @throws LoginException if the credentials are invalid.
+ * @throws NoSuchWorkspaceException if <code>workspaceName</code> is unknown.
+ * @throws RepositoryException if another error occurs.
+ */
+ public SessionInfo obtain(Credentials credentials, String workspaceName)
+ throws LoginException, NoSuchWorkspaceException, RepositoryException {
+ checkCredentials(credentials, workspaceName);
+ checkWorkspace(workspaceName);
+ return createSessionInfo(credentials, workspaceName);
+ }
+
+ /**
+ * This default implementation returns the session info returned by the call
+ * to {@link #createSessionInfo(SessionInfo, String)}.
+ */
+ public SessionInfo obtain(SessionInfo sessionInfo, String workspaceName)
+ throws LoginException, NoSuchWorkspaceException, RepositoryException {
+ return createSessionInfo(sessionInfo, workspaceName);
+ }
+
+
+ /**
+ * This default implementation returns the session info returned by the call
+ * to {@link #obtain(Credentials, String)} with the workspaceName taken from
+ * the passed <code>sessionInfo</code>.
+ */
+ public SessionInfo impersonate(SessionInfo sessionInfo, Credentials credentials)
+ throws LoginException, RepositoryException {
+ return obtain(credentials, sessionInfo.getWorkspaceName());
+ }
+
+ /**
+ * This default implementation does nothing.
+ */
+ public void dispose(SessionInfo sessionInfo) throws RepositoryException {
+ // do nothing
+ }
+
+ //-----------------------------< node types >-------------------------------
+
+ /**
+ * This default implementation first calls {@link #checkSessionInfo(SessionInfo)}
+ * with the <code>sessionInfo</code>,
+ */
+ public Iterator<QNodeTypeDefinition> getQNodeTypeDefinitions(SessionInfo sessionInfo) throws
+ RepositoryException {
+
+ checkSessionInfo(sessionInfo);
+ return nodeTypeDefs.getAllDefinitions();
+ }
+
+ /**
+ * This default implementation first calls {@link #checkSessionInfo(SessionInfo)}
+ * with the <code>sessionInfo</code>, then gathers the {@link QNodeTypeDefinition}s
+ * with the given <code>nodetypeNames</code>. If one of the nodetypeNames
+ * is not a valid node type definition then a {@link RepositoryException}
+ * is thrown.
+ */
+ public Iterator<QNodeTypeDefinition> getQNodeTypeDefinitions(SessionInfo sessionInfo, Name[] nodetypeNames)
+ throws RepositoryException {
+
+ checkSessionInfo(sessionInfo);
+ return nodeTypeDefs.getDefinitions(nodetypeNames);
+ }
+
+ /**
+ * This default implementation first calls {@link #checkSessionInfo(SessionInfo)}
+ * with the <code>sessionInfo</code>, then lazily initializes {@link #rootNodeDefinition}
+ * if <code>nodeId</code> denotes the root node; otherwise throws a
+ * {@link UnsupportedRepositoryOperationException}.
+ */
+ public QNodeDefinition getNodeDefinition(SessionInfo sessionInfo,
+ NodeId nodeId)
+ throws RepositoryException {
+ checkSessionInfo(sessionInfo);
+ if (nodeId.getUniqueID() == null && nodeId.getPath().denotesRoot()) {
+ synchronized (this) {
+ if (rootNodeDefinition == null) {
+ rootNodeDefinition = createRootNodeDefinition();
+ }
+ return rootNodeDefinition;
+ }
+ }
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public QPropertyDefinition getPropertyDefinition(SessionInfo sessionInfo,
+ PropertyId propertyId)
+ throws RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void registerNodeTypes(SessionInfo sessionInfo, QNodeTypeDefinition[] nodeTypeDefinitions, boolean allowUpdate) throws InvalidNodeTypeDefinitionException, NodeTypeExistsException, UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void unregisterNodeTypes(SessionInfo sessionInfo, Name[] nodeTypeNames) throws UnsupportedRepositoryOperationException, NoSuchNodeTypeException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ //-----------------------------< namespaces >-------------------------------
+
+ /**
+ * This default implementation first calls {@link #checkSessionInfo(SessionInfo)}
+ * with the <code>sessionInfo</code>, then returns the prefix to namespace
+ * URL mapping that was provided in the constructor of this repository
+ * service.
+ */
+ public Map<String, String> getRegisteredNamespaces(SessionInfo sessionInfo) throws
+ RepositoryException {
+ checkSessionInfo(sessionInfo);
+ return namespaces.getPrefixToURIMapping();
+ }
+
+ /**
+ * This default implementation first calls {@link #checkSessionInfo(SessionInfo)}
+ * with the <code>sessionInfo</code>, then returns the namepsace URI for the
+ * given <code>prefix</code>.
+ */
+ public String getNamespaceURI(SessionInfo sessionInfo, String prefix)
+ throws NamespaceException, RepositoryException {
+ checkSessionInfo(sessionInfo);
+ return namespaces.getURI(prefix);
+ }
+
+ /**
+ * This default implementation first calls {@link #checkSessionInfo(SessionInfo)}
+ * with the <code>sessionInfo</code>, then return the namespace prefix for
+ * the given <code>uri</code>.
+ */
+ public String getNamespacePrefix(SessionInfo sessionInfo, String uri)
+ throws NamespaceException, RepositoryException {
+ checkSessionInfo(sessionInfo);
+ return namespaces.getPrefix(uri);
+ }
+
+ //-----------------------------< write methods >----------------------------
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public Batch createBatch(SessionInfo sessionInfo, ItemId itemId)
+ throws RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void submit(Batch batch) throws PathNotFoundException, ItemNotFoundException, NoSuchNodeTypeException, ValueFormatException, VersionException, LockException, ConstraintViolationException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void importXml(SessionInfo sessionInfo,
+ NodeId parentId,
+ InputStream xmlStream,
+ int uuidBehaviour) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void move(SessionInfo sessionInfo,
+ NodeId srcNodeId,
+ NodeId destParentNodeId,
+ Name destName) throws ItemExistsException, PathNotFoundException, VersionException, ConstraintViolationException, LockException, AccessDeniedException, UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void copy(SessionInfo sessionInfo,
+ String srcWorkspaceName,
+ NodeId srcNodeId,
+ NodeId destParentNodeId,
+ Name destName) throws NoSuchWorkspaceException, ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException, LockException, UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void update(SessionInfo sessionInfo,
+ NodeId nodeId,
+ String srcWorkspaceName)
+ throws NoSuchWorkspaceException, AccessDeniedException, LockException, InvalidItemStateException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void clone(SessionInfo sessionInfo,
+ String srcWorkspaceName,
+ NodeId srcNodeId,
+ NodeId destParentNodeId,
+ Name destName,
+ boolean removeExisting) throws NoSuchWorkspaceException, ConstraintViolationException, VersionException, AccessDeniedException, PathNotFoundException, ItemExistsException, LockException, UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public LockInfo lock(SessionInfo sessionInfo,
+ NodeId nodeId,
+ boolean deep,
+ boolean sessionScoped)
+ throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public LockInfo lock(SessionInfo sessionInfo, NodeId nodeId, boolean deep,
+ boolean sessionScoped, long timeoutHint, String ownerHint)
+ throws UnsupportedRepositoryOperationException, LockException,
+ AccessDeniedException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @return <code>null</code>.
+ */
+ public LockInfo getLockInfo(SessionInfo sessionInfo, NodeId nodeId)
+ throws AccessDeniedException, RepositoryException {
+ return null;
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void refreshLock(SessionInfo sessionInfo, NodeId nodeId)
+ throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void unlock(SessionInfo sessionInfo, NodeId nodeId)
+ throws UnsupportedRepositoryOperationException, LockException, AccessDeniedException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public NodeId checkin(SessionInfo sessionInfo, NodeId nodeId)
+ throws VersionException, UnsupportedRepositoryOperationException, InvalidItemStateException, LockException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void checkout(SessionInfo sessionInfo, NodeId nodeId)
+ throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void checkout(SessionInfo sessionInfo, NodeId nodeId, NodeId activityId)
+ throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public NodeId checkpoint(SessionInfo sessionInfo, NodeId nodeId)
+ throws UnsupportedRepositoryOperationException, LockException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void removeVersion(SessionInfo sessionInfo,
+ NodeId versionHistoryId,
+ NodeId versionId)
+ throws ReferentialIntegrityException, AccessDeniedException, UnsupportedRepositoryOperationException, VersionException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void restore(SessionInfo sessionInfo,
+ NodeId nodeId,
+ NodeId versionId,
+ boolean removeExisting) throws VersionException, PathNotFoundException, ItemExistsException, UnsupportedRepositoryOperationException, LockException, InvalidItemStateException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void restore(SessionInfo sessionInfo,
+ NodeId[] versionIds,
+ boolean removeExisting) throws ItemExistsException, UnsupportedRepositoryOperationException, VersionException, LockException, InvalidItemStateException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException
+ * always.
+ */
+ public Iterator<NodeId> merge(SessionInfo sessionInfo,
+ NodeId nodeId,
+ String srcWorkspaceName,
+ boolean bestEffort) throws
+ NoSuchWorkspaceException, AccessDeniedException, MergeException,
+ LockException, InvalidItemStateException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException
+ * always.
+ */
+ public Iterator<NodeId> merge(SessionInfo sessionInfo,
+ NodeId nodeId,
+ String srcWorkspaceName,
+ boolean bestEffort,
+ boolean isShallow) throws
+ NoSuchWorkspaceException, AccessDeniedException, MergeException,
+ LockException, InvalidItemStateException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void resolveMergeConflict(SessionInfo sessionInfo,
+ NodeId nodeId,
+ NodeId[] mergeFailedIds,
+ NodeId[] predecessorIds)
+ throws VersionException, InvalidItemStateException, UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void addVersionLabel(SessionInfo sessionInfo,
+ NodeId versionHistoryId,
+ NodeId versionId,
+ Name label,
+ boolean moveLabel) throws VersionException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void removeVersionLabel(SessionInfo sessionInfo,
+ NodeId versionHistoryId,
+ NodeId versionId,
+ Name label) throws VersionException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public NodeId createActivity(SessionInfo sessionInfo, String title) throws UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void removeActivity(SessionInfo sessionInfo, NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public Iterator<NodeId> mergeActivity(SessionInfo sessionInfo, NodeId activityId) throws UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public NodeId createConfiguration(SessionInfo sessionInfo, NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ //-----------------------------< observation >------------------------------
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public EventFilter createEventFilter(SessionInfo sessionInfo,
+ int eventTypes,
+ Path absPath,
+ boolean isDeep,
+ String[] uuid,
+ Name[] nodeTypeName,
+ boolean noLocal)
+ throws UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public Subscription createSubscription(SessionInfo sessionInfo,
+ EventFilter[] filters)
+ throws UnsupportedRepositoryOperationException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void updateEventFilters(Subscription subscription,
+ EventFilter[] filters)
+ throws RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public EventBundle[] getEvents(Subscription subscription, long timeout)
+ throws RepositoryException, InterruptedException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public EventBundle getEvents(SessionInfo sessionInfo, EventFilter filter,
+ long after) throws
+ RepositoryException, UnsupportedRepositoryOperationException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void dispose(Subscription subscription) throws RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ //-------------------------------------------------< namespace registry >---
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void registerNamespace(SessionInfo sessionInfo,
+ String prefix,
+ String uri) throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void unregisterNamespace(SessionInfo sessionInfo, String uri)
+ throws NamespaceException, UnsupportedRepositoryOperationException, AccessDeniedException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ //-----------------------------------------------< Workspace Management >---
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void createWorkspace(SessionInfo sessionInfo, String name, String srcWorkspaceName) throws AccessDeniedException, UnsupportedRepositoryOperationException, NoSuchWorkspaceException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @throws UnsupportedRepositoryOperationException always.
+ */
+ public void deleteWorkspace(SessionInfo sessionInfo, String name) throws AccessDeniedException, UnsupportedRepositoryOperationException, NoSuchWorkspaceException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ //-------------------------------< query >----------------------------------
+
+ public String[] getSupportedQueryLanguages(SessionInfo sessionInfo) throws RepositoryException {
+ checkSessionInfo(sessionInfo);
+ return new String[0];
+ }
+
+ public String[] checkQueryStatement(SessionInfo sessionInfo, String statement,
+ String language, Map<String, String> namespaces) throws
+ InvalidQueryException, RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ public QueryInfo executeQuery(SessionInfo sessionInfo, String statement,
+ String language, Map<String, String> namespaces, long limit,
+ long offset, Map<String, QValue> values) throws RepositoryException {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
}
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/EventFilterImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/EventFilterImpl.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/EventFilterImpl.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/EventFilterImpl.java Tue Sep 8 16:09:28 2009
@@ -16,18 +16,20 @@
*/
package org.apache.jackrabbit.spi.commons;
-import org.apache.jackrabbit.spi.EventFilter;
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+
import org.apache.jackrabbit.spi.Event;
+import org.apache.jackrabbit.spi.EventFilter;
+import org.apache.jackrabbit.spi.Name;
import org.apache.jackrabbit.spi.NodeId;
import org.apache.jackrabbit.spi.Path;
-import javax.jcr.RepositoryException;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Arrays;
-import java.util.Collections;
-import java.io.Serializable;
-
/**
* <code>EventFilterImpl</code> is the simple bean style implementation of an
* {@link EventFilter}.
@@ -40,9 +42,9 @@
private final Path absPath;
- private final Set uuids;
+ private final Set<String> uuids;
- private final Set nodeTypeNames;
+ private final Set<Name> nodeTypeNames;
private final boolean noLocal;
@@ -61,13 +63,13 @@
Path absPath,
boolean isDeep,
String[] uuids,
- Set nodeTypeNames,
+ Set<Name> nodeTypeNames,
boolean noLocal) {
this.eventTypes = eventTypes;
this.absPath = absPath;
this.isDeep = isDeep;
- this.uuids = uuids != null ? new HashSet(Arrays.asList(uuids)) : null;
- this.nodeTypeNames = nodeTypeNames != null ? new HashSet(nodeTypeNames) : null;
+ this.uuids = uuids != null ? new HashSet<String>(Arrays.asList(uuids)) : null;
+ this.nodeTypeNames = nodeTypeNames != null ? new HashSet<Name>(nodeTypeNames) : null;
this.noLocal = noLocal;
}
@@ -100,7 +102,7 @@
// check node types
if (nodeTypeNames != null) {
- Set eventTypes = new HashSet();
+ Set<Name> eventTypes = new HashSet<Name>();
eventTypes.addAll(Arrays.asList(event.getMixinTypeNames()));
eventTypes.add(event.getPrimaryNodeTypeName());
// create intersection
@@ -154,7 +156,7 @@
if (uuids == null) {
return null;
} else {
- return (String[]) uuids.toArray(new String[uuids.size()]);
+ return uuids.toArray(new String[uuids.size()]);
}
}
@@ -162,7 +164,7 @@
* @return an unmodifiable set of node type names or <code>null</code> if
* this filter does not care about node types.
*/
- public Set getNodeTypeNames() {
+ public Set<Name> getNodeTypeNames() {
if (nodeTypeNames == null) {
return null;
} else {
@@ -181,6 +183,7 @@
* Returns a string representation of this EventFilter instance.
* {@inheritDoc}
*/
+ @Override
public String toString() {
return new StringBuffer(getClass().getName())
.append("[")
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/QNodeTypeDefinitionImpl.java Tue Sep 8 16:09:28 2009
@@ -167,12 +167,31 @@
NamePathResolver resolver,
QValueFactory qValueFactory)
throws RepositoryException {
- this(resolver.getQName(def.getName()),
- getNames(def.getDeclaredSupertypeNames(), resolver), null, def.isMixin(),
- def.isAbstract(), def.isQueryable(), def.hasOrderableChildNodes(),
+ this(resolver.getQName(def.getName()), def, resolver, qValueFactory);
+ }
+
+ /**
+ * Internal constructor to avoid resolving def.getName() 3 times.
+ * @param name name of the definition
+ * @param def node type definition
+ * @param resolver resolver
+ * @param qValueFactory value factory
+ * @throws RepositoryException if an error occurs
+ */
+ private QNodeTypeDefinitionImpl(Name name, NodeTypeDefinition def,
+ NamePathResolver resolver,
+ QValueFactory qValueFactory)
+ throws RepositoryException {
+ this(name,
+ getNames(def.getDeclaredSupertypeNames(), resolver),
+ null,
+ def.isMixin(),
+ def.isAbstract(),
+ def.isQueryable(),
+ def.hasOrderableChildNodes(),
def.getPrimaryItemName() == null ? null : resolver.getQName(def.getPrimaryItemName()),
- createQPropertyDefinitions(def.getDeclaredPropertyDefinitions(), resolver, qValueFactory),
- createQNodeDefinitions(def.getDeclaredChildNodeDefinitions(), resolver));
+ createQPropertyDefinitions(name, def.getDeclaredPropertyDefinitions(), resolver, qValueFactory),
+ createQNodeDefinitions(name, def.getDeclaredChildNodeDefinitions(), resolver));
}
//------------------------------------------------< QNodeTypeDefinition >---
@@ -351,22 +370,37 @@
return names;
}
- private static QPropertyDefinition[] createQPropertyDefinitions(PropertyDefinition[] pds,
+ private static QPropertyDefinition[] createQPropertyDefinitions(Name declName,
+ PropertyDefinition[] pds,
NamePathResolver resolver,
QValueFactory qValueFactory)
throws RepositoryException {
+ if (pds == null || pds.length == 0) {
+ return QPropertyDefinition.EMPTY_ARRAY;
+ }
QPropertyDefinition[] declaredPropDefs = new QPropertyDefinition[pds.length];
for (int i = 0; i < pds.length; i++) {
PropertyDefinition propDef = pds[i];
Name name = propDef.getName().equals(QItemDefinitionImpl.ANY_NAME.getLocalName())
? QItemDefinitionImpl.ANY_NAME
: resolver.getQName(propDef.getName());
- Name declName = resolver.getQName(propDef.getDeclaringNodeType().getName());
- QValue[] defVls = ValueFormat.getQValues(propDef.getDefaultValues(), resolver, qValueFactory);
+ // check if propDef provides declaring node type and if it matches 'this' one.
+ if (propDef.getDeclaringNodeType() != null) {
+ if (!declName.equals(resolver.getQName(propDef.getDeclaringNodeType().getName()))) {
+ throw new RepositoryException("Property definition specified invalid declaring nodetype: "
+ + propDef.getDeclaringNodeType().getName() + ", but should be " + declName);
+ }
+ }
+ QValue[] defVls = propDef.getDefaultValues() == null
+ ? QValue.EMPTY_ARRAY
+ : ValueFormat.getQValues(propDef.getDefaultValues(), resolver, qValueFactory);
String[] jcrConstraints = propDef.getValueConstraints();
- QValueConstraint[] constraints = new QValueConstraint[jcrConstraints.length];
- for (int j=0; j<constraints.length; j++) {
- constraints[j] = ValueConstraint.create(propDef.getRequiredType(), jcrConstraints[j], resolver);
+ QValueConstraint[] constraints = QValueConstraint.EMPTY_ARRAY;
+ if (jcrConstraints != null && jcrConstraints.length > 0) {
+ constraints = new QValueConstraint[jcrConstraints.length];
+ for (int j=0; j<constraints.length; j++) {
+ constraints[j] = ValueConstraint.create(propDef.getRequiredType(), jcrConstraints[j], resolver);
+ }
}
declaredPropDefs[i] = new QPropertyDefinitionImpl(
name, declName,
@@ -385,14 +419,26 @@
return declaredPropDefs;
}
- private static QNodeDefinition[] createQNodeDefinitions(NodeDefinition[] nds, NamePathResolver resolver) throws RepositoryException {
+ private static QNodeDefinition[] createQNodeDefinitions(Name declName,
+ NodeDefinition[] nds,
+ NamePathResolver resolver)
+ throws RepositoryException {
+ if (nds == null || nds.length == 0) {
+ return QNodeDefinition.EMPTY_ARRAY;
+ }
QNodeDefinition[] declaredNodeDefs = new QNodeDefinition[nds.length];
for (int i = 0; i < nds.length; i++) {
NodeDefinition nodeDef = nds[i];
Name name = nodeDef.getName().equals(QItemDefinitionImpl.ANY_NAME.getLocalName())
? QItemDefinitionImpl.ANY_NAME
: resolver.getQName(nodeDef.getName());
- Name declName = resolver.getQName(nodeDef.getDeclaringNodeType().getName());
+ // check if propDef provides declaring node type and if it matches 'this' one.
+ if (nodeDef.getDeclaringNodeType() != null) {
+ if (!declName.equals(resolver.getQName(nodeDef.getDeclaringNodeType().getName()))) {
+ throw new RepositoryException("Childnode definition specified invalid declaring nodetype: "
+ + nodeDef.getDeclaringNodeType().getName() + ", but should be " + declName);
+ }
+ }
Name defaultPrimaryType = nodeDef.getDefaultPrimaryTypeName() == null
? null
: resolver.getQName(nodeDef.getDefaultPrimaryTypeName());
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/ChangeLogImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/ChangeLogImpl.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/ChangeLogImpl.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/ChangeLogImpl.java Tue Sep 8 16:09:28 2009
@@ -16,9 +16,6 @@
*/
package org.apache.jackrabbit.spi.commons.batch;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
import javax.jcr.RepositoryException;
@@ -35,12 +32,7 @@
* applied} to a batch, all operations in the list are {@link Operation#apply(Batch) applied} to that
* batch.
*/
-public class ChangeLogImpl implements ChangeLog {
-
- /**
- * {@link Operation}s kept in this change log.
- */
- protected final List operations = new LinkedList();
+public class ChangeLogImpl extends AbstractChangeLog<Operation> {
public void addNode(NodeId parentId, Name nodeName, Name nodetypeName, String uuid)
throws RepositoryException {
@@ -88,60 +80,5 @@
addOperation(Operations.setValue(propertyId, values));
}
- public Batch apply(Batch batch) throws RepositoryException {
- if (batch == null) {
- throw new IllegalArgumentException("Batch must not be null");
- }
- for (Iterator it = operations.iterator(); it.hasNext(); ) {
- Operation op = (Operation) it.next();
- op.apply(batch);
- }
- return batch;
- }
-
- /**
- * This method is called when an operation is added to the list of {@link #operations}
- * kept by this change log.
- * @param op {@link Operation} to add
- * @throws RepositoryException
- */
- protected void addOperation(Operation op) throws RepositoryException {
- operations.add(op);
- }
-
- // -----------------------------------------------------< Object >---
-
- public String toString() {
- StringBuffer b = new StringBuffer();
- for (Iterator it = operations.iterator(); it.hasNext(); ) {
- b.append(it.next());
- if (it.hasNext()) {
- b.append(", ");
- }
- }
- return b.toString();
- }
-
- public boolean equals(Object other) {
- if (null == other) {
- return false;
- }
- if (this == other) {
- return true;
- }
- if (other instanceof ChangeLogImpl) {
- return equals((ChangeLogImpl) other);
- }
- return false;
- }
-
- public boolean equals(ChangeLogImpl other) {
- return operations.equals(other.operations);
- }
-
- public int hashCode() {
- throw new IllegalArgumentException("Not hashable");
- }
-
}
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/ConsolidatingChangeLog.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/ConsolidatingChangeLog.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/ConsolidatingChangeLog.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/ConsolidatingChangeLog.java Tue Sep 8 16:09:28 2009
@@ -39,7 +39,7 @@
* {@link CancelableOperation CancelableOperation} implementations document their behavior
* concerning cancellation.
*/
-public class ConsolidatingChangeLog extends ChangeLogImpl {
+public class ConsolidatingChangeLog extends AbstractChangeLog<ConsolidatingChangeLog.CancelableOperation> {
private static final PathFactory PATH_FACTORY = PathFactoryImpl.getInstance();
/**
@@ -136,15 +136,11 @@
* <li>Otherwise add the current operation to the list of operations.</li>
* </ul>
*/
- protected void addOperation(Operation op) throws RepositoryException {
- if (!(op instanceof CancelableOperation)) {
- throw new IllegalArgumentException("Operation not instance of "
- + CancelableOperation.class.getName());
- }
-
- CancelableOperation otherOp = (CancelableOperation) op;
- for (Iterator it = new OperationsBackwardWithSentinel(); it.hasNext(); ) {
- CancelableOperation thisOp = (CancelableOperation) it.next();
+ @Override
+ public void addOperation(CancelableOperation op) throws RepositoryException {
+ CancelableOperation otherOp = op;
+ for (OperationsBackwardWithSentinel it = new OperationsBackwardWithSentinel(); it.hasNext(); ) {
+ CancelableOperation thisOp = it.next();
switch (thisOp.cancel(otherOp)) {
case CancelableOperation.CANCEL_THIS:
it.remove();
@@ -165,8 +161,8 @@
// -----------------------------------------------------< private >---
- private class OperationsBackwardWithSentinel implements Iterator {
- private final ListIterator it = operations.listIterator(operations.size());
+ private class OperationsBackwardWithSentinel implements Iterator<CancelableOperation> {
+ private final ListIterator<CancelableOperation> it = operations.listIterator(operations.size());
private boolean last = !it.hasPrevious();
private boolean done;
@@ -174,13 +170,13 @@
return it.hasPrevious() || last;
}
- public Object next() {
+ public CancelableOperation next() {
if (last) {
done = true;
return CancelableOperations.empty();
}
else {
- Object o = it.previous();
+ CancelableOperation o = it.previous();
last = !it.hasPrevious();
return o;
}
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/Operations.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/Operations.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/Operations.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/batch/Operations.java Tue Sep 8 16:09:28 2009
@@ -56,10 +56,12 @@
*/
public void apply(Batch batch) throws RepositoryException { /* nothing to do */ }
+ @Override
public String toString() {
return "Empty[]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -67,6 +69,7 @@
return other instanceof Empty;
}
+ @Override
public int hashCode() {
return Empty.class.hashCode();
}
@@ -115,10 +118,12 @@
batch.addNode(parentId, nodeName, nodetypeName, uuid);
}
+ @Override
public String toString() {
return "AddNode[" + parentId + ", " + nodeName + ", " + nodetypeName + ", " + uuid + "]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -139,6 +144,7 @@
&& Operations.equals(uuid, other.uuid);
}
+ @Override
public int hashCode() {
return 41 * (
41 * (
@@ -221,10 +227,12 @@
}
}
+ @Override
public String toString() {
return "AddProperty[" + parentId + ", " + propertyName + ", " + values + "]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -245,6 +253,7 @@
&& Arrays.equals(values, other.values);
}
+ @Override
public int hashCode() {
return 41 * (
41 * (
@@ -312,10 +321,12 @@
batch.move(srcNodeId, destParentNodeId, destName);
}
+ @Override
public String toString() {
return "Move[" + srcNodeId + ", " + destParentNodeId + ", " + destName + "]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -335,6 +346,7 @@
&& Operations.equals(destName, other.destName);
}
+ @Override
public int hashCode() {
return 41 * (
41 * (
@@ -383,10 +395,12 @@
batch.remove(itemId);
}
+ @Override
public String toString() {
return "Remove[" + itemId + "]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -404,6 +418,7 @@
return Operations.equals(itemId, other.itemId);
}
+ @Override
public int hashCode() {
return 41 + Operations.hashCode(itemId);
}
@@ -452,10 +467,12 @@
batch.reorderNodes(parentId, srcNodeId, beforeNodeId);
}
+ @Override
public String toString() {
return "ReorderNodes[" + parentId + ", " + srcNodeId + ", " + beforeNodeId + "]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -475,6 +492,7 @@
&& Operations.equals(beforeNodeId, other.beforeNodeId);
}
+ @Override
public int hashCode() {
return 41 * (
41 * (
@@ -526,10 +544,12 @@
batch.setMixins(nodeId, mixinNodeTypeNames);
}
+ @Override
public String toString() {
return "SetMixins[" + nodeId + ", " + mixinNodeTypeNames + "]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -548,6 +568,7 @@
&& Arrays.equals(mixinNodeTypeNames, other.mixinNodeTypeNames);
}
+ @Override
public int hashCode() {
return 41 * (
41 + Operations.hashCode(nodeId))
@@ -596,10 +617,12 @@
batch.setPrimaryType(nodeId, primaryTypeName);
}
+ @Override
public String toString() {
return "SetPrimaryType[" + nodeId + ", " + primaryTypeName + "]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -618,6 +641,7 @@
&& primaryTypeName.equals(other.primaryTypeName);
}
+ @Override
public int hashCode() {
return 41 * (
41 + Operations.hashCode(nodeId))
@@ -689,10 +713,12 @@
}
}
+ @Override
public String toString() {
return "SetValue[" + propertyId + ", " + values + "]";
}
+ @Override
public boolean equals(Object other) {
if (null == other) {
return false;
@@ -712,6 +738,7 @@
&& Arrays.equals(values, other.values);
}
+ @Override
public int hashCode() {
return 41 * (
41 + Operations.hashCode(propertyId))
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/logging/RepositoryServiceLogger.java Tue Sep 8 16:09:28 2009
@@ -109,8 +109,8 @@
}, "getQValueFactory()", new Object[]{});
}
- public Map<String, String> getRepositoryDescriptors() throws RepositoryException {
- return (Map<String, String>) execute(new Callable() {
+ public Map<String, QValue[]> getRepositoryDescriptors() throws RepositoryException {
+ return (Map<String, QValue[]>) execute(new Callable() {
public Object call() throws RepositoryException {
return service.getRepositoryDescriptors();
}
@@ -398,6 +398,17 @@
}, "checkout(SessionInfo, NodeId)", new Object[]{unwrap(sessionInfo), nodeId});
}
+ public void checkout(final SessionInfo sessionInfo, final NodeId nodeId, final NodeId activityId)
+ throws RepositoryException {
+
+ execute(new Callable() {
+ public Object call() throws RepositoryException {
+ service.checkout(unwrap(sessionInfo), nodeId, activityId);
+ return null;
+ }
+ }, "checkout(SessionInfo, NodeId, NodeId)", new Object[]{unwrap(sessionInfo), nodeId, activityId});
+ }
+
public NodeId checkpoint(final SessionInfo sessionInfo, final NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
return (NodeId) execute(new Callable() {
public Object call() throws RepositoryException {
@@ -526,12 +537,12 @@
}, "mergeActivity(SessionInfo, NodeId)", new Object[]{unwrap(sessionInfo), activityId});
}
- public NodeId createConfiguration(final SessionInfo sessionInfo, final NodeId nodeId, final NodeId baselineId) throws UnsupportedRepositoryOperationException, RepositoryException {
+ public NodeId createConfiguration(final SessionInfo sessionInfo, final NodeId nodeId) throws UnsupportedRepositoryOperationException, RepositoryException {
return (NodeId) execute(new Callable() {
public Object call() throws RepositoryException {
- return service.createConfiguration(unwrap(sessionInfo), nodeId, baselineId);
+ return service.createConfiguration(unwrap(sessionInfo), nodeId);
}
- }, "createConfiguration(SessionInfo, NodeId, NodeId)", new Object[]{unwrap(sessionInfo), nodeId, baselineId});
+ }, "createConfiguration(SessionInfo, NodeId, NodeId)", new Object[]{unwrap(sessionInfo), nodeId});
}
public String[] getSupportedQueryLanguages(final SessionInfo sessionInfo) throws RepositoryException {
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NameConstants.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NameConstants.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NameConstants.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/NameConstants.java Tue Sep 8 16:09:28 2009
@@ -283,6 +283,18 @@
*/
public static final Name JCR_ACTIVITY_TITLE = FACTORY.create(Name.NS_JCR_URI, "activityTitle");
+ /**
+ * jcr:configurations
+ * @since 2.0
+ */
+ public static final Name JCR_CONFIGURATIONS = FACTORY.create(Name.NS_JCR_URI, "configurations");
+
+ /**
+ * jcr:configuration
+ * @since 2.0
+ */
+ public static final Name JCR_CONFIGURATION = FACTORY.create(Name.NS_JCR_URI, "configuration");
+
//--------------------------------< node type related item name constants >
@@ -543,6 +555,12 @@
*/
public static final Name NT_ACTIVITY = FACTORY.create(Name.NS_NT_URI, "activity");
+ /**
+ * nt:configuration
+ * @since 2.0
+ */
+ public static final Name NT_CONFIGURATION = FACTORY.create(Name.NS_NT_URI, "configuration");
+
//--------------------------------------------------------------------------
/**
* rep:root
@@ -560,12 +578,22 @@
public static final Name REP_VERSIONSTORAGE = FACTORY.create(Name.NS_REP_URI, "versionStorage");
/**
- * rep:activities
+ * rep:Activities
+ */
+ public static final Name REP_ACTIVITIES = FACTORY.create(Name.NS_REP_URI, "Activities");
+
+ /**
+ * rep:Configurations
+ */
+ public static final Name REP_CONFIGURATIONS = FACTORY.create(Name.NS_REP_URI, "Configurations");
+
+ /**
+ * rep:baseVersions
*/
- public static final Name REP_ACTIVITIES = FACTORY.create(Name.NS_REP_URI, "activities");
+ public static final Name REP_BASEVERSIONS = FACTORY.create(Name.NS_REP_URI, "baseVersions");
/**
- * rep:versionReference
+ * rep:VersionReference
*/
public static final Name REP_VERSION_REFERENCE = FACTORY.create(Name.NS_REP_URI, "VersionReference");
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/PathMap.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/PathMap.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/PathMap.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/name/PathMap.java Tue Sep 8 16:09:28 2009
@@ -21,6 +21,7 @@
import org.apache.jackrabbit.spi.PathFactory;
import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
+import java.util.List;
import java.util.Map;
import java.util.ArrayList;
import java.util.HashMap;
@@ -31,14 +32,15 @@
* Generic path map that associates information with the individual path elements
* of a path.
*/
-public class PathMap {
+public class PathMap<T> {
private static final PathFactory PATH_FACTORY = PathFactoryImpl.getInstance();
/**
* Root element
*/
- private final Element root = new Element(PATH_FACTORY.getRootPath().getNameElement());
+ private final Element<T> root =
+ new Element<T>(PATH_FACTORY.getRootPath().getNameElement());
/**
* Map a path to a child. If <code>exact</code> is <code>false</code>,
@@ -48,12 +50,12 @@
* @return child, maybe <code>null</code> if <code>exact</code> is
* <code>true</code>
*/
- public Element map(Path path, boolean exact) {
+ public Element<T> map(Path path, boolean exact) {
Path.Element[] elements = path.getElements();
- Element current = root;
+ Element<T> current = root;
for (int i = 1; i < elements.length; i++) {
- Element next = current.getChild(elements[i]);
+ Element<T> next = current.getChild(elements[i]);
if (next == null) {
if (exact) {
return null;
@@ -71,8 +73,8 @@
* @param path path to child
* @param obj object to store at destination
*/
- public Element put(Path path, Object obj) {
- Element element = put(path);
+ public Element<T> put(Path path, T obj) {
+ Element<T> element = put(path);
element.obj = obj;
return element;
}
@@ -83,12 +85,12 @@
* @param path path to child
* @param element element to store at destination
*/
- public void put(Path path, Element element) {
+ public void put(Path path, Element<T> element) {
Path.Element[] elements = path.getElements();
- Element current = root;
+ Element<T> current = root;
for (int i = 1; i < elements.length - 1; i++) {
- Element next = current.getChild(elements[i]);
+ Element<T> next = current.getChild(elements[i]);
if (next == null) {
next = current.createChild(elements[i]);
}
@@ -101,12 +103,12 @@
* Create an empty child given by its path.
* @param path path to child
*/
- public Element put(Path path) {
+ public Element<T> put(Path path) {
Path.Element[] elements = path.getElements();
- Element current = root;
+ Element<T> current = root;
for (int i = 1; i < elements.length; i++) {
- Element next = current.getChild(elements[i]);
+ Element<T> next = current.getChild(elements[i]);
if (next == null) {
next = current.createChild(elements[i]);
}
@@ -123,7 +125,7 @@
* or not; otherwise call back on non-empty children
* only
*/
- public void traverse(ElementVisitor visitor, boolean includeEmpty) {
+ public void traverse(ElementVisitor<T> visitor, boolean includeEmpty) {
root.traverse(visitor, includeEmpty);
}
@@ -131,17 +133,17 @@
* Internal class holding the object associated with a certain
* path element.
*/
- public final static class Element {
+ public final static class Element<T> {
/**
* Parent element
*/
- private Element parent;
+ private Element<T> parent;
/**
* Map of immediate children
*/
- private Map children;
+ private Map<Name, List<Element<T>>> children;
/**
* Number of non-empty children
@@ -151,7 +153,7 @@
/**
* Object associated with this element
*/
- private Object obj;
+ private T obj;
/**
* Path.Element suitable for path construction associated with this
@@ -185,8 +187,8 @@
* @param nameIndex position where child is created
* @return child
*/
- private Element createChild(Path.Element nameIndex) {
- Element element = new Element(nameIndex);
+ private Element<T> createChild(Path.Element nameIndex) {
+ Element<T> element = new Element<T>(nameIndex);
put(nameIndex, element);
return element;
}
@@ -214,10 +216,10 @@
// convert 1-based index value to 0-base value
int index = getZeroBasedIndex(nameIndex);
if (children != null) {
- ArrayList list = (ArrayList) children.get(nameIndex.getName());
+ List<Element<T>> list = children.get(nameIndex.getName());
if (list != null && list.size() > index) {
for (int i = index; i < list.size(); i++) {
- Element element = (Element) list.get(i);
+ Element<T> element = list.get(i);
if (element != null) {
element.index = element.getNormalizedIndex() + 1;
element.updatePathElement(element.getName(), element.index);
@@ -234,15 +236,15 @@
* @return element matching <code>nameIndex</code> or <code>null</code> if
* none exists.
*/
- private Element getChild(Path.Element nameIndex) {
+ private Element<T> getChild(Path.Element nameIndex) {
// convert 1-based index value to 0-base value
int index = getZeroBasedIndex(nameIndex);
- Element element = null;
+ Element<T> element = null;
if (children != null) {
- ArrayList list = (ArrayList) children.get(nameIndex.getName());
+ List<Element<T>> list = children.get(nameIndex.getName());
if (list != null && list.size() > index) {
- element = (Element) list.get(index);
+ element = list.get(index);
}
}
return element;
@@ -253,15 +255,15 @@
* @param nameIndex position where child should be located
* @param element element to add
*/
- public void put(Path.Element nameIndex, Element element) {
+ public void put(Path.Element nameIndex, Element<T> element) {
// convert 1-based index value to 0-base value
int index = getZeroBasedIndex(nameIndex);
if (children == null) {
- children = new HashMap();
+ children = new HashMap<Name, List<Element<T>>>();
}
- ArrayList list = (ArrayList) children.get(nameIndex.getName());
+ List<Element<T>> list = children.get(nameIndex.getName());
if (list == null) {
- list = new ArrayList();
+ list = new ArrayList<Element<T>>();
children.put(nameIndex.getName(), list);
}
while (list.size() < index) {
@@ -289,7 +291,7 @@
* @param nameIndex child's path element
* @return removed child, may be <code>null</code>
*/
- public Element remove(Path.Element nameIndex) {
+ public Element<T> remove(Path.Element nameIndex) {
return remove(nameIndex, true, true);
}
@@ -309,7 +311,7 @@
* an element
* @return removed child, may be <code>null</code>
*/
- private Element remove(Path.Element nameIndex, boolean shift,
+ private Element<T> remove(Path.Element nameIndex, boolean shift,
boolean removeIfEmpty) {
// convert 1-based index value to 0-base value
@@ -317,14 +319,14 @@
if (children == null) {
return null;
}
- ArrayList list = (ArrayList) children.get(nameIndex.getName());
+ List<Element<T>> list = children.get(nameIndex.getName());
if (list == null || list.size() <= index) {
return null;
}
- Element element = (Element) list.set(index, null);
+ Element<T> element = list.set(index, null);
if (shift) {
for (int i = index + 1; i < list.size(); i++) {
- Element sibling = (Element) list.get(i);
+ Element<T> sibling = list.get(i);
if (sibling != null) {
sibling.index--;
sibling.updatePathElement(sibling.getName(), sibling.index);
@@ -386,19 +388,14 @@
* <code>Path.PathElement</code> and values
* are of type <code>Element</code>
*/
- public void setChildren(Map children) {
+ public void setChildren(Map<Path.Element, Element<T>> children) {
// Remove all children without removing the element itself
this.children = null;
childrenCount = 0;
// Now add back all items
- Iterator entries = children.entrySet().iterator();
- while (entries.hasNext()) {
- Map.Entry entry = (Map.Entry) entries.next();
-
- Path.Element nameIndex = (Path.Element) entry.getKey();
- Element element = (Element) entry.getValue();
- put(nameIndex, element);
+ for (Map.Entry<Path.Element, Element<T>> entry : children.entrySet()) {
+ put(entry.getKey(), entry.getValue());
}
// Special case: if map was empty, handle like removeAll()
@@ -411,7 +408,7 @@
* Return the object associated with this element
* @return object associated with this element
*/
- public Object get() {
+ public T get() {
return obj;
}
@@ -419,7 +416,7 @@
* Set the object associated with this element
* @param obj object associated with this element
*/
- public void set(Object obj) {
+ public void set(T obj) {
this.obj = obj;
if (obj == null && childrenCount == 0 && parent != null) {
@@ -542,16 +539,13 @@
* element regardless, whether the associated object is empty
* or not; otherwise call back on non-empty children only
*/
- public void traverse(ElementVisitor visitor, boolean includeEmpty) {
+ public void traverse(ElementVisitor<T> visitor, boolean includeEmpty) {
if (includeEmpty || obj != null) {
visitor.elementVisited(this);
}
if (children != null) {
- Iterator iter = children.values().iterator();
- while (iter.hasNext()) {
- ArrayList list = (ArrayList) iter.next();
- for (int i = 0; i < list.size(); i++) {
- Element element = (Element) list.get(i);
+ for (List<Element<T>>list : children.values()) {
+ for (Element<T> element : list) {
if (element != null) {
element.traverse(visitor, includeEmpty);
}
@@ -578,8 +572,8 @@
* child of this node.
* @param other node to check
*/
- public boolean isAncestorOf(Element other) {
- Element parent = other.parent;
+ public boolean isAncestorOf(Element<T> other) {
+ Element<T> parent = other.parent;
while (parent != null) {
if (parent == this) {
return true;
@@ -593,7 +587,7 @@
* Return the parent of this element
* @return parent or <code>null</code> if this is the root element
*/
- public Element getParent() {
+ public Element<T> getParent() {
return parent;
}
@@ -609,15 +603,11 @@
* Return an iterator over all of this element's children. Every
* element returned by this iterator is of type {@link Element}.
*/
- public Iterator getChildren() {
- ArrayList result = new ArrayList();
-
+ public Iterator<Element<T>> getChildren() {
+ ArrayList<Element<T>> result = new ArrayList<Element<T>>();
if (children != null) {
- Iterator iter = children.values().iterator();
- while (iter.hasNext()) {
- ArrayList list = (ArrayList) iter.next();
- for (int i = 0; i < list.size(); i++) {
- Element element = (Element) list.get(i);
+ for (List<Element<T>> list : children.values()) {
+ for (Element<T> element : list) {
if (element != null) {
result.add(element);
}
@@ -637,12 +627,12 @@
* @return descendant, maybe <code>null</code> if <code>exact</code> is
* <code>true</code>
*/
- public Element getDescendant(Path relPath, boolean exact) {
+ public Element<T> getDescendant(Path relPath, boolean exact) {
Path.Element[] elements = relPath.getElements();
- Element current = this;
+ Element<T> current = this;
for (int i = 0; i < elements.length; i++) {
- Element next = current.getChild(elements[i]);
+ Element<T> next = current.getChild(elements[i]);
if (next == null) {
if (exact) {
return null;
@@ -658,12 +648,12 @@
/**
* Element visitor used in {@link PathMap#traverse}
*/
- public interface ElementVisitor {
+ public interface ElementVisitor<T> {
/**
* Invoked for every element visited on a tree traversal
* @param element element visited
*/
- void elementVisited(Element element);
+ void elementVisited(Element<T> element);
}
}
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/AbstractItemDefinitionTemplate.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/AbstractItemDefinitionTemplate.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/AbstractItemDefinitionTemplate.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/AbstractItemDefinitionTemplate.java Tue Sep 8 16:09:28 2009
@@ -16,8 +16,18 @@
*/
package org.apache.jackrabbit.spi.commons.nodetype;
+import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
+import org.apache.jackrabbit.spi.commons.name.NameConstants;
+import org.apache.jackrabbit.spi.Name;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import javax.jcr.nodetype.ItemDefinition;
import javax.jcr.nodetype.NodeType;
+import javax.jcr.nodetype.ConstraintViolationException;
+import javax.jcr.RepositoryException;
+import javax.jcr.NamespaceException;
+import javax.jcr.version.OnParentVersionAction;
/**
* <code>AbstractItemDefinitionTemplate</code> serves as base class for
@@ -26,25 +36,40 @@
*/
abstract class AbstractItemDefinitionTemplate implements ItemDefinition {
- private String name;
+ private static final Logger log = LoggerFactory.getLogger(AbstractItemDefinitionTemplate.class);
+
+ private Name name;
private boolean autoCreated;
private boolean mandatory;
- private int opv;
+ private int opv = OnParentVersionAction.COPY;
private boolean protectedStatus;
+ protected final NamePathResolver resolver;
+
/**
* Package private constructor
+ *
+ * @param resolver
*/
- AbstractItemDefinitionTemplate() {
+ AbstractItemDefinitionTemplate(NamePathResolver resolver) {
+ this.resolver = resolver;
}
/**
* Package private constructor
*
* @param def
+ * @param resolver
+ * @throws javax.jcr.nodetype.ConstraintViolationException
*/
- AbstractItemDefinitionTemplate(ItemDefinition def) {
- name = def.getName();
+ AbstractItemDefinitionTemplate(ItemDefinition def, NamePathResolver resolver) throws ConstraintViolationException {
+ this.resolver = resolver;
+
+ if (def instanceof ItemDefinitionImpl) {
+ name = ((ItemDefinitionImpl) def).itemDef.getName();
+ } else {
+ setName(def.getName());
+ }
autoCreated = def.isAutoCreated();
mandatory = def.isMandatory();
opv = def.getOnParentVersion();
@@ -56,9 +81,20 @@
* Sets the name of the child item.
*
* @param name a <code>String</code>.
+ * @throws ConstraintViolationException
*/
- public void setName(String name) {
- this.name = name;
+ public void setName(String name) throws ConstraintViolationException {
+ if (ItemDefinitionImpl.ANY_NAME.equals(name)) {
+ // handle the * special case that isn't a valid JCR name but a valid
+ // name for a ItemDefinition (residual).
+ this.name = NameConstants.ANY_NAME;
+ } else {
+ try {
+ this.name = resolver.getQName(name);
+ } catch (RepositoryException e) {
+ throw new ConstraintViolationException(e);
+ }
+ }
}
/**
@@ -83,8 +119,11 @@
* Sets the on-parent-version status of the child item.
*
* @param opv an <code>int</code> constant member of <code>OnParentVersionAction</code>.
+ * @throws IllegalArgumentException If the given <code>opv</code> flag isn't valid.
*/
public void setOnParentVersion(int opv) {
+ // validate the given opv-action
+ OnParentVersionAction.nameFromValue(opv);
this.opv = opv;
}
@@ -102,7 +141,17 @@
* {@inheritDoc}
*/
public String getName() {
- return name;
+ if (name == null) {
+ return null;
+ } else {
+ try {
+ return resolver.getJCRName(name);
+ } catch (NamespaceException e) {
+ // should never get here
+ log.error("encountered unregistered namespace in item definition name", e);
+ return name.toString();
+ }
+ }
}
/**
@@ -139,5 +188,4 @@
public boolean isProtected() {
return protectedStatus;
}
-
}
Modified: jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/AbstractNodeTypeManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/AbstractNodeTypeManager.java?rev=812570&r1=812569&r2=812570&view=diff
==============================================================================
--- jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/AbstractNodeTypeManager.java (original)
+++ jackrabbit/sandbox/JCR-1456/jackrabbit-spi-commons/src/main/java/org/apache/jackrabbit/spi/commons/nodetype/AbstractNodeTypeManager.java Tue Sep 8 16:09:28 2009
@@ -19,6 +19,7 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.jackrabbit.spi.Name;
+import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
import javax.jcr.nodetype.NodeTypeManager;
import javax.jcr.nodetype.NodeTypeTemplate;
@@ -50,13 +51,22 @@
*/
public abstract NodeType getNodeType(Name ntName) throws NoSuchNodeTypeException;
+ /**
+ * Returns the NamePathResolver used to validate JCR names.
+ *
+ * @return the NamePathResolver used to convert JCR names/paths to internal
+ * onces and vice versa. The resolver may also be used to validate names
+ * passed to the various templates.
+ */
+ public abstract NamePathResolver getNamePathResolver();
+
//----------------------------------------------------< NodeTypeManager >---
/**
* @see javax.jcr.nodetype.NodeTypeManager#createNodeTypeTemplate()
*/
public NodeTypeTemplate createNodeTypeTemplate()
throws UnsupportedRepositoryOperationException, RepositoryException {
- return new NodeTypeTemplateImpl();
+ return new NodeTypeTemplateImpl(getNamePathResolver());
}
/**
@@ -64,7 +74,7 @@
*/
public NodeTypeTemplate createNodeTypeTemplate(NodeTypeDefinition ntd)
throws UnsupportedRepositoryOperationException, RepositoryException {
- return new NodeTypeTemplateImpl(ntd);
+ return new NodeTypeTemplateImpl(ntd, getNamePathResolver());
}
/**
@@ -72,7 +82,7 @@
*/
public NodeDefinitionTemplate createNodeDefinitionTemplate()
throws UnsupportedRepositoryOperationException, RepositoryException {
- return new NodeDefinitionTemplateImpl(getNodeType(NodeType.NT_BASE));
+ return new NodeDefinitionTemplateImpl(getNamePathResolver());
}
/**
@@ -80,7 +90,7 @@
*/
public PropertyDefinitionTemplate createPropertyDefinitionTemplate()
throws UnsupportedRepositoryOperationException, RepositoryException {
- return new PropertyDefinitionTemplateImpl();
+ return new PropertyDefinitionTemplateImpl(getNamePathResolver());
}
/**