[Yanel-commits] rev 25320 - in
public/yanel/contributions/resources: . redirect redirect/src
redirect/src/build redirect/src/java redirect/src/java/org
redirect/src/java/org/wyona redirect/src/java/org/wyona/yanel
redirect/src/java/org/wyona/yanel/impl
redirect/src/java/org/wyona/yanel/impl/resources
michi at wyona.com
michi at wyona.com
Fri Jun 22 11:35:32 CEST 2007
Author: michi
Date: 2007-06-22 11:35:30 +0200 (Fri, 22 Jun 2007)
New Revision: 25320
Added:
public/yanel/contributions/resources/redirect/
public/yanel/contributions/resources/redirect/build.xml
public/yanel/contributions/resources/redirect/resource.xml
public/yanel/contributions/resources/redirect/src/
public/yanel/contributions/resources/redirect/src/build/
public/yanel/contributions/resources/redirect/src/build/build.properties
public/yanel/contributions/resources/redirect/src/build/dependencies.xml
public/yanel/contributions/resources/redirect/src/java/
public/yanel/contributions/resources/redirect/src/java/org/
public/yanel/contributions/resources/redirect/src/java/org/wyona/
public/yanel/contributions/resources/redirect/src/java/org/wyona/yanel/
public/yanel/contributions/resources/redirect/src/java/org/wyona/yanel/impl/
public/yanel/contributions/resources/redirect/src/java/org/wyona/yanel/impl/resources/
public/yanel/contributions/resources/redirect/src/java/org/wyona/yanel/impl/resources/RedirectResource.java
Log:
redirect resource added
Added: public/yanel/contributions/resources/redirect/build.xml
===================================================================
--- public/yanel/contributions/resources/redirect/build.xml (rev 0)
+++ public/yanel/contributions/resources/redirect/build.xml 2007-06-22 09:35:30 UTC (rev 25320)
@@ -0,0 +1,48 @@
+<?xml version="1.0"?>
+
+<project name="yanel-resource" default="compile">
+
+ <import file="src/build/dependencies.xml"/>
+
+ <target name="init" description="Initialize build" depends="dependencies">
+ <echo>Initialize build</echo>
+
+ <dirname property="resource.home.dir" file="${ant.file}"/>
+ <echo>Resource Home Directory: ${resource.home.dir}</echo>
+
+ <property file="${resource.home.dir}/src/build/local.build.properties"/>
+ <property file="${resource.home.dir}/src/build/build.properties"/>
+
+ <path id="classpath">
+ <pathelement path="${maven2.cp}"/>
+ </path>
+ <property name="resource.build.dir" value="${resource.home.dir}/build"/>
+ <property name="resource.classes.dir" value="${resource.build.dir}/classes"/>
+ <property name="resource.lib.dir" value="${resource.build.dir}/lib"/>
+ <property name="resource.java.dir" value="${resource.home.dir}/src/java"/>
+ </target>
+
+ <target name="compile" description="Compile Java classes" depends="init">
+
+ <mkdir dir="${resource.classes.dir}"/>
+ <javac srcdir="${resource.java.dir}" destdir="${resource.classes.dir}"
+ classpathref="classpath"
+ debug="true"
+ />
+ <mkdir dir="${resource.lib.dir}"/>
+ <jar destfile="${resource.lib.dir}/yanel-resource-${resource.name}-${resource.version}.jar"
+ basedir="${resource.classes.dir}"
+ />
+ </target>
+
+ <target name="clean" depends="init">
+ <delete dir="${resource.build.dir}"/>
+ </target>
+
+ <target name="copy-dependencies" depends="init">
+ <copy todir="${build.dir}/webapps/${servlet.context.prefix}/WEB-INF/lib">
+ <fileset refid="maven2.resource.fileset"/>
+ <mapper type="flatten"/>
+ </copy>
+ </target>
+</project>
Added: public/yanel/contributions/resources/redirect/resource.xml
===================================================================
--- public/yanel/contributions/resources/redirect/resource.xml (rev 0)
+++ public/yanel/contributions/resources/redirect/resource.xml 2007-06-22 09:35:30 UTC (rev 25320)
@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+
+<resource xmlns="http://www.wyona.org/yanel/1.0"
+ name="redirect"
+ namespace="http://www.wyona.org/yanel/resource/1.0"
+ class="org.wyona.yanel.impl.resources.RedirectResource"
+ >
+<description>
+Redirect whereas an XSLT or multiple XSLTs can be specified and applied
+</description>
+
+<rtd>
+ <property name="mime-type"/>
+ <property name="xslt" multiple="true"/>
+ <property name="yanel-path"/>
+</rtd>
+</resource>
Added: public/yanel/contributions/resources/redirect/src/build/build.properties
===================================================================
--- public/yanel/contributions/resources/redirect/src/build/build.properties (rev 0)
+++ public/yanel/contributions/resources/redirect/src/build/build.properties 2007-06-22 09:35:30 UTC (rev 25320)
@@ -0,0 +1,2 @@
+resource.name=redirect
+resource.version=0.0.1-dev-rXXX
Added: public/yanel/contributions/resources/redirect/src/build/dependencies.xml
===================================================================
--- public/yanel/contributions/resources/redirect/src/build/dependencies.xml (rev 0)
+++ public/yanel/contributions/resources/redirect/src/build/dependencies.xml 2007-06-22 09:35:30 UTC (rev 25320)
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+
+<project name="wiki-dependencies" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
+
+ <target name="dependencies" description="Dependencies">
+ <!-- INFO: http://maven.apache.org/ant-tasks.html -->
+ <artifact:remoteRepository id="wyona.remote.repository" url="http://www.wyona.org/maven2/"/>
+
+ <artifact:dependencies pathId="maven2.classpath" filesetId="maven2.fileset">
+ <remoteRepository refid="wyona.remote.repository"/>
+ <dependency groupId="wyona-org-yanel" artifactId="yanel-core" version="${yanel.source.version}"/>
+ <dependency groupId="wyona-org-security" artifactId="wyona-org-security-core" version="0.0.1-dev-r25041"/>
+ <dependency groupId="xml-resolver" artifactId="xml-resolver" version="1.1"/>
+ <dependency groupId="javax.servlet" artifactId="servlet-api" version="2.3"/>
+ <dependency groupId="xalan" artifactId="xalan" version="2.7.0"/>
+ <dependency groupId="avalon-framework" artifactId="avalon-framework-api" version="4.3"/>
+ <dependency groupId="avalon-framework" artifactId="avalon-framework-impl" version="4.3"/>
+ </artifact:dependencies>
+
+ <artifact:dependencies pathId="maven2.resource.classpath" filesetId="maven2.resource.fileset">
+ <remoteRepository refid="wyona.remote.repository"/>
+ <!-- No resource specific libs yet -->
+ <dependency groupId="avalon-framework" artifactId="avalon-framework-api" version="4.3"/>
+ <dependency groupId="avalon-framework" artifactId="avalon-framework-impl" version="4.3"/>
+ <dependency groupId="wyona-org-security" artifactId="wyona-org-security-core" version="0.0.1-dev-r25041"/>
+ </artifact:dependencies>
+
+ <property name="maven2.cp" refid="maven2.classpath"/>
+ <property name="maven2.resource.cp" refid="maven2.resource.classpath"/>
+ <!--<echo>Maven2 classpath: ${maven2.cp}</echo>-->
+ </target>
+
+</project>
Added: public/yanel/contributions/resources/redirect/src/java/org/wyona/yanel/impl/resources/RedirectResource.java
===================================================================
--- public/yanel/contributions/resources/redirect/src/java/org/wyona/yanel/impl/resources/RedirectResource.java (rev 0)
+++ public/yanel/contributions/resources/redirect/src/java/org/wyona/yanel/impl/resources/RedirectResource.java 2007-06-22 09:35:30 UTC (rev 25320)
@@ -0,0 +1,695 @@
+/*
+ * Copyright 2006 Wyona
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.wyona.org/licenses/APACHE-LICENSE-2.0
+ *
+ * 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.wyona.yanel.impl.resources;
+
+import org.w3c.dom.Document;
+import org.wyona.yanel.core.Path;
+import org.wyona.yanel.core.Resource;
+import org.wyona.yanel.core.ResourceConfiguration;
+import org.wyona.yanel.core.Topic;
+import org.wyona.yanel.core.Yanel;
+
+import org.wyona.yanel.core.api.attributes.CreatableV2;
+import org.wyona.yanel.core.api.attributes.IntrospectableV1;
+import org.wyona.yanel.core.api.attributes.ModifiableV2;
+import org.wyona.yanel.core.api.attributes.TranslatableV1;
+import org.wyona.yanel.core.api.attributes.VersionableV2;
+import org.wyona.yanel.core.api.attributes.ViewableV1;
+import org.wyona.yanel.core.api.attributes.ViewableV2;
+import org.wyona.yanel.core.api.attributes.WorkflowableV1;
+import org.wyona.yanel.core.attributes.translatable.TranslationException;
+import org.wyona.yanel.core.attributes.translatable.TranslationManager;
+import org.wyona.yanel.core.attributes.versionable.RevisionInformation;
+import org.wyona.yanel.core.attributes.viewable.View;
+import org.wyona.yanel.core.attributes.viewable.ViewDescriptor;
+
+import org.wyona.yanel.core.map.Map;
+import org.wyona.yanel.core.map.Realm;
+import org.wyona.yanel.core.serialization.HTMLSerializer;
+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.wyona.yanel.core.workflow.Workflow;
+import org.wyona.yanel.core.workflow.WorkflowException;
+import org.wyona.yanel.core.workflow.WorkflowHelper;
+
+import org.wyona.yarep.core.NoSuchNodeException;
+import org.wyona.yarep.core.NoSuchPropertyException;
+import org.wyona.yarep.core.Node;
+import org.wyona.yarep.core.Repository;
+import org.wyona.yarep.core.RepositoryException;
+import org.wyona.yarep.core.RepositoryFactory;
+import org.wyona.yarep.core.Revision;
+import org.wyona.yarep.util.RepoPath;
+
+import org.wyona.security.core.api.Identity;
+import org.wyona.security.core.api.IdentityMap;
+
+import org.xml.sax.InputSource;
+import org.xml.sax.XMLReader;
+import org.xml.sax.helpers.XMLReaderFactory;
+
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.sax.SAXResult;
+import javax.xml.transform.sax.SAXSource;
+import javax.xml.transform.sax.SAXTransformerFactory;
+import javax.xml.transform.sax.TransformerHandler;
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.transform.stream.StreamResult;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.Reader;
+import java.io.Writer;
+import java.util.Date;
+import java.util.Properties;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationUtil;
+
+import org.apache.log4j.Category;
+import org.apache.xml.resolver.tools.CatalogResolver;
+import org.apache.xml.serializer.Serializer;
+
+/**
+ *
+ */
+public class RedirectResource extends Resource implements ViewableV2, ModifiableV2, VersionableV2, CreatableV2, IntrospectableV1, TranslatableV1, WorkflowableV1 {
+
+ private static Category log = Category.getInstance(RedirectResource.class);
+
+ Map map;
+
+ private String srcPath;
+
+ public static String IDENTITY_MAP_KEY = "identity-map";
+
+ /**
+ *
+ */
+ public RedirectResource() {
+ }
+
+ /**
+ *
+ */
+ public ViewDescriptor[] getViewDescriptors() {
+ ViewDescriptor[] vd = new ViewDescriptor[2];
+ vd[0] = new ViewDescriptor("default");
+ // NOTE: depends on XSLT ...
+ vd[0].setMimeType(null);
+ vd[1] = new ViewDescriptor("source");
+ vd[1].setMimeType("application/xml");
+ return vd;
+ }
+
+ public View getView(String viewId) throws Exception {
+ return getView(viewId, null);
+ }
+
+ /**
+ * Generates view
+ */
+ public View getView(String viewId, String revisionName) throws Exception {
+ View view = new View();
+ view.setResponse(false); // this resource writes the response itself
+ HttpServletRequest request = getRequest();
+ HttpServletResponse response = getResponse();
+
+ String defaultHref = getResourceConfigProperty("href");
+
+ String currentUser = null;
+ Identity identity = getIdentity(request);
+ if (identity != null) {
+ currentUser = identity.getUsername();
+ }
+
+ ResourceConfiguration rc = getConfiguration();
+ Document customConfigDoc = rc.getCustomConfiguration();
+ if (customConfigDoc != null) {
+ Configuration config = ConfigurationUtil.toConfiguration(customConfigDoc.getDocumentElement());
+ Configuration[] redirectConfigs = config.getChildren("user");
+ if (redirectConfigs.length == 0) return null;
+ for (int i = 0; i < redirectConfigs.length; i++) {
+ try {
+ if (redirectConfigs[i].getAttribute("name") == currentUser || (currentUser).equals(redirectConfigs[i].getAttribute("name"))) {
+ response.setStatus(307);
+ response.setHeader("Location", redirectConfigs[i].getAttribute("href"));
+ } else {
+ this.srcPath = defaultHref;
+ }
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ return null;
+ }
+ }
+ }
+
+ return view;
+ }
+
+ /**
+ * Gets the repository path of this resource.
+ */
+ public String getSourcePath() {
+ if (this.srcPath != null && this.srcPath.length() != 0) {
+ return this.srcPath;
+ } else {
+ return getPath();
+ }
+ }
+
+ /**
+ *
+ */
+ private InputStream getContentXML(Repository repo, String yanelPath, String revisionName) throws Exception {
+ if (yanelPath != null) {
+ log.debug("Yanel Path: " + yanelPath);
+ Resource res = yanel.getResourceManager().getResource(getRequest(), getResponse(),
+ getRealm(), yanelPath);
+ if (ResourceAttributeHelper.hasAttributeImplemented(res, "Viewable", "1")) {
+ // TODO: Pass the request ...
+ String viewV1path = getRealm().getMountPoint() + yanelPath.substring(1);
+ log.debug("including document: " + viewV1path);
+ View view = ((ViewableV1) res).getView(new Path(viewV1path), null);
+ if (view.getMimeType().indexOf("xml") >= 0) {
+ // TODO: Shall the mime-type be transfered?
+ return view.getInputStream();
+ } else {
+ log.warn("No XML like mime-type: " + getPath());
+ }
+ } else if (ResourceAttributeHelper.hasAttributeImplemented(res, "Viewable", "2")) {
+ // TODO: Pass the request ...
+ View view = ((ViewableV2) res).getView(null);
+ if (view.getMimeType().indexOf("xml") >= 0) {
+ // TODO: Shall the mime-type be transfered?
+ return view.getInputStream();
+ } else {
+ log.warn("No XML like mime-type: " + getPath());
+ }
+ } else {
+ log.warn("Resource is not ViewableV1: " + getPath());
+ }
+ }
+
+ Node node;
+ if (revisionName != null) {
+ node = repo.getNode(getSourcePath()).getRevision(revisionName);
+ } else {
+ node = repo.getNode(getSourcePath());
+ }
+ return node.getInputStream();
+ }
+
+ /**
+ * Get mime type
+ */
+ public String getMimeType(String viewId) throws Exception {
+ String mimeType = getResourceConfigProperty("mime-type");
+ if (mimeType != null) return mimeType;
+
+ String suffix = PathUtil.getSuffix(getPath());
+ if (suffix != null) {
+ log.debug("SUFFIX: " + suffix);
+ if (suffix.equals("html")) {
+ //mimeType = "text/html";
+ mimeType = "application/xhtml+xml";
+ } else if (suffix.equals("xhtml")) {
+ mimeType = "application/xhtml+xml";
+ } else if (suffix.equals("xml")) {
+ mimeType = "application/xml";
+ } else {
+ mimeType = "application/xml";
+ }
+ } else {
+ mimeType = "application/xml";
+ }
+ return mimeType;
+ }
+
+ /**
+ *
+ */
+ public Reader getReader() throws Exception {
+ return new InputStreamReader(getInputStream(), "UTF-8");
+ }
+
+ /**
+ *
+ */
+ public InputStream getInputStream() throws Exception {
+ return getRealm().getRepository().getNode(getPath()).getInputStream();
+ }
+
+ /**
+ *
+ */
+ public Writer getWriter() throws Exception {
+ log.error("Not implemented yet!");
+ return null;
+ }
+
+ /**
+ *
+ */
+ public OutputStream getOutputStream() throws Exception {
+ return getRealm().getRepository().getNode(getPath()).getOutputStream();
+ }
+
+ /**
+ *
+ */
+ public void write(InputStream in) throws Exception {
+ log.warn("Not implemented yet!");
+ }
+
+ /**
+ *
+ */
+ public long getLastModified() throws Exception {
+ Node node = getRealm().getRepository().getNode(getPath());
+ long lastModified;
+ if (node.isResource()) {
+ lastModified = node.getLastModified();
+ } else {
+ lastModified = 0;
+ }
+
+ return lastModified;
+ }
+
+ /**
+ * 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;
+ }
+
+
+ /**
+ *
+ */
+ public boolean delete() throws Exception {
+ getRealm().getRepository().getNode(getPath()).delete();
+ return true;
+ }
+
+ /**
+ *
+ */
+ public RevisionInformation[] getRevisions() throws Exception {
+ Revision[] revisions = getRealm().getRepository().getNode(getPath()).getRevisions();
+ RevisionInformation[] revisionInfos = new RevisionInformation[revisions.length];
+
+ for (int i = 0; i < revisions.length; i++) {
+ revisionInfos[i] = new RevisionInformation(revisions[i]);
+ }
+ return revisionInfos;
+ }
+
+ public void checkin(String comment) throws Exception {
+ Node node = getRealm().getRepository().getNode(getPath());
+ Revision revision = node.checkin(comment);
+ // set initial workflow state and date:
+ Workflow workflow = WorkflowHelper.getWorkflow(this);
+ if (workflow != null) {
+ setWorkflowState(workflow.getInitialState(), revision.getRevisionName());
+ }
+ /*
+ if (node.isCheckedOut()) {
+ String checkoutUserID = node.getCheckoutUserID();
+ if (checkoutUserID.equals(userID)) {
+ node.checkin();
+ } else {
+ throw new Exception("Resource is checked out by another user: " + checkoutUserID);
+ }
+ } else {
+ throw new Exception("Resource is not checked out.");
+ }
+ */
+ }
+
+ public void checkout(String userID) throws Exception {
+ Node node = getRealm().getRepository().getNode(getPath());
+ node.checkout(userID);
+ /*
+ if (node.isCheckedOut()) {
+ String checkoutUserID = node.getCheckoutUserID();
+ if (checkoutUserID.equals(userID)) {
+ log.warn("Resource " + getPath() + " is already checked out by this user: " + checkoutUserID);
+ } else {
+ throw new Exception("Resource is already checked out by another user: " + checkoutUserID);
+ }
+ } else {
+ node.checkout(userID);
+ }
+ */
+ }
+
+ public void cancelCheckout() throws Exception {
+ Node node = getRealm().getRepository().getNode(getPath());
+ node.cancelCheckout();
+ }
+
+ public void restore(String revisionName) throws Exception {
+ getRealm().getRepository().getNode(getPath()).restore(revisionName);
+ }
+
+ public Date getCheckoutDate() throws Exception {
+ Node node = getRealm().getRepository().getNode(getPath());
+ // return node.getCheckoutDate();
+ return null;
+ }
+
+ public String getCheckoutUserID() throws Exception {
+ Node node = getRealm().getRepository().getNode(getPath());
+ return node.getCheckoutUserID();
+ }
+
+ public boolean isCheckedOut() throws Exception {
+ Node node = getRealm().getRepository().getNode(getPath());
+ return node.isCheckedOut();
+ }
+
+
+ public boolean exists() throws Exception {
+ return getRealm().getRepository().existsNode(getPath());
+ }
+
+ /**
+ * Get size of generated page
+ */
+ public long getSize() throws Exception {
+ // TODO: If the XML is being transformed then the size will not be the same as the size of the node!
+/*
+ Node node = getRealm().getRepository().getNode(getPath());
+ long size;
+ if (node.isResource()) {
+ size = node.getSize();
+ } else {
+ size = 0;
+ }
+ return size;
+*/
+ return -1;
+ }
+
+ /**
+ * Get operating system
+ */
+ public String getOS(String userAgent) {
+ if (userAgent.indexOf("Linux") > 0) {
+ return "unix";
+ } else if (userAgent.indexOf("Mac OS X") > 0) {
+ return "unix";
+ } else if (userAgent.indexOf("Windows") > 0) {
+ return "windows";
+ } else {
+ log.warn("Operating System could not be recognized: " + userAgent);
+ return null;
+ }
+ }
+
+ /**
+ * Get client
+ */
+ public String getClient(String userAgent) {
+ if (userAgent.indexOf("Firefox") > 0) {
+ return "firefox";
+ } else if (userAgent.indexOf("MSIE") > 0) {
+ return "msie";
+ } else {
+ log.warn("Client could not be recognized: " + userAgent);
+ return null;
+ }
+ }
+
+
+ /**
+ *
+ */
+ public void create(HttpServletRequest request) {
+ try {
+ // TODO: XHTML template should not be hardcoded!
+ Repository repo = getRealm().getRepository();
+
+ org.wyona.yanel.core.util.YarepUtil.addNodes(repo, getPath().toString(), org.wyona.yarep.core.NodeType.RESOURCE);
+ Writer writer = new java.io.OutputStreamWriter(repo.getNode(getPath()).getOutputStream());
+ writer.write("<?xml version=\"1.0\"?>");
+ writer.write("<html xmlns=\"http://www.w3.org/1999/xhtml\">");
+ writer.write("<head>");
+ writer.write(" <title>Created from template ...</title>");
+ writer.write(" <link rel=\"neutron-introspection\" type=\"application/neutron+xml\" href=\"?yanel.resource.usecase=introspection\"/>");
+ writer.write("</head>");
+ writer.write("<body>");
+ writer.write(" <p>Created from template ...</p>");
+ writer.write("</body>");
+ writer.write("</html>");
+ writer.close();
+
+ // TODO: Introspection should not be hardcoded!
+ String name = new org.wyona.commons.io.Path(getPath()).getName();
+ String parent = new org.wyona.commons.io.Path(getPath()).getParent().toString();
+ String nameWithoutSuffix = name;
+ int lastIndex = name.lastIndexOf(".");
+ if (lastIndex > 0) nameWithoutSuffix = name.substring(0, lastIndex);
+ String introspectionPath = parent + "/introspection-" + nameWithoutSuffix + ".xml";
+
+ org.wyona.yanel.core.util.YarepUtil.addNodes(repo, introspectionPath, org.wyona.yarep.core.NodeType.RESOURCE);
+ writer = new java.io.OutputStreamWriter(repo.getNode(introspectionPath).getOutputStream());
+ writer.write(getIntrospection(name));
+ writer.close();
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ }
+
+ /**
+ *
+ */
+ public java.util.HashMap createRTIProperties(HttpServletRequest request) {
+ java.util.HashMap map = new java.util.HashMap();
+ map.put("xslt", request.getParameter("rp.xslt"));
+ map.put("mime-type", request.getParameter("rp.mime-type"));
+ map.put("workflow-schema", request.getParameter("rp.workflow-schema"));
+ return map;
+ }
+
+ /**
+ *
+ */
+ public String getPropertyType(String name) {
+ log.warn("Not implemented yet!");
+ return null;
+ }
+
+ /**
+ *
+ */
+ public Object getProperty(String name) {
+ log.warn("Not implemented yet!");
+ return null;
+ }
+
+ /**
+ *
+ */
+ public String[] getPropertyNames() {
+ log.warn("Not implemented yet!");
+ return null;
+ }
+
+ /**
+ *
+ */
+ public void setProperty(String name, Object value) {
+ log.warn("Not implemented yet!");
+ }
+
+ /**
+ * Gets the identity from the session associated with the given request.
+ * @param request
+ * @return identity or null if there is no identity in the session for the current
+ * realm or if there is no session at all
+ */
+ private Identity getIdentity(HttpServletRequest request) throws Exception {
+ Realm realm = getRealm();
+ HttpSession session = request.getSession(false);
+ if (session != null) {
+ IdentityMap identityMap = (IdentityMap)session.getAttribute(IDENTITY_MAP_KEY);
+ if (identityMap != null) {
+ return (Identity)identityMap.get(realm.getID());
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Create introspection for XHTML documents used by the creator (WARNING: Mime type is hardcoded!)
+ * @param name
+ * @return introspection as string
+ */
+ private String getIntrospection(String name) {
+ StringBuffer sb = new StringBuffer();
+ sb.append("<?xml version=\"1.0\"?>");
+ sb.append("\n");
+ sb.append("\n<introspection xmlns=\"http://www.wyona.org/neutron/2.0\">");
+ sb.append("\n");
+
+ sb.append("<navigation>");
+ sb.append(" <sitetree href=\"./\" method=\"PROPFIND\"/>");
+ sb.append("</navigation>");
+
+
+ sb.append("\n <resource name=\"" + name + "\">");
+ sb.append("\n <edit mime-type=\"application/xhtml+xml\">");
+ sb.append("\n <checkout url=\"" + name + "?yanel.resource.viewid=source&yanel.resource.usecase=checkout\" method=\"GET\"/>");
+ sb.append("\n <checkin url=\"" + name + "?yanel.resource.usecase=checkin\" method=\"PUT\"/>");
+ sb.append("\n <release-lock url=\"" + name + "?yanel.resource.usecase=release-lock\" method=\"GET\"/>");
+ sb.append("\n </edit>");
+ sb.append("\n </resource>");
+ sb.append("\n</introspection>");
+
+ return sb.toString();
+ }
+
+ /**
+ * Get introspection for Introspectable interface
+ */
+ public String getIntrospection() throws Exception {
+ String name = PathUtil.getName(getPath());
+ StringBuffer sb = new StringBuffer("<?xml version=\"1.0\"?>");
+ sb.append("<introspection xmlns=\"http://www.wyona.org/neutron/2.0\">");
+
+ sb.append("<navigation>");
+ sb.append(" <sitetree href=\"./\" method=\"PROPFIND\"/>");
+ sb.append("</navigation>");
+
+ sb.append("<resource name=\"" + name + "\">");
+ //sb.append("<edit mime-type=\"application/xml\">");
+ sb.append("<edit mime-type=\"" + this.getMimeType(null) + "\">");
+ sb.append("<checkout url=\"?yanel.resource.viewid=source&yanel.resource.usecase=checkout\" method=\"GET\"/>");
+ sb.append("<checkin url=\"?yanel.resource.usecase=checkin\" method=\"PUT\"/>");
+ sb.append("<release-lock url=\"?yanel.resource.usecase=release-lock\" method=\"GET\"/>");
+ sb.append("</edit>");
+
+ sb.append(getWorkflowIntrospection());
+
+ sb.append("</resource>");
+ sb.append("</introspection>");
+ return sb.toString();
+ }
+
+ protected TranslationManager getTranslationManager() throws TranslationException {
+ return getRealm().getTranslationManager();
+ }
+
+ public String getLanguage() throws TranslationException {
+ return getTranslationManager().getLanguage(this);
+ }
+
+ public String[] getLanguages() throws TranslationException {
+ return getTranslationManager().getLanguages(this);
+ }
+
+ public Resource getTranslation(String language) throws TranslationException {
+ return getTranslationManager().getTranslation(this, language);
+ }
+
+ public void addTranslation(Resource resource, String language) throws TranslationException {
+ getTranslationManager().addTranslation(this, resource, language);
+ }
+
+ public boolean hasTranslation(String language) throws TranslationException {
+ return getTranslationManager().hasTranslation(this, language);
+ }
+
+ public void removeTranslation(String language) throws TranslationException {
+ getTranslationManager().removeTranslation(this, language);
+ }
+
+ /************************************************
+ * Workflow *
+ ************************************************/
+
+ public void doTransition(String transitionID, String revision) throws WorkflowException {
+ WorkflowHelper.doTransition(this, transitionID, revision);
+ }
+
+ public View getLiveView(String viewid) throws Exception {
+ if (WorkflowHelper.isLive(this)) {
+ String liveRevision = WorkflowHelper.getLiveRevision(this);
+ return getView(viewid, liveRevision);
+ } else {
+ return null;
+ }
+ }
+
+ public boolean isLive() throws WorkflowException {
+ return WorkflowHelper.isLive(this);
+ }
+
+ public String getWorkflowVariable(String name) throws WorkflowException {
+ return WorkflowHelper.getWorkflowVariable(this, name);
+ }
+
+ public void setWorkflowVariable(String name, String value) throws WorkflowException {
+ WorkflowHelper.setWorkflowVariable(this, name, value);
+ }
+
+ public void removeWorkflowVariable(String name) throws WorkflowException {
+ WorkflowHelper.removeWorkflowVariable(this, name);
+ }
+
+ public String getWorkflowState(String revision) throws WorkflowException {
+ return WorkflowHelper.getWorkflowState(this, revision);
+ }
+
+ public void setWorkflowState(String state, String revision) throws WorkflowException {
+ WorkflowHelper.setWorkflowState(this, state, revision);
+ }
+
+ public Date getWorkflowDate(String revision) throws WorkflowException {
+ return WorkflowHelper.getWorkflowDate(this, revision);
+ }
+
+ public String getWorkflowIntrospection() throws WorkflowException {
+ return WorkflowHelper.getWorkflowIntrospection(this);
+ }
+
+}
More information about the Yanel-commits
mailing list