You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by st...@apache.org on 2004/07/21 18:58:25 UTC

cvs commit: jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/version FrozenNode.java

stefan      2004/07/21 09:58:25

  Added:       proposals/jcrri/src/org/apache/slide/jcr/core/version
                        FrozenNode.java
  Log:
  jcrri
  
  Revision  Changes    Path
  1.1                  jakarta-slide/proposals/jcrri/src/org/apache/slide/jcr/core/version/FrozenNode.java
  
  Index: FrozenNode.java
  ===================================================================
  /*
   * $Id: FrozenNode.java,v 1.1 2004/07/21 16:58:25 stefan Exp $
   *
   * Copyright 2002-2004 Day Management AG, Switzerland.
   *
   * Licensed under the Day RI License, Version 2.0 (the "License"),
   * as a reference implementation of the following specification:
   *
   *   Content Repository API for Java Technology, revision 0.13
   *        <http://www.jcp.org/en/jsr/detail?id=170>
   *
   * You may not use this file except in compliance with the License.
   * You may obtain a copy of the License files at
   *
   *     http://www.day.com/content/en/licenses/day-ri-license-2.0
   *     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.slide.jcr.core.version;
  
  import org.apache.slide.jcr.core.*;
  import org.apache.slide.jcr.core.nodetype.NodeTypeRegistry;
  import org.apache.slide.jcr.core.nodetype.NodeTypeImpl;
  import org.apache.slide.jcr.core.nodetype.NodeDefImpl;
  import org.apache.slide.jcr.core.state.NodeState;
  import org.apache.slide.jcr.util.UUID;
  
  import javax.jcr.*;
  import javax.jcr.version.OnParentVersionAction;
  import javax.jcr.nodetype.NodeDef;
  import java.util.ArrayList;
  
  /**
   * This Class implements...
   * 
   * @author tripod
   * @version $Revision: 1.1 $, $Date: 2004/07/21 16:58:25 $
   */
  public class FrozenNode extends NodeImpl implements Node {
  
      /** name of the 'jcr:frozenUUID' property */
      public static final QName PROPNAME_FROZEN_UUID = new QName(NamespaceRegistryImpl.NS_JCR_URI, "frozenUUID");
  
      /** name of the 'jcr:frozenPrimaryType' property */
      public static final QName PROPNAME_FROZEN_PRIMARY_TYPE = new QName(NamespaceRegistryImpl.NS_JCR_URI, "frozenPrimaryType");
  
      /** name of the 'jcr:frozenMixinTypes' property */
      public static final QName PROPNAME_FROZEN_MIXIN_TYPES = new QName(NamespaceRegistryImpl.NS_JCR_URI, "frozenMixinTypes");
  
      /** name of the 'jcr:frozenChildHistories' property */
      public static final QName PROPNAME_FROZEN_CHILD_HISTORIES= new QName(NamespaceRegistryImpl.NS_JCR_URI, "frozenChildHistories");
  
      /**
       * Creates a new Frozen node. This is only called by the ItemManager when
       * creating new node instances.
       * @see org.apache.slide.jcr.core.ItemManager#createNodeInstance(org.apache.slide.jcr.core.state.NodeState, javax.jcr.nodetype.NodeDef)
       */
      public FrozenNode(ItemManager itemMgr, TicketImpl ticket, NodeId id,
  		       NodeState state, NodeDef definition,
  		       ItemLifeCycleListener[] listeners)
  	    throws RepositoryException {
  	super(itemMgr, ticket, id, state, definition, listeners);
      }
  
      /**
       * Initializes the frozen state of a version. i.e. copies the uuid,
       * primary types etc.
       * @param node
       */
      void initFrozenState(NodeImpl node)
  	    throws RepositoryException {
  	internalSetProperty(
  		VersionImpl.PROPNAME_FROZEN_UUID,
  		InternalValue.create(node.getUUID())
  	);
  	internalSetProperty(
  		VersionImpl.PROPNAME_FROZEN_PRIMARY_TYPE,
  		InternalValue.create(node.getProperty(VersionImpl.PROPNAME_PRIMARYTYPE).getString()));
  
  	if (node.hasProperty(VersionImpl.PROPNAME_MIXINTYPES)) {
  	    internalSetProperty(
  		    VersionImpl.PROPNAME_FROZEN_MIXIN_TYPES,
  		    InternalValue.create(node.getProperty(VersionImpl.PROPNAME_MIXINTYPES).getString()));
  	}
      }
  
      /**
       * Creates the frozen state from a node
       * @param node
       * @throws RepositoryException
       */
      void createFrozenState(NodeImpl node) throws RepositoryException {
  	// copy over the 'special' properties. please note, that they are not
  	// copied in the loop below, since they have a OPV of initialze or compute.
  	initFrozenState(node);
  
  	// iterate over the properties
  	PropertyIterator piter = node.getProperties();
  	while (piter.hasNext()) {
  	    Property prop = piter.nextProperty();
  	    switch (prop.getDefinition().getOnParentVersion()) {
  		case OnParentVersionAction.ABORT:
  		    throw new RepositoryException("Checkin aborted due to OPV in " + prop.getPath());
  		case OnParentVersionAction.COMPUTE:
  		case OnParentVersionAction.IGNORE:
  		case OnParentVersionAction.INITIALIZE:
  		    break;
  		case OnParentVersionAction.VERSION:
  		case OnParentVersionAction.COPY:
  		    QName name = QName.fromJCRName(prop.getName(), ticket.getNamespaceResolver());
  		    Value[] values = prop.getValues();
  		    InternalValue[] ivalues = new InternalValue[values.length];
  		    for (int i=0; i<values.length; i++) {
  			ivalues[i] = InternalValue.create(values[i], ticket.getNamespaceResolver());
  		    }
  		    internalSetProperty(name, ivalues);
  		    break;
  	    }
  	}
  
  	// iterate over the nodes
  	NodeIterator niter = node.getNodes();
  	while (niter.hasNext()) {
  	    NodeImpl child = (NodeImpl) niter.nextNode();
  	    switch (child.getDefinition().getOnParentVersion()) {
  		case OnParentVersionAction.ABORT:
  		    throw new RepositoryException("Checkin aborted due to OPV in " + child.safeGetJCRPath());
  		case OnParentVersionAction.COMPUTE:
  		case OnParentVersionAction.IGNORE:
  		case OnParentVersionAction.INITIALIZE:
  		    break;
  		case OnParentVersionAction.VERSION:
  		    if (child.isNodeType(
  			    NodeTypeRegistry.MIX_VERSIONABLE.toJCRName(
  				    ticket.getNamespaceResolver()))
  		    ) {
  			// create nt:frozenChild (not defined yet)
  			/*
  			NodeTypeImpl nt = (NodeTypeImpl)
  				ticket.getWorkspace().getNodeTypeManager().getNodeType(
  					NodeTypeRegistry.NT_FROZEN_CHILD.toJCRName(
  						ticket.getNamespaceResolver()
  					)
  				);
  			*/
  			NodeTypeImpl nt = (NodeTypeImpl)
  				ticket.getWorkspace().getNodeTypeManager().getNodeType("nt:frozenChild");
  			QName name = QName.fromJCRName(child.getName(), ticket.getNamespaceResolver());
  			NodeDefImpl def = getApplicableChildNodeDef(name, nt.getQName());
  			NodeImpl newChild = createChildNode(name, def, nt);
  			newChild.internalSetProperty(
  				VersionImpl.PROPNAME_VERSION_HISTORY,
  				InternalValue.create(new UUID(child.getVersionHistory().getUUID()))
  			);
  
  		    }
  		    // else ignore
  		    break;
  		case OnParentVersionAction.COPY:
  		    NodeTypeImpl nt = (NodeTypeImpl)
  			    ticket.getWorkspace().getNodeTypeManager().getNodeType(
  				    NodeTypeRegistry.NT_FROZEN.toJCRName(
  					    ticket.getNamespaceResolver()
  				    )
  			    );
  		    QName name = QName.fromJCRName(child.getName(), ticket.getNamespaceResolver());
  		    NodeDefImpl def = getApplicableChildNodeDef(name, nt.getQName());
  		    FrozenNode newChild = (FrozenNode) createChildNode(name, def, nt);
  		    newChild.createFrozenState((NodeImpl) child);
  		    break;
  	    }
  	}
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: slide-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: slide-dev-help@jakarta.apache.org