- preliminary support for callouts using xsd:include. rewriting links in the schema now to point at the virtualization server. not the best solution. but i couldn't get LSResourceResolver to work (would have been the elegant solution) since i don't have access to the DOMConfiguration object within chiba - works great in the schemaformbuilder.

- sample implementation of a callout in the alfresco sample website; using a jsp to produce an included xsd that lists all available company_footer.xmls
- moving stuff around.  XFormsbean is now in the xforms package rather than ajax package - more relevant to that codebase.
- consolidating SchemaFormBuilder into one class since the inheritance hierarchy made very little sense. 
- refactored some of the sample website to reduce java code in the jsps and begining to think about a generic utility library for callouts and jsps that want to access templating generated data.



git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/BRANCHES/WCM-DEV2/root@3957 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Ariel Backenroth
2006-09-28 04:06:01 +00:00
parent 280cff0999
commit 0f2bf9a3e0
26 changed files with 1294 additions and 1471 deletions

View File

@@ -67,7 +67,7 @@
<from-email-address>alfresco@alfresco.org</from-email-address>
<!-- WCM domain and port for virtualisation server -->
<wcm-domain>alfresco.dyndns.org</wcm-domain>
<wcm-domain>arielbackenroth.dyndns.org</wcm-domain>
<wcm-port>8180</wcm-port>
</client>
</config>

View File

@@ -104,6 +104,13 @@
</target>
<target name="sample-website" depends="init">
<javac srcdir="source/test-resources/websites/alfresco/ROOT/WEB-INF/classes"
classpathref="classpath.compile"/>
<mkdir dir="source/test-resources/websites/alfresco/ROOT/WEB-INF/lib"/>
<jar basedir="source/test-resources/websites/alfresco/ROOT/WEB-INF/classes"
destfile="source/test-resources/websites/alfresco/ROOT/WEB-INF/lib/alfresco-sample-website.jar"
includes="**/*.class"/>
<mkdir dir="${dir.dist}"/>
<zip destfile="${dir.dist}/alfresco-sample-website.zip"
basedir="source/test-resources/websites/alfresco/"
excludes="**/.svn"/>

View File

@@ -67,16 +67,31 @@ public final class AVMConstants
public static String buildAVMStoreUrl(String store)
{
if (store.indexOf(":") > 0)
store = store.substring(0, store.indexOf(':'));
ClientConfigElement config = Application.getClientConfig(FacesContext.getCurrentInstance());
return MessageFormat.format(PREVIEW_SANDBOX_URL, lookupStoreDNS(store), config.getWCMDomain(), config.getWCMPort());
}
public static String buildAVMAssetUrl(String store, String assetPath)
{
if (assetPath.startsWith('/' + DIR_APPBASE + '/' + DIR_WEBAPPS))
assetPath = assetPath.substring(('/' + DIR_APPBASE + '/' + DIR_WEBAPPS).length());
if (assetPath.length() == 0 || assetPath.charAt(0) != '/')
assetPath = '/' + assetPath;
ClientConfigElement config = Application.getClientConfig(FacesContext.getCurrentInstance());
return MessageFormat.format(PREVIEW_ASSET_URL, lookupStoreDNS(store), config.getWCMDomain(), config.getWCMPort(), assetPath);
}
public static String buildAVMAssetUrl(final String avmPath)
{
final String[] s = avmPath.split(":");
if (s.length != 2)
throw new IllegalArgumentException("expected exactly one ':' in " + avmPath);
return AVMConstants.buildAVMAssetUrl(s[0], s[1]);
}
public static String lookupStoreDNS(String store)
{
String dns = null;
@@ -113,5 +128,5 @@ public final class AVMConstants
// URLs for preview of sandboxes and assets
public final static String PREVIEW_SANDBOX_URL = "http://www-{0}.avm.{1}:{2}";
public final static String PREVIEW_ASSET_URL = "http://www-{0}.avm.{1}:{2}/{3}";
public final static String PREVIEW_ASSET_URL = "http://www-{0}.avm.{1}:{2}{3}";
}

View File

@@ -81,7 +81,6 @@ public class CreateWebContentWizard extends BaseContentWizard
this.avmBrowseBean = avmBrowseBean;
}
// ------------------------------------------------------------------------------
// Wizard implementation

View File

@@ -35,7 +35,7 @@ public interface TemplateType
/** the xml schema for this template type */
public Document getSchema();
public String /* URI */ getSchemaURI();
// public String /* URI */ getSchemaURI();
// public void setSchemaNodeRef(final NodeRef nodeRef);
//

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.templating.xforms;
/**
* This exception is thrown when implementations of <code>SchemaFormBuilder</code>
* encounters an error building a form.
*
* @author Brian Dueck
*/
public class FormBuilderException
extends Exception
{
/**
* Creates a new instance of <code>FormBuilderException</code> without detail message.
*/
public FormBuilderException() { }
/**
* Constructs an instance of <code>FormBuilderException</code> with the specified detail message.
*
* @param msg the detail message.
*/
public FormBuilderException(String msg)
{
super(msg);
}
/**
* Constructs an instance of <code>FormBuilderException</code> with the specified root exception.
*
* @param x The root exception.
*/
public FormBuilderException(Exception x)
{
super(x);
}
}

View File

