package com.delcyon.capo.tests.util;
import java.io.File;
import java.util.logging.Level;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.delcyon.capo.CapoApplication;
import com.delcyon.capo.Configuration;
import com.delcyon.capo.Configuration.PREFERENCE;
import com.delcyon.capo.controller.Group;
import com.delcyon.capo.controller.elements.SyncElement;
import com.delcyon.capo.resourcemanager.ResourceDescriptor;
import com.delcyon.capo.resourcemanager.ResourceDescriptor.Action;
import com.delcyon.capo.resourcemanager.ResourceDescriptor.LifeCycle;
import com.delcyon.capo.resourcemanager.ResourceManager;
import com.delcyon.capo.resourcemanager.ResourceParameter;
import com.delcyon.capo.resourcemanager.types.ContentMetaData;
import com.delcyon.capo.resourcemanager.types.FileResourceContentMetaData.FileAttributes;
import com.delcyon.capo.resourcemanager.types.FileResourceType;
import com.delcyon.capo.resourcemanager.types.JcrResourceType;
import com.delcyon.capo.server.CapoServer.Preferences;
import com.delcyon.capo.xml.XMLDiff;
import com.delcyon.capo.xml.XPath;
import com.delcyon.capo.xml.dom.ResourceDocument;
public class Util
{
public static CapoApplication minmalApplication = null;
public static void startMinimalCapoApplication() throws Exception
{
if (minmalApplication == null)
{
minmalApplication = new TestCapoApplication();
}
if (CapoApplication.getApplication() == null)
{
minmalApplication = new TestCapoApplication();
}
if (CapoApplication.getConfiguration() == null)
{
CapoApplication.setConfiguration(new Configuration(new String[]{"-"+PREFERENCE.DISABLE_CONFIG_AUTOSYNC.toString(),"-"+Preferences.DISABLE_REPO.toString(),"true","-"+Preferences.DISABLE_WEBSERVER.toString(),"true"}));
}
if(CapoApplication.LOGGING_LEVEL.intValue() >= Level.FINER.intValue())
{
System.setProperty("jaxp.debug", "true");
}
if (CapoApplication.getDataManager() == null)
{
CapoApplication.setDataManager(new ResourceManager());
}
if (CapoApplication.getDataManager() == null)
{
CapoApplication.setDataManager(new ResourceManager());
}
}
public static void copyTree(String src,String dest,boolean recursive,boolean prune) throws Exception
{
startMinimalCapoApplication();
SyncElement syncControlElement = new SyncElement();
Document document = CapoApplication.getDocumentBuilder().newDocument();
Element syncElement = document.createElement("sync");
syncElement.setAttribute(SyncElement.Attributes.src.toString(), src);
syncElement.setAttribute(SyncElement.Attributes.dest.toString(), dest);
syncElement.setAttribute(SyncElement.Attributes.recursive.toString(), recursive+"");
syncElement.setAttribute(SyncElement.Attributes.prune.toString(), prune+"");
syncElement.setAttribute(SyncElement.Attributes.syncAttributes.toString(), true+"");
Element resourceParameterElement = document.createElementNS(CapoApplication.RESOURCE_NAMESPACE_URI, "resouce:parameter");
resourceParameterElement.setAttribute("name", FileResourceType.Parameters.ROOT_DIR.toString());
resourceParameterElement.setAttribute("value", new File(".").getCanonicalPath());
syncElement.appendChild(resourceParameterElement);
Group group = new Group("test", null, null, null);
syncControlElement.init(syncElement, null, group, null);
//ResourceDescriptor sourceResourceDescriptor = new FileResourceType().getResourceDescriptor(src);
//ResourceDescriptor destinationResourceDescriptor = new FileResourceType().getResourceDescriptor(dest);
//syncControlElement.syncTree(sourceResourceDescriptor, destinationResourceDescriptor);
syncControlElement.processServerSideElement();
}
public static byte[] readData(String src) throws Exception
{
startMinimalCapoApplication();
ResourceDescriptor sourceResourceDescriptor = null;
if(src.startsWith("repo:"))
{
sourceResourceDescriptor = new JcrResourceType().getResourceDescriptor(src);
}
else
{
sourceResourceDescriptor = new FileResourceType().getResourceDescriptor(src);
sourceResourceDescriptor.getResourceMetaData(null,new ResourceParameter(FileResourceType.Parameters.ROOT_DIR, new File(".").getCanonicalPath()));
}
return sourceResourceDescriptor.readBlock(null);
}
public static void writeData(String dest, byte[] bytes) throws Exception
{
startMinimalCapoApplication();
ResourceDescriptor destinationResourceDescriptor = null;
if(dest.startsWith("repo:"))
{
destinationResourceDescriptor = new JcrResourceType().getResourceDescriptor(dest);
}
else
{
destinationResourceDescriptor = new FileResourceType().getResourceDescriptor(dest);
destinationResourceDescriptor.getResourceMetaData(null,new ResourceParameter(FileResourceType.Parameters.ROOT_DIR, new File(".").getCanonicalPath()));
}
destinationResourceDescriptor.writeBlock(null, bytes);
}
public static void deleteTree(String dest) throws Exception
{
startMinimalCapoApplication();
ResourceDescriptor destinationResourceDescriptor = null;
if(dest.startsWith("repo:"))
{
destinationResourceDescriptor = new JcrResourceType().getResourceDescriptor(dest);
}
else
{
destinationResourceDescriptor = new FileResourceType().getResourceDescriptor(dest);
destinationResourceDescriptor.getResourceMetaData(null,new ResourceParameter(FileResourceType.Parameters.ROOT_DIR, new File(".").getCanonicalPath()));
}
destinationResourceDescriptor.performAction(null, Action.DELETE);
}
public static Boolean areSame(String src, String dest) throws Exception
{
startMinimalCapoApplication();
ResourceDescriptor sourceResourceDescriptor = new FileResourceType().getResourceDescriptor(src);
sourceResourceDescriptor.getResourceMetaData(null,new ResourceParameter(FileResourceType.Parameters.ROOT_DIR, new File(".").getCanonicalPath()));
ResourceDescriptor destinationResourceDescriptor = new FileResourceType().getResourceDescriptor(dest);
destinationResourceDescriptor.getResourceMetaData(null,new ResourceParameter(FileResourceType.Parameters.ROOT_DIR, new File(".").getCanonicalPath()));
// Assert.assertTrue(sourceResourceDescriptor.getContentMetaData(null).exists());
// Assert.assertTrue(destinationResourceDescriptor.getContentMetaData(null).exists());
//use resource document to get results from both sides
ResourceDocument baseDocument = new ResourceDocument(sourceResourceDescriptor);
//Assert.assertTrue(baseDocument.getDocumentElement().getAttribute("exists").equals("true"));
//XPath.dumpNode(baseDocument, System.out);
ResourceDocument modDocument = new ResourceDocument(destinationResourceDescriptor);
//XPath.dumpNode(modDocument, System.out);
//Assert.assertTrue(modDocument.getDocumentElement().getAttribute("exists").equals("true"));
//use xml diff to generate diff between both side
XMLDiff xmlDiff = new XMLDiff();
xmlDiff.addIgnoreableAttribute(null,ContentMetaData.Attributes.path.toString());
xmlDiff.addIgnoreableAttribute(null,ContentMetaData.Attributes.uri.toString());
xmlDiff.addIgnoreableAttribute(null,ContentMetaData.Attributes.lastModified.toString());
xmlDiff.addIgnoreableAttribute(null,FileAttributes.absolutePath.toString());
xmlDiff.addIgnoreableAttribute(null,FileAttributes.canonicalPath.toString());
Document diffDocument = xmlDiff.getDifferences(baseDocument, modDocument);
//verify that root element of xml diff contains mod = base
baseDocument.close(LifeCycle.EXPLICIT);
modDocument.close(LifeCycle.EXPLICIT);
if (diffDocument.getDocumentElement().getAttributeNS(XMLDiff.XDIFF_NAMESPACE_URI, XMLDiff.XDIFF_ELEMENT_ATTRIBUTE_NAME).equals(XMLDiff.EQUALITY) == false)
{
XPath.dumpNode(diffDocument, System.out);
}
return XMLDiff.EQUALITY.equals(diffDocument.getDocumentElement().getAttributeNS(XMLDiff.XDIFF_NAMESPACE_URI, XMLDiff.XDIFF_ELEMENT_ATTRIBUTE_NAME));
}
}