removing temp file write in generating xform - instead passing a downloadable url to the schema (which includes the users ticket).

removing xmlbeans - replacing with a super simple and minimal implementation of default xml instance generation (which supports default values).



git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3907 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Ariel Backenroth
2006-09-24 15:44:13 +00:00
parent bbc92c8143
commit de3e2ef435
9 changed files with 893 additions and 1103 deletions

View File

@@ -8,8 +8,6 @@
<classpathentry combineaccessrules="false" kind="src" path="/Remote API"/> <classpathentry combineaccessrules="false" kind="src" path="/Remote API"/>
<classpathentry kind="lib" path="/3rd Party/lib/chiba/chiba-1.2.0.jar"/> <classpathentry kind="lib" path="/3rd Party/lib/chiba/chiba-1.2.0.jar"/>
<classpathentry kind="lib" path="/3rd Party/lib/commons/commons-httpclient-3.0.jar"/> <classpathentry kind="lib" path="/3rd Party/lib/commons/commons-httpclient-3.0.jar"/>
<classpathentry kind="lib" path="/3rd Party/lib/xmlbeans/xbean.jar"/>
<classpathentry kind="lib" path="/3rd Party/lib/xmlbeans/jsr173_1.0_api.jar"/>
<classpathentry kind="lib" path="/3rd Party/lib/commons/commons-jxpath-1.2.jar"/> <classpathentry kind="lib" path="/3rd Party/lib/commons/commons-jxpath-1.2.jar"/>
<classpathentry kind="lib" path="/3rd Party/lib/xerces-2.8.0/xml-apis.jar"/> <classpathentry kind="lib" path="/3rd Party/lib/xerces-2.8.0/xml-apis.jar"/>
<classpathentry kind="lib" path="/3rd Party/lib/xerces-2.8.0/xercesImpl.jar"/> <classpathentry kind="lib" path="/3rd Party/lib/xerces-2.8.0/xercesImpl.jar"/>

View File

@@ -42,7 +42,6 @@
<fileset dir="${dir.common.lib}/swarmcache" includes="*.jar" /> <fileset dir="${dir.common.lib}/swarmcache" includes="*.jar" />
<fileset dir="${dir.common.lib}/jbpm" includes="*.jar" /> <fileset dir="${dir.common.lib}/jbpm" includes="*.jar" />
<fileset dir="${dir.common.lib}/chiba" includes="*.jar" /> <fileset dir="${dir.common.lib}/chiba" includes="*.jar" />
<fileset dir="${dir.common.lib}/xmlbeans" includes="*.jar" />
<fileset dir="${dir.project.core}/build/dist" includes="${dir.name.core}.jar" /> <fileset dir="${dir.project.core}/build/dist" includes="${dir.name.core}.jar" />
<fileset dir="${dir.project.dependency}/build/dist" includes="${dir.name.dependency}.jar" /> <fileset dir="${dir.project.dependency}/build/dist" includes="${dir.name.dependency}.jar" />
<fileset dir="${dir.project.repository}/build/dist" includes="${dir.name.repository}.jar" /> <fileset dir="${dir.project.repository}/build/dist" includes="${dir.name.repository}.jar" />

View File

@@ -18,6 +18,7 @@ package org.alfresco.web.templating;
import org.w3c.dom.Document; import org.w3c.dom.Document;
import java.util.List; import java.util.List;
import java.net.URI;
import java.io.Serializable; import java.io.Serializable;
//import org.alfresco.service.cmr.repository.NodeRef; //import org.alfresco.service.cmr.repository.NodeRef;
@@ -34,13 +35,12 @@ public interface TemplateType
/** the xml schema for this template type */ /** the xml schema for this template type */
public Document getSchema(); public Document getSchema();
public String /* URI */ getSchemaURI();
// public void setSchemaNodeRef(final NodeRef nodeRef); // public void setSchemaNodeRef(final NodeRef nodeRef);
// //
// public NodeRef getSchemaNodeRef(); // public NodeRef getSchemaNodeRef();
/** Provides a sample xml file for the schema */
public Document getSampleXml(final String rootTagName);
//XXXarielb not used currently and not sure if it's necessary... //XXXarielb not used currently and not sure if it's necessary...
// public void addInputMethod(final TemplateInputMethod in); // public void addInputMethod(final TemplateInputMethod in);

View File