@@ -80,7 +80,8 @@ public class TemplateTypeImpl
final TemplatingService ts = TemplatingService.getInstance();
try
{
this.schema = ts.parseXML(this.schemaNodeRef);
//XXXarielb maybe cloneNode instead?
return /* this.schema = */ ts.parseXML(this.schemaNodeRef);
}
catch (Exception e)
{

View File

@@ -14,7 +14,7 @@
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.templating.xforms.schemabuilder;
package org.alfresco.web.templating.xforms;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

View File

@@ -14,7 +14,7 @@
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.bean.ajax;
package org.alfresco.web.templating.xforms;
import java.io.BufferedReader;
import java.io.IOException;
@@ -27,14 +27,16 @@ import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.context.ExternalContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.alfresco.web.bean.wcm.AVMConstants;
import org.alfresco.web.templating.*;
import org.alfresco.web.templating.xforms.*;
import org.alfresco.web.templating.xforms.schemabuilder.FormBuilderException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.alfresco.web.bean.wcm.AVMBrowseBean;
import org.alfresco.web.app.servlet.FacesHelper;
import org.chiba.xml.xforms.ChibaBean;
import org.chiba.xml.xforms.exception.XFormsException;
@@ -42,6 +44,8 @@ import org.chiba.xml.xforms.events.XFormsEvent;
import org.chiba.xml.xforms.events.XFormsEventFactory;
import org.w3c.dom.*;
import org.w3c.dom.bootstrap.DOMImplementationRegistry;
import org.w3c.dom.ls.*;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
@@ -85,20 +89,26 @@ public class XFormsBean
public void init()
throws XFormsException
{
LOGGER.debug("initializing " + this + " with tt " + tt.getName());
this.chibaBean = new ChibaBean();
final FacesContext facesContext = FacesContext.getCurrentInstance();
final ExternalContext externalContext = facesContext.getExternalContext();
final HttpServletRequest request = (HttpServletRequest)
externalContext.getRequest();
final HttpSession session = (HttpSession)
externalContext.getSession(true);
final AVMBrowseBean browseBean = (AVMBrowseBean)
session.getAttribute("AVMBrowseBean");
LOGGER.debug("avm cwd is " + browseBean.getCurrentPath());
XFormsBean.storeCookies(request.getCookies(), this.chibaBean);
try
{
LOGGER.debug("initializing " + this +
" with tt " + tt.getName());
//XXXarielb generalize this
final XFormsInputMethod tim = (XFormsInputMethod)
tt.getInputMethods().get(0);
final Document form = tim.getXForm(instanceData.getContent(), tt);
final Document form = this.buildXForm(instanceData.getContent(),
tt,
browseBean.getCurrentPath(),
request);
this.chibaBean.setXMLContainer(form);
final EventTarget et = (EventTarget)
@@ -244,6 +254,59 @@ public class XFormsBean
out.close();
}
private void rewriteInlineURIs(final Document schemaDocument,
final String cwdAvmPath)
{
final NodeList includes =
schemaDocument.getElementsByTagNameNS(SchemaFormBuilder.XMLSCHEMA_NS, "include");
LOGGER.debug("rewriting " + includes.getLength() + " includes");
for (int i = 0; i < includes.getLength(); i++)
{
final Element includeEl = (Element)includes.item(i);
if (includeEl.hasAttribute("schemaLocation"))
{
String uri = includeEl.getAttribute("schemaLocation");
final String baseURI = (uri.charAt(0) == '/'
? AVMConstants.buildAVMStoreUrl(cwdAvmPath)
: AVMConstants.buildAVMAssetUrl(cwdAvmPath));
LOGGER.debug("rewriting " + uri + " as " + (baseURI + uri));
includeEl.setAttribute("schemaLocation", baseURI + uri);
}
}
}
/**
* Generates the xforms based on the schema.
*/
private Document buildXForm(Document xmlContent,
final TemplateType tt,
final String cwdAvmPath,
final HttpServletRequest request)
throws FormBuilderException
{
final Document schemaDocument = tt.getSchema();
this.rewriteInlineURIs(schemaDocument, cwdAvmPath);
final String baseUrl = (request.getScheme() + "://" +
request.getServerName() + ':' +
request.getServerPort() +
request.getContextPath());
LOGGER.debug("using baseUrl " + baseUrl + " for schemaformbuilder");
final SchemaFormBuilder builder =
new SchemaFormBuilder("/ajax/invoke/XFormsBean.handleAction",
SchemaFormBuilder.SUBMIT_METHOD_POST,
new XHTMLWrapperElementsBuilder(),
baseUrl);
LOGGER.debug("building xform for schema " + tt.getName());
final Document result = builder.buildForm(xmlContent,
schemaDocument,
tt.getName());
LOGGER.debug("generated xform: " + result);
// LOGGER.debug(ts.writeXMLToString(result));
return result;
}
private Node getEventLog()
{
final TemplatingService ts = TemplatingService.getInstance();

View File

@@ -22,8 +22,6 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.ServletContext;
import org.alfresco.web.templating.*;
import org.alfresco.web.templating.xforms.schemabuilder.*;
import org.alfresco.web.bean.ajax.XFormsBean;
import org.chiba.xml.util.DOMUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -101,44 +99,4 @@ public class XFormsInputMethod
ts.writeXML(result, out);
}
private static String getDocumentElementNameNoNS(final Document d)
{
final Node n = d.getDocumentElement();
String name = n.getNodeName();
return name;
// String prefix = n.getPrefix();
// String namespace = n.getNamespaceURI();
// System.out.println("name " + name + " prefix " + prefix + " ns uri " + namespace);
// return name.replaceAll(".+\\:", "");
}
/**
* Generates the xforms based on the schema.
*/
public Document getXForm(Document xmlContent, final TemplateType tt)
throws FormBuilderException
{
final TemplatingService ts = TemplatingService.getInstance();
final FacesContext fc = FacesContext.getCurrentInstance();
final HttpServletRequest request = (HttpServletRequest)
fc.getExternalContext().getRequest();
final String baseUrl = (request.getScheme() + "://" +
request.getServerName() + ':' +
request.getServerPort() +
request.getContextPath());
LOGGER.debug("using baseUrl " + baseUrl + " for schemaformbuilder");
final SchemaFormBuilder builder =
new BaseSchemaFormBuilder(xmlContent,
"/ajax/invoke/XFormsBean.handleAction",
SchemaFormBuilder.SUBMIT_METHOD_POST,
new XHTMLWrapperElementsBuilder(),
baseUrl);
LOGGER.debug("building xform for schema " + tt.getName());
final Document result = builder.buildForm(tt);
LOGGER.debug("generated xform: " + result);
// LOGGER.debug(ts.writeXMLToString(result));
return result;
}
}

View File

@@ -14,7 +14,7 @@
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.templating.xforms.schemabuilder;
package org.alfresco.web.templating.xforms;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

View File

@@ -1,551 +0,0 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.templating.xforms.schemabuilder;
import org.apache.xerces.xs.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;
import java.util.*;
/*
* Search for TODO for things remaining to-do in this implementation.
*
* TODO: i18n/l10n of messages, hints, captions. Possibly leverage org.chiba.i18n classes.
* TODO: When Chiba supports itemset, use schema keyref and key constraints for validation.
* TODO: Add support for default and fixed values.
* TODO: Add support for use=prohibited.
*/
/**
* A concrete base implementation of the SchemaFormBuilder interface allowing
* an XForm to be automatically generated for an XML Schema definition.
*
* @author Brian Dueck
* @version $Id: BaseSchemaFormBuilder.java,v 1.19 2005/03/29 14:24:34 unl Exp $
*/
public class BaseSchemaFormBuilder
extends AbstractSchemaFormBuilder
implements SchemaFormBuilder {
/**
* Creates a new BaseSchemaFormBuilder object.
*
* @param instanceSource __UNDOCUMENTED__
* @param action __UNDOCUMENTED__
* @param submitMethod __UNDOCUMENTED__
* @param wrapper __UNDOCUMENTED__
*/
public BaseSchemaFormBuilder(final Document instanceDocument,
final String action,
final String submitMethod,
final WrapperElementsBuilder wrapper,
final String base)
{
super(instanceDocument,
action,
submitMethod,
wrapper,
base);
}
/**
* __UNDOCUMENTED__
*
* @param text __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public String createCaption(String text) {
// if the word is all upper case, then set to lower case and continue
if (text.equals(text.toUpperCase()))
text = text.toLowerCase();
String[] s = text.split("[-_\\ ]");
StringBuffer result = new StringBuffer();
for (int i = 0; i < s.length; i++)
{
if (i != 0)
result.append(' ');
if (s[i].length() > 1)
{
result.append(Character.toUpperCase(s[i].charAt(0)) +
s[i].substring(1, s[i].length()));
}
else
{
result.append(s[i]);
}
}
return result.toString();
}
/**
* __UNDOCUMENTED__
*
* @param attribute __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public String createCaption(XSAttributeDeclaration attribute) {
// TODO: Improve i18n/l10n of caption - may have to use
// a custom <appinfo> element in the XML Schema to do this.
//
return createCaption(attribute.getName());
}
public String createCaption(XSAttributeUse attribute) {
// TODO: Improve i18n/l10n of caption - may have to use
// a custom <appinfo> element in the XML Schema to do this.
//
return createCaption(attribute.getAttrDeclaration().getName());
}
/**
* __UNDOCUMENTED__
*
* @param element __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public String createCaption(XSElementDeclaration element) {
// TODO: Improve i18n/l10n of caption - may have to use
// a custom <appinfo> element in the XML Schema to do this.
//
return createCaption(element.getName());
}
/**
* __UNDOCUMENTED__
*
* @param element __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public String createCaption(XSObject element) {
// TODO: Improve i18n/l10n of caption - may have to use
// a custom <appinfo> element in the XML Schema to do this.
//
if (element instanceof XSElementDeclaration) {
return createCaption(((XSElementDeclaration) element).getName());
} else if (element instanceof XSAttributeDeclaration) {
return createCaption(((XSAttributeDeclaration) element).getName());
} else if (element instanceof XSAttributeUse) {
return createCaption(((XSAttributeUse) element).getAttrDeclaration().getName());
} else
LOGGER.warn("WARNING: createCaption: element is not an attribute nor an element: "
+ element.getClass().getName());
return null;
}
/**
* __UNDOCUMENTED__
*
* @param xForm __UNDOCUMENTED__
* @param caption __UNDOCUMENTED__
* @param controlType __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public Element createControlForAnyType(Document xForm,
String caption,
XSTypeDefinition controlType) {
Element control = xForm.createElementNS(SchemaFormBuilder.XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "textarea");
this.setXFormsId(control);
control.setAttributeNS(SchemaFormBuilder.CHIBA_NS,
SchemaFormBuilder.CHIBA_NS_PREFIX + "height",
"3");
//label
Element captionElement = (Element)
control.appendChild(xForm.createElementNS(SchemaFormBuilder.XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "label"));
this.setXFormsId(captionElement);
captionElement.appendChild(xForm.createTextNode(caption));
return control;
}
/**
* __UNDOCUMENTED__
*
* @param xForm __UNDOCUMENTED__
* @param caption __UNDOCUMENTED__
* @param controlType __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public Element createControlForAtomicType(Document xForm,
String caption,
XSSimpleTypeDefinition controlType) {
Element control;
//remove while select1 do not work correctly in repeats
if ("boolean".equals(controlType.getName()))
{
control = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "select1");
control.setAttributeNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "appearance",
"full");
this.setXFormsId(control);
Element item_true =
xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "item");
this.setXFormsId(item_true);
Element label_true =
xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "label");
this.setXFormsId(label_true);
Text label_true_text = xForm.createTextNode("true");
label_true.appendChild(label_true_text);
item_true.appendChild(label_true);
Element value_true =
xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "value");
this.setXFormsId(value_true);
Text value_true_text = xForm.createTextNode("true");
value_true.appendChild(value_true_text);
item_true.appendChild(value_true);
control.appendChild(item_true);
Element item_false =
xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "item");
this.setXFormsId(item_false);
Element label_false =
xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "label");
this.setXFormsId(label_false);
Text label_false_text = xForm.createTextNode("false");
label_false.appendChild(label_false_text);
item_false.appendChild(label_false);
Element value_false =
xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "value");
this.setXFormsId(value_false);
Text value_false_text = xForm.createTextNode("false");
value_false.appendChild(value_false_text);
item_false.appendChild(value_false);
control.appendChild(item_false);
}
else
{
control = xForm.createElementNS(XFORMS_NS, SchemaFormBuilder.XFORMS_NS_PREFIX + "input");
this.setXFormsId(control);
}
//label
Element captionElement = (Element)
control.appendChild(xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "label"));
this.setXFormsId(captionElement);
captionElement.appendChild(xForm.createTextNode(caption));
return control;
}
/**
* __UNDOCUMENTED__
*
* @param xForm __UNDOCUMENTED__
* @param controlType __UNDOCUMENTED__
* @param caption __UNDOCUMENTED__
* @param bindElement __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public Element createControlForEnumerationType(Document xForm,
XSSimpleTypeDefinition controlType,
String caption,
Element bindElement) {
// TODO: Figure out an intelligent or user determined way to decide between
// selectUI style (listbox, menu, combobox, radio) (radio and listbox best apply)
// Possibly look for special appInfo section in the schema and if not present default to comboBox...
//
// For now, use radio if enumValues < DEFAULT_LONG_LIST_MAX_SIZE otherwise use combobox
//
final StringList enumFacets = controlType.getLexicalEnumeration();
if (enumFacets.getLength() <= 0)
return null;
Element control = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "select1");
this.setXFormsId(control);
//label
Element captionElement1 = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "label");
control.appendChild(captionElement1);
this.setXFormsId(captionElement1);
captionElement1.appendChild(xForm.createTextNode(caption));
Element choices = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "choices");
this.setXFormsId(choices);
final List<String> enumValues = new ArrayList(enumFacets.getLength());
for (int i = 0; i < enumFacets.getLength(); i++)
{
enumValues.add(enumFacets.item(i));
}
control.setAttributeNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "appearance",
(enumFacets.getLength() < Long.parseLong(getProperty(SELECTONE_LONG_LIST_SIZE_PROP))
? getProperty(SELECTONE_UI_CONTROL_SHORT_PROP)
: getProperty(SELECTONE_UI_CONTROL_LONG_PROP)));
if (enumFacets.getLength() >= Long.parseLong(getProperty(SELECTONE_LONG_LIST_SIZE_PROP)))
{
// add the "Please select..." instruction item for the combobox
// and set the isValid attribute on the bind element to check for the "Please select..."
// item to indicate that is not a valid value
//
String pleaseSelect = "[Select1 " + caption + "]";
Element item = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "item");
this.setXFormsId(item);
choices.appendChild(item);
Element captionElement =
xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "label");
this.setXFormsId(captionElement);
item.appendChild(captionElement);
captionElement.appendChild(xForm.createTextNode(pleaseSelect));
Element value =
xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "value");
this.setXFormsId(value);
item.appendChild(value);
value.appendChild(xForm.createTextNode(pleaseSelect));
// not(purchaseOrder/state = '[Choose State]')
//String isValidExpr = "not(" + bindElement.getAttributeNS(XFORMS_NS,"nodeset") + " = '" + pleaseSelect + "')";
// ->no, not(. = '[Choose State]')
String isValidExpr = "not( . = '" + pleaseSelect + "')";
//check if there was a constraint
String constraint = bindElement.getAttributeNS(XFORMS_NS, "constraint");
constraint = (constraint != null && constraint.length() != 0
? constraint + " and " + isValidExpr
: isValidExpr);
bindElement.setAttributeNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "constraint",
constraint);
}
control.appendChild(choices);
this.addChoicesForSelectControl(xForm, choices, enumValues);
return control;
}
/**
* __UNDOCUMENTED__
*
* @param xForm __UNDOCUMENTED__
* @param listType __UNDOCUMENTED__
* @param caption __UNDOCUMENTED__
* @param bindElement __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public Element createControlForListType(final Document xForm,
final XSSimpleTypeDefinition listType,
final String caption,
final Element bindElement) {
XSSimpleTypeDefinition controlType = listType.getItemType();
final StringList enumFacets = controlType.getLexicalEnumeration();
if (enumFacets.getLength() <= 0)
return null;
Element control = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "select");
this.setXFormsId(control);
//label
Element captionElement = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "label");
control.appendChild(captionElement);
this.setXFormsId(captionElement);
captionElement.appendChild(xForm.createTextNode(caption));
List<String> enumValues = new ArrayList<String>(enumFacets.getLength());
for (int i = 0; i < enumFacets.getLength(); i++)
{
enumValues.add(enumFacets.item(i));
}
// TODO: Figure out an intelligent or user determined way to decide between
// selectUI style (listbox, menu, combobox, radio) (radio and listbox best apply)
// Possibly look for special appInfo section in the schema and if not present default to checkBox...
//
// For now, use checkbox if there are < DEFAULT_LONG_LIST_MAX_SIZE items, otherwise use long control
//
control.setAttributeNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "appearance",
(enumValues.size() < Long.parseLong(getProperty(SELECTMANY_LONG_LIST_SIZE_PROP))
? getProperty(SELECTMANY_UI_CONTROL_SHORT_PROP)
: getProperty(SELECTMANY_UI_CONTROL_LONG_PROP)));
Element choices = xForm.createElementNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "choices");
this.setXFormsId(choices);
control.appendChild(choices);
this.addChoicesForSelectControl(xForm, choices, enumValues);
return control;
}
/**
* __UNDOCUMENTED__
*
* @param xForm __UNDOCUMENTED__
* @param node __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public Element createHint(Document xForm, XSObject node)
{
XSAnnotation annotation = null;
if (node instanceof XSElementDeclaration)
annotation = ((XSElementDeclaration) node).getAnnotation();
else if (node instanceof XSAttributeDeclaration)
annotation = ((XSAttributeDeclaration) node).getAnnotation();
else if (node instanceof XSAttributeUse)
annotation =
((XSAttributeUse) node).getAttrDeclaration().getAnnotation();
return (annotation != null
? addHintFromDocumentation(xForm, annotation)
: null);
}
/**
* __UNDOCUMENTED__
*
* @param bindElement __UNDOCUMENTED__
*/
public void endBindElement(Element bindElement)
{
}
/**
* __UNDOCUMENTED__
*
* @param controlElement __UNDOCUMENTED__
* @param controlType __UNDOCUMENTED__
*/
public void endFormControl(final Element controlElement,
final XSTypeDefinition controlType,
final Occurs o)
{
}
/**
* __UNDOCUMENTED__
*
* @param groupElement __UNDOCUMENTED__
*/
public void endFormGroup(final Element groupElement,
final XSTypeDefinition controlType,
final Occurs o,
final Element modelSection)
{
}
/**
* __UNDOCUMENTED__
*
* @param bindElement __UNDOCUMENTED__
* @param controlType __UNDOCUMENTED__
* @param minOccurs __UNDOCUMENTED__
* @param maxOccurs __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public Element startBindElement(final Element bindElement,
final XSModel schema,
final XSTypeDefinition controlType,
final Occurs o)
{
// START WORKAROUND
// Due to a Chiba bug, anyType is not a recognized type name.
// so, if this is an anyType, then we'll just skip the type
// setting.
//
// type.getName() may be 'null' for anonymous types, so compare against
// static string (see bug #1172541 on sf.net)
if (!"anyType".equals(controlType.getName()))
{
Element enveloppe = bindElement.getOwnerDocument().getDocumentElement();
String typeName = this.getXFormsTypeName(enveloppe, schema, controlType);
if (typeName != null && typeName.length() != 0)
bindElement.setAttributeNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "type",
typeName);
}
bindElement.setAttributeNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "required",
o.minimum == 0 ? "false()" : "true()");
//no more minOccurs & maxOccurs element: add a constraint if maxOccurs>1:
//count(.) <= maxOccurs && count(.) >= minOccurs
String minConstraint = null;
String maxConstraint = null;
if (o.minimum > 1)
//if 0 or 1 -> no constraint (managed by "required")
minConstraint = "count(.) >= " + o.minimum;
if (o.maximum > 1)
//if 1 or unbounded -> no constraint
maxConstraint = "count(.) <= " + o.maximum;
final String constraint = (minConstraint != null && maxConstraint != null
? minConstraint + " and " + maxConstraint
: (minConstraint != null
? minConstraint
: maxConstraint));
if (constraint != null && constraint.length() != 0)
bindElement.setAttributeNS(XFORMS_NS,
SchemaFormBuilder.XFORMS_NS_PREFIX + "constraint",
constraint);
return bindElement;
}
/**
* __UNDOCUMENTED__
*
* @param controlElement __UNDOCUMENTED__
* @param controlType __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public Element startFormControl(Element controlElement,
XSTypeDefinition controlType)
{
return controlElement;
}
/**
* __UNDOCUMENTED__
*
* @param groupElement __UNDOCUMENTED__
* @param schemaElement __UNDOCUMENTED__
* @return __UNDOCUMENTED__
*/
public Element startFormGroup(Element groupElement,
XSElementDeclaration schemaElement)
{
return groupElement;
}
}

View File

@@ -1,85 +0,0 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.templating.xforms.schemabuilder;
/**
* This exception is thrown when implementations of <code>SchemaFormBuilder</code> encounters an
* error building a form.
*
* @author Brian Dueck
* @version $Id: FormBuilderException.java,v 1.4 2005/01/31 22:49:31 joernt Exp $
*/
public class FormBuilderException extends java.lang.Exception {
private Exception cause = null;
/**
* Creates a new instance of <code>FormBuilderException</code> without detail message.
*/
public FormBuilderException() {
}
/**
* Constructs an instance of <code>FormBuilderException</code> with the specified detail message.
*
* @param msg the detail message.
*/
public FormBuilderException(String msg) {
super(msg);
}
/**
* Constructs an instance of <code>FormBuilderException</code> with the specified root exception.
*
* @param x The root exception.
*/
public FormBuilderException(Exception x) {
//THIS DOES NOT WORK WITH JDK 1.3 CAUSE THIS IS NEW IN JDK 1.4
//super(x);
super(x.getMessage());
}
}
/*
$Log: FormBuilderException.java,v $
Revision 1.4 2005/01/31 22:49:31 joernt
added copyright notice
Revision 1.3 2004/08/15 14:14:07 joernt
preparing release...
-reformatted sources to fix mixture of tabs and spaces
-optimized imports on all files
Revision 1.2 2003/10/02 15:15:49 joernt
applied chiba jalopy settings to whole src tree
Revision 1.1 2003/07/12 12:22:48 joernt
package refactoring: moved from xforms.builder
Revision 1.1.1.1 2003/05/23 14:54:08 unl
no message
Revision 1.2 2003/02/19 09:09:15 soframel
print the exception's message
Revision 1.1 2002/12/11 14:50:42 soframel
transferred the Schema2XForms generator from chiba2 to chiba1
Revision 1.3 2002/06/11 17:13:03 joernt
commented out jdk 1.3 incompatible constructor-impl
Revision 1.2 2002/06/11 14:06:31 joernt
commented out the jdk 1.4 constructor
Revision 1.1 2002/05/22 22:24:34 joernt
Brian's initial version of schema2xforms builder
*/

View File

@@ -1,445 +0,0 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.templating.xforms.schemabuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.xerces.xs.*;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.transform.Source;
import java.util.Properties;
import org.alfresco.web.templating.*;
/**
* An object that implements this interface can build an XForm that conforms to
* the elements and attributes declared in an XML Schema.
*
* @author Brian Dueck
* @version $Id: SchemaFormBuilder.java,v 1.16 2005/02/10 13:24:57 joernt Exp $
*/
public interface SchemaFormBuilder
{
////////////////////////////////////////////////////////////////////////////
public static class Occurs
{
public final static int UNBOUNDED = -1;
public final int minimum;
public final int maximum;
public Occurs(final XSParticle particle)
{
if (particle == null)
{
this.minimum = 1;
this.maximum = 1;
}
else
{
this.minimum = particle.getMinOccurs();
this.maximum = (particle.getMaxOccursUnbounded()
? Occurs.UNBOUNDED
: particle.getMaxOccurs());
}
}
public Occurs(final int minimum)
{
this(minimum, UNBOUNDED);
}
public Occurs(final int minimum, final int maximum)
{
this.minimum = minimum;
this.maximum = maximum;
}
public boolean isUnbounded()
{
return this.maximum == UNBOUNDED;
}
public String toString()
{
return "minimum=" + minimum + ", maximum=" + maximum;
}
}
////////////////////////////////////////////////////////////////////////////
public final static Log LOGGER =
LogFactory.getLog(SchemaFormBuilder.class);
/**
* XMLSchema Instance Namespace declaration
*/
public static final String XMLSCHEMA_INSTANCE_NS =
"http://www.w3.org/2001/XMLSchema-instance";
/**
* XMLSchema instance prefix
*/
public static final String XMLSCHEMA_INSTANCE_NS_PREFIX = "xsi:";
/**
* XMLNS Namespace declaration.
*/
public static final String XMLNS_NAMESPACE_URI =
"http://www.w3.org/2000/xmlns/";
/**
* XML Namespace declaration
*/
public static final String XML_NAMESPACE_URI =
"http://www.w3.org/XML/1998/namespace";
/**
* XForms namespace declaration.
*/
public static final String XFORMS_NS =
"http://www.w3.org/2002/xforms";
/**
* XForms prefix
*/
public static final String XFORMS_NS_PREFIX = "xforms:";
/**
* Chiba namespace declaration.
*/
public static final String CHIBA_NS =
"http://chiba.sourceforge.net/xforms";
/**
* Chiba prefix
*/
public static final String CHIBA_NS_PREFIX = "chiba:";
/**
* XLink namespace declaration.
*/
public static final String XLINK_NS = "http://www.w3.org/1999/xlink";
/**
* Xlink prefix
*/
public static final String XLINK_NS_PREFIX = "xlink:";
/**
* XML Events namsepace declaration.
*/
public static final String XMLEVENTS_NS = "http://www.w3.org/2001/xml-events";
/**
* XML Events prefix
*/
public static final String XMLEVENTS_NS_PREFIX = "ev:";
/**
* Prossible values of the "@method" on the "submission" element
*/
public static final String SUBMIT_METHOD_POST = "post";
/**
* __UNDOCUMENTED__
*/
public static final String SUBMIT_METHOD_PUT = "put";
/**
* __UNDOCUMENTED__
*/
public static final String SUBMIT_METHOD_GET = "get";
/**
* __UNDOCUMENTED__
*/
public static final String SUBMIT_METHOD_FORM_DATA_POST = "form-data-post";
/**
* __UNDOCUMENTED__
*/
public static final String SUBMIT_METHOD_URLENCODED_POST =
"urlencoded-post";
/**
* Get the current set of properties used by implementations of SchemaFormBuilder.
*
* @return The list of properties.
*/
public Properties getProperties();
/**
* Sets the property to the specified value. If the property exists, its value is overwritten.
*
* @param key The implementation defined property key.
* @param value The value for the property.
*/
public void setProperty(String key, String value);
/**
* Gets the value for the specified property.
*
* @param key The implementation defined property key.
* @return The property value if found, or null if the property cannot be located.
*/
public String getProperty(String key);
/**
* Gets the value for the specified property, with a default if the property cannot be located.
*
* @param key The implementation defined property key.
* @param defaultValue This value will be returned if the property does not exists.
* @return The property value if found, or defaultValue if the property cannot be located.
*/
public String getProperty(String key, String defaultValue);
/**
* Generate the XForm based on a user supplied XML Schema.
*
* @param inputURI The document source for the XML Schema.
* @return The Document containing the XForm.
* @throws org.chiba.tools.schemabuilder.FormBuilderException
* If an error occurs building the XForm.
*/
public Document buildForm(final TemplateType tt)
throws FormBuilderException;
/**
* Creates a caption for the provided text extracted from the XML Schema.
* The implementation is responsible for reformatting the provided string to make it
* suitable to be displayed to users of the XForm. This typically includes translating
* XML tag name style identifiers (e.g. customerStreetAddress) into more reader friendly
* captions (e.g. Customer Street Address).
*
* @param text The string value to be reformatted for use as a caption.
* @return The caption.
*/
public String createCaption(String text);
/**
* Creates a caption for the provided XML Schema attribute.
* The implementation is responsible for providing an appropriate caption
* suitable to be displayed to users of the XForm. This typically includes translating
* XML tag name style identifiers (e.g. customerStreetAddress) into more reader friendly
* captions (e.g. Customer Street Address).
*
* @param attribute The XML schema attribute for which a caption is required.
* @return The caption.
*/
public String createCaption(XSAttributeDeclaration attribute);
/**
* Creates a caption for the provided XML Schema element.
* The implementation is responsible for providing an appropriate caption
* suitable to be displayed to users of the XForm. This typically includes translating
* XML tag name style identifiers (e.g. customerStreetAddress) into more reader friendly
* captions (e.g. Customer Street Address).
*
* @param element The XML schema element for which a caption is required.
* @return The caption.
*/
public String createCaption(XSElementDeclaration element);
/**
* Creates a form control for an XML Schema any type.
* <p/>
* This method is called when the form builder determines a form control is required for
* an any type.
* The implementation of this method is responsible for creating an XML element of the
* appropriate type to receive a value for <b>controlType</b>. The caller is responsible
* for adding the returned element to the form and setting caption, bind, and other
* standard elements and attributes.
*
* @param xForm The XForm document.
* @param controlType The XML Schema type for which the form control is to be created.
* @return The element for the form control.
*/
public Element createControlForAnyType(Document xForm,
String caption,
XSTypeDefinition controlType);
/**
* Creates a form control for an XML Schema simple atomic type.
* <p/>
* This method is called when the form builder determines a form control is required for
* an atomic type.
* The implementation of this method is responsible for creating an XML element of the
* appropriate type to receive a value for <b>controlType</b>. The caller is responsible
* for adding the returned element to the form and setting caption, bind, and other
* standard elements and attributes.
*
* @param xForm The XForm document.
* @param controlType The XML Schema type for which the form control is to be created.
* @return The element for the form control.
*/
public Element createControlForAtomicType(Document xForm,
String caption,
XSSimpleTypeDefinition controlType);
/**
* Creates a form control for an XML Schema simple type restricted by an enumeration.
* This method is called when the form builder determines a form control is required for
* an enumerated type.
* The implementation of this method is responsible for creating an XML element of the
* appropriate type to receive a value for <b>controlType</b>. The caller is responsible
* for adding the returned element to the form and setting caption, bind, and other
* standard elements and attributes.
*
* @param xForm The XForm document.
* @param controlType The XML Schema type for which the form control is to be created.
* @param caption The caption for the form control. The caller The purpose of providing the caption
* is to permit the implementation to add a <b>[Select1 .... ]</b> message that involves the caption.
* @param bindElement The bind element for this control. The purpose of providing the bind element
* is to permit the implementation to add a isValid attribute to the bind element that prevents
* the <b>[Select1 .... ]</b> item from being selected.
* @return The element for the form control.
*/
public Element createControlForEnumerationType(Document xForm,
XSSimpleTypeDefinition controlType,
String caption,
Element bindElement);
/**
* Creates a form control for an XML Schema simple list type.
* <p/>
* This method is called when the form builder determines a form control is required for
* a list type.
* The implementation of this method is responsible for creating an XML element of the
* appropriate type to receive a value for <b>controlType</b>. The caller is responsible
* for adding the returned element to the form and setting caption, bind, and other
* standard elements and attributes.
*
* @param xForm The XForm document.
* @param listType The XML Schema list type for which the form control is to be created.
* @param caption The caption for the form control. The caller The purpose of providing the caption
* is to permit the implementation to add a <b>[Select1 .... ]</b> message that involves the caption.
* @param bindElement The bind element for this control. The purpose of providing the bind element
* is to permit the implementation to add a isValid attribute to the bind element that prevents
* the <b>[Select1 .... ]</b> item from being selected.
* @return The element for the form control.
*/
public Element createControlForListType(Document xForm,
XSSimpleTypeDefinition listType,
String caption,
Element bindElement);
/**
* Creates a hint XML Schema annotated node (AttributeDecl or ElementDecl).
* The implementation is responsible for providing an xforms:hint element for the
* specified schemaNode suitable to be dsipalayed to users of the XForm. The caller
* is responsible for adding the returned element to the form.
* This typically includes extracting documentation from the element/attribute's
* annotation/documentation elements and/or extracting the same information from the
* element/attribute's type annotation/documentation.
*
* @param schemaNode The string value to be reformatted for use as a caption.
* @return The xforms:hint element. If a null value is returned a hint is not added.
*/
public Element createHint(Document xForm, XSObject schemaNode);
/**
* This method is invoked after the form builder is finished creating and processing
* a bind element. Implementations may choose to use this method to add/inspect/modify
* the bindElement prior to the builder moving onto the next bind element.
*
* @param bindElement The bind element being processed.
*/
public void endBindElement(Element bindElement);
/**
* This method is invoked after the form builder is finished creating and processing
* a form control. Implementations may choose to use this method to add/inspect/modify
* the controlElement prior to the builder moving onto the next control.
*
* @param controlElement The form control element that was created.
* @param controlType The XML Schema type for which <b>controlElement</b> was created.
*/
public void endFormControl(Element controlElement,
XSTypeDefinition controlType,
Occurs occurs);
/**
* __UNDOCUMENTED__
*
* @param groupElement __UNDOCUMENTED__
*/
public void endFormGroup(Element groupElement,
XSTypeDefinition controlType,
Occurs occurs,
Element modelSection);
/**
* Reset the SchemaFormBuilder to default values.
*/
public void reset();
/**
* This method is invoked after an xforms:bind element is created for the specified SimpleType.
* The implementation is responsible for setting setting any/all bind attributes
* except for <b>id</b> and <b>ref</b> - these have been automatically set
* by the caller (and should not be touched by implementation of startBindElement)
* prior to invoking startBindElement.
* The caller automatically adds the returned element to the model section of
* the form.
*
* @param bindElement The bindElement being processed.
* @param controlType XML Schema type of the element/attribute this bind is for.
* @param minOccurs The minimum number of occurences for this element/attribute.
* @param maxOccurs The maximum number of occurences for this element/attribute.
* @return The bind Element to use in the XForm - bindElement or a replacement.
*/
public Element startBindElement(Element bindElement,
XSModel schema,
XSTypeDefinition controlType,
Occurs occurs);
/**
* This method is invoked after the form builder creates a form control
* via a createControlForXXX() method but prior to decorating the form control
* with common attributes such as a caption, hint, help text elements,
* bind attributes, etc.
* The returned element is used in the XForm in place of controlElement.
* Implementations may choose to use this method to substitute controlElement
* with a different element, or perform any other processing on controlElement
* prior to it being added to the form.
*
* @param controlElement The form control element that was created.
* @param controlType The XML Schema type for which <b>controlElement</b> was created.
* @return The Element to use in the XForm - controlElement or a replacement.
*/
public Element startFormControl(Element controlElement,
XSTypeDefinition controlType);
/**
* This method is invoked after an xforms:group element is created for the specified
* ElementDecl. A group is created whenever an element is encountered in the XML Schema
* that contains other elements and attributes (complex types or mixed content types).
* The caller automatically adds the returned element to the XForm.
*
* @param groupElement The groupElement being processed.
* @param schemaElement The schemaElement for the group.
* @return The group Element to use in the XForm - groupElement or a replacement. If a null
* value is returned, the group is not created.
*/
public Element startFormGroup(Element groupElement,
XSElementDeclaration schemaElement);
}

View File

@@ -0,0 +1,40 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.pr;
public class CompanyFooterBean
{
private final String name;
private final String href;
public CompanyFooterBean(final String name,
final String href)
{
this.name = name;
this.href = href;
}
public String getName()
{
return this.name;
}
public String getHref()
{
return this.href;
}
}

View File

@@ -0,0 +1,58 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.pr;
import java.util.Date;
public class PressReleaseBean
{
private final String title;
private final String theAbstract;
private final Date launchDate;
private final String href;
public PressReleaseBean(final String title,
final String theAbstract,
final Date launchDate,
final String href)
{
this.title = title;
this.theAbstract = theAbstract;
this.launchDate = launchDate;
this.href = href;
}
public String getTitle()
{
return this.title;
}
public String getAbstract()
{
return this.theAbstract;
}
public Date getLaunchDate()
{
return this.launchDate;
}
public String getHref()
{
return this.href;
}
}

View File

@@ -0,0 +1,133 @@
/*
* Copyright (C) 2005 Alfresco, Inc.
*
* Licensed under the Mozilla Public License version 1.1
* with a permitted attribution clause. You may obtain a
* copy of the License at
*
* http://www.alfresco.org/legal/license.txt
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific
* language governing permissions and limitations under the
* License.
*/
package org.alfresco.web.pr;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import org.alfresco.jndi.*;
import org.alfresco.repo.avm.AVMRemote;
import org.alfresco.service.cmr.avm.AVMNodeDescriptor;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.text.*;
public class Util
{
public static List<PressReleaseBean> getPressReleases(final HttpServletRequest request,
final ServletContext servletContext)
throws Exception
{
final Map<String, Document> entries = Util.loadXMLDocuments(request,
servletContext,
"/media/releases/content",
"alfresco:press-release");
final List<PressReleaseBean> result = new ArrayList<PressReleaseBean>(entries.size());
for (Map.Entry<String, Document> entry : entries.entrySet() )
{
String fileName = entry.getKey();
Document d = entry.getValue();
Element t = (Element)d.getElementsByTagName("alfresco:title").item(0);
Element a = (Element)d.getElementsByTagName("alfresco:abstract").item(0);
Element dateEl = (Element)d.getElementsByTagName("alfresco:launch_date").item(0);
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateEl.getFirstChild().getNodeValue());
String href = "/media/releases/content/" + fileName;
href = href.replaceAll(".xml$", ".shtml");
result.add(new PressReleaseBean(t.getFirstChild().getNodeValue(),
a.getFirstChild().getNodeValue(),
date,
href));
}
return result;
}
public static List<CompanyFooterBean> getCompanyFooters(final HttpServletRequest request,
final ServletContext servletContext)
throws Exception
{
final Map<String, Document> entries = Util.loadXMLDocuments(request,
servletContext,
"/media/releases/content/company_footers",
"alfresco:company-footer");
final List<CompanyFooterBean> result = new ArrayList<CompanyFooterBean>(entries.size());
for (Map.Entry<String, Document> entry : entries.entrySet())
{
String fileName = entry.getKey();
Document d = entry.getValue();
Element n = (Element)d.getElementsByTagName("alfresco:name").item(0);
String href = "/media/releases/content/company_footers/" + fileName;
result.add(new CompanyFooterBean(n.getFirstChild().getNodeValue(),
href));
}
return result;
}
private static Map<String, Document> loadXMLDocuments(final HttpServletRequest request,
final ServletContext servletContext,
final String path,
final String documentElementNodeName)
throws Exception
{
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);
final DocumentBuilder db = dbf.newDocumentBuilder();
// The real_path will look somethign like this:
// /alfresco.avm/avm.alfresco.localhost/$-1$alfreco-guest-main:/appBase/avm_webapps/my_webapp
//
String real_path = servletContext.getRealPath(path);
// The avm_path to the root of the context will look something like this:
// alfreco-guest-main:/appBase/avm_webapps/my_webapp
//
String avm_path = real_path.substring(real_path.indexOf('$', real_path.indexOf('$') + 1) + 1);
avm_path = avm_path.replace('\\','/');
final AVMRemote avm_remote = AVMFileDirContext.getAVMRemote();
final Map<String, AVMNodeDescriptor> entries = avm_remote.getDirectoryListing(-1, avm_path);
Map<String, Document> result = new HashMap<String, Document>();
for (Map.Entry<String, AVMNodeDescriptor> entry : entries.entrySet() )
{
final String entry_name = entry.getKey();
AVMNodeDescriptor entry_node = entry.getValue();
if (entry_node.isFile())
{
final InputStream istream =
new AVMRemoteInputStream(avm_remote.getInputHandle(-1, avm_path + '/' + entry_name),
avm_remote );
try
{
final Document d = db.parse(istream);
if (documentElementNodeName.equals(d.getDocumentElement().getNodeName()))
result.put(entry_name, d);
}
catch (Throwable t)
{
t.printStackTrace();
}
finally
{
istream.close();
}
}
}
return result;
}
}

