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: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to