@@ -315,7 +315,9 @@ public final class TemplatingService implements Serializable
(n instanceof Document (n instanceof Document
? ((Document)n).getDocumentElement() ? ((Document)n).getDocumentElement()
: n).getNodeName() + : n).getNodeName() +
" to " + output); " to " + (output instanceof StringWriter
? "string"
: output));
final StringWriter sw = new StringWriter(); final StringWriter sw = new StringWriter();
t.transform(new DOMSource(n), new StreamResult(sw)); t.transform(new DOMSource(n), new StreamResult(sw));
LOGGER.debug(sw.toString()); LOGGER.debug(sw.toString());

View File

@@ -17,22 +17,16 @@
package org.alfresco.web.templating.xforms; package org.alfresco.web.templating.xforms;
import java.io.*; import java.io.*;
import java.net.URI;
import java.util.*; import java.util.*;
import javax.xml.parsers.ParserConfigurationException;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.util.TempFileProvider;
import org.alfresco.web.templating.*;
import org.alfresco.web.templating.xforms.schemabuilder.FormBuilderException;
import org.apache.xmlbeans.*;
import org.apache.xmlbeans.impl.xsd2inst.SampleXmlUtil;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
import org.alfresco.model.ContentModel; import org.alfresco.model.ContentModel;
import org.alfresco.service.cmr.repository.NodeRef;
import org.alfresco.web.app.servlet.DownloadContentServlet;
import org.alfresco.web.templating.*;
import org.apache.commons.logging.Log; import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.w3c.dom.*;
import org.xml.sax.SAXException;
public class TemplateTypeImpl public class TemplateTypeImpl
implements TemplateType implements TemplateType
@@ -64,6 +58,21 @@ public class TemplateTypeImpl
return this.name; return this.name;
} }
public String /* URI */ getSchemaURI()
{
final javax.faces.context.FacesContext fc =
javax.faces.context.FacesContext.getCurrentInstance();
final javax.servlet.http.HttpSession session = (javax.servlet.http.HttpSession)
fc.getExternalContext().getSession(true);
org.alfresco.web.bean.repository.User user = (org.alfresco.web.bean.repository.User)
session.getAttribute(org.alfresco.web.app.servlet.AuthenticationHelper.AUTHENTICATION_USER);
String result = DownloadContentServlet.generateDownloadURL(this.schemaNodeRef, this.name + ".xsd");
result += "?ticket=" + user.getTicket();
return result;
}
public Document getSchema() public Document getSchema()
{ {
if (this.schema == null) if (this.schema == null)
@@ -81,108 +90,6 @@ public class TemplateTypeImpl
return this.schema; return this.schema;
} }
public Document getSampleXml(final String rootTagName)
{
XmlOptions xmlOptions = new XmlOptions();
xmlOptions = xmlOptions.setLoadLineNumbers().setLoadMessageDigest();
final XmlObject[] schemas = new XmlObject[1];
try
{
schemas[0] = XmlObject.Factory.parse(this.getSchema(), xmlOptions);
}
catch (XmlException xmle)
{
LOGGER.error(xmle);
}
final XmlOptions compileOptions = new XmlOptions();
compileOptions.setCompileDownloadUrls();
compileOptions.setCompileNoPvrRule();
compileOptions.setCompileNoUpaRule();
SchemaTypeSystem sts = null;
try
{
sts = XmlBeans.compileXsd(schemas,
XmlBeans.getBuiltinTypeSystem(),
compileOptions);
}
catch (XmlException xmle)
{
LOGGER.error(xmle);
}
if (sts == null)
{
throw new NullPointerException("No Schemas to process.");
}
final SchemaType[] globalElems = sts.documentTypes();
SchemaType elem = null;
for (int i = 0; i < globalElems.length; i++)
{
if (rootTagName.equals(globalElems[i].getDocumentElementName().getLocalPart()))
{
elem = globalElems[i];
break;
}
}
if (elem == null)
throw new NullPointerException("Could not find a global element with name \"" + rootTagName + "\"");
final String xmlString = SampleXmlUtil.createSampleForType(elem);
try
{
final TemplatingService ts = TemplatingService.getInstance();
final Document d = ts.parseXML(new ByteArrayInputStream(xmlString.getBytes()));
LOGGER.debug("sample xml:");
LOGGER.debug(ts.writeXMLToString(d));
TemplateTypeImpl.cleanUpSampleXml(d.getDocumentElement());
LOGGER.debug("cleaned up xml:");
LOGGER.debug(ts.writeXMLToString(d));
return d;
}
catch (ParserConfigurationException pce)
{
assert false : pce.getMessage();
return null;
}
catch (SAXException saxe)
{
assert false : saxe.getMessage();
return null;
}
catch (IOException ioe)
{
assert false : ioe.getMessage();
return null;
}
}
private static void cleanUpSampleXml(final Node n)
{
if (n instanceof CharacterData)
{
// System.out.println("replacing data " + ((CharacterData)n).getData());
((CharacterData)n).setData(" ");
}
else if (n instanceof Element)
{
final NamedNodeMap attrs = n.getAttributes();
for (int i = 0; i < attrs.getLength(); i++)
{
// System.out.println("not replacing data " + ((Attr)n).getValue());
// ((Attr)attrs.item(i)).setValue("");
}
}
final NodeList nl = n.getChildNodes();
for (int i = 0; i < nl.getLength(); i++)
{
TemplateTypeImpl.cleanUpSampleXml(nl.item(i));
}
}
public List<TemplateInputMethod> getInputMethods() public List<TemplateInputMethod> getInputMethods()
{ {
return INPUT_METHODS; return INPUT_METHODS;

View File

@@ -119,32 +119,27 @@ public class XFormsInputMethod
public Document getXForm(Document xmlContent, final TemplateType tt) public Document getXForm(Document xmlContent, final TemplateType tt)
throws FormBuilderException throws FormBuilderException
{ {
if (xmlContent == null)
xmlContent = tt.getSampleXml(tt.getName());
final TemplatingService ts = TemplatingService.getInstance(); final TemplatingService ts = TemplatingService.getInstance();
final FacesContext fc = FacesContext.getCurrentInstance(); final FacesContext fc = FacesContext.getCurrentInstance();
final HttpServletRequest request = (HttpServletRequest) final HttpServletRequest request = (HttpServletRequest)
fc.getExternalContext().getRequest(); fc.getExternalContext().getRequest();
final String baseUrl = (request.getScheme() + "://" + final String baseUrl = (request.getScheme() + "://" +
request.getServerName() + ':' + request.getServerName() + ':' +
request.getServerPort()); request.getServerPort() +
request.getContextPath());
LOGGER.debug("using baseUrl " + baseUrl + " for schemaformbuilder"); LOGGER.debug("using baseUrl " + baseUrl + " for schemaformbuilder");
final SchemaFormBuilder builder = final SchemaFormBuilder builder =
new BaseSchemaFormBuilder(tt.getName(), new BaseSchemaFormBuilder(tt.getName(),
xmlContent, xmlContent,
request.getContextPath() + "/ajax/invoke/XFormsBean.handleAction", "/ajax/invoke/XFormsBean.handleAction",
SchemaFormBuilder.SUBMIT_METHOD_POST, SchemaFormBuilder.SUBMIT_METHOD_POST,
new XHTMLWrapperElementsBuilder(), new XHTMLWrapperElementsBuilder(),
null, baseUrl);
baseUrl,
true);
LOGGER.debug("building xform for schema " + tt.getName()); LOGGER.debug("building xform for schema " + tt.getName());
final Document result = builder.buildForm(tt); //schemaFile.getPath()); final Document result = builder.buildForm(tt);
LOGGER.debug("generated xform:"); LOGGER.debug("generated xform: " + result);
LOGGER.debug(ts.writeXMLToString(result)); // LOGGER.debug(ts.writeXMLToString(result));
// xmlContentFile.delete();
// schemaFile.delete();
return result; return result;
} }
} }

View File

@@ -51,24 +51,20 @@ public class BaseSchemaFormBuilder
* @param action __UNDOCUMENTED__ * @param action __UNDOCUMENTED__
* @param submitMethod __UNDOCUMENTED__ * @param submitMethod __UNDOCUMENTED__
* @param wrapper __UNDOCUMENTED__ * @param wrapper __UNDOCUMENTED__
* @param stylesheet __UNDOCUMENTED__
*/ */
public BaseSchemaFormBuilder(String rootTagName, public BaseSchemaFormBuilder(final String rootTagName,
Document instanceDocument, final Document instanceDocument,
String action, final String action,
String submitMethod, final String submitMethod,
WrapperElementsBuilder wrapper, final WrapperElementsBuilder wrapper,
String stylesheet, final String base)
String base, {
boolean userSchemaTypes) {
super(rootTagName, super(rootTagName,
instanceDocument, instanceDocument,
action, action,
submitMethod, submitMethod,
wrapper, wrapper,
stylesheet, base);
base,
userSchemaTypes);
} }
/** /**
@@ -493,8 +489,9 @@ public class BaseSchemaFormBuilder
* @param maxOccurs __UNDOCUMENTED__ * @param maxOccurs __UNDOCUMENTED__
* @return __UNDOCUMENTED__ * @return __UNDOCUMENTED__
*/ */
public Element startBindElement(Element bindElement, public Element startBindElement(final Element bindElement,
XSTypeDefinition controlType, final XSModel schema,
final XSTypeDefinition controlType,
final Occurs o) final Occurs o)
{ {
// START WORKAROUND // START WORKAROUND
@@ -507,7 +504,7 @@ public class BaseSchemaFormBuilder
if (!"anyType".equals(controlType.getName())) if (!"anyType".equals(controlType.getName()))
{ {
Element enveloppe = bindElement.getOwnerDocument().getDocumentElement(); Element enveloppe = bindElement.getOwnerDocument().getDocumentElement();
String typeName = this.getXFormsTypeName(enveloppe, controlType); String typeName = this.getXFormsTypeName(enveloppe, schema, controlType);
if (typeName != null && typeName.length() != 0) if (typeName != null && typeName.length() != 0)
bindElement.setAttributeNS(XFORMS_NS, bindElement.setAttributeNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "type", SchemaFormBuilder.XFORMS_NS_PREFIX + "type",
@@ -567,11 +564,6 @@ public class BaseSchemaFormBuilder
public Element startFormGroup(Element groupElement, public Element startFormGroup(Element groupElement,
XSElementDeclaration schemaElement) XSElementDeclaration schemaElement)
{ {
//groupElement.setAttributeNS(CHIBA_NS,getChibaNSPrefix() + "box-align",getProperty(GROUP_BOX_ALIGN_PROP));
//groupElement.setAttributeNS(CHIBA_NS,getChibaNSPrefix() + "box-orient",getProperty(GROUP_BOX_ORIENT_PROP));
//groupElement.setAttributeNS(CHIBA_NS,getChibaNSPrefix() + "caption-width",getProperty(GROUP_CAPTION_WIDTH_PROP));
//groupElement.setAttributeNS(CHIBA_NS,getChibaNSPrefix() + "width",getProperty(GROUP_WIDTH_PROP));
//groupElement.setAttributeNS(CHIBA_NS,getChibaNSPrefix() + "border",getProperty(GROUP_BORDER_PROP));
return groupElement; return groupElement;
} }
} }

View File

@@ -96,7 +96,7 @@ public interface SchemaFormBuilder
"http://www.w3.org/2001/XMLSchema-instance"; "http://www.w3.org/2001/XMLSchema-instance";
/** /**
* XMLSchema instance prefix * * XMLSchema instance prefix
*/ */
public static final String XMLSCHEMA_INSTANCE_NS_PREFIX = "xsi:"; public static final String XMLSCHEMA_INSTANCE_NS_PREFIX = "xsi:";
@@ -180,20 +180,6 @@ public interface SchemaFormBuilder
public static final String SUBMIT_METHOD_URLENCODED_POST = public static final String SUBMIT_METHOD_URLENCODED_POST =
"urlencoded-post"; "urlencoded-post";
/**
* __UNDOCUMENTED__
*
* @return __UNDOCUMENTED__
*/
public String getAction();
/**
* __UNDOCUMENTED__
*
* @return __UNDOCUMENTED__
*/
public Document getInstanceDocument();
/** /**
* Get the current set of properties used by implementations of SchemaFormBuilder. * Get the current set of properties used by implementations of SchemaFormBuilder.
* *
@@ -226,24 +212,6 @@ public interface SchemaFormBuilder
*/ */
public String getProperty(String key, String defaultValue); public String getProperty(String key, String defaultValue);
/**
* Properties choosed by the user
*/
public String getRootTagName();
/**
* __UNDOCUMENTED__
*
* @return __UNDOCUMENTED__
*/
public String getStylesheet();
/**
* __UNDOCUMENTED__
*
* @return __UNDOCUMENTED__
*/
public String getSubmitMethod();
/** /**
* Generate the XForm based on a user supplied XML Schema. * Generate the XForm based on a user supplied XML Schema.
@@ -440,6 +408,7 @@ public interface SchemaFormBuilder
* @return The bind Element to use in the XForm - bindElement or a replacement. * @return The bind Element to use in the XForm - bindElement or a replacement.
*/ */
public Element startBindElement(Element bindElement, public Element startBindElement(Element bindElement,
XSModel schema,
XSTypeDefinition controlType, XSTypeDefinition controlType,
Occurs occurs); Occurs occurs);