/*
* 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.usecases.common;
import org.exoplatform.services.jcr.BaseStandaloneTest;
import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionValue;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeValue;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.Node;
import javax.jcr.PathNotFoundException;
import javax.jcr.Session;
import javax.jcr.SimpleCredentials;
import javax.jcr.Workspace;
import javax.jcr.version.OnParentVersionAction;
public class TestCutPasteOnJCRSystem extends BaseStandaloneTest
{
@Override
protected void tearDown() throws Exception
{
// super.tearDown();
if (adminSession_ != null)
{
adminSession_.logout();
}
if (systemSession_ != null)
{
systemSession_.logout();
}
}
private Session adminSession_;
private Session systemSession_;
private String workspaceName;
public void testCutActionJcrSystem() throws Exception
{
createTaxonomyNodeType();
initTaxonomyTree();
/*
* So, we have exo:taxonomies tree like that: jcr:system/exo:taxonomies(nt:untructured) /cms
* /news /sport /calendar
*/
Node adminTaxonomyHome = adminSession_.getRootNode().getNode("jcr:system/exo:taxonomies");
Workspace workspace = adminSession_.getWorkspace();
assertTrue("workspace is not null", workspace != null);
Node newsTaxonomy = adminTaxonomyHome.getNode("cms/news");
Node sportsTaxonomy = adminTaxonomyHome.getNode("cms/sports");
Node calendarTaxonomy = adminTaxonomyHome.getNode("cms/calendar");
assertNotNull(newsTaxonomy);
assertNotNull(sportsTaxonomy);
assertNotNull(calendarTaxonomy);
// if we cut-paste a taxonomy Node at 4th level (if we suppose that exo:taxonomies is 1st level
// It's OK
try
{
calendarTaxonomy.getNode("calendarTest");
fail("There is node with path /exo:taxonomies/cms/calendar/calendarTest");
}
catch (Exception e)
{
calendarTaxonomy.addNode("calendarTest", "exo:taxonomy");
adminSession_.save();
}
Node calendarNode2cut = calendarTaxonomy.getNode("calendarTest");
assertNotNull(calendarNode2cut);
String cutPath = calendarNode2cut.getPath();
String pastedPath = sportsTaxonomy.getPath() + cutPath.substring(cutPath.lastIndexOf("/"));
workspace.move(cutPath, pastedPath);
// use other admin session to check
Session otherAdminSession =
repository.login(new SimpleCredentials("admin", "admin".toCharArray()), workspaceName);
assertNotSame(adminSession_, otherAdminSession);
try
{
otherAdminSession.getItem(cutPath);
fail("=======>Node isn't cut yet");
}
catch (Exception e)
{
}
try
{
otherAdminSession.getItem(pastedPath);
}
catch (Exception e)
{
fail("==========> Node isn't pasted");
}
// if we cut - paste a higher level Node(3 or 2). It's wrong
// cut "cms/news" node and paste to "/cms/sports"
String newsSrcPath = newsTaxonomy.getPath();
String destPath2Paste = sportsTaxonomy.getPath() + newsSrcPath.substring(newsSrcPath.lastIndexOf("/"));
// otherAdminSession.getItem(destPath2Paste) ;
otherAdminSession.refresh(false);
workspace.move(newsSrcPath, destPath2Paste);
try
{
otherAdminSession.getItem(newsSrcPath);
fail(newsSrcPath + " don't be cut");
}
catch (Exception e)
{
}
otherAdminSession.getItem(destPath2Paste);
// add "cms/testNode" to check FAILL
Node testTaxonomy = null;
try
{
adminTaxonomyHome.getNode("testNode");
}
catch (PathNotFoundException e)
{
testTaxonomy = adminTaxonomyHome.addNode("testNode", "exo:taxonomy");
adminSession_.save();
}
String srcPath = testTaxonomy.getPath();
String destPath = sportsTaxonomy.getPath() + srcPath.substring(srcPath.lastIndexOf("/"));
workspace.move(srcPath, destPath);
try
{
adminSession_.getItem(destPath);
}
catch (Exception e)
{
fail("Node wasn't moved(pasted) successfully:" + destPath);
}
adminTaxonomyHome.remove();
adminSession_.save();
}
private void initTaxonomyTree() throws Exception
{
String systemWorkspaceName_ = repository.getSystemWorkspaceName();
systemSession_ = repository.getSystemSession(systemWorkspaceName_);
adminSession_ = repository.login(new SimpleCredentials("admin", "admin".toCharArray()), systemWorkspaceName_);
Node taxonomyHome = null;
try
{
taxonomyHome = (Node)systemSession_.getItem("/jcr:system/exo:taxonomies");
fail("There should not be /jcr:system/exo:taxonomies");
}
catch (PathNotFoundException e)
{
}
taxonomyHome = systemSession_.getRootNode().addNode("jcr:system/exo:taxonomies", "nt:unstructured");
systemSession_.save();
try
{
taxonomyHome.getNode("cms");
fail("There should not be /jcr:system/exo:taxonomies/cms");
}
catch (PathNotFoundException e)
{
taxonomyHome.addNode("cms", "exo:taxonomy");
systemSession_.save();
}
try
{
taxonomyHome.getNode("cms/news");
fail("There should not be /jcr:system/exo:taxonomies/cms/news");
}
catch (Exception e)
{
taxonomyHome.addNode("cms/news", "exo:taxonomy");
systemSession_.save();
}
try
{
taxonomyHome.getNode("cms/sports");
fail("There should not be /jcr:system/exo:taxonomies/cms/sports");
}
catch (Exception e)
{
taxonomyHome.addNode("cms/sports", "exo:taxonomy");
systemSession_.save();
}
try
{
taxonomyHome.getNode("cms/calendar");
fail("There should not be /jcr:system/exo:taxonomies/cms/calendar");
}
catch (Exception e)
{
taxonomyHome.addNode("cms/calendar", "exo:taxonomy");
systemSession_.save();
}
}
private void createTaxonomyNodeType() throws Exception
{
/*
* this is NodeType config for exo:taxonomy <nodeType name="exo:taxonomy" isMixin="false"
* hasOrderableChildNodes="false" primaryItemName=""> <supertypes>
* <supertype>nt:base</supertype> </supertypes> <childNodeDefinitions> <childNodeDefinition
* name="*" defaultPrimaryType="" autoCreated="false" mandatory="false"
* onParentVersion="VERSION" protected="false" sameNameSiblings="false"> <requiredPrimaryTypes>
* <requiredPrimaryType>nt:base</requiredPrimaryType> </requiredPrimaryTypes>
* </childNodeDefinition> </childNodeDefinitions> </nodeType>
*/
ExtendedNodeTypeManager manager = repository.getNodeTypeManager();
NodeTypeValue exoTaxonomy = new NodeTypeValue();
exoTaxonomy.setName("exo:taxonomy");
exoTaxonomy.setMixin(false);
exoTaxonomy.setOrderableChild(false);
exoTaxonomy.setPrimaryItemName("");
List<String> superTypeNames = new ArrayList<String>();
superTypeNames.add("nt:base");
exoTaxonomy.setDeclaredSupertypeNames(superTypeNames);
NodeDefinitionValue childNodeDefinitionValue = new NodeDefinitionValue();
childNodeDefinitionValue.setName("*");
childNodeDefinitionValue.setDefaultNodeTypeName("");
childNodeDefinitionValue.setMandatory(false);
childNodeDefinitionValue.setAutoCreate(false);
childNodeDefinitionValue.setRequiredNodeTypeNames(superTypeNames);
childNodeDefinitionValue.setSameNameSiblings(false);
List<NodeDefinitionValue> childNodeDefinitions = new ArrayList<NodeDefinitionValue>();
childNodeDefinitions.add(childNodeDefinitionValue);
childNodeDefinitionValue.setOnVersion(OnParentVersionAction.VERSION);
exoTaxonomy.setDeclaredChildNodeDefinitionValues(childNodeDefinitions);
manager.registerNodeType(exoTaxonomy, ExtendedNodeTypeManager.IGNORE_IF_EXISTS);
}
protected String getRepositoryName()
{
return null;
}
}