[Yanel-commits] rev 46019 - in
public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources:
. rescreator
michi at wyona.com
michi at wyona.com
Mon Dec 14 14:15:32 CET 2009
Author: michi
Date: 2009-12-14 14:15:31 +0100 (Mon, 14 Dec 2009)
New Revision: 46019
Added:
public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/rescreator/ResourceCreatorResource.java
Removed:
public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java
Log:
moved into subdir such that it is unique
Deleted: public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java
===================================================================
--- public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java 2009-12-14 13:15:04 UTC (rev 46018)
+++ public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java 2009-12-14 13:15:31 UTC (rev 46019)
@@ -1,853 +0,0 @@
-/*
- * Copyright 2006 Wyona
- */
-
-package org.wyona.yanel.impl.resources;
-
-import org.wyona.yanel.core.Path;
-import org.wyona.yanel.core.Resource;
-import org.wyona.yanel.core.ResourceConfiguration;
-import org.wyona.yanel.core.ResourceTypeDefinition;
-import org.wyona.yanel.core.ResourceTypeRegistry;
-import org.wyona.yanel.core.api.attributes.CreatableV2;
-import org.wyona.yanel.core.api.attributes.ViewableV2;
-import org.wyona.yanel.core.attributes.viewable.View;
-import org.wyona.yanel.core.attributes.viewable.ViewDescriptor;
-import org.wyona.yanel.core.navigation.Node;
-import org.wyona.yanel.core.navigation.Sitetree;
-import org.wyona.yanel.core.serialization.SerializerFactory;
-import org.wyona.yanel.core.source.ResourceResolver;
-import org.wyona.yanel.core.transformation.I18nTransformer2;
-import org.wyona.yanel.core.transformation.XIncludeTransformer;
-import org.wyona.yanel.core.util.PathUtil;
-import org.wyona.yanel.core.util.ResourceAttributeHelper;
-
-import org.apache.log4j.Category;
-import org.apache.xml.resolver.tools.CatalogResolver;
-import org.apache.xml.serializer.Serializer;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.util.Enumeration;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.sax.SAXResult;
-import javax.xml.transform.sax.SAXTransformerFactory;
-import javax.xml.transform.sax.TransformerHandler;
-import javax.xml.transform.stream.StreamSource;
-
-import org.apache.avalon.framework.configuration.Configuration;
-import org.apache.avalon.framework.configuration.ConfigurationUtil;
-
-import org.w3c.dom.Document;
-import org.xml.sax.InputSource;
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLReaderFactory;
-
-/**
- *
- */
-public class ResourceCreatorResource extends Resource implements ViewableV2{
- private static Category log = Category.getInstance(ResourceCreatorResource.class);
- private boolean ajaxBrowser = false;
-
- /**
- *
- */
- public ResourceCreatorResource() {
- }
-
- /**
- *
- */
- public boolean exists() {
- return true;
- }
-
- /**
- *
- */
- public long getSize() {
- return -1;
- }
-
- /**
- *
- */
- public String getMimeType(String viewId) {
- if (viewId != null && viewId.equals("source")) return "application/xml";
- return "application/xhtml+xml";
- }
-
- /**
- *
- */
- public View getView(String viewId) {
- if(request.getHeader("User-Agent").indexOf("rv:1.7") < 0) {
- ajaxBrowser = true;
- }
-
- View view = new View();
- String mimeType = getMimeType(viewId);
- view.setMimeType(mimeType);
-
- try {
- org.wyona.yarep.core.Repository repo = getRealm().getRepository();
-
- if (viewId != null && viewId.equals("source")) {
- view.setInputStream(new java.io.StringBufferInputStream(getScreen()));
- view.setMimeType("application/xml");
- return view;
- }
-
- String[] xsltPath = getXSLTPath(getPath());
- if (xsltPath != null) {
- // create reader:
- XMLReader xmlReader = XMLReaderFactory.createXMLReader();
- CatalogResolver catalogResolver = new CatalogResolver();
- xmlReader.setEntityResolver(catalogResolver);
-
- // create xslt transformer:
- SAXTransformerFactory tf = (SAXTransformerFactory)TransformerFactory.newInstance();
-
- TransformerHandler[] xsltHandlers = new TransformerHandler[xsltPath.length];
- for (int i = 0; i < xsltPath.length; i++) {
- xsltHandlers[i] = tf.newTransformerHandler(new StreamSource(repo.getNode(xsltPath[i]).getInputStream()));
- xsltHandlers[i].getTransformer().setParameter("yanel.path.name", org.wyona.commons.io.PathUtil.getName(getPath()));
- xsltHandlers[i].getTransformer().setParameter("yanel.path", getPath());
- xsltHandlers[i].getTransformer().setParameter("yanel.back2context", PathUtil.backToContext(realm, getPath()));
- xsltHandlers[i].getTransformer().setParameter("yarep.back2realm", PathUtil.backToRealm(getPath()));
-
- xsltHandlers[i].getTransformer().setParameter("language", getRequestedLanguage());
- }
-
- // create i18n transformer:
- I18nTransformer2 i18nTransformer = new I18nTransformer2("global", getRequestedLanguage(), getRealm().getDefaultLanguage());
- i18nTransformer.setEntityResolver(catalogResolver);
-
- // create xinclude transformer:
- XIncludeTransformer xIncludeTransformer = new XIncludeTransformer();
- ResourceResolver resolver = new ResourceResolver(this);
- xIncludeTransformer.setResolver(resolver);
-
- // create serializer:
- Serializer serializer = SerializerFactory.getSerializer(SerializerFactory.XHTML_STRICT);
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
- // chain everything together (create a pipeline):
- xmlReader.setContentHandler(xsltHandlers[0]);
- for (int i=0; i<xsltHandlers.length-1; i++) {
- xsltHandlers[i].setResult(new SAXResult(xsltHandlers[i+1]));
- }
- xsltHandlers[xsltHandlers.length-1].setResult(new SAXResult(xIncludeTransformer));
- xIncludeTransformer.setResult(new SAXResult(i18nTransformer));
- i18nTransformer.setResult(new SAXResult(serializer.asContentHandler()));
- serializer.setOutputStream(baos);
-
- // execute pipeline:
- xmlReader.parse(new InputSource(new java.io.StringBufferInputStream(getScreen())));
-
- // write result into view:
- view.setInputStream(new ByteArrayInputStream(baos.toByteArray()));
- return view;
- }
- log.debug("Mime-Type: " + mimeType);
- view.setInputStream(new java.io.StringBufferInputStream(getScreen()));
- return view;
- } catch(Exception e) {
- log.error(e + " (" + getPath() + ", " + getRealm() + ")", e);
- }
-
- view.setInputStream(new java.io.StringBufferInputStream(getScreen()));
- return view;
- }
-
- /**
- *
- */
- public ViewDescriptor[] getViewDescriptors() {
- ViewDescriptor[] vd = new ViewDescriptor[2];
- vd[0] = new ViewDescriptor("default");
- vd[0].setMimeType(getMimeType(null));
- vd[1] = new ViewDescriptor("source");
- vd[1].setMimeType(getMimeType("source"));
- return vd;
- }
-
- /**
- * Generate XHTML screen
- */
- protected String getScreen() {
- StringBuffer sb = new StringBuffer("<?xml version=\"1.0\"?>");
- sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
- sb.append("<head><title>create resource</title>");
- sb.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + PathUtil.getResourcesHtdocsPath(this) + "css/resource-creator.css\"/>");
- sb.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-css/progressBar.css\"/>");
- sb.append("<script src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-js/prototype.js\" type=\"text/javascript\"></script>");
- sb.append("<script src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-js/progressBar.js\" type=\"text/javascript\"></script>");
- sb.append("<script src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-js/sorttable.js\" type=\"text/javascript\"></script>");
- sb.append("<script src=\"" + PathUtil.getResourcesHtdocsPath(this)+ "js/ajaxlookup.js\" type=\"text/javascript\"></script>");
- sb.append("</head>");
- sb.append("<body>");
-
- HttpServletRequest request = getEnvironment().getRequest();
- Enumeration parameters = request.getParameterNames();
- if (!parameters.hasMoreElements()) {
- getSelectResourceTypeScreen(sb);
- } else {
- if (request.getParameter("save-as") != null) {
- // NOTE: Save as has been merged with getResourceScreen because otherwise uploading of data would be rather cumbersome.
- //getSaveAsScreen(sb);
- getNoSuchScreen(sb);
- } else if (request.getParameter("save") != null) {
- getSaveScreen(sb);
- } else if (request.getParameter("lookup") != null) {
- return getLookUp().toString();
- } else if (request.getParameter("resource-type") != null) {
- getResourceScreen(sb);
- } else {
- log.info("Fallback ...");
- //getNoSuchScreen(sb);
- getSelectResourceTypeScreen(sb);
- }
- }
-
- sb.append("</body>");
- sb.append("</html>");
- return sb.toString();
- }
-
- /**
- *
- */
- private void getSelectResourceTypeScreen(StringBuffer sb) {
- sb.append("<h4>Create new page (step 0)</h4>");
- sb.append("<h2>Select template (resp. resource type)</h2>");
- sb.append("<form>");
-
- ResourceTypeRegistry rtr = new ResourceTypeRegistry();
-
- ResourceTypeDefinition[] rtds = getResourceTypeDefinitions();
- if (rtds != null) {
- sb.append("Template (resp. resource type): <select name=\"resource-type\">");
- for (int i = 0; i < rtds.length; i++) {
- try {
- Resource resource = rtr.newResource(rtds[i].getResourceTypeUniversalName());
- if (resource != null && ResourceAttributeHelper.hasAttributeImplemented(resource, "Creatable", "2")) {
- sb.append("<option value=\"" + rtds[i].getResourceTypeNamespace() + "::" + rtds[i].getResourceTypeLocalName() + "\">" + getDisplayName(rtds[i].getResourceTypeLocalName(), rtds[i].getResourceTypeNamespace()) + "</option>");
- } else {
- log.warn("Resource type: " + rtds[i] + " does not implement CreatableV2 interface!");
- }
- } catch(Exception e) {
- log.error(e);
- }
- }
-
- sb.append("</select>");
- } else {
- sb.append("<p>No resource types!</p>");
- }
- sb.append("<br/><input type=\"button\" name=\"Cancel\" value=\"Cancel\" onclick=\"location.href='" + getReferer() + "'\"/>");
- sb.append("<input type=\"hidden\" name=\"referer\" value=\"" + getReferer() + "\"/>");
- sb.append("<input type=\"submit\" name=\"Next\" value=\"Next\"/>");
- sb.append("</form>");
- }
-
- /**
- *
- */
- private void getNoSuchScreen(StringBuffer sb) {
- sb.append("<p>No such screen!</p>");
- }
-
- /**
- * Save screen
- */
- private void getSaveScreen(StringBuffer sb) {
- sb.append("<h4>Create new page (step 2)</h4>");
-
- Path pathOfNewResource = null;
- try {
- pathOfNewResource = create();
- } catch(Exception e) {
- log.warn(e.getMessage(), e);
- sb.append("<p>Exception: "+e.getMessage()+"</p>");
- sb.append("<a href=\"javascript:history.back()\">back</a>");
- return;
- }
-
- sb.append("<h2>Resource has been created</h2>");
-
- HttpServletRequest request = getRequest();
- Enumeration parameters = request.getParameterNames();
- if (parameters.hasMoreElements()) {
- sb.append("<ul>");
- while (parameters.hasMoreElements()) {
- String parameter = (String) parameters.nextElement();
- if (parameter.indexOf("rp.") == 0) {
- sb.append("<li>"+parameter+": "+request.getParameter(parameter)+"</li>");
- }
- }
- sb.append("</ul>");
- }
-
- if (log.isDebugEnabled()) log.debug("New Resource: " + PathUtil.backToRealm(getPath()) + ", " + pathOfNewResource);
- // NOTE: Back to realm has the form of ./ or ../ or ../../ etc., hence drop the leading slash!
- if (pathOfNewResource != null) {
- String href = PathUtil.backToRealm(getPath()) + pathOfNewResource.toString().substring(1);
- sb.append("<p>New resource can be accessed at: <a href=\"" + href + "\">" + href + "</a></p>");
- } else {
- sb.append("<p>Please note that no path/URL has been associated with the newly created resource, because it might be some internally used resource.</p>");
- }
- }
-
- /**
- *
- */
- private void getResourceScreen(StringBuffer sb) {
- String rtps = getRequest().getParameter("resource-type");
- String resNamespace = rtps.substring(0, rtps.indexOf("::"));
- String resName = rtps.substring(rtps.indexOf("::") + 2);
- ResourceTypeRegistry rtr = new ResourceTypeRegistry();
-
- if (getRequest().getParameter("create-new-folder") != null && !getRequest().getParameter("create-new-folder").equals("")) {
- try {
- create(getRequest().getParameter("create-new-folder"), getRequest().getParameter("lookin"), "http://www.wyona.org/yanel/resource/1.0::directory");
- } catch (Exception e) {
- sb.append("<p>Could not create folder. Exception: " + e + "</p>");
- log.error(e.getMessage(), e);
- }
- }
-
-
- try {
- String universalName = "<{"+ resNamespace +"}"+ resName +"/>";
- log.debug("Universal Name: " + universalName);
- Resource resource = rtr.newResource(universalName);
- if (resource != null) {
- if (ResourceAttributeHelper.hasAttributeImplemented(resource, "Creatable", "2")) {
-
- sb.append("<h4>Create new page (step 1)</h4>");
- sb.append("<h2>Enter/Select template (resp. resource) specific parameters and \"Save As\"</h2>");
- sb.append("<form enctype=\"multipart/form-data\" method=\"post\">");
- sb.append("<p>Template (resp. resource type): " + resName + " ("+resNamespace+")</p>");
- // TODO: Add this parameter to the continuation within the session!
- sb.append("<input type=\"hidden\" name=\"resource-type\" value=\"" + rtps + "\"/>");
-
- Property[] defaultProperties = getDefaultProperties(resName, resNamespace);
- String[] propertyNames = ((CreatableV2) resource).getPropertyNames();
- if ((propertyNames != null && propertyNames.length > 0) || defaultProperties != null) {
- sb.append("<p>Resource specific properties:</p>");
- } else {
- sb.append("<p>No resource specific properties!</p>");
- }
-
- if (propertyNames != null && propertyNames.length > 0) {
- sb.append("<table border=\"1\">");
- for (int i = 0; i < propertyNames.length; i++) {
- sb.append("<tr><td>" + propertyNames[i] + ":   </td><td>");
- String propertyType = ((CreatableV2) resource).getPropertyType(propertyNames[i]);
- if (propertyType != null && propertyType.equals(CreatableV2.TYPE_UPLOAD)) {
- sb.append("<input type=\"file\" name=\"rp." + propertyNames[i] + "\"/><br/>");
- } else if (propertyType != null && propertyType.equals(CreatableV2.TYPE_SELECT)) {
- Object defaultValues = ((CreatableV2) resource).getProperty(propertyNames[i]);
- if (defaultValues instanceof java.util.HashMap) {
- sb.append("<select name=\"rp." + propertyNames[i] + "\">");
- sb.append(" <option value=\"*\">*</option>");
- sb.append(" <option value=\"public\">public</option>");
- sb.append(" <option value=\"private\">private</option>");
- sb.append("</select><br/>");
- } else {
- sb.append("Exception: Parameter doesn't seem to be a of type SELECT: " + propertyNames[i]);
- }
- } else if (propertyType != null && propertyType.equals(CreatableV2.TYPE_PASSWORD)) {
- //sb.append("<input type=\"file\" name=\"rp." + propertyNames[i] + "\"/><br/>");
- Object value = ((CreatableV2) resource).getProperty(propertyNames[i]);
- if (value == null) {
- sb.append("<input type=\"password\" name=\"rp." + propertyNames[i] + "\" value=\"\" size=\"60\"/><br/>");
- } else {
- sb.append("<input type=\"password\" name=\"rp." + propertyNames[i] + "\" value=\"" + value + "\" size=\"60\"/><br/>");
- }
- } else {
- log.debug("Let's assume the property is of type text ...");
- Object value = ((CreatableV2) resource).getProperty(propertyNames[i]);
- if (value == null) {
- sb.append("<input type=\"text\" name=\"rp." + propertyNames[i] + "\" value=\"\" size=\"60\"/><br/>");
- } else {
- sb.append("<input type=\"text\" name=\"rp." + propertyNames[i] + "\" value=\"" + value + "\" size=\"60\"/><br/>");
- }
- }
- sb.append("</td></tr>");
- }
- sb.append("</table>");
- }
- if (defaultProperties != null) {
- sb.append("<ul>");
- for (int i = 0; i < defaultProperties.length; i++) {
- sb.append("<li>");
- sb.append("Default property: " + defaultProperties[i]);
- sb.append("<input type=\"hidden\" name=\"rp." + defaultProperties[i].getName() + "\" value=\"" + defaultProperties[i].getValue() + "\"/>");
- sb.append("</li>");
- }
- sb.append("</ul>");
- }
-
- sb.append("<br/><br/>");
-
- sb.append("<div class=\"creatorFileBrowser\">");
- sb.append("<table>");
- sb.append("<tr><td colspan=\"2\" class=\"fileBrowserHead\">Save as:</td></tr>");
- sb.append("<tr><td colspan=\"2\">");
- sb.append("<div id=\"lookup\">");
- sb.append(getLookUp());
- sb.append("</div>");
- sb.append("</td></tr>");
- sb.append("<tr><td colspan=\"2\" class=\"fileBrowserNewName\">");
-
- String createName = getRequest().getParameter("create-name");
- if (createName != null) {
- sb.append("New name: <input type=\"text\" name=\"create-name\" value=\"" + createName + "\"/>");
- } else {
- sb.append("New name: <input type=\"text\" name=\"create-name\"/>");
- }
- sb.append("</td></tr>");
-
- sb.append("<tr>");
- sb.append("<td>");
- sb.append("<input type=\"button\" name=\"Cancel\" value=\"Cancel\" onclick=\"location.href='" + getReferer() + "'\"/>");
- sb.append("<input type=\"hidden\" name=\"referer\" value=\"" + getReferer() + "\"/>");
- sb.append("</td>");
- sb.append("<td align=\"right\">");
- sb.append("<input type=\"submit\" value=\"Save new resource\" name=\"save\"/>");
- sb.append("</td>");
- sb.append("</tr>");
- sb.append("</table>");
- sb.append("</div>");
-
- sb.append("</form>");
-
- // TODO: Display realm navigation (sitetree, topic map, ...) resp. introduce another step
- }
- }
- } catch (Exception e) {
- sb.append("<p>Exception: " + e + "</p>");
- log.error(e.getMessage(), e);
- }
- }
-
- /**
- * Creates new resource
- * @return Path of new resource
- */
- private Path create() throws Exception {
- return create(getRequest().getParameter("create-name"), getRequest().getParameter("lookin"), getRequest().getParameter("resource-type"));
- }
-
- /**
- * Creates new resource
- * @param String createName
- * @param String lookinPath
- * @param String resourceType
- * @return Path of new resource
- */
- private Path create(String createName, String lookinPath, String resourceType) throws Exception {
- if (resourceType == null) {
- log.error("No resource-type parameter specified!");
- return null;
- }
-
- org.wyona.yanel.core.map.Realm realm = getRealm();
- Path pathOfResourceCreator = new Path(getPath());
-
- org.wyona.commons.io.Path parent = new org.wyona.commons.io.Path(pathOfResourceCreator.toString()).getParent();
-
- Path pathOfNewResource = new Path(getParentOfNewResource(parent, lookinPath).toString() + createName);
-
- if (log.isDebugEnabled()) log.debug("Path of new resource: " + pathOfNewResource);
- pathOfNewResource = new Path(removeTooManySlashes(pathOfNewResource.toString()));
- if (log.isDebugEnabled()) log.debug("Path of new resource without too many slashes: " + pathOfNewResource);
-
- String rtps = resourceType;
- String resNamespace = rtps.substring(0, rtps.indexOf("::"));
- String resName = rtps.substring(rtps.indexOf("::") + 2);
- Resource newResource = yanel.getResourceManager().getResource(getEnvironment(), realm, pathOfNewResource.toString(), new ResourceConfiguration(resName, resNamespace, null));
-
- if (newResource != null) {
- if (ResourceAttributeHelper.hasAttributeImplemented(newResource, "Creatable", "2")) {
- createName = ((CreatableV2) newResource).getCreateName(createName);
- if (createName != null && createName.equals("")) {
- throw new Exception("Please enter a name!");
- }
- if (createName == null) {
- pathOfNewResource = null;
- newResource.setPath(null);
- } else {
- pathOfNewResource = new Path(removeTooManySlashes(getParentOfNewResource(parent, lookinPath).toString()) + createName);
- newResource.setPath(pathOfNewResource.toString());
- }
- ((CreatableV2) newResource).create(request);
- if (pathOfNewResource != null) {
- createResourceConfiguration(newResource);
- addToSitetree(newResource);
- }
- } else {
- throw new Exception("creation NOT successfull!");
- }
- } else {
- throw new Exception("creation NOT successful (newResource == null)!");
-
- }
- return pathOfNewResource;
- }
-
- /**
- * Add to sitetree
- */
- private void addToSitetree(Resource newResource) throws Exception {
- org.wyona.yanel.core.navigation.Sitetree sitetree = getRealm().getRepoNavigation();
- String parentPath = org.wyona.commons.io.PathUtil.getParent(newResource.getPath());
- org.wyona.yanel.core.navigation.Node parentNode = sitetree.getNode(getRealm(), parentPath);
- if (parentNode != null) {
- String nodeName = org.wyona.commons.io.PathUtil.getName(newResource.getPath());
- String label = nodeName;
- parentNode.appendChild(sitetree.createNode(nodeName, label));
- } else {
- log.error("No such node with path: " + parentPath);
- }
- }
-
- /**
- * Create resource configuration (yanel-rc)
- */
- private void createResourceConfiguration(Resource newResource) throws Exception {
- StringBuffer rcContent = new StringBuffer("<?xml version=\"1.0\"?>\n\n");
- rcContent.append("<yanel:resource-config xmlns:yanel=\"http://www.wyona.org/yanel/rti/1.0\">\n");
- rcContent.append("<yanel:rti name=\"" + newResource.getRTD().getResourceTypeLocalName() + "\" namespace=\"" + newResource.getRTD().getResourceTypeNamespace() + "\"/>\n\n");
- java.util.HashMap rtiProperties = ((CreatableV2) newResource).createRTIProperties(request);
- if (rtiProperties != null) {
- if (log.isDebugEnabled()) log.debug(rtiProperties + " " + PathUtil.getRTIPath(newResource.getPath()));
- java.util.Iterator iterator = rtiProperties.keySet().iterator();
- while (iterator.hasNext()) {
- String property = (String) iterator.next();
- String value = (String) rtiProperties.get(property);
- if (value != null) {
- rcContent.append("<yanel:property name=\"" + property + "\" value=\"" + value + "\"/>\n");
- if(log.isDebugEnabled()) log.debug("Set Property: " + property + ", " + value);
- } else {
- log.warn("Value of property '" + property + "' is null and won't be set within resource configuration: " + PathUtil.getRCPath(newResource.getPath()));
- }
- }
- } else {
- log.warn("No RTI properties: " + newResource.getPath());
- }
- rcContent.append("</yanel:resource-config>");
-
-
- org.wyona.yarep.core.Repository rcRepo = newResource.getRealm().getRTIRepository();
- org.wyona.commons.io.Path newRCPath = new org.wyona.commons.io.Path(PathUtil.getRCPath(newResource.getPath()));
- if (log.isDebugEnabled()) log.debug(newRCPath);
- org.wyona.yanel.core.util.YarepUtil.addNodes(rcRepo, newRCPath.toString(), org.wyona.yarep.core.NodeType.RESOURCE);
-
- java.io.Writer writer = new java.io.OutputStreamWriter(rcRepo.getNode(newRCPath.toString()).getOutputStream());
- writer.write(rcContent.toString());
- writer.close();
- }
-
- /**
- * Get resource type definitions
- */
- private ResourceTypeDefinition[] getResourceTypeDefinitions() {
- ResourceTypeRegistry rtr = new ResourceTypeRegistry();
- ResourceConfiguration rc = getConfiguration();
- Document customConfigDoc = rc.getCustomConfiguration();
- if (customConfigDoc != null) {
- Configuration config = ConfigurationUtil.toConfiguration(customConfigDoc.getDocumentElement());
- Configuration resourceTypesConfig = config.getChild("resource-types", false);
- if (resourceTypesConfig != null) {
- Configuration[] resourceTypeConfigs = resourceTypesConfig.getChildren("resource-type");
- if (resourceTypeConfigs.length == 0) return null;
- ResourceTypeDefinition[] rtds = new ResourceTypeDefinition[resourceTypeConfigs.length];
- for (int i = 0; i < resourceTypeConfigs.length; i++) {
- try {
- String universalName = "<{"+resourceTypeConfigs[i].getAttribute("namespace")+"}"+resourceTypeConfigs[i].getAttribute("name")+"/>";
- rtds[i] = rtr.getResourceTypeDefinition(universalName);
- log.debug("Resource Type: " + universalName);
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- return null;
- }
- }
- return rtds;
- }
- }
- ResourceTypeDefinition[] rtds = rtr.getResourceTypeDefinitions();
- return rtds;
- }
-
- /**
- * Get default properties from custom configuration
- */
- private Property[] getDefaultProperties(String resName, String resNamespace) {
- Document customConfigDoc = getConfiguration().getCustomConfiguration();
- if (customConfigDoc != null) {
- Configuration config = ConfigurationUtil.toConfiguration(customConfigDoc.getDocumentElement());
- Configuration resourceTypesConfig = config.getChild("resource-types", false);
- if (resourceTypesConfig != null) {
- Configuration[] resourceTypeConfigs = resourceTypesConfig.getChildren("resource-type");
- if (resourceTypeConfigs.length == 0) return null;
- for (int i = 0; i < resourceTypeConfigs.length; i++) {
- try {
- if (resourceTypeConfigs[i].getAttribute("namespace").equals(resNamespace) && resourceTypeConfigs[i].getAttribute("name").equals(resName)) {
- log.debug("Resource Type Found: " + resName + ", " + resNamespace);
- Configuration[] propertyConfigs = resourceTypeConfigs[i].getChildren("property");
- Property[] props = new Property[propertyConfigs.length];
- for (int k = 0; k < propertyConfigs.length; k++) {
- props[k] = new Property(propertyConfigs[k].getAttribute("name"), propertyConfigs[k].getAttribute("value"));
- log.debug("Property: " + props[k]);
- }
- return props;
- }
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- return null;
- }
- }
- }
- }
- return null;
- }
-
- /**
- * Get the display name from custom configuration
- */
- private String getDisplayName(String resName, String resNamespace) {
- Document customConfigDoc = getConfiguration().getCustomConfiguration();
- if (customConfigDoc != null) {
-
- try {
- org.jdom.Document jdomDocument = new org.jdom.input.DOMBuilder().build(customConfigDoc);
- org.jdom.xpath.XPath xpath = org.jdom.xpath.XPath.newInstance("/yanel:custom-config/rc:resource-types/rc:resource-type[@name='" + resName + "']/rc:display-name");
- xpath.addNamespace("yanel", "http://www.wyona.org/yanel/rti/1.0");
- xpath.addNamespace("rc", "http://www.wyona.org/yanel/resource/resource-creator/1.0");
- org.jdom.Element displayNameElement = (org.jdom.Element) xpath.selectSingleNode(jdomDocument);
- if (displayNameElement != null) {
- // TODO: It seems like document does not contain text nodes ...
- if (log.isDebugEnabled()) log.debug("Display name: " + displayNameElement + " :: " + displayNameElement.getText() + " :: " + displayNameElement.getName());
- return displayNameElement.getText();
- }
- log.warn("No display name: " + resName);
- return resName;
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- return resName;
- }
- }
- return resName;
- }
-
- /**
- * Return sitetree
- */
- private StringBuffer getLookUp() {
- StringBuffer sb = new StringBuffer("");
- //Sitetree sitetree = (Sitetree) getYanel().getBeanFactory().getBean("repo-navigation");
- Sitetree sitetree = getRealm().getRepoNavigation();
- Node node = null;
- String lookinPath = getRequest().getParameter("lookin");
- if (lookinPath != null) {
- node = sitetree.getNode(getRealm(), lookinPath);
- } else {
- node = sitetree.getNode(getRealm(), getPath());
- }
-
- if (node != null) {
- if (node.isCollection()) {
- if(log.isDebugEnabled()) log.debug("Is Collection: " + node.getName());
- } else if (node.isResource()) {
- if (log.isDebugEnabled()) log.debug("Is Resource: " + node.getName());
- node = node.getParent();
- } else {
- log.error("Neither collection nor resource: " + getPath());
- }
- } else {
- log.error("No such path '" + getPath() + "' within sitetree! Root node will be used.");
- node = sitetree.getNode(getRealm(), "/");
- }
-
- String rtps = getEnvironment().getRequest().getParameter("resource-type");
- String resNamespace = rtps.substring(0, rtps.indexOf("::"));
- String resName = rtps.substring(rtps.indexOf("::") + 2);
-
- sb.append("<table id=\"resourceCreatorSaveAsTable\">");
- sb.append("<tr><td>Look in: " + node.getPath() + "   </td><td>New folder: <input type=\"text\" name=\"create-new-folder\"/> <input type=\"image\" src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/folder-new.png\" alt=\"make a new folder\"/> ");
-
- String parent = "/";
- if (!node.getPath().equals("/")) {
- parent = new org.wyona.commons.io.Path(node.getPath()).getParent().toString();
-
- if (log.isDebugEnabled()) log.debug("Parent: " + parent);
-
- if (ajaxBrowser) {
- sb.append("<a href=\"JavaScript:ajaxlookup('" + resNamespace + "::" + resName + "', '" + parent + "')\"><img src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/go-up.png\" alt=\"go up\" border=\"0\"/></a>");
- } else {
- sb.append("<a href=\"?lookin=" + parent + "&resource-type=" + resNamespace + "::" + resName + "\"><img src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/go-up.png\" alt=\"go up\" border=\"0\"/></a>");
- }
- } else {
- // Do not display "go-up" if current node is root node
- }
-
- sb.append("</td></tr>");
-
- sb.append("<tr><td colspan=\"2\">");
-
- sb.append("<div id=\"lookupfiles\">");
- sb.append("<table id=\"lookupfilesTable\" class=\"sortable\">");
- sb.append("<thead>");
- sb.append("<tr><th>Type</th><th>Name</th><th>Resource Type</th></tr>");
- sb.append("</thead>");
- sb.append("<tbody>");
- Node[] children = node.getChildren();
- for (int i = 0; i < children.length; i++) {
- String resourceTypeName;
- try {
- resourceTypeName = yanel.getResourceManager().getResource(getEnvironment(), realm, children[i].getPath()).getResourceTypeLocalName();
- } catch (Exception e) {
- log.error(e.getMessage(), e);
- resourceTypeName = "?";
- }
- if (children[i].isCollection()) {
- // TODO: Also append resource specific parameters (AJAX ...)
- if (ajaxBrowser) {
- sb.append("<tr><td sorttable_customkey=\"Collection\"><a href=\"JavaScript:ajaxlookup('" + resNamespace + "::" + resName + "', '" + node.getPath() + children[i].getName() + "/')\"><img class=\"lookupicon\" src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/folder.png\" alt=\"Collection:\"/></a></td><td><a href=\"JavaScript:ajaxlookup('" + resNamespace + "::" + resName + "', '" + node.getPath() + children[i].getName() + "/')\">" + children[i].getName() + "</a></td><td>" + resourceTypeName + "</td></tr>");
- } else {
- sb.append("<tr><td sorttable_customkey=\"Collection\"><a href=\"?lookin=" + node.getPath() + children[i].getName() + "/&resource-type=" + resNamespace + "::" + resName + "\"><img class=\"lookupicon\" src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/folder.png\" alt=\"Collection:\"/></a></td><td><a href=\"?lookin=" + node.getPath() + children[i].getName() + "/&resource-type=" + resNamespace + "::" + resName + "\">" + children[i].getName() + "</a></td><td>" + resourceTypeName + "</td></tr>");
- }
- } else if (children[i].isResource()) {
- sb.append("<tr><td sorttable_customkey=\"Resource\"><img class=\"lookupicon\" src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/text-x-generic.png\" alt=\"Resource:\"/></td><td>"+children[i].getName()+"</td><td>" + resourceTypeName + "</td></tr>");
- } else {
- sb.append("<tr><td>?</td><td>"+children[i].getName()+"</td><td>-</td></tr>");
- }
- }
-
- sb.append("</tbody>");
- sb.append("</table>");
- sb.append("<input type=\"hidden\" name=\"lookin\" value=\"" + node.getPath() + "\"/>");
- sb.append("</div>");
- sb.append("</td></tr>");
-
-
- sb.append("</table>");
-
- return sb;
- }
-
- /**
- * Get XSLT path
- */
- private String[] getXSLTPath(String path) throws Exception {
- String[] xsltPath = getResourceConfigProperties("xslt");
- if (xsltPath != null && xsltPath.length > 0) return xsltPath;
- log.info("No XSLT Path within: " + path);
- return null;
- }
-
- /**
- * Remove slashes if there are too many, e.g. /foo//bar.html is being transformed into /foo/bar.html
- */
- private String removeTooManySlashes(String path) {
- StringBuffer sb = new StringBuffer();
- boolean previousCharWasSlash = false;
- for (int i = 0; i < path.length(); i++) {
- char c = path.charAt(i);
- if (c == '/' && previousCharWasSlash) {
- if (log.isDebugEnabled()) log.debug("Do not append this slash: " + i);
- } else {
- sb.append(c);
- }
- if (c == '/') {
- previousCharWasSlash = true;
- } else {
- previousCharWasSlash = false;
- }
- }
- return sb.toString();
- }
-
- private Path getParentOfNewResource(org.wyona.commons.io.Path parent, String lookinPath) {
- Path parentOfNewResource = null;
- if(parent.equals("null")) {
- // if pathOfResourceCreator is ROOT
- parentOfNewResource = new Path("/" + lookinPath + "/");
- } else if(parent.toString().equals("/")){
- parentOfNewResource = new Path(parent + "/" + lookinPath + "/");
- } else {
- parentOfNewResource = new Path("/" + lookinPath + "/");
- }
- return parentOfNewResource;
- }
-
- private String getReferer() {
- if(request.getParameter("referer") != null) {
- return request.getParameter("referer");
- }
- if(request.getHeader("referer") != null) {
- return replaceEntities(request.getHeader("referer"));
- }
- return PathUtil.backToRealm(getPath());
- }
-
- /**
- * Replaces some characters by their corresponding xml entities.
- * This method escapes those characters which must not occur in an xml text node.
- * @param string
- * @return escaped string
- */
- public String replaceEntities(String str) {
- // there may be some & and some & mixed in the input, so first transform all
- // & to & and then transform all & back to &
- // this way we don't get double escaped &amp;
- str = str.replaceAll("&", "&");
- str = str.replaceAll("&", "&");
- str = str.replaceAll("<", "<");
- return str;
- }
-}
-
-/**
- *
- */
-class Property {
-
- private String name;
- private String value;
-
- /**
- *
- */
- public Property(String name, String value) {
- this.name = name;
- this.value = value;
- }
-
- /**
- *
- */
- public String getName() {
- return name;
- }
-
- /**
- *
- */
- public String getValue() {
- return value;
- }
-
- /**
- *
- */
- public String toString() {
- return name + " = " + value;
- }
-}
Copied: public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/rescreator/ResourceCreatorResource.java (from rev 45999, public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java)
===================================================================
--- public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/rescreator/ResourceCreatorResource.java (rev 0)
+++ public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/rescreator/ResourceCreatorResource.java 2009-12-14 13:15:31 UTC (rev 46019)
@@ -0,0 +1,853 @@
+/*
+ * Copyright 2006 Wyona
+ */
+
+package org.wyona.yanel.impl.resources;
+
+import org.wyona.yanel.core.Path;
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.ResourceConfiguration;
+import org.wyona.yanel.core.ResourceTypeDefinition;
+import org.wyona.yanel.core.ResourceTypeRegistry;
+import org.wyona.yanel.core.api.attributes.CreatableV2;
+import org.wyona.yanel.core.api.attributes.ViewableV2;
+import org.wyona.yanel.core.attributes.viewable.View;
+import org.wyona.yanel.core.attributes.viewable.ViewDescriptor;
+import org.wyona.yanel.core.navigation.Node;
+import org.wyona.yanel.core.navigation.Sitetree;
+import org.wyona.yanel.core.serialization.SerializerFactory;
+import org.wyona.yanel.core.source.ResourceResolver;
+import org.wyona.yanel.core.transformation.I18nTransformer2;
+import org.wyona.yanel.core.transformation.XIncludeTransformer;
+import org.wyona.yanel.core.util.PathUtil;
+import org.wyona.yanel.core.util.ResourceAttributeHelper;
+
+import org.apache.log4j.Category;
+import org.apache.xml.resolver.tools.CatalogResolver;
+import org.apache.xml.serializer.Serializer;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.Enumeration;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationUtil;
+
+import org.w3c.dom.Document;
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+/**
+ *
+ */
+public class ResourceCreatorResource extends Resource implements ViewableV2{
+ private static Category log = Category.getInstance(ResourceCreatorResource.class);
+ private boolean ajaxBrowser = false;
+
+ /**
+ *
+ */
+ public ResourceCreatorResource() {
+ }
+
+ /**
+ *
+ */
+ public boolean exists() {
+ return true;
+ }
+
+ /**
+ *
+ */
+ public long getSize() {
+ return -1;
+ }
+
+ /**
+ *
+ */
+ public String getMimeType(String viewId) {
+ if (viewId != null && viewId.equals("source")) return "application/xml";
+ return "application/xhtml+xml";
+ }
+
+ /**
+ *
+ */
+ public View getView(String viewId) {
+ if(request.getHeader("User-Agent").indexOf("rv:1.7") < 0) {
+ ajaxBrowser = true;
+ }
+
+ View view = new View();
+ String mimeType = getMimeType(viewId);
+ view.setMimeType(mimeType);
+
+ try {
+ org.wyona.yarep.core.Repository repo = getRealm().getRepository();
+
+ if (viewId != null && viewId.equals("source")) {
+ view.setInputStream(new java.io.StringBufferInputStream(getScreen()));
+ view.setMimeType("application/xml");
+ return view;
+ }
+
+ String[] xsltPath = getXSLTPath(getPath());
+ if (xsltPath != null) {
+ // create reader:
+ XMLReader xmlReader = XMLReaderFactory.createXMLReader();
+ CatalogResolver catalogResolver = new CatalogResolver();
+ xmlReader.setEntityResolver(catalogResolver);
+
+ // create xslt transformer:
+ SAXTransformerFactory tf = (SAXTransformerFactory)TransformerFactory.newInstance();
+
+ TransformerHandler[] xsltHandlers = new TransformerHandler[xsltPath.length];
+ for (int i = 0; i < xsltPath.length; i++) {
+ xsltHandlers[i] = tf.newTransformerHandler(new StreamSource(repo.getNode(xsltPath[i]).getInputStream()));
+ xsltHandlers[i].getTransformer().setParameter("yanel.path.name", org.wyona.commons.io.PathUtil.getName(getPath()));
+ xsltHandlers[i].getTransformer().setParameter("yanel.path", getPath());
+ xsltHandlers[i].getTransformer().setParameter("yanel.back2context", PathUtil.backToContext(realm, getPath()));
+ xsltHandlers[i].getTransformer().setParameter("yarep.back2realm", PathUtil.backToRealm(getPath()));
+
+ xsltHandlers[i].getTransformer().setParameter("language", getRequestedLanguage());
+ }
+
+ // create i18n transformer:
+ I18nTransformer2 i18nTransformer = new I18nTransformer2("global", getRequestedLanguage(), getRealm().getDefaultLanguage());
+ i18nTransformer.setEntityResolver(catalogResolver);
+
+ // create xinclude transformer:
+ XIncludeTransformer xIncludeTransformer = new XIncludeTransformer();
+ ResourceResolver resolver = new ResourceResolver(this);
+ xIncludeTransformer.setResolver(resolver);
+
+ // create serializer:
+ Serializer serializer = SerializerFactory.getSerializer(SerializerFactory.XHTML_STRICT);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+ // chain everything together (create a pipeline):
+ xmlReader.setContentHandler(xsltHandlers[0]);
+ for (int i=0; i<xsltHandlers.length-1; i++) {
+ xsltHandlers[i].setResult(new SAXResult(xsltHandlers[i+1]));
+ }
+ xsltHandlers[xsltHandlers.length-1].setResult(new SAXResult(xIncludeTransformer));
+ xIncludeTransformer.setResult(new SAXResult(i18nTransformer));
+ i18nTransformer.setResult(new SAXResult(serializer.asContentHandler()));
+ serializer.setOutputStream(baos);
+
+ // execute pipeline:
+ xmlReader.parse(new InputSource(new java.io.StringBufferInputStream(getScreen())));
+
+ // write result into view:
+ view.setInputStream(new ByteArrayInputStream(baos.toByteArray()));
+ return view;
+ }
+ log.debug("Mime-Type: " + mimeType);
+ view.setInputStream(new java.io.StringBufferInputStream(getScreen()));
+ return view;
+ } catch(Exception e) {
+ log.error(e + " (" + getPath() + ", " + getRealm() + ")", e);
+ }
+
+ view.setInputStream(new java.io.StringBufferInputStream(getScreen()));
+ return view;
+ }
+
+ /**
+ *
+ */
+ public ViewDescriptor[] getViewDescriptors() {
+ ViewDescriptor[] vd = new ViewDescriptor[2];
+ vd[0] = new ViewDescriptor("default");
+ vd[0].setMimeType(getMimeType(null));
+ vd[1] = new ViewDescriptor("source");
+ vd[1].setMimeType(getMimeType("source"));
+ return vd;
+ }
+
+ /**
+ * Generate XHTML screen
+ */
+ protected String getScreen() {
+ StringBuffer sb = new StringBuffer("<?xml version=\"1.0\"?>");
+ sb.append("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
+ sb.append("<head><title>create resource</title>");
+ sb.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + PathUtil.getResourcesHtdocsPath(this) + "css/resource-creator.css\"/>");
+ sb.append("<link rel=\"stylesheet\" type=\"text/css\" href=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-css/progressBar.css\"/>");
+ sb.append("<script src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-js/prototype.js\" type=\"text/javascript\"></script>");
+ sb.append("<script src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-js/progressBar.js\" type=\"text/javascript\"></script>");
+ sb.append("<script src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-js/sorttable.js\" type=\"text/javascript\"></script>");
+ sb.append("<script src=\"" + PathUtil.getResourcesHtdocsPath(this)+ "js/ajaxlookup.js\" type=\"text/javascript\"></script>");
+ sb.append("</head>");
+ sb.append("<body>");
+
+ HttpServletRequest request = getEnvironment().getRequest();
+ Enumeration parameters = request.getParameterNames();
+ if (!parameters.hasMoreElements()) {
+ getSelectResourceTypeScreen(sb);
+ } else {
+ if (request.getParameter("save-as") != null) {
+ // NOTE: Save as has been merged with getResourceScreen because otherwise uploading of data would be rather cumbersome.
+ //getSaveAsScreen(sb);
+ getNoSuchScreen(sb);
+ } else if (request.getParameter("save") != null) {
+ getSaveScreen(sb);
+ } else if (request.getParameter("lookup") != null) {
+ return getLookUp().toString();
+ } else if (request.getParameter("resource-type") != null) {
+ getResourceScreen(sb);
+ } else {
+ log.info("Fallback ...");
+ //getNoSuchScreen(sb);
+ getSelectResourceTypeScreen(sb);
+ }
+ }
+
+ sb.append("</body>");
+ sb.append("</html>");
+ return sb.toString();
+ }
+
+ /**
+ *
+ */
+ private void getSelectResourceTypeScreen(StringBuffer sb) {
+ sb.append("<h4>Create new page (step 0)</h4>");
+ sb.append("<h2>Select template (resp. resource type)</h2>");
+ sb.append("<form>");
+
+ ResourceTypeRegistry rtr = new ResourceTypeRegistry();
+
+ ResourceTypeDefinition[] rtds = getResourceTypeDefinitions();
+ if (rtds != null) {
+ sb.append("Template (resp. resource type): <select name=\"resource-type\">");
+ for (int i = 0; i < rtds.length; i++) {
+ try {
+ Resource resource = rtr.newResource(rtds[i].getResourceTypeUniversalName());
+ if (resource != null && ResourceAttributeHelper.hasAttributeImplemented(resource, "Creatable", "2")) {
+ sb.append("<option value=\"" + rtds[i].getResourceTypeNamespace() + "::" + rtds[i].getResourceTypeLocalName() + "\">" + getDisplayName(rtds[i].getResourceTypeLocalName(), rtds[i].getResourceTypeNamespace()) + "</option>");
+ } else {
+ log.warn("Resource type: " + rtds[i] + " does not implement CreatableV2 interface!");
+ }
+ } catch(Exception e) {
+ log.error(e);
+ }
+ }
+
+ sb.append("</select>");
+ } else {
+ sb.append("<p>No resource types!</p>");
+ }
+ sb.append("<br/><input type=\"button\" name=\"Cancel\" value=\"Cancel\" onclick=\"location.href='" + getReferer() + "'\"/>");
+ sb.append("<input type=\"hidden\" name=\"referer\" value=\"" + getReferer() + "\"/>");
+ sb.append("<input type=\"submit\" name=\"Next\" value=\"Next\"/>");
+ sb.append("</form>");
+ }
+
+ /**
+ *
+ */
+ private void getNoSuchScreen(StringBuffer sb) {
+ sb.append("<p>No such screen!</p>");
+ }
+
+ /**
+ * Save screen
+ */
+ private void getSaveScreen(StringBuffer sb) {
+ sb.append("<h4>Create new page (step 2)</h4>");
+
+ Path pathOfNewResource = null;
+ try {
+ pathOfNewResource = create();
+ } catch(Exception e) {
+ log.warn(e.getMessage(), e);
+ sb.append("<p>Exception: "+e.getMessage()+"</p>");
+ sb.append("<a href=\"javascript:history.back()\">back</a>");
+ return;
+ }
+
+ sb.append("<h2>Resource has been created</h2>");
+
+ HttpServletRequest request = getRequest();
+ Enumeration parameters = request.getParameterNames();
+ if (parameters.hasMoreElements()) {
+ sb.append("<ul>");
+ while (parameters.hasMoreElements()) {
+ String parameter = (String) parameters.nextElement();
+ if (parameter.indexOf("rp.") == 0) {
+ sb.append("<li>"+parameter+": "+request.getParameter(parameter)+"</li>");
+ }
+ }
+ sb.append("</ul>");
+ }
+
+ if (log.isDebugEnabled()) log.debug("New Resource: " + PathUtil.backToRealm(getPath()) + ", " + pathOfNewResource);
+ // NOTE: Back to realm has the form of ./ or ../ or ../../ etc., hence drop the leading slash!
+ if (pathOfNewResource != null) {
+ String href = PathUtil.backToRealm(getPath()) + pathOfNewResource.toString().substring(1);
+ sb.append("<p>New resource can be accessed at: <a href=\"" + href + "\">" + href + "</a></p>");
+ } else {
+ sb.append("<p>Please note that no path/URL has been associated with the newly created resource, because it might be some internally used resource.</p>");
+ }
+ }
+
+ /**
+ *
+ */
+ private void getResourceScreen(StringBuffer sb) {
+ String rtps = getRequest().getParameter("resource-type");
+ String resNamespace = rtps.substring(0, rtps.indexOf("::"));
+ String resName = rtps.substring(rtps.indexOf("::") + 2);
+ ResourceTypeRegistry rtr = new ResourceTypeRegistry();
+
+ if (getRequest().getParameter("create-new-folder") != null && !getRequest().getParameter("create-new-folder").equals("")) {
+ try {
+ create(getRequest().getParameter("create-new-folder"), getRequest().getParameter("lookin"), "http://www.wyona.org/yanel/resource/1.0::directory");
+ } catch (Exception e) {
+ sb.append("<p>Could not create folder. Exception: " + e + "</p>");
+ log.error(e.getMessage(), e);
+ }
+ }
+
+
+ try {
+ String universalName = "<{"+ resNamespace +"}"+ resName +"/>";
+ log.debug("Universal Name: " + universalName);
+ Resource resource = rtr.newResource(universalName);
+ if (resource != null) {
+ if (ResourceAttributeHelper.hasAttributeImplemented(resource, "Creatable", "2")) {
+
+ sb.append("<h4>Create new page (step 1)</h4>");
+ sb.append("<h2>Enter/Select template (resp. resource) specific parameters and \"Save As\"</h2>");
+ sb.append("<form enctype=\"multipart/form-data\" method=\"post\">");
+ sb.append("<p>Template (resp. resource type): " + resName + " ("+resNamespace+")</p>");
+ // TODO: Add this parameter to the continuation within the session!
+ sb.append("<input type=\"hidden\" name=\"resource-type\" value=\"" + rtps + "\"/>");
+
+ Property[] defaultProperties = getDefaultProperties(resName, resNamespace);
+ String[] propertyNames = ((CreatableV2) resource).getPropertyNames();
+ if ((propertyNames != null && propertyNames.length > 0) || defaultProperties != null) {
+ sb.append("<p>Resource specific properties:</p>");
+ } else {
+ sb.append("<p>No resource specific properties!</p>");
+ }
+
+ if (propertyNames != null && propertyNames.length > 0) {
+ sb.append("<table border=\"1\">");
+ for (int i = 0; i < propertyNames.length; i++) {
+ sb.append("<tr><td>" + propertyNames[i] + ":   </td><td>");
+ String propertyType = ((CreatableV2) resource).getPropertyType(propertyNames[i]);
+ if (propertyType != null && propertyType.equals(CreatableV2.TYPE_UPLOAD)) {
+ sb.append("<input type=\"file\" name=\"rp." + propertyNames[i] + "\"/><br/>");
+ } else if (propertyType != null && propertyType.equals(CreatableV2.TYPE_SELECT)) {
+ Object defaultValues = ((CreatableV2) resource).getProperty(propertyNames[i]);
+ if (defaultValues instanceof java.util.HashMap) {
+ sb.append("<select name=\"rp." + propertyNames[i] + "\">");
+ sb.append(" <option value=\"*\">*</option>");
+ sb.append(" <option value=\"public\">public</option>");
+ sb.append(" <option value=\"private\">private</option>");
+ sb.append("</select><br/>");
+ } else {
+ sb.append("Exception: Parameter doesn't seem to be a of type SELECT: " + propertyNames[i]);
+ }
+ } else if (propertyType != null && propertyType.equals(CreatableV2.TYPE_PASSWORD)) {
+ //sb.append("<input type=\"file\" name=\"rp." + propertyNames[i] + "\"/><br/>");
+ Object value = ((CreatableV2) resource).getProperty(propertyNames[i]);
+ if (value == null) {
+ sb.append("<input type=\"password\" name=\"rp." + propertyNames[i] + "\" value=\"\" size=\"60\"/><br/>");
+ } else {
+ sb.append("<input type=\"password\" name=\"rp." + propertyNames[i] + "\" value=\"" + value + "\" size=\"60\"/><br/>");
+ }
+ } else {
+ log.debug("Let's assume the property is of type text ...");
+ Object value = ((CreatableV2) resource).getProperty(propertyNames[i]);
+ if (value == null) {
+ sb.append("<input type=\"text\" name=\"rp." + propertyNames[i] + "\" value=\"\" size=\"60\"/><br/>");
+ } else {
+ sb.append("<input type=\"text\" name=\"rp." + propertyNames[i] + "\" value=\"" + value + "\" size=\"60\"/><br/>");
+ }
+ }
+ sb.append("</td></tr>");
+ }
+ sb.append("</table>");
+ }
+ if (defaultProperties != null) {
+ sb.append("<ul>");
+ for (int i = 0; i < defaultProperties.length; i++) {
+ sb.append("<li>");
+ sb.append("Default property: " + defaultProperties[i]);
+ sb.append("<input type=\"hidden\" name=\"rp." + defaultProperties[i].getName() + "\" value=\"" + defaultProperties[i].getValue() + "\"/>");
+ sb.append("</li>");
+ }
+ sb.append("</ul>");
+ }
+
+ sb.append("<br/><br/>");
+
+ sb.append("<div class=\"creatorFileBrowser\">");
+ sb.append("<table>");
+ sb.append("<tr><td colspan=\"2\" class=\"fileBrowserHead\">Save as:</td></tr>");
+ sb.append("<tr><td colspan=\"2\">");
+ sb.append("<div id=\"lookup\">");
+ sb.append(getLookUp());
+ sb.append("</div>");
+ sb.append("</td></tr>");
+ sb.append("<tr><td colspan=\"2\" class=\"fileBrowserNewName\">");
+
+ String createName = getRequest().getParameter("create-name");
+ if (createName != null) {
+ sb.append("New name: <input type=\"text\" name=\"create-name\" value=\"" + createName + "\"/>");
+ } else {
+ sb.append("New name: <input type=\"text\" name=\"create-name\"/>");
+ }
+ sb.append("</td></tr>");
+
+ sb.append("<tr>");
+ sb.append("<td>");
+ sb.append("<input type=\"button\" name=\"Cancel\" value=\"Cancel\" onclick=\"location.href='" + getReferer() + "'\"/>");
+ sb.append("<input type=\"hidden\" name=\"referer\" value=\"" + getReferer() + "\"/>");
+ sb.append("</td>");
+ sb.append("<td align=\"right\">");
+ sb.append("<input type=\"submit\" value=\"Save new resource\" name=\"save\"/>");
+ sb.append("</td>");
+ sb.append("</tr>");
+ sb.append("</table>");
+ sb.append("</div>");
+
+ sb.append("</form>");
+
+ // TODO: Display realm navigation (sitetree, topic map, ...) resp. introduce another step
+ }
+ }
+ } catch (Exception e) {
+ sb.append("<p>Exception: " + e + "</p>");
+ log.error(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * Creates new resource
+ * @return Path of new resource
+ */
+ private Path create() throws Exception {
+ return create(getRequest().getParameter("create-name"), getRequest().getParameter("lookin"), getRequest().getParameter("resource-type"));
+ }
+
+ /**
+ * Creates new resource
+ * @param String createName
+ * @param String lookinPath
+ * @param String resourceType
+ * @return Path of new resource
+ */
+ private Path create(String createName, String lookinPath, String resourceType) throws Exception {
+ if (resourceType == null) {
+ log.error("No resource-type parameter specified!");
+ return null;
+ }
+
+ org.wyona.yanel.core.map.Realm realm = getRealm();
+ Path pathOfResourceCreator = new Path(getPath());
+
+ org.wyona.commons.io.Path parent = new org.wyona.commons.io.Path(pathOfResourceCreator.toString()).getParent();
+
+ Path pathOfNewResource = new Path(getParentOfNewResource(parent, lookinPath).toString() + createName);
+
+ if (log.isDebugEnabled()) log.debug("Path of new resource: " + pathOfNewResource);
+ pathOfNewResource = new Path(removeTooManySlashes(pathOfNewResource.toString()));
+ if (log.isDebugEnabled()) log.debug("Path of new resource without too many slashes: " + pathOfNewResource);
+
+ String rtps = resourceType;
+ String resNamespace = rtps.substring(0, rtps.indexOf("::"));
+ String resName = rtps.substring(rtps.indexOf("::") + 2);
+ Resource newResource = yanel.getResourceManager().getResource(getEnvironment(), realm, pathOfNewResource.toString(), new ResourceConfiguration(resName, resNamespace, null));
+
+ if (newResource != null) {
+ if (ResourceAttributeHelper.hasAttributeImplemented(newResource, "Creatable", "2")) {
+ createName = ((CreatableV2) newResource).getCreateName(createName);
+ if (createName != null && createName.equals("")) {
+ throw new Exception("Please enter a name!");
+ }
+ if (createName == null) {
+ pathOfNewResource = null;
+ newResource.setPath(null);
+ } else {
+ pathOfNewResource = new Path(removeTooManySlashes(getParentOfNewResource(parent, lookinPath).toString()) + createName);
+ newResource.setPath(pathOfNewResource.toString());
+ }
+ ((CreatableV2) newResource).create(request);
+ if (pathOfNewResource != null) {
+ createResourceConfiguration(newResource);
+ addToSitetree(newResource);
+ }
+ } else {
+ throw new Exception("creation NOT successfull!");
+ }
+ } else {
+ throw new Exception("creation NOT successful (newResource == null)!");
+
+ }
+ return pathOfNewResource;
+ }
+
+ /**
+ * Add to sitetree
+ */
+ private void addToSitetree(Resource newResource) throws Exception {
+ org.wyona.yanel.core.navigation.Sitetree sitetree = getRealm().getRepoNavigation();
+ String parentPath = org.wyona.commons.io.PathUtil.getParent(newResource.getPath());
+ org.wyona.yanel.core.navigation.Node parentNode = sitetree.getNode(getRealm(), parentPath);
+ if (parentNode != null) {
+ String nodeName = org.wyona.commons.io.PathUtil.getName(newResource.getPath());
+ String label = nodeName;
+ parentNode.appendChild(sitetree.createNode(nodeName, label));
+ } else {
+ log.error("No such node with path: " + parentPath);
+ }
+ }
+
+ /**
+ * Create resource configuration (yanel-rc)
+ */
+ private void createResourceConfiguration(Resource newResource) throws Exception {
+ StringBuffer rcContent = new StringBuffer("<?xml version=\"1.0\"?>\n\n");
+ rcContent.append("<yanel:resource-config xmlns:yanel=\"http://www.wyona.org/yanel/rti/1.0\">\n");
+ rcContent.append("<yanel:rti name=\"" + newResource.getRTD().getResourceTypeLocalName() + "\" namespace=\"" + newResource.getRTD().getResourceTypeNamespace() + "\"/>\n\n");
+ java.util.HashMap rtiProperties = ((CreatableV2) newResource).createRTIProperties(request);
+ if (rtiProperties != null) {
+ if (log.isDebugEnabled()) log.debug(rtiProperties + " " + PathUtil.getRTIPath(newResource.getPath()));
+ java.util.Iterator iterator = rtiProperties.keySet().iterator();
+ while (iterator.hasNext()) {
+ String property = (String) iterator.next();
+ String value = (String) rtiProperties.get(property);
+ if (value != null) {
+ rcContent.append("<yanel:property name=\"" + property + "\" value=\"" + value + "\"/>\n");
+ if(log.isDebugEnabled()) log.debug("Set Property: " + property + ", " + value);
+ } else {
+ log.warn("Value of property '" + property + "' is null and won't be set within resource configuration: " + PathUtil.getRCPath(newResource.getPath()));
+ }
+ }
+ } else {
+ log.warn("No RTI properties: " + newResource.getPath());
+ }
+ rcContent.append("</yanel:resource-config>");
+
+
+ org.wyona.yarep.core.Repository rcRepo = newResource.getRealm().getRTIRepository();
+ org.wyona.commons.io.Path newRCPath = new org.wyona.commons.io.Path(PathUtil.getRCPath(newResource.getPath()));
+ if (log.isDebugEnabled()) log.debug(newRCPath);
+ org.wyona.yanel.core.util.YarepUtil.addNodes(rcRepo, newRCPath.toString(), org.wyona.yarep.core.NodeType.RESOURCE);
+
+ java.io.Writer writer = new java.io.OutputStreamWriter(rcRepo.getNode(newRCPath.toString()).getOutputStream());
+ writer.write(rcContent.toString());
+ writer.close();
+ }
+
+ /**
+ * Get resource type definitions
+ */
+ private ResourceTypeDefinition[] getResourceTypeDefinitions() {
+ ResourceTypeRegistry rtr = new ResourceTypeRegistry();
+ ResourceConfiguration rc = getConfiguration();
+ Document customConfigDoc = rc.getCustomConfiguration();
+ if (customConfigDoc != null) {
+ Configuration config = ConfigurationUtil.toConfiguration(customConfigDoc.getDocumentElement());
+ Configuration resourceTypesConfig = config.getChild("resource-types", false);
+ if (resourceTypesConfig != null) {
+ Configuration[] resourceTypeConfigs = resourceTypesConfig.getChildren("resource-type");
+ if (resourceTypeConfigs.length == 0) return null;
+ ResourceTypeDefinition[] rtds = new ResourceTypeDefinition[resourceTypeConfigs.length];
+ for (int i = 0; i < resourceTypeConfigs.length; i++) {
+ try {
+ String universalName = "<{"+resourceTypeConfigs[i].getAttribute("namespace")+"}"+resourceTypeConfigs[i].getAttribute("name")+"/>";
+ rtds[i] = rtr.getResourceTypeDefinition(universalName);
+ log.debug("Resource Type: " + universalName);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return null;
+ }
+ }
+ return rtds;
+ }
+ }
+ ResourceTypeDefinition[] rtds = rtr.getResourceTypeDefinitions();
+ return rtds;
+ }
+
+ /**
+ * Get default properties from custom configuration
+ */
+ private Property[] getDefaultProperties(String resName, String resNamespace) {
+ Document customConfigDoc = getConfiguration().getCustomConfiguration();
+ if (customConfigDoc != null) {
+ Configuration config = ConfigurationUtil.toConfiguration(customConfigDoc.getDocumentElement());
+ Configuration resourceTypesConfig = config.getChild("resource-types", false);
+ if (resourceTypesConfig != null) {
+ Configuration[] resourceTypeConfigs = resourceTypesConfig.getChildren("resource-type");
+ if (resourceTypeConfigs.length == 0) return null;
+ for (int i = 0; i < resourceTypeConfigs.length; i++) {
+ try {
+ if (resourceTypeConfigs[i].getAttribute("namespace").equals(resNamespace) && resourceTypeConfigs[i].getAttribute("name").equals(resName)) {
+ log.debug("Resource Type Found: " + resName + ", " + resNamespace);
+ Configuration[] propertyConfigs = resourceTypeConfigs[i].getChildren("property");
+ Property[] props = new Property[propertyConfigs.length];
+ for (int k = 0; k < propertyConfigs.length; k++) {
+ props[k] = new Property(propertyConfigs[k].getAttribute("name"), propertyConfigs[k].getAttribute("value"));
+ log.debug("Property: " + props[k]);
+ }
+ return props;
+ }
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return null;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get the display name from custom configuration
+ */
+ private String getDisplayName(String resName, String resNamespace) {
+ Document customConfigDoc = getConfiguration().getCustomConfiguration();
+ if (customConfigDoc != null) {
+
+ try {
+ org.jdom.Document jdomDocument = new org.jdom.input.DOMBuilder().build(customConfigDoc);
+ org.jdom.xpath.XPath xpath = org.jdom.xpath.XPath.newInstance("/yanel:custom-config/rc:resource-types/rc:resource-type[@name='" + resName + "']/rc:display-name");
+ xpath.addNamespace("yanel", "http://www.wyona.org/yanel/rti/1.0");
+ xpath.addNamespace("rc", "http://www.wyona.org/yanel/resource/resource-creator/1.0");
+ org.jdom.Element displayNameElement = (org.jdom.Element) xpath.selectSingleNode(jdomDocument);
+ if (displayNameElement != null) {
+ // TODO: It seems like document does not contain text nodes ...
+ if (log.isDebugEnabled()) log.debug("Display name: " + displayNameElement + " :: " + displayNameElement.getText() + " :: " + displayNameElement.getName());
+ return displayNameElement.getText();
+ }
+ log.warn("No display name: " + resName);
+ return resName;
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return resName;
+ }
+ }
+ return resName;
+ }
+
+ /**
+ * Return sitetree
+ */
+ private StringBuffer getLookUp() {
+ StringBuffer sb = new StringBuffer("");
+ //Sitetree sitetree = (Sitetree) getYanel().getBeanFactory().getBean("repo-navigation");
+ Sitetree sitetree = getRealm().getRepoNavigation();
+ Node node = null;
+ String lookinPath = getRequest().getParameter("lookin");
+ if (lookinPath != null) {
+ node = sitetree.getNode(getRealm(), lookinPath);
+ } else {
+ node = sitetree.getNode(getRealm(), getPath());
+ }
+
+ if (node != null) {
+ if (node.isCollection()) {
+ if(log.isDebugEnabled()) log.debug("Is Collection: " + node.getName());
+ } else if (node.isResource()) {
+ if (log.isDebugEnabled()) log.debug("Is Resource: " + node.getName());
+ node = node.getParent();
+ } else {
+ log.error("Neither collection nor resource: " + getPath());
+ }
+ } else {
+ log.error("No such path '" + getPath() + "' within sitetree! Root node will be used.");
+ node = sitetree.getNode(getRealm(), "/");
+ }
+
+ String rtps = getEnvironment().getRequest().getParameter("resource-type");
+ String resNamespace = rtps.substring(0, rtps.indexOf("::"));
+ String resName = rtps.substring(rtps.indexOf("::") + 2);
+
+ sb.append("<table id=\"resourceCreatorSaveAsTable\">");
+ sb.append("<tr><td>Look in: " + node.getPath() + "   </td><td>New folder: <input type=\"text\" name=\"create-new-folder\"/> <input type=\"image\" src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/folder-new.png\" alt=\"make a new folder\"/> ");
+
+ String parent = "/";
+ if (!node.getPath().equals("/")) {
+ parent = new org.wyona.commons.io.Path(node.getPath()).getParent().toString();
+
+ if (log.isDebugEnabled()) log.debug("Parent: " + parent);
+
+ if (ajaxBrowser) {
+ sb.append("<a href=\"JavaScript:ajaxlookup('" + resNamespace + "::" + resName + "', '" + parent + "')\"><img src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/go-up.png\" alt=\"go up\" border=\"0\"/></a>");
+ } else {
+ sb.append("<a href=\"?lookin=" + parent + "&resource-type=" + resNamespace + "::" + resName + "\"><img src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/go-up.png\" alt=\"go up\" border=\"0\"/></a>");
+ }
+ } else {
+ // Do not display "go-up" if current node is root node
+ }
+
+ sb.append("</td></tr>");
+
+ sb.append("<tr><td colspan=\"2\">");
+
+ sb.append("<div id=\"lookupfiles\">");
+ sb.append("<table id=\"lookupfilesTable\" class=\"sortable\">");
+ sb.append("<thead>");
+ sb.append("<tr><th>Type</th><th>Name</th><th>Resource Type</th></tr>");
+ sb.append("</thead>");
+ sb.append("<tbody>");
+ Node[] children = node.getChildren();
+ for (int i = 0; i < children.length; i++) {
+ String resourceTypeName;
+ try {
+ resourceTypeName = yanel.getResourceManager().getResource(getEnvironment(), realm, children[i].getPath()).getResourceTypeLocalName();
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ resourceTypeName = "?";
+ }
+ if (children[i].isCollection()) {
+ // TODO: Also append resource specific parameters (AJAX ...)
+ if (ajaxBrowser) {
+ sb.append("<tr><td sorttable_customkey=\"Collection\"><a href=\"JavaScript:ajaxlookup('" + resNamespace + "::" + resName + "', '" + node.getPath() + children[i].getName() + "/')\"><img class=\"lookupicon\" src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/folder.png\" alt=\"Collection:\"/></a></td><td><a href=\"JavaScript:ajaxlookup('" + resNamespace + "::" + resName + "', '" + node.getPath() + children[i].getName() + "/')\">" + children[i].getName() + "</a></td><td>" + resourceTypeName + "</td></tr>");
+ } else {
+ sb.append("<tr><td sorttable_customkey=\"Collection\"><a href=\"?lookin=" + node.getPath() + children[i].getName() + "/&resource-type=" + resNamespace + "::" + resName + "\"><img class=\"lookupicon\" src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/folder.png\" alt=\"Collection:\"/></a></td><td><a href=\"?lookin=" + node.getPath() + children[i].getName() + "/&resource-type=" + resNamespace + "::" + resName + "\">" + children[i].getName() + "</a></td><td>" + resourceTypeName + "</td></tr>");
+ }
+ } else if (children[i].isResource()) {
+ sb.append("<tr><td sorttable_customkey=\"Resource\"><img class=\"lookupicon\" src=\"" + PathUtil.getGlobalHtdocsPath(this) + "yanel-img/icons/text-x-generic.png\" alt=\"Resource:\"/></td><td>"+children[i].getName()+"</td><td>" + resourceTypeName + "</td></tr>");
+ } else {
+ sb.append("<tr><td>?</td><td>"+children[i].getName()+"</td><td>-</td></tr>");
+ }
+ }
+
+ sb.append("</tbody>");
+ sb.append("</table>");
+ sb.append("<input type=\"hidden\" name=\"lookin\" value=\"" + node.getPath() + "\"/>");
+ sb.append("</div>");
+ sb.append("</td></tr>");
+
+
+ sb.append("</table>");
+
+ return sb;
+ }
+
+ /**
+ * Get XSLT path
+ */
+ private String[] getXSLTPath(String path) throws Exception {
+ String[] xsltPath = getResourceConfigProperties("xslt");
+ if (xsltPath != null && xsltPath.length > 0) return xsltPath;
+ log.info("No XSLT Path within: " + path);
+ return null;
+ }
+
+ /**
+ * Remove slashes if there are too many, e.g. /foo//bar.html is being transformed into /foo/bar.html
+ */
+ private String removeTooManySlashes(String path) {
+ StringBuffer sb = new StringBuffer();
+ boolean previousCharWasSlash = false;
+ for (int i = 0; i < path.length(); i++) {
+ char c = path.charAt(i);
+ if (c == '/' && previousCharWasSlash) {
+ if (log.isDebugEnabled()) log.debug("Do not append this slash: " + i);
+ } else {
+ sb.append(c);
+ }
+ if (c == '/') {
+ previousCharWasSlash = true;
+ } else {
+ previousCharWasSlash = false;
+ }
+ }
+ return sb.toString();
+ }
+
+ private Path getParentOfNewResource(org.wyona.commons.io.Path parent, String lookinPath) {
+ Path parentOfNewResource = null;
+ if(parent.equals("null")) {
+ // if pathOfResourceCreator is ROOT
+ parentOfNewResource = new Path("/" + lookinPath + "/");
+ } else if(parent.toString().equals("/")){
+ parentOfNewResource = new Path(parent + "/" + lookinPath + "/");
+ } else {
+ parentOfNewResource = new Path("/" + lookinPath + "/");
+ }
+ return parentOfNewResource;
+ }
+
+ private String getReferer() {
+ if(request.getParameter("referer") != null) {
+ return request.getParameter("referer");
+ }
+ if(request.getHeader("referer") != null) {
+ return replaceEntities(request.getHeader("referer"));
+ }
+ return PathUtil.backToRealm(getPath());
+ }
+
+ /**
+ * Replaces some characters by their corresponding xml entities.
+ * This method escapes those characters which must not occur in an xml text node.
+ * @param string
+ * @return escaped string
+ */
+ public String replaceEntities(String str) {
+ // there may be some & and some & mixed in the input, so first transform all
+ // & to & and then transform all & back to &
+ // this way we don't get double escaped &amp;
+ str = str.replaceAll("&", "&");
+ str = str.replaceAll("&", "&");
+ str = str.replaceAll("<", "<");
+ return str;
+ }
+}
+
+/**
+ *
+ */
+class Property {
+
+ private String name;
+ private String value;
+
+ /**
+ *
+ */
+ public Property(String name, String value) {
+ this.name = name;
+ this.value = value;
+ }
+
+ /**
+ *
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ *
+ */
+ public String getValue() {
+ return value;
+ }
+
+ /**
+ *
+ */
+ public String toString() {
+ return name + " = " + value;
+ }
+}
More information about the Yanel-commits
mailing list