package com.delcyon.capo.xml.dom; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import org.w3c.dom.Document; import org.w3c.dom.Node; import com.delcyon.capo.CapoApplication; import com.delcyon.capo.controller.Group; import com.delcyon.capo.controller.elements.ResourceControlElement; import com.delcyon.capo.resourcemanager.ResourceDescriptor; import com.delcyon.capo.resourcemanager.ResourceDescriptor.LifeCycle; import com.delcyon.capo.resourcemanager.types.ContentMetaData; import com.delcyon.capo.xml.cdom.CDocument; import com.delcyon.capo.xml.cdom.CElement; public class ResourceDocument extends CDocument implements ResourceNode { private ResourceDescriptor resourceDescriptor; private ResourceControlElement resourceControlElement = null; private boolean exportContentOnly = false; private boolean includeAttributes = false; private boolean fullDocument = true; private ResourceDocument() //serialization { } public ResourceDocument(ResourceControlElement resourceControlElement) { this.resourceControlElement = resourceControlElement; } public void setDocumentElement(ResourceElement documentElement) { this.resourceDescriptor = documentElement.getProxyedResourceDescriptor(); if(getDocumentElement() != null) { removeChild(getDocumentElement()); } appendChild(documentElement); } /** this is only used in testing as a convience method **/ public ResourceDocument(ResourceDescriptor resourceDescriptor) throws Exception { Group group = new Group("resourceDocumentInternal", null, null, null); CElement resourceControlElementDeclaration = new CElement(CapoApplication.SERVER_NAMESPACE_URI, "server:resource"); resourceControlElementDeclaration.setAttribute(ResourceControlElement.Attributes.lifeCycle, LifeCycle.EXPLICIT); ResourceControlElement resourceControlElement = new ResourceControlElement(); resourceControlElement.init(resourceControlElementDeclaration, null, group, null); this.resourceControlElement = resourceControlElement; this.resourceDescriptor = resourceDescriptor; appendChild( new ResourceElement(this,this,resourceDescriptor)); } public void close(LifeCycle lifeCycle) throws Exception { resourceControlElement.getParentGroup().closeResourceDescriptors(lifeCycle); } // public ResourceDocument(ResourceElement documentResourceElement) throws Exception // { // appendChild(documentResourceElement); // } // public ResourceDocument(ResourceControlElement resourceControlElement) throws Exception // { // this.prefix = resourceControlElement.getControlElementDeclaration().getPrefix(); // this.namespaceURI = resourceControlElement.getControlElementDeclaration().getNamespaceURI(); // this.documentElement = new ResourceElement(this,resourceControlElement); // // //// this.resourceDescriptor = CapoApplication.getDataManager().getResourceDescriptor(resourceControlElement, resourceControlElement.getAttributeValue(Attributes.uri)); //// this.resourceDescriptor.init(resourceControlElement.getParentGroup(),resourceControlElement.getLifeCycle(),resourceControlElement.getAttributeValue(Attributes.step).equalsIgnoreCase("true"),ResourceParameterBuilder.getResourceParameters(resourceControlElement.getControlElementDeclaration())); //// this.resourceDescriptor.open(resourceControlElement.getParentGroup()); //// resourceControlElement.setResourceDescriptor(this.resourceDescriptor); //// this.documentElement = new ResourceElement(this,resourceDescriptor); // resourceNodeList.add(documentElement); // } public void setContentOnly(boolean exportContentOnly) { this.exportContentOnly = exportContentOnly; } public boolean isContentOnly() { return exportContentOnly; } public void setFullDocument(boolean fullDocument) { this.fullDocument = fullDocument; } public boolean isFullDocument() { return fullDocument; } public boolean isIncludeAttributes() { return includeAttributes; } /** * This only takes effect when the document isn't a fullDocument * @param includeAttributes */ public void setIncludeAttributes(boolean includeAttributes) { this.includeAttributes = includeAttributes; } @Override public ResourceDescriptor getResourceDescriptor() { return new ResourceElementResourceDescriptor((ResourceElement) this.getDocumentElement()); } @Override public ResourceDescriptor getProxyedResourceDescriptor() { return this.resourceDescriptor; } @Override public ResourceControlElement getResourceControlElement() { return this.resourceControlElement; } public void setResourceControlElement(ResourceControlElement resourceControlElement) { this.resourceControlElement = resourceControlElement; } @Override public ResourceDocument getOwnerResourceDocument() { return this; } public ResourceElement createResourceElement(String localName, CElement content,ContentMetaData contentMetaData) { return new ResourceElement(this, localName, content, contentMetaData); } public static Document export(Node node, boolean contentOnly) throws Exception { ResourceNode resourceNode = (ResourceNode) node; resourceNode.getOwnerResourceDocument().setContentOnly(contentOnly); TransformerFactory tFactory = TransformerFactory.newInstance(); DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); documentBuilderFactory.setNamespaceAware(true); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document indentityTransforDocument = documentBuilder.parse(ClassLoader.getSystemResource("defaults/identity_transform.xsl").openStream()); Transformer transformer = tFactory.newTransformer(new DOMSource(indentityTransforDocument)); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //transformer.setOutputProperty(SaxonOutputKeys.INDENT_SPACES,"4"); DOMResult domResult = new DOMResult(); transformer.transform(new DOMSource(node), domResult); resourceNode.getOwnerResourceDocument().setContentOnly(false); return (Document) domResult.getNode(); } }