/*
* 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.core.version;
import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
import org.exoplatform.services.jcr.dataflow.ItemState;
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.impl.Constants;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
import org.exoplatform.services.jcr.impl.dataflow.DefaultItemDataCopyVisitor;
import org.exoplatform.services.jcr.impl.dataflow.session.SessionChangesLog;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import javax.jcr.RepositoryException;
import javax.jcr.version.OnParentVersionAction;
/**
* Created by The eXo Platform SAS 14.12.2006
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter
* Nedonosko</a>
* @version $Id: ItemDataCopyIgnoredVisitor.java 12306 2008-03-24 10:25:55Z ksm
* $
*/
public class ItemDataCopyIgnoredVisitor extends DefaultItemDataCopyVisitor
{
private static final Log LOG = ExoLogger.getLogger("exo.jcr.component.core.ItemDataCopyIgnoredVisitor");
protected final SessionChangesLog restoredChanges;
public ItemDataCopyIgnoredVisitor(NodeData context, InternalQName destNodeName, NodeTypeDataManager nodeTypeManager,
SessionDataManager dataManager, SessionChangesLog changes)
{
super(context, destNodeName, nodeTypeManager, dataManager, dataManager, true);
this.restoredChanges = changes;
}
@Override
protected void entering(PropertyData property, int level) throws RepositoryException
{
if (level == 1
&& (property.getQPath().getName().equals(Constants.JCR_BASEVERSION) || property.getQPath().getName().equals(
Constants.JCR_ISCHECKEDOUT)))
{
// skip versionable specific props
return;
}
if (curParent() == null)
{
NodeData existedParent = (NodeData)dataManager.getItemData(property.getParentIdentifier());
PropertyDefinitionData pdef =
ntManager.getPropertyDefinitions(property.getQPath().getName(), existedParent.getPrimaryTypeName(),
existedParent.getMixinTypeNames()).getAnyDefinition();
if (pdef.getOnParentVersion() == OnParentVersionAction.IGNORE)
{
// parent is not exists as this copy context current parent
// i.e. it's a IGNOREd property elsewhere at a versionable node
// descendant.
// So, we have to know that this parent WILL exists after restore
ItemState contextState = restoredChanges.getItemState(property.getParentIdentifier());
if (contextState != null && !contextState.isDeleted())
{
// the node can be stored as IGNOREd in restore set, check an action
if (LOG.isDebugEnabled())
LOG.debug("A property " + property.getQPath().getAsString() + " is IGNOREd");
// set context current parent to existed in restore set
parents.push((NodeData)contextState.getData());
super.entering(property, level);
parents.pop();
}
}
}
else
{
// copy as IGNOREd parent child, i.e. OnParentVersionAction is any
if (LOG.isDebugEnabled())
{
LOG.debug("A property " + property.getQPath().getAsString() + " is IGNOREd node descendant");
}
super.entering(property, level);
}
}
@Override
protected void entering(NodeData node, int level) throws RepositoryException
{
if (level == 0)
{
parents.pop(); // remove context parent (redo superclass constructor
// work)
}
else if (level > 0)
{
if (curParent() == null)
{
NodeData existedParent = (NodeData)dataManager.getItemData(node.getParentIdentifier());
NodeDefinitionData ndef =
ntManager.getChildNodeDefinition(node.getQPath().getName(), node.getPrimaryTypeName(),
existedParent.getPrimaryTypeName(), existedParent.getMixinTypeNames());
// the node can be stored as IGNOREd in restore set, check an action
if (ndef.getOnParentVersion() == OnParentVersionAction.IGNORE)
{
// parent is not exists as this copy context current parent
// i.e. it's a IGNOREd node elsewhere at a versionable node
// descendant.
// So, we have to know that this parent WILL exists after restore
ItemState contextState = restoredChanges.getItemState(node.getParentIdentifier());
if (contextState != null && !contextState.isDeleted())
{
if (LOG.isDebugEnabled())
LOG.debug("A node " + node.getQPath().getAsString() + " is IGNOREd");
// set context current parent to existed in restore set
parents.push((NodeData)contextState.getData());
super.entering(node, level);
NodeData thisNode = parents.pop(); // copied
parents.pop(); // contextParent
parents.push(thisNode);
return;
}
}
}
else
{
// copy as IGNOREd parent child, i.e. OnParentVersionAction is any
if (LOG.isDebugEnabled())
{
LOG.debug("A node " + node.getQPath().getAsString() + " is IGNOREd node descendant");
}
super.entering(node, level);
return;
}
}
parents.push(null); // skip this node as we hasn't parent in restore result
}
@Override
protected void leaving(NodeData node, int level) throws RepositoryException
{
if (parents.size() > 0)
{
parents.pop();
}
}
}