[Yanel-commits] rev 25163 -
public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources
michi at wyona.com
michi at wyona.com
Mon Jun 18 09:36:29 CEST 2007
Author: michi
Date: 2007-06-18 09:36:28 +0200 (Mon, 18 Jun 2007)
New Revision: 25163
Modified:
public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java
Log:
AJAX implementation finished
Modified: 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 2007-06-18 07:29:31 UTC (rev 25162)
+++ public/yanel/trunk/src/contributions/resources/resource-creator/src/java/org/wyona/yanel/impl/resources/ResourceCreatorResource.java 2007-06-18 07:36:28 UTC (rev 25163)
@@ -15,25 +15,47 @@
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.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.InputStreamReader;
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;
/**
*
@@ -67,8 +89,88 @@
*
*/
public View getView(String viewId) {
+ if(request.getHeader("User-Agent").indexOf("rv:1.7") < 0) {
+ ajaxBrowser = true;
+ }
+
View view = new View();
- view.setMimeType(getMimeType(viewId));
+ 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;
+ }
+ if (request.getParameter("javascript") != null) {
+ view.setInputStream(new java.io.StringBufferInputStream(getScreen()));
+ view.setMimeType("text/javascript");
+ 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", 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;
+ } else {
+ 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;
}
@@ -89,59 +191,14 @@
* Flow
*/
private String getScreen() {
+ String backToRealm = org.wyona.yanel.core.util.PathUtil.backToRealm(getPath());
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("<script src=\"?javascript=prototype.js\" type=\"text/javascript\"></script>");
sb.append(System.getProperty("line.separator"));
- sb.append("<script language=\"Javascript\">");
+ sb.append("<script src=\"?javascript=ajaxlookup.js\" type=\"text/javascript\"></script>");
sb.append(System.getProperty("line.separator"));
- sb.append("function xmlhttpPost(strURL, lookin) {");
- sb.append(System.getProperty("line.separator"));
- sb.append(" var xmlHttpReq = false;");
- sb.append(System.getProperty("line.separator"));
- sb.append(" var self = this;");
- sb.append(System.getProperty("line.separator"));
- sb.append(" // Mozilla/Safari");
- sb.append(System.getProperty("line.separator"));
- sb.append(" if (window.XMLHttpRequest) {");
- sb.append(System.getProperty("line.separator"));
- sb.append(" self.xmlHttpReq = new XMLHttpRequest();");
- sb.append(System.getProperty("line.separator"));
- sb.append(" }");
- sb.append(System.getProperty("line.separator"));
- sb.append(" // IE");
- sb.append(System.getProperty("line.separator"));
- sb.append(" else if (window.ActiveXObject) {");
- sb.append(System.getProperty("line.separator"));
- sb.append(" self.xmlHttpReq = new ActiveXObject(\"Microsoft.XMLHTTP\");");
- sb.append(System.getProperty("line.separator"));
- sb.append(" }");
- sb.append(System.getProperty("line.separator"));
- sb.append(" self.xmlHttpReq.open('GET', strURL, true);");
- sb.append(System.getProperty("line.separator"));
- sb.append(" self.xmlHttpReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');");
- sb.append(System.getProperty("line.separator"));
- sb.append(" self.xmlHttpReq.onreadystatechange = function() {");
- sb.append(System.getProperty("line.separator"));
- sb.append(" if (self.xmlHttpReq.readyState == 4) {");
- sb.append(System.getProperty("line.separator"));
- sb.append(" document.getElementById(\"showLookIn\").innerHTML = lookin;");
- sb.append(System.getProperty("line.separator"));
- sb.append(" document.getElementById(\"lookinpasser\").value = lookin;");
- sb.append(System.getProperty("line.separator"));
- sb.append(" document.getElementById(\"lookup\").innerHTML = self.xmlHttpReq.responseText;");
- sb.append(System.getProperty("line.separator"));
- sb.append(" }");
- sb.append(System.getProperty("line.separator"));
- sb.append(" }");
- sb.append(System.getProperty("line.separator"));
- sb.append(" self.xmlHttpReq.send(null);");
- sb.append(System.getProperty("line.separator"));
- sb.append("}");
- sb.append(System.getProperty("line.separator"));
- sb.append("</script>");
- sb.append(System.getProperty("line.separator"));
-
sb.append("</head>");
sb.append("<body>");
@@ -158,7 +215,9 @@
getSaveScreen(sb);
} else if (request.getParameter("lookup") != null) {
return getLookUp().toString();
- } else if (request.getParameter("resource-type") != null) {
+ } else if (request.getParameter("javascript") != null) {
+ return getJavaScript().toString();
+ } else if (request.getParameter("resource-type") != null) {
getResourceScreen(sb);
} else {
log.info("Fallback ...");
@@ -288,7 +347,7 @@
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)) {
+ } 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] + "\">");
@@ -338,30 +397,12 @@
log.error("Neither collection nor resource: " + getPath());
}
- sb.append("<br/><br/>");
-
-
- sb.append("<table border=\"1\"><tr><td colspan=\"2\">Save as:</td></tr>");
- sb.append("<tr><td>Look in: <div id=\"showLookIn\">" + node.getPath() + "</div>   </td><td>New folder: <input type=\"text\" name=\"create-new-folder\"/><input type=\"submit\" value=\"Create new folder\"/></td></tr>");
-
- sb.append("<tr><td colspan=\"2\" id=\"lookup\">");
+ sb.append("<br/><br/>");
+
+ sb.append("<div id=\"lookup\">");
sb.append(getLookUp());
- sb.append("</td></tr>");
-
- sb.append("<tr><td colspan=\"2\">");
- 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><td colspan=\"2\" align=\"right\"><input type=\"submit\" value=\"Save new resource\" name=\"save\"/></td></tr>");
- sb.append("</table>");
-
- sb.append("<input type=\"hidden\" name=\"lookin\" id=\"lookinpasser\" value=\"" + node.getPath() + "\"/>");
+ sb.append("</div>");
+
sb.append("</form>");
// TODO: Display realm navigation (sitetree, topic map, ...) resp. introduce another step
@@ -440,7 +481,7 @@
} else {
log.warn("No RTI properties: " + newResource.getPath());
}
- rcContent.append("</yanel:resource-config>");
+ rcContent.append("</yanel:resource-config>");
org.wyona.yarep.core.Repository rcRepo = newResource.getRealm().getRTIRepository();
@@ -569,6 +610,24 @@
String resNamespace = rtps.substring(0, rtps.indexOf("::"));
String resName = rtps.substring(rtps.indexOf("::") + 2);
+ sb.append("<table border=\"1\" style=\"width:100%;\"><tr><td colspan=\"2\">Save as:</td></tr>");
+ sb.append("<tr><td>Look in: " + node.getPath() + "   </td><td>New folder: <input type=\"text\" name=\"create-new-folder\"/><input type=\"submit\" value=\"Create new folder\"/> ");
+
+ String parent = "";
+ if (!node.getPath().equals("/")) {
+ parent = node.getPath().substring(0, node.getPath().lastIndexOf("/"));
+ parent = parent.substring(0, parent.lastIndexOf("/"));
+ }
+
+ if (ajaxBrowser) {
+ sb.append("<a href='JavaScript:ajaxlookup(\"" + resNamespace + "::" + resName + "\", \"" + parent + "/\")'>parent</a>");
+ } else {
+ sb.append("<a href=\"?lookin=" + parent + "/&resource-type=" + resNamespace + "::" + resName + "\">parent</a>");
+ }
+ sb.append("</td></tr>");
+
+ sb.append("<tr><td colspan=\"2\">");
+
sb.append("<div style=\"height:160px;overflow:auto;\">");
sb.append("<table border=\"1\" width=\"100%\">");
sb.append("<tr><th align=\"left\">Name</th><th align=\"left\">Resource Type</th></tr>");
@@ -576,7 +635,11 @@
for (int i = 0; i < children.length; i++) {
if (children[i].isCollection()) {
// TODO: Also append resource specific parameters (AJAX ...)
- sb.append("<tr><td>Collection: <a href='JavaScript:xmlhttpPost(\"?lookup=true&lookin=" + node.getPath() + children[i].getName() + "/&resource-type=" + resNamespace + "::" + resName + "\", \"" + node.getPath() + children[i].getName() + "/\")'>" + children[i].getName() + "</a></td><td>TBD</td></tr>");
+ if (ajaxBrowser) {
+ sb.append("<tr><td>Collection: <a href='JavaScript:ajaxlookup(\"" + resNamespace + "::" + resName + "\", \"" + node.getPath() + children[i].getName() + "/\")'>" + children[i].getName() + "</a></td><td>TBD</td></tr>");
+ } else {
+ sb.append("<tr><td>Collection: <a href=\"?lookin=" + node.getPath() + children[i].getName() + "/&resource-type=" + resNamespace + "::" + resName + "\">" + children[i].getName() + "</a></td><td>TBD</td></tr>");
+ }
} else if (children[i].isResource()) {
sb.append("<tr><td>Resource: "+children[i].getName()+"</td><td>TBD</td></tr>");
} else {
@@ -585,9 +648,57 @@
}
sb.append("</table>");
sb.append("</div>");
+ sb.append("</td></tr>");
+
+ sb.append("<tr><td colspan=\"2\">");
+
+ 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><td colspan=\"2\" align=\"right\"><input type=\"submit\" value=\"Save new resource\" name=\"save\"/></td></tr>");
+ sb.append("</table>");
+ sb.append("<input type=\"hidden\" name=\"lookin\" value=\"" + node.getPath() + "\"/>");
return sb;
}
+
+ private StringBuffer getJavaScript() {
+ String jsFileName = getRequest().getParameter("javascript");
+ try {
+ File jsFile = org.wyona.commons.io.FileUtil.file(rtd.getConfigFile().getParentFile()
+ .getAbsolutePath(), "js" + File.separator + jsFileName);
+ StringBuffer sb = new StringBuffer(1000);
+ BufferedReader reader = new BufferedReader(
+ new FileReader(jsFile));
+ char[] buf = new char[1024];
+ int numRead=0;
+ while((numRead=reader.read(buf)) != -1){
+ sb.append(buf, 0, numRead);
+ }
+ reader.close();
+ return sb;
+ } catch (Exception e) {
+ // TODO: handle exception
+ log.error("DEBUG: could not get javascript file: " + jsFileName + " " + e);
+ }
+ return null;
+ }
+
+ /**
+ * Get XSLT path
+ */
+ private String[] getXSLTPath(String path) throws Exception {
+ String[] xsltPath = getResourceConfigProperties("xslt");
+ if (xsltPath != null) 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
More information about the Yanel-commits
mailing list