/*
* 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.xml.importing;
import org.exoplatform.services.jcr.access.AccessControlList;
import org.exoplatform.services.jcr.access.AccessManager;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
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.QPath;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
import org.exoplatform.services.jcr.impl.xml.importing.dataflow.ImportNodeData;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.security.ConversationState;
import java.util.Map;
import javax.jcr.NamespaceRegistry;
import javax.jcr.RepositoryException;
/**
* Created by The eXo Platform SAS.
*
* @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
* @version $Id: WorkspaceContentImporter.java 14100 2008-05-12 10:53:47Z
* gazarenkov $
*/
public class WorkspaceContentImporter extends SystemViewImporter
{
/**
* Class logger.
*/
protected final static Log LOG = ExoLogger.getLogger("exo.jcr.component.core.WorkspaceContentImporter");
/**
* The flag indicates whether a verified that the first element is the root.
*/
protected boolean isFirstElementChecked = false;
/**
* Class used to import content of workspace, using "System View XML Mapping",
* e.g. for restore data during backup. <br> Assumes that root node of the
* workspace was already created, initialized and given as parent. <br> If
* <b>system</b> workspace initialized from a scratch it will already contains
* root (/) and /jcr:system nodes, namespaces and nodetypes were registered.
*/
public WorkspaceContentImporter(NodeData parent, QPath ancestorToSave, int uuidBehavior,
ItemDataConsumer dataConsumer, NodeTypeDataManager ntManager, LocationFactory locationFactory,
ValueFactoryImpl valueFactory, NamespaceRegistry namespaceRegistry, AccessManager accessManager,
ConversationState userState, Map<String, Object> context, RepositoryImpl repository, String currentWorkspaceName)
{
super(parent, ancestorToSave, uuidBehavior, dataConsumer, ntManager, locationFactory, valueFactory,
namespaceRegistry, accessManager, userState, context, repository, currentWorkspaceName);
}
/*
* (non-Javadoc)
* @see
* org.exoplatform.services.jcr.impl.xml.importing.SystemViewImporter#startElement
* (java.lang.String , java.lang.String, java.lang.String, java.util.Map)
*/
@Override
public void startElement(String namespaceURI, String localName, String name, Map<String, String> atts)
throws RepositoryException
{
InternalQName elementName = locationFactory.parseJCRName(name).getInternalName();
if (Constants.SV_NODE_NAME.equals(elementName))
{
// sv:node element
// node name (value of sv:name attribute)
String svName = getAttribute(atts, Constants.SV_NAME_NAME);
if (svName == null)
{
throw new RepositoryException("Missing mandatory sv:name attribute of element sv:node");
}
String svId = getAttribute(atts, Constants.EXO_ID_NAME);
if (svId == null)
{
throw new RepositoryException("Missing mandatory exo:id attribute of element sv:node");
}
ImportNodeData newNodeData;
InternalQName currentNodeName;
int nodeIndex = 1;
NodeData parentData = getParent();
if (!isFirstElementChecked)
{
if (!ROOT_NODE_NAME.equals(svName))
{
throw new RepositoryException("The first element must be root. But found '" + svName + "'");
}
isFirstElementChecked = true;
}
if (ROOT_NODE_NAME.equals(svName))
{
// remove the wrong root from the stack
tree.pop();
newNodeData = addChangesForRootNodeInitialization(parentData);
}
else
{
currentNodeName = locationFactory.parseJCRName(svName).getInternalName();
nodeIndex = getNodeIndex(parentData, currentNodeName, null);
newNodeData = new ImportNodeData(parentData, currentNodeName, nodeIndex);
newNodeData.setOrderNumber(getNextChildOrderNum(parentData));
newNodeData.setIdentifier(svId);
changesLog.add(new ItemState(newNodeData, ItemState.ADDED, true, parentData.getQPath()));
}
tree.push(newNodeData);
mapNodePropertiesInfo.put(newNodeData.getIdentifier(), new NodePropertiesInfo(newNodeData));
}
else
{
super.startElement(namespaceURI, localName, name, atts);
if (Constants.SV_PROPERTY_NAME.equals(elementName))
{
String svId = getAttribute(atts, Constants.EXO_ID_NAME);
if (svId == null)
{
throw new RepositoryException("Missing mandatory exo:id attribute of element sv:property");
}
propertyInfo.setIndentifer(svId);
}
}
}
/**
* @param rootData
* the root node data of workspace
*/
protected ImportNodeData addChangesForRootNodeInitialization(NodeData rootData) throws RepositoryException
{
ImportNodeData newRootData =
new ImportNodeData(Constants.ROOT_PATH, Constants.ROOT_UUID, -1, Constants.NT_UNSTRUCTURED,
new InternalQName[0], -1, null, new AccessControlList());
changesLog.add(new ItemState(rootData, ItemState.ADDED, true, null));
return newRootData;
}
}