View File

@@ -9,11 +9,7 @@
<description>Alfresco Website</description>
<context-param>
<param-name>foor</param-name>
<param-value>bar</param-value>
<description>foo bar</description>
</context-param>
<!-- Faces Servlet -->
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>

View File

@@ -0,0 +1,25 @@
<jsp:directive.page language="java" contentType="text/html; charset=UTF-8"/>
<jsp:directive.page import="java.util.*"/>
<jsp:directive.page import="org.alfresco.web.pr.*"/>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:simpleType name="company-footer">
<xs:restriction base="xs:string">
<%
List<CompanyFooterBean> companyFooters = Util.getCompanyFooters(request, application);
for (CompanyFooterBean companyFooter : companyFooters)
{
%>
<xs:enumeration value="<%= companyFooter.getHref() %>">
<xs:annotation>
<xs:documentation><%= companyFooter.getName() %></xs:documentation>
</xs:annotation>
</xs:enumeration>
<%
}
%>
</xs:restriction>
</xs:simpleType>
</xs:schema>

View File

@@ -1,88 +1,7 @@
<jsp:directive.page import="java.io.*"/>
<jsp:directive.page import="java.util.*"/>
<jsp:directive.page import="org.alfresco.jndi.*"/>
<jsp:directive.page import="org.alfresco.repo.avm.AVMRemote"/>
<jsp:directive.page import="org.alfresco.service.cmr.avm.AVMNodeDescriptor"/>
<jsp:directive.page import="org.w3c.dom.*"/>
<jsp:directive.page import="javax.xml.parsers.*"/>
<jsp:directive.page language="java" contentType="text/html; charset=UTF-8"/>
<jsp:directive.page import="java.text.*"/>
<%!
class PressRelease
{
public final String title;
public final String theAbstract;
public final Date date;
public final String href;
public PressRelease(String title, String theAbstract, Date d, String href)
{
this.title = title;
this.theAbstract = theAbstract;
this.date = d;
this.href = href;
}
}
public List<PressRelease> getPressReleases(HttpServletRequest request, ServletContext servletContext, JspWriter out)
throws Exception
{
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setValidating(false);
final DocumentBuilder db = dbf.newDocumentBuilder();
// The real_path will look somethign like this:
// /alfresco.avm/avm.alfresco.localhost/$-1$alfreco-guest-main:/appBase/avm_webapps/my_webapp
//
String real_path = servletContext.getRealPath("/media/releases/content");
// The avm_path to the root of the context will look something like this:
// alfreco-guest-main:/appBase/avm_webapps/my_webapp
//
String avm_path = real_path.substring( real_path.indexOf('$', real_path.indexOf('$') + 1) + 1 );
avm_path = avm_path.replace('\\','/');
AVMRemote avm_remote = AVMFileDirContext.getAVMRemote();
Map< String, AVMNodeDescriptor> entries = avm_remote.getDirectoryListing(-1, avm_path);
List<PressRelease> result = new LinkedList<PressRelease>();
for ( Map.Entry<String, AVMNodeDescriptor> entry : entries.entrySet() )
{
String entry_name = entry.getKey();
AVMNodeDescriptor entry_node = entry.getValue();
if (entry_node.isFile())
{
InputStream istream = new AVMRemoteInputStream( avm_remote.getInputHandle( -1, avm_path + '/' + entry_name ), avm_remote );
try
{
Document d = db.parse(istream);
if ("alfresco:press-release".equals(d.getDocumentElement().getNodeName()))
{
Element t = (Element)d.getElementsByTagName("alfresco:title").item(0);
Element a = (Element)d.getElementsByTagName("alfresco:abstract").item(0);
Element dateEl = (Element)d.getElementsByTagName("alfresco:launch_date").item(0);
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(dateEl.getFirstChild().getNodeValue());
String href = "/media/releases/content/" + entry_name;
href = href.replaceAll(".xml$", ".shtml");
result.add(new PressRelease(t.getFirstChild().getNodeValue(),
a.getFirstChild().getNodeValue(),
date,
href));
}
}
catch (Throwable t)
{
t.printStackTrace();
}
finally
{
istream.close();
}
}
}
return result;
}
%>
<jsp:directive.page import="java.util.*"/>
<jsp:directive.page import="org.alfresco.web.pr.*"/>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
@@ -162,12 +81,12 @@ public List<PressRelease> getPressReleases(HttpServletRequest request, ServletCo
<h1>Alfresco Press Releases</h1>
<%
List<PressRelease> pressReleases = getPressReleases(request, application, out);
for (PressRelease pr : pressReleases)
List<PressReleaseBean> pressReleases = Util.getPressReleases(request, application);
for (PressReleaseBean pr : pressReleases)
{
%>
<h2 class="headline"><a href="<%= pr.href %>"><%= pr.title %></a></h2>
<p class="date"><%= DateFormat.getDateInstance(DateFormat.LONG).format(pr.date) %></p><p class="abstract"><%= pr.theAbstract %></p>
<h2 class="headline"><a href="<%= pr.getHref() %>"><%= pr.getTitle() %></a></h2>
<p class="date"><%= DateFormat.getDateInstance(DateFormat.LONG).format(pr.getLaunchDate()) %></p><p class="abstract"><%= pr.getAbstract() %></p>
<%
}
%>

View File

@@ -1,8 +1,10 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:alfresco="http://www.alfresco.org/alfresco"
xml:base="http://wacko.org"
targetNamespace="http://www.alfresco.org/alfresco"
elementFormDefault="qualified">
<xs:include schemaLocation="/GetCompanyFooterSimpleType"/>
<xs:element name="company-footer">
<xs:complexType>
<xs:sequence>

View File

@@ -3,6 +3,7 @@
xmlns:alfresco="http://www.alfresco.org/alfresco"
targetNamespace="http://www.alfresco.org/alfresco"
elementFormDefault="qualified">
<xs:include schemaLocation="/media/releases/get_company_footer_simple_type.jsp"/>
<xs:simpleType name="category">
<xs:restriction base="xs:string">
<xs:enumeration value="Product"/>
@@ -12,22 +13,6 @@
<xs:enumeration value="Training"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="company-footer">
<xs:restriction base="xs:string">
<xs:enumeration value="Activiti"/>
<xs:enumeration value="Alfresco"/>
<xs:enumeration value="Kofax"/>
<xs:enumeration value="Aarden Ringcroft"/>
<xs:enumeration value="PreVisor"/>
<xs:enumeration value="FileMark"/>
<xs:enumeration value="Red Herring"/>
<xs:enumeration value="Rivet Logic Corp."/>
<xs:enumeration value="Mayfield Fund"/>
<xs:enumeration value="Accel Partners"/>
<xs:enumeration value="BitRock"/>
<xs:enumeration value="aegif"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="press-release">
<xs:complexType>
<xs:sequence>

View File

@@ -87,9 +87,8 @@
</xsl:for-each>
<xsl:for-each select="/alfresco:press-release/alfresco:include_company_footer">
<xsl:variable name="cf-id"><xsl:value-of select="."/></xsl:variable>
<xsl:variable name="cf-url"><xsl:value-of select="concat('/media/releases/content/company_footers/', concat($cf-id, '.xml'))"/></xsl:variable>
<h2>About <xsl:value-of select="document($cf-url)/alfresco:company-footer/alfresco:name"/></h2>
<xsl:for-each select="document($cf-url)/alfresco:company-footer/alfresco:body">
<h2>About <xsl:value-of select="document($cf-id)/alfresco:company-footer/alfresco:name"/></h2>
<xsl:for-each select="document($cf-id)/alfresco:company-footer/alfresco:body">
<p><xsl:value-of select="." disable-output-escaping="yes"/></p>
</xsl:for-each>
</xsl:for-each>

View File

@@ -2545,8 +2545,7 @@
Bean that returns information on a node
</description>
<managed-bean-name>XFormsBean</managed-bean-name>
<managed-bean-class>org.alfresco.web.bean.ajax.XFormsBean</managed-bean-class>
<managed-bean-class>org.alfresco.web.templating.xforms.XFormsBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>

View File

@@ -18,6 +18,7 @@
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="/WEB-INF/alfresco.tld" prefix="a" %>
<%@ taglib uri="/WEB-INF/repo.tld" prefix="r" %>
<%@ page import="org.alfresco.web.bean.wcm.AVMConstants" %>
<%@ page import="org.alfresco.web.app.Application" %>
<%@ page import="org.alfresco.web.templating.*" %>
<%@ page import="org.alfresco.web.bean.wcm.CreateWebContentWizard" %>
@@ -57,25 +58,4 @@ dojo.addOnLoad(function()
addSubmitHandlerToButton(document.getElementById("wizard:next-button"));
addSubmitHandlerToButton(document.getElementById("wizard:finish-button"));
});
//
//var baseOnClick = b.onclick;
//b.onclick = function()
//{
// if (!document.submitTrigger.done)
// {
// document.submitTrigger.buttonClick();
// return false;
// }
// else
// {
// return baseOnClick();
// }
//}
//});
//function doSubmit()
//{
//var b = document.getElementById("wizard:next-button");
//b.click();
//}
</script>