Author: adamw Date: 2005-11-14 16:44:56 -0500 (Mon, 14 Nov 2005) New Revision: 1570 Added: trunk/forge/portal-extensions/forge-kosmos/conf/server/kosmos-services-servlet.xml trunk/forge/portal-extensions/forge-kosmos/src/ trunk/forge/portal-extensions/forge-kosmos/src/java/ trunk/forge/portal-extensions/forge-kosmos/src/java/org/ trunk/forge/portal-extensions/forge-kosmos/src/java/org/jboss/ trunk/forge/portal-extensions/forge-kosmos/src/java/org/jboss/kosmos/ trunk/forge/portal-extensions/forge-kosmos/src/java/org/jboss/kosmos/ShotokuCachedDataStore.java Modified: trunk/forge/portal-extensions/forge-ear/src/META-INF/application.xml trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java trunk/forge/portal-extensions/forge-kosmos/ trunk/forge/portal-extensions/forge-kosmos/maven.xml trunk/forge/portal-extensions/forge-kosmos/project.xml trunk/forge/portal-extensions/forge-kosmos/to-copy/kosmos-portlet.war trunk/forge/portal-extensions/forge-kosmos/to-copy/kosmos-server.war trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNode.java trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/SlashNamesTest.java trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/servlet/ShotokuServlet.java Log: http://jira.jboss.com/jira/browse/JBLAB-490 : implementation Modified: trunk/forge/portal-extensions/forge-ear/src/META-INF/application.xml =================================================================== --- trunk/forge/portal-extensions/forge-ear/src/META-INF/application.xml 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/forge-ear/src/META-INF/application.xml 2005-11-14 21:44:56 UTC (rev 1570) @@ -15,6 +15,16 @@ </module> <module> <web> + <web-uri>kosmos-portlet.war</web-uri> + </web> + </module> + <module> + <web> + <web-uri>kosmos-server.war</web-uri> + </web> + </module> + <module> + <web> <web-uri>federation-register.war</web-uri> </web> </module> Modified: trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java =================================================================== --- trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/forge-file-access/src/java/org/jboss/forge/fileaccess/FileAccessFilter.java 2005-11-14 21:44:56 UTC (rev 1570) @@ -25,7 +25,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.net.URLDecoder; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -118,11 +117,6 @@ * want to get the part /path/to/resource. */ String requestedRes = requestURI.split("[/]", 3)[2]; - - // Decoding the requested resource name for kosmos-cache - if (requestedRes.indexOf(KOSMOS_CACHE_ACCESS) != -1) { - requestedRes = URLDecoder.decode(requestedRes, "utf-8"); - } try { // Checking if we can allow access to this resource. @@ -182,6 +176,7 @@ is.close(); } } catch (Exception e1) { + e1.printStackTrace(); response.setContentType("text/html"); response.getWriter().println(ACCESS_DENIED); } Property changes on: trunk/forge/portal-extensions/forge-kosmos ___________________________________________________________________ Name: svn:ignore - target + target .classpath .settings .project Added: trunk/forge/portal-extensions/forge-kosmos/conf/server/kosmos-services-servlet.xml =================================================================== --- trunk/forge/portal-extensions/forge-kosmos/conf/server/kosmos-services-servlet.xml 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/forge-kosmos/conf/server/kosmos-services-servlet.xml 2005-11-14 21:44:56 UTC (rev 1570) @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> + +<beans> + <!-- CC service --> + <bean id="ccService" class="hu.midori.kosmos.server.cc.CcServiceImpl"> + <property name="store" ref="shotokuCachedDataStore"/> + </bean> + <bean name="/cc-service" class="org.springframework.remoting.caucho.HessianServiceExporter"> + <property name="service" ref="ccService"/> + <property name="serviceInterface" value="hu.midori.kosmos.protocol.CcService"/> + </bean> + + <!-- JIRA service --> + <bean id="jiraService" class="hu.midori.kosmos.server.jira.JiraServiceImpl"> + <property name="store" ref="shotokuCachedDataStore"/> + </bean> + <bean name="/jira-service" class="org.springframework.remoting.caucho.HessianServiceExporter"> + <property name="service" ref="jiraService"/> + <property name="serviceInterface" value="hu.midori.kosmos.protocol.JiraService"/> + </bean> + + <!-- SF service --> + <bean id="sfService" class="hu.midori.kosmos.server.sf.SfServiceImpl"> + <property name="store" ref="shotokuCachedDataStore"/> + </bean> + <bean name="/sf-service" class="org.springframework.remoting.caucho.HessianServiceExporter"> + <property name="service" ref="sfService"/> + <property name="serviceInterface" value="hu.midori.kosmos.protocol.SfService"/> + </bean> + + <!-- SVN service --> + <bean id="svnService" class="hu.midori.kosmos.server.svn.SvnServiceImpl"> + <property name="store" ref="shotokuCachedDataStore"/> + </bean> + <bean name="/svn-service" class="org.springframework.remoting.caucho.HessianServiceExporter"> + <property name="service" ref="svnService"/> + <property name="serviceInterface" value="hu.midori.kosmos.protocol.SvnService"/> + </bean> + + <!-- Shotoku cached data store --> + <bean id="shotokuCachedDataStore" class="org.jboss.kosmos.ShotokuCachedDataStore"> + <property name="fileAccessUrl" value="http://localhost:8080/file-access"/> + <property name="prefix" value="kosmos/images/kosmos-cache"/> + </bean> +</beans> \ No newline at end of file Modified: trunk/forge/portal-extensions/forge-kosmos/maven.xml =================================================================== --- trunk/forge/portal-extensions/forge-kosmos/maven.xml 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/forge-kosmos/maven.xml 2005-11-14 21:44:56 UTC (rev 1570) @@ -13,6 +13,7 @@ </goal> <goal name="build"> + <attainGoal name="java:compile" /> </goal> <goal name="deploy"> @@ -31,13 +32,20 @@ <ant:filename name="**/*" /> </ant:fileset> </ant:copy> + + <!-- Copying cache class --> + <ant:copy todir="target/kosmos-server.war/WEB-INF/classes" overwrite="true"> + <ant:fileset dir="target/classes"> + <ant:filename name="**/*" /> + </ant:fileset> + </ant:copy> <!-- Deleting old deployment --> <ant:delete dir="${local.deploy.dir}/kosmos-server.war" /> <ant:delete dir="${local.deploy.dir}/kosmos-portlet.war" /> <!-- Deploying new packages --> - <ant:copy todir="${local.deploy.dir}" overwrite="true"> + <ant:copy todir="../${forge.ear.dir}/target/${forge.ear.name}" overwrite="true"> <ant:fileset dir="target"> <ant:filename name="**/*" /> </ant:fileset> Modified: trunk/forge/portal-extensions/forge-kosmos/project.xml =================================================================== --- trunk/forge/portal-extensions/forge-kosmos/project.xml 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/forge-kosmos/project.xml 2005-11-14 21:44:56 UTC (rev 1570) @@ -9,4 +9,16 @@ <extend>../common.xml</extend> <id>forge-kosmos</id> <name>Forge kosmos</name> + <dependencies> + <dependency> + <groupId>kosmos</groupId> + <artifactId>kosmos-server</artifactId> + <version>1.0</version> + <jar>kosmos-server.jar</jar> + </dependency> + </dependencies> + + <build> + <sourceDirectory>src/java</sourceDirectory> + </build> </project> Added: trunk/forge/portal-extensions/forge-kosmos/src/java/org/jboss/kosmos/ShotokuCachedDataStore.java =================================================================== --- trunk/forge/portal-extensions/forge-kosmos/src/java/org/jboss/kosmos/ShotokuCachedDataStore.java 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/forge-kosmos/src/java/org/jboss/kosmos/ShotokuCachedDataStore.java 2005-11-14 21:44:56 UTC (rev 1570) @@ -0,0 +1,114 @@ +/* + * JBoss, Home of Professional Open Source + * Copyright 2005, JBoss Inc., and individual contributors as indicated + * by the @authors tag. See the copyright.txt in the distribution for a + * full listing of individual contributors. + * + * This is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this software; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA, or see the FSF site: http://www.fsf.org. + */ +package org.jboss.kosmos; + +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.Date; + +import org.jboss.shotoku.ContentManager; +import org.jboss.shotoku.Directory; +import org.jboss.shotoku.Node; +import org.jboss.shotoku.exceptions.ResourceDoesNotExist; + +import hu.midori.kosmos.server.CachedDataStore; + +/** + * + * @author Adam Warski (ad...@as...) + * @author <a href="mailto:aro...@mi...">Aron Gombas</a> + */ +public class ShotokuCachedDataStore implements CachedDataStore { + private String fileAccessUrl; + + private String prefix; + + private ContentManager cm; + + public String storeFile(String fileName, InputStream in) throws Exception { + Node file; + Directory cacheDir = cm.getRootDirectory(); + + // Clearing old cache. + String cachedWildcard = getCachedWildcard(fileName); + for (Node cacheNode : cacheDir.getNodes()) { + if (cacheNode.getName().endsWith(cachedWildcard)) { + cacheNode.delete(); + } + } + + // Saving the new file. + String cachedFileName = getCachedFileName(fileName); + try { + file = cm.getNode(cachedFileName); + } catch (ResourceDoesNotExist e) { + file = cm.getRootDirectory().newNode(cachedFileName); + } + + file.setContent(in); + file.save("Kosmos"); + + return fileAccessUrl + "/" + prefix + "/" + cachedFileName; + } + + public void setFileAccessUrl(String fileAccessUrl) { + this.fileAccessUrl = fileAccessUrl; + } + + public void setPrefix(String prefix) { + cm = ContentManager.getContentManager(prefix); + this.prefix = prefix; + } + + /** + * Returns the part of the filename for a cached item without the timestamp + * prefix. This is used to found the previous versions of the same cache item. + * @throws UnsupportedEncodingException + */ + private static String getCachedWildcard(String filename) + throws UnsupportedEncodingException { + return encodeFilename("", filename); + } + + /** + * Returns the local filename for a cached item, by adding a timestamp prefix + * so that browsers will not cache the item if it actually changes. + * @throws UnsupportedEncodingException + */ + private static String getCachedFileName(String filename) + throws UnsupportedEncodingException { + return encodeFilename(Long.toString(new Date().getTime()), filename); + } + + /** + * Encodes the local filename for a cached item. + * @param filename can contain any character. + * @return the filename which contain only file-system-compatible characters. + * @throws UnsupportedEncodingException + */ + private static String encodeFilename(String prefix, String filename) + throws UnsupportedEncodingException { + return URLEncoder.encode(String.format("%s_%s", prefix, filename), + "utf-8"); + } +} Modified: trunk/forge/portal-extensions/forge-kosmos/to-copy/kosmos-portlet.war =================================================================== (Binary files differ) Modified: trunk/forge/portal-extensions/forge-kosmos/to-copy/kosmos-server.war =================================================================== (Binary files differ) Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnHeadNode.java 2005-11-14 21:44:56 UTC (rev 1570) @@ -92,7 +92,6 @@ getNodeContent().setContent(stringContent); } - public void setContent(InputStream is) { try { getNodeContent().setContent(is); @@ -105,6 +104,10 @@ getNodeContent().setContent(bytes); } + protected void setContent(NodeContent content) { + this.content = content; + } + public OutputStream getOutputStream() { return getNodeContent().getOutputStream(); } Modified: trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNode.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNode.java 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/shotoku/shotoku-svn/src/java/org/jboss/shotoku/svn/SvnNewNode.java 2005-11-14 21:44:56 UTC (rev 1570) @@ -117,7 +117,7 @@ throw new RepositoryException(e); } - super.setContent(content.asString()); + super.setContent(content); saveWithLock(logMessage); } Modified: trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/SlashNamesTest.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/SlashNamesTest.java 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/SlashNamesTest.java 2005-11-14 21:44:56 UTC (rev 1570) @@ -61,6 +61,21 @@ assertTrue(TEST_CONTENT.equals(base.getNode(TEST_NESTED_NODE).getContent())); } + public void testNestedExisting() { + Directory base = cm.getDirectory(TEST_DIR); + base.newDirectory("h").save("h"); + + Node nested = base.newNode(TEST_NESTED_NODE); + assertTrue((TEST_DIR + "/" + TEST_NESTED_NODE).equals(nested.getFullName())); + + nested.setContent(TEST_CONTENT); + nested.save(TEST_NESTED_NODE); + + assertTrue(TEST_CONTENT.equals(base.getDirectory("h"). + getDirectory("j").getNode("k").getContent())); + assertTrue(TEST_CONTENT.equals(base.getNode(TEST_NESTED_NODE).getContent())); + } + /** * Checks if content managers work with prefixes that contain unnecessary /. */ Modified: trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/servlet/ShotokuServlet.java =================================================================== --- trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/servlet/ShotokuServlet.java 2005-11-14 21:44:02 UTC (rev 1569) +++ trunk/forge/portal-extensions/shotoku/shotoku-test/src/java/org/jboss/shotoku/test/servlet/ShotokuServlet.java 2005-11-14 21:44:56 UTC (rev 1570) @@ -1,5 +1,6 @@ package org.jboss.shotoku.test.servlet; +import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; @@ -9,7 +10,9 @@ import javax.servlet.http.HttpServletResponse; import org.jboss.shotoku.ContentManager; +import org.jboss.shotoku.Node; import org.jboss.shotoku.aop.Inject; +import org.jboss.shotoku.exceptions.ResourceDoesNotExist; /** * @author Adam Warski (ad...@as...) @@ -17,10 +20,6 @@ public class ShotokuServlet extends HttpServlet { @Inject(prefix="shotoku-test") ContentManager test; - - //@Inject(prefix="wiki-content") - //@Inject - ContentManager wikiCm; /*private void readInputStream(InputStream is) throws IOException { int b; @@ -37,9 +36,15 @@ pw.write("Depends test: " + test + "<br />"); pw.write("<br />"); - wikiCm = ContentManager.getContentManager("wiki-content/"); + Node n; + try { + n = test.getNode("image.png"); + } catch (ResourceDoesNotExist e) { + n = test.getRootDirectory().newNode("image.png"); + } - wikiCm.getDirectory(""); + n.setContent(new FileInputStream("/home/adamw/downloads/image.png")); + n.save(""); //NodeList nl = new NodeList(); //pw.write(nl.getFeed("default/feeds/templates/hello-world.vm", null, new HashMap<String, Object>()).toString()); |