/*
* 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.version;
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.persistent.PersistedNodeData;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.ItemData;
import org.exoplatform.services.jcr.datamodel.ItemType;
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.QPathEntry;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
import java.util.ArrayList;
import java.util.List;
import javax.jcr.version.VersionException;
/**
* Created by The eXo Platform SAS.
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter Nedonosko</a>
* @version $Id: TestFrozenNodeInitializer.java 11907 2008-03-13 15:36:21Z ksm $
*/
public class TestFrozenNodeInitializer extends BaseVersionImplTest
{
public void testFrozenCreated() throws Exception
{
createVersionable(TESTCASE_ONPARENT_COPY);
// going to test
versionable.accept(visitor);
// ask for nt:frozenNode
List<ItemState> versionableChanges = new ArrayList<ItemState>();
versionableChanges.addAll(versionableLog.getChildrenChanges(versionable.getIdentifier(), true));
versionableChanges.addAll(versionableLog.getChildrenChanges(versionable.getIdentifier(), false));
List<ItemState> testChanges = new ArrayList<ItemState>();
testChanges.addAll(changesLog.getChildrenChanges(frozenRoot.getIdentifier(), true));
testChanges.addAll(changesLog.getChildrenChanges(frozenRoot.getIdentifier(), false));
next : for (ItemState state : versionableChanges)
{
if (versionable.equals(state.getData()))
{
continue next; // we have no interest for this item
}
for (ItemState result : testChanges)
{
ItemData resultData = result.getData();
// log.info("frozen change found " + resultData.getQPath().getAsString() + ", " +
// resultData.getUUID() + "... ");
if (resultData.getQPath().getName().equals(state.getData().getQPath().getName()))
{
// if (resultData.isNode() && resultData.getUUID().equals(state.getData().getUUID()))
continue next;
}
}
fail("Change is not stored in frozen state: " + state.getData().getQPath().getAsString());
}
}
public void testFrozenInitialized_OnParentVersion_COPY() throws Exception
{
createVersionable(TESTCASE_ONPARENT_COPY);
// going to test
versionable.accept(visitor);
List<ItemState> versionableChanges = versionableLog.getDescendantsChanges(versionable.getQPath());
List<ItemState> testChanges = changesLog.getDescendantsChanges(frozenRoot.getQPath());
next : for (ItemState state : versionableChanges)
{
if (versionable.equals(state.getData()))
{
continue next; // we have no interest for this item
}
for (ItemState result : testChanges)
{
ItemData resultData = result.getData();
// log.info("frozen change found " + resultData.getQPath().getAsString() + ", " +
// resultData.getUUID() + "... ");
if (resultData.getQPath().getName().equals(state.getData().getQPath().getName()))
{
// if (resultData.isNode() && resultData.getUUID().equals(state.getData().getUUID()))
continue next;
}
}
fail("Change is not stored in frozen state: " + state.getData().getQPath().getAsString());
}
}
public void testFrozenInitialized_OnParentVersion_ABORT() throws Exception
{
createVersionable(TESTCASE_ONPARENT_ABORT);
try
{
versionable.accept(visitor);
fail("A VersionException must be throwed on OnParentVersion=ABORT");
}
catch (VersionException e)
{
// ok
}
}
public void testFrozenInitialized_OnParentVersion_IGNORE() throws Exception
{
createVersionable(TESTCASE_ONPARENT_IGNORE);
versionable.accept(visitor);
List<ItemState> versionableChanges = versionableLog.getDescendantsChanges(versionable.getQPath());
List<ItemState> testChanges = changesLog.getDescendantsChanges(frozenRoot.getQPath());
next : for (ItemState state : versionableChanges)
{
if (versionable.equals(state.getData()))
{
continue next; // we have no interest for this item
}
for (ItemState result : testChanges)
{
ItemData resultData = result.getData();
// log.info("frozen change found " + resultData.getQPath().getAsString() + ", " +
// resultData.getUUID() + "... ");
if (resultData.getQPath().getName().equals(state.getData().getQPath().getName()))
{
if (resultData.getQPath().getName().equals(PROPERTY_IGNORED))
{
fail("Ignored property can't be stored in frozen state: " + resultData.getQPath().getAsString());
}
if (resultData.getQPath().getName().equals(NODE_IGNORED))
{
fail("Ignored node can't be stored in frozen state: " + resultData.getQPath().getAsString());
}
continue next;
}
}
if (!(state.getData().getQPath().getName().equals(PROPERTY_IGNORED) || state.getData().getQPath().getName()
.equals(NODE_IGNORED)))
{
fail("Change is not stored in frozen state: " + state.getData().getQPath().getAsString());
}
}
}
public void testFrozenInitialized_OnParentVersion_VERSION() throws Exception
{
createVersionable(TESTCASE_ONPARENT_VERSION);
versionable.accept(visitor);
List<ItemState> versionableChanges = versionableLog.getDescendantsChanges(versionable.getQPath());
List<ItemState> testChanges = changesLog.getDescendantsChanges(frozenRoot.getQPath());
next : for (ItemState state : versionableChanges)
{
if (versionable.equals(state.getData()))
{
continue next; // we have no interest for this item
}
if (state.getData().getQPath().getName().equals(Constants.JCR_VERSIONHISTORY))
{
continue next; // we have no interest for jcr:versionHistory on versionable (as it will be
// saved as jcr:childVersionHistory)
}
for (ItemState result : testChanges)
{
ItemData resultData = result.getData();
if (resultData.getQPath().getName().equals(state.getData().getQPath().getName()))
{
if (resultData.getQPath().getName().equals(NODE_VERSIONED))
{
InternalQName ntName = null;
if (resultData instanceof TransientNodeData)
{
ntName = ((TransientNodeData)resultData).getPrimaryTypeName();
}
else if (resultData instanceof PersistedNodeData)
{
ntName = ((PersistedNodeData)resultData).getPrimaryTypeName();
}
else
{
fail("Unknown (for test) node data instance type: " + resultData);
}
assertEquals("Versioned node must be stored in frozen state as node of type nt:versionedChild: "
+ resultData.getQPath().getAsString(), Constants.NT_VERSIONEDCHILD, ntName);
// QPath versionHistoryPropertyPath = QPath.makeChildPath(state.getData().getQPath(),
// Constants.JCR_VERSIONHISTORY);
// PropertyData vh = (PropertyData)
// session.getTransientNodesManager().getItemData(versionHistoryPropertyPath);
PropertyData vh =
(PropertyData)session.getTransientNodesManager().getItemData((NodeData)state.getData(),
new QPathEntry(Constants.JCR_VERSIONHISTORY, 0), ItemType.PROPERTY);
String vhUuid = new String(vh.getValues().get(0).getAsByteArray());
QPath childVersionHistoryPropertyPath =
QPath.makeChildPath(resultData.getQPath(), Constants.JCR_CHILDVERSIONHISTORY);
ItemState cvhState = changesLog.getItemState(childVersionHistoryPropertyPath);
assertNotNull(
"Frozen state of node of type nt:versionedChild hasn't jcr:childVersionHistory property: "
+ resultData.getQPath().getAsString(), cvhState);
String cvhUuid = new String(((PropertyData)cvhState.getData()).getValues().get(0).getAsByteArray());
assertEquals("jcr:childVersionHistory property in frozen state contains wrong uuid", vhUuid, cvhUuid);
}
else if (resultData.getQPath().getName().equals(PROPERTY_VERSIONED))
{
// behaviour of COPY...
}
continue next;
}
}
fail("Change is not stored in frozen state: " + state.getData().getQPath().getAsString());
}
}
}