Package org.exoplatform.services.jcr.impl.dataflow

Source Code of org.exoplatform.services.jcr.impl.dataflow.ItemDataCopyVisitor

/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.impl.dataflow;

import java.util.ArrayList;
import java.util.List;

import javax.jcr.RepositoryException;

import org.exoplatform.services.log.Log;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.NodeData;
import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.datamodel.QPath;
import org.exoplatform.services.jcr.datamodel.ValueData;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
import org.exoplatform.services.jcr.impl.dataflow.version.VersionHistoryDataHelper;
import org.exoplatform.services.jcr.util.IdGenerator;
import org.exoplatform.services.log.ExoLogger;

public class ItemDataCopyVisitor
   extends DefaultItemDataCopyVisitor
{

   private Log log = ExoLogger.getLogger("jcr.ItemDataCopyVisitor");

   public ItemDataCopyVisitor(NodeData parent, InternalQName destNodeName, NodeTypeDataManager nodeTypeManager,
            SessionDataManager dataManager, boolean keepIdentifiers)
   {
      super(parent, destNodeName, nodeTypeManager, dataManager, keepIdentifiers);
   }

   @Override
   protected void entering(PropertyData property, int level) throws RepositoryException
   {

      if (log.isDebugEnabled())
         log.debug("entering " + property.getQPath().getAsString());

      // don't using super
      InternalQName qname = property.getQPath().getName();

      List<ValueData> values;

      if (ntManager.isNodeType(Constants.MIX_VERSIONABLE, curParent().getPrimaryTypeName(), curParent()
               .getMixinTypeNames()))
      {
         // versionable node copy
         // [mix:versionable] > mix:referenceable
         // mixin
         // - jcr:versionHistory (reference) mandatory protected
         // < 'nt:versionHistory'
         // - jcr:baseVersion (reference) mandatory protected
         // ignore
         // < 'nt:version'
         // - jcr:isCheckedOut (boolean) = 'true' mandatory
         // autocreated protected ignore
         // - jcr:predecessors (reference) mandatory protected
         // multiple
         // < 'nt:version'
         // - jcr:mergeFailed (reference) protected multiple abort
         // < 'nt:version'

         // before manipulate with version stuuf we have create a one new VH right
         // here!
         QPath vhpPath = QPath.makeChildPath(curParent().getQPath(), Constants.JCR_VERSIONHISTORY);
         ItemState vhpState = findLastItemState(vhpPath);
         if (vhpState == null)
         {
            // need create a new VH
            PlainChangesLogImpl changes = new PlainChangesLogImpl();
            VersionHistoryDataHelper vh = new VersionHistoryDataHelper(curParent(), changes, dataManager, ntManager);
            itemAddStates.addAll(changes.getAllStates());
         }

         values = new ArrayList<ValueData>(1);
         if (qname.equals(Constants.JCR_LOCKISDEEP))
         {
            return;
         }
         else if (qname.equals(Constants.JCR_LOCKOWNER))
         {
            return;
         }
         else if (qname.equals(Constants.JCR_VERSIONHISTORY))
         {
            return; // added in VH create
         }
         else if (qname.equals(Constants.JCR_PREDECESSORS))
         {
            return; // added in VH create
         }
         else if (qname.equals(Constants.JCR_BASEVERSION))
         {
            return; // added in VH create
         }
         else if (qname.equals(Constants.JCR_ISCHECKEDOUT))
         {
            values.add(new TransientValueData(true));
         }
         else if (qname.equals(Constants.JCR_MERGEFAILED))
         {
            return; // skip it
         }
         else if (qname.equals(Constants.JCR_UUID))
         {
            values.add(new TransientValueData(curParent().getIdentifier())); // uuid
            // of
            // the
            // parent
         }
         else
         {
            values = property.getValues(); // copy the property
         }
      }
      else if (ntManager.isNodeType(Constants.MIX_REFERENCEABLE, curParent().getPrimaryTypeName(), curParent()
               .getMixinTypeNames())
               && qname.equals(Constants.JCR_UUID))
      {

         values = new ArrayList<ValueData>(1);
         values.add(new TransientValueData(curParent().getIdentifier()));
      }
      else
      {
         // http://jira.exoplatform.org/browse/JCR-294
         if (qname.equals(Constants.JCR_LOCKISDEEP))
         {
            return;
         }
         else if (qname.equals(Constants.JCR_LOCKOWNER))
         {
            return;
         }
         values = property.getValues();
      }

      TransientPropertyData newProperty =
               new TransientPropertyData(QPath.makeChildPath(curParent().getQPath(), qname), keepIdentifiers ? property
                        .getIdentifier() : IdGenerator.generate(), -1, property.getType(), curParent().getIdentifier(),
                        property.isMultiValued());

      newProperty.setValues(values);

      if (log.isDebugEnabled())
         log.debug("entering COPY " + newProperty.getQPath().getAsString() + "; pidentifier: "
                  + newProperty.getParentIdentifier() + "; identifier: " + newProperty.getIdentifier());

      itemAddStates.add(new ItemState(newProperty, ItemState.ADDED, true, ancestorToSave, level != 0));
   }
}
TOP

Related Classes of org.exoplatform.services.jcr.impl.dataflow.ItemDataCopyVisitor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.