package com.delcyon.capo.controller.elements; import java.io.File; import org.junit.AfterClass; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import com.delcyon.capo.CapoApplication; import com.delcyon.capo.controller.Group; import com.delcyon.capo.resourcemanager.ResourceDescriptor; import com.delcyon.capo.resourcemanager.ResourceDescriptor.LifeCycle; 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.tests.util.external.Util; import com.delcyon.capo.xml.XMLDiff; import com.delcyon.capo.xml.XPath; import com.delcyon.capo.xml.dom.ResourceDocument; public class SyncElementTest { @BeforeClass public static void setUpBeforeClass() throws Exception { com.delcyon.capo.tests.util.Util.startMinimalCapoApplication(); } @Before public void setUp() throws Exception { } @Test public void testProcessServerSideElement() throws Exception { Util.deleteTree("capo"); String src = "test-data/capo"; String dest = "capo"; 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(), "true"); syncElement.setAttribute(SyncElement.Attributes.syncAttributes.toString(), "lastModified"); 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); syncControlElement.processServerSideElement(); ResourceDescriptor sourceResourceDescriptor = new FileResourceType().getResourceDescriptor(src); ResourceDescriptor destinationResourceDescriptor = new FileResourceType().getResourceDescriptor(dest); //use resource document to get results from both sides ResourceDocument baseDocument = new ResourceDocument(sourceResourceDescriptor); XPath.dumpNode(baseDocument, System.out); Assert.assertNotNull(XPath.selectSingleNodeValue(baseDocument.getDocumentElement(), "//resource:keystore")); ResourceDocument modDocument = new ResourceDocument(destinationResourceDescriptor); Assert.assertNotNull(XPath.selectSingleNodeValue(modDocument.getDocumentElement(), "//resource:keystore")); //XPath.dumpNode(modDocument, System.err); //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,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); } Assert.assertEquals("There is a difference between "+src+" and "+dest,XMLDiff.EQUALITY,diffDocument.getDocumentElement().getAttributeNS(XMLDiff.XDIFF_NAMESPACE_URI, XMLDiff.XDIFF_ELEMENT_ATTRIBUTE_NAME)); } @Test public void testPrune() throws Exception { Util.deleteTree("capo"); String src = "test-data/capo"; String dest = "capo"; Util.copyTree(src, dest+"/"+dest); //create sync element 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(), "true"); syncElement.setAttribute(SyncElement.Attributes.syncAttributes.toString(), "lastModified"); 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); syncControlElement.processServerSideElement(); ResourceDescriptor sourceResourceDescriptor = new FileResourceType().getResourceDescriptor(src); sourceResourceDescriptor.addResourceParameters(null, new ResourceParameter(FileResourceType.Parameters.ROOT_DIR,new File(".").getCanonicalPath())); ResourceDescriptor destinationResourceDescriptor = new FileResourceType().getResourceDescriptor(dest); //destinationResourceDescriptor.addResourceParameters(null, new ResourceParameter(FileResourceType.Parameters.ROOT_DIR,new File(".").getCanonicalPath())); //use resource document to get results from both sides ResourceDocument baseDocument = new ResourceDocument(sourceResourceDescriptor); //XPath.dumpNode(baseDocument, System.out); ResourceDocument modDocument = new ResourceDocument(destinationResourceDescriptor); //XPath.dumpNode(modDocument, System.out); //use xml diff to generate diff between both side XMLDiff xmlDiff = new XMLDiff(); xmlDiff.addIgnoreableAttribute(CapoApplication.RESOURCE_NAMESPACE_URI,ContentMetaData.Attributes.path.toString()); xmlDiff.addIgnoreableAttribute(CapoApplication.RESOURCE_NAMESPACE_URI,ContentMetaData.Attributes.uri.toString()); xmlDiff.addIgnoreableAttribute(CapoApplication.RESOURCE_NAMESPACE_URI,FileAttributes.absolutePath.toString()); xmlDiff.addIgnoreableAttribute(CapoApplication.RESOURCE_NAMESPACE_URI,FileAttributes.canonicalPath.toString()); Document diffDocument = xmlDiff.getDifferences(baseDocument, modDocument); baseDocument.close(LifeCycle.EXPLICIT); modDocument.close(LifeCycle.EXPLICIT); //verify that root element of xml diff contains mod != base //make sure things are differrent before we prune if (diffDocument.getDocumentElement().getAttributeNS(XMLDiff.XDIFF_NAMESPACE_URI, XMLDiff.XDIFF_ELEMENT_ATTRIBUTE_NAME).equals(XMLDiff.INEQUALITY) == false) { XPath.dumpNode(diffDocument, System.out); } Assert.assertEquals("There is no difference between "+src+" and "+dest,XMLDiff.INEQUALITY,diffDocument.getDocumentElement().getAttributeNS(XMLDiff.XDIFF_NAMESPACE_URI, XMLDiff.XDIFF_ELEMENT_ATTRIBUTE_NAME)); syncElement.setAttribute(SyncElement.Attributes.prune.toString(), "true"); syncControlElement.processServerSideElement(); sourceResourceDescriptor = new FileResourceType().getResourceDescriptor(src); destinationResourceDescriptor = new FileResourceType().getResourceDescriptor(dest); //use resource document to get results from both sides baseDocument = new ResourceDocument(sourceResourceDescriptor); Assert.assertTrue(baseDocument.getDocumentElement().getAttribute("exists").equals("true")); //XPath.dumpNode(baseDocument, System.out); modDocument = new ResourceDocument(destinationResourceDescriptor); Assert.assertTrue(modDocument.getDocumentElement().getAttribute("exists").equals("true")); //XPath.dumpNode(modDocument, System.out); //use xml diff to generate diff between both side xmlDiff = new XMLDiff(); xmlDiff.addIgnoreableAttribute(null,ContentMetaData.Attributes.path.toString()); xmlDiff.addIgnoreableAttribute(null,ContentMetaData.Attributes.uri.toString()); xmlDiff.addIgnoreableAttribute(null,FileAttributes.absolutePath.toString()); xmlDiff.addIgnoreableAttribute(null,FileAttributes.canonicalPath.toString()); diffDocument = xmlDiff.getDifferences(baseDocument, modDocument); baseDocument.close(LifeCycle.EXPLICIT); modDocument.close(LifeCycle.EXPLICIT); //verify that root element of xml diff contains mod != base //make sure things are differrent before we prune if (diffDocument.getDocumentElement().getAttributeNS(XMLDiff.XDIFF_NAMESPACE_URI, XMLDiff.XDIFF_ELEMENT_ATTRIBUTE_NAME).equals(XMLDiff.EQUALITY) == false) { XPath.dumpNode(diffDocument, System.out); } Assert.assertEquals("There is a difference between "+src+" and "+dest,XMLDiff.EQUALITY,diffDocument.getDocumentElement().getAttributeNS(XMLDiff.XDIFF_NAMESPACE_URI, XMLDiff.XDIFF_ELEMENT_ATTRIBUTE_NAME)); } @AfterClass public static void afterClass() throws Exception { // Util.deleteTree("capo"); // TestCapoApplication.cleanup(); } }