You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by js...@apache.org on 2007/04/12 00:05:39 UTC
svn commit: r527701 - in /activemq/trunk: ./ activemq-fileserver/
activemq-fileserver/src/ activemq-fileserver/src/main/
activemq-fileserver/src/main/java/ activemq-fileserver/src/main/java/org/
activemq-fileserver/src/main/java/org/apache/ activemq-fi...
Author: jstrachan
Date: Wed Apr 11 15:05:37 2007
New Revision: 527701
URL: http://svn.apache.org/viewvc?view=rev&rev=527701
Log:
Applied patch from Aleksi Kallio for AMQ-1075 to add a file server for out of band BlobMessage support
Added:
activemq/trunk/activemq-fileserver/
activemq/trunk/activemq-fileserver/pom.xml (with props)
activemq/trunk/activemq-fileserver/src/
activemq/trunk/activemq-fileserver/src/main/
activemq/trunk/activemq-fileserver/src/main/java/
activemq/trunk/activemq-fileserver/src/main/java/org/
activemq/trunk/activemq-fileserver/src/main/java/org/apache/
activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/
activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/
activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/FilenameGuardFilter.java (with props)
activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/RestFilter.java (with props)
activemq/trunk/activemq-fileserver/src/main/webapp/
activemq/trunk/activemq-fileserver/src/main/webapp/WEB-INF/
activemq/trunk/activemq-fileserver/src/main/webapp/WEB-INF/web.xml (with props)
activemq/trunk/activemq-fileserver/src/main/webapp/index.html (with props)
activemq/trunk/activemq-fileserver/src/test/
activemq/trunk/activemq-fileserver/src/test/java/
activemq/trunk/activemq-fileserver/src/test/java/org/
activemq/trunk/activemq-fileserver/src/test/java/org/apache/
activemq/trunk/activemq-fileserver/src/test/java/org/apache/activemq/
activemq/trunk/activemq-fileserver/src/test/java/org/apache/activemq/util/
activemq/trunk/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java (with props)
Modified:
activemq/trunk/pom.xml
Added: activemq/trunk/activemq-fileserver/pom.xml
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-fileserver/pom.xml?view=auto&rev=527701
==============================================================================
--- activemq/trunk/activemq-fileserver/pom.xml (added)
+++ activemq/trunk/activemq-fileserver/pom.xml Wed Apr 11 15:05:37 2007
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.apache.org/licenses/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.
+-->
+
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-parent</artifactId>
+ <version>4.2-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>activemq-fileserver</artifactId>
+ <packaging>war</packaging>
+ <name>ActiveMQ :: File Server</name>
+ <description>Web File Server for out of band large message exchange</description>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>maven-jetty-plugin</artifactId>
+ <version>${jetty-version}</version>
+ <configuration>
+ <connectors>
+ <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
+ <port>${jetty.port}</port>
+ <maxIdleTime>60000</maxIdleTime>
+ </connector>
+ </connectors>
+ <scanIntervalSeconds>10</scanIntervalSeconds>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <excludes>
+ <exclude>**/RestFilterTest.*</exclude>
+ </excludes>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+
+ <!-- j2ee jars -->
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jms_1.1_spec</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-jta_1.0.1B_spec</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-j2ee-management_1.0_spec</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.geronimo.specs</groupId>
+ <artifactId>geronimo-j2ee-jacc_1.0_spec</artifactId>
+ </dependency>
+
+ <!-- TODO this should not be needed, but transitive dependencies are not working -->
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>activemq-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>activeio-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-jaas</artifactId>
+ <optional>true</optional>
+ </dependency>
+
+ <!-- web container -->
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ </dependency>
+
+ <!-- For Spring servlet -->
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring</artifactId>
+ </dependency>
+
+ <!-- used for testing -->
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <properties>
+ <jetty.port>8080</jetty.port>
+ </properties>
+</project>
Propchange: activemq/trunk/activemq-fileserver/pom.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: activemq/trunk/activemq-fileserver/pom.xml
------------------------------------------------------------------------------
svn:executable = *
Added: activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/FilenameGuardFilter.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/FilenameGuardFilter.java?view=auto&rev=527701
==============================================================================
--- activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/FilenameGuardFilter.java (added)
+++ activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/FilenameGuardFilter.java Wed Apr 11 15:05:37 2007
@@ -0,0 +1,75 @@
+package org.apache.activemq.util;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.mortbay.log.Log;
+
+public class FilenameGuardFilter implements Filter {
+
+ public void destroy() {
+ // nothing to destroy
+ }
+
+ public void init(FilterConfig config) throws ServletException {
+ // nothing to init
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ if (request instanceof HttpServletRequest) {
+ HttpServletRequest httpRequest = (HttpServletRequest)request;
+ GuardedHttpServletRequest guardedRequest = new GuardedHttpServletRequest(httpRequest);
+ chain.doFilter(guardedRequest, response);
+ } else {
+ chain.doFilter(request, response);
+ }
+ }
+
+ private static class GuardedHttpServletRequest extends HttpServletRequestWrapper {
+
+ public GuardedHttpServletRequest(HttpServletRequest httpRequest) {
+ super(httpRequest);
+ }
+
+ private String guard(String filename) {
+ String guarded = filename.replace(":", "_");
+ if (Log.isDebugEnabled())
+ {
+ Log.debug("guarded " + filename + " to "+ guarded);
+ }
+ return guarded;
+ }
+
+ @Override
+ public String getParameter(String name) {
+ if (name.equals("Destination")) {
+ return guard(super.getParameter(name));
+ } else {
+ return super.getParameter(name);
+ }
+ }
+
+ @Override
+ public String getPathInfo() {
+ return guard(super.getPathInfo());
+ }
+
+ @Override
+ public String getPathTranslated() {
+ return guard(super.getPathTranslated());
+ }
+
+ @Override
+ public String getRequestURI() {
+ return guard(super.getRequestURI());
+ }
+ }
+}
Propchange: activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/FilenameGuardFilter.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/RestFilter.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/RestFilter.java?view=auto&rev=527701
==============================================================================
--- activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/RestFilter.java (added)
+++ activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/RestFilter.java Wed Apr 11 15:05:37 2007
@@ -0,0 +1,241 @@
+//========================================================================
+//Copyright 2007 CSC - Scientific Computing Ltd.
+//------------------------------------------------------------------------
+//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.apache.org/licenses/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.apache.activemq.util;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.net.URL;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.UnavailableException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.mortbay.log.Log;
+import org.mortbay.util.IO;
+import org.mortbay.util.URIUtil;
+
+import sun.net.www.protocol.http.HttpURLConnection;
+
+/**
+* <p>Adds support for HTTP PUT, MOVE and
+* DELETE methods. If init parameters read-permission-role and write-permission-role
+* are defined then all requests are authorized using the defined roles. Also GET methods are
+* authorized. </p>
+*
+* @author Aleksi Kallio
+*
+*/
+public class RestFilter implements Filter {
+
+ private static final String HTTP_HEADER_DESTINATION = "Destination";
+ private static final String HTTP_METHOD_MOVE = "MOVE";
+ private static final String HTTP_METHOD_PUT = "PUT";
+ private static final String HTTP_METHOD_GET = "GET";
+ private static final String HTTP_METHOD_DELETE = "DELETE";
+
+ private String readPermissionRole = null;
+ private String writePermissionRole = null;
+ private FilterConfig filterConfig;
+
+ public void init(FilterConfig filterConfig) throws UnavailableException
+ {
+ this.filterConfig = filterConfig;
+ readPermissionRole = filterConfig.getInitParameter("read-permission-role");
+ writePermissionRole = filterConfig.getInitParameter("write-permission-role");
+ }
+
+ private File locateFile(HttpServletRequest request)
+ {
+ return new File(filterConfig.getServletContext().getRealPath(URIUtil.addPaths(request.getServletPath(),request.getPathInfo())));
+ }
+
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
+ {
+ if (!(request instanceof HttpServletRequest && response instanceof HttpServletResponse))
+ {
+ if (Log.isDebugEnabled())
+ {
+ Log.debug("request not HTTP, can not understand: " + request.toString());
+ }
+ chain.doFilter(request, response);
+ return;
+ }
+
+ HttpServletRequest httpRequest = (HttpServletRequest)request;
+ HttpServletResponse httpResponse = (HttpServletResponse)response;
+
+ if (httpRequest.getMethod().equals(HTTP_METHOD_MOVE))
+ {
+ doMove(httpRequest, httpResponse);
+ }
+ else if (httpRequest.getMethod().equals(HTTP_METHOD_PUT))
+ {
+ doPut(httpRequest, httpResponse);
+ }
+ else if (httpRequest.getMethod().equals(HTTP_METHOD_GET))
+ {
+ if (checkGet(httpRequest, httpResponse)) {
+ chain.doFilter(httpRequest, httpResponse); // actual processing done elsewhere
+ }
+ }
+ else if (httpRequest.getMethod().equals(HTTP_METHOD_DELETE))
+ {
+ doDelete(httpRequest, httpResponse);
+ }
+ else
+ {
+ chain.doFilter(httpRequest, httpResponse);
+ }
+ }
+
+ protected void doMove(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ if (Log.isDebugEnabled())
+ {
+ Log.debug("RESTful file access: MOVE request for " + request.getRequestURI());
+ }
+
+ if (writePermissionRole != null && !request.isUserInRole(writePermissionRole))
+ {
+ response.sendError(HttpURLConnection.HTTP_FORBIDDEN);
+ return;
+ }
+
+ File file = locateFile(request);
+ String destination = request.getHeader(HTTP_HEADER_DESTINATION);
+
+ if (destination == null)
+ {
+ response.sendError(HttpURLConnection.HTTP_BAD_REQUEST, "Destination header not found");
+ return;
+ }
+
+ try
+ {
+ URL destinationUrl = new URL(destination);
+ IO.copyFile(file, new File(destinationUrl.getFile()));
+ IO.delete(file);
+ }
+ catch (IOException e)
+ {
+ response.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR); // file could not be moved
+ return;
+ }
+
+ response.setStatus(HttpURLConnection.HTTP_NO_CONTENT); // we return no content
+ }
+
+ protected boolean checkGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ if (Log.isDebugEnabled())
+ {
+ Log.debug("RESTful file access: GET request for " + request.getRequestURI());
+ }
+
+ if (readPermissionRole != null && !request.isUserInRole(readPermissionRole))
+ {
+ response.sendError(HttpURLConnection.HTTP_FORBIDDEN);
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+
+ protected void doPut(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ if (Log.isDebugEnabled())
+ {
+ Log.debug("RESTful file access: PUT request for " + request.getRequestURI());
+ }
+
+ if (writePermissionRole != null && !request.isUserInRole(writePermissionRole))
+ {
+ response.sendError(HttpURLConnection.HTTP_FORBIDDEN);
+ return;
+ }
+
+ File file = locateFile(request);
+
+ if (file.exists())
+ {
+ boolean success = file.delete(); // replace file if it exists
+ if (!success)
+ {
+ response.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR); // file existed and could not be deleted
+ return;
+ }
+ }
+
+ FileOutputStream out = new FileOutputStream(file);
+ try
+ {
+ IO.copy(request.getInputStream(), out);
+ }
+ catch (IOException e)
+ {
+ Log.warn(Log.EXCEPTION, e); // is this obsolete?
+ out.close();
+ throw(e);
+ }
+
+ response.setStatus(HttpURLConnection.HTTP_NO_CONTENT); // we return no content
+ }
+
+ protected void doDelete(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
+ {
+ if (Log.isDebugEnabled())
+ {
+ Log.debug("RESTful file access: DELETE request for " + request.getRequestURI());
+ }
+
+ if (writePermissionRole != null && !request.isUserInRole(writePermissionRole))
+ {
+ response.sendError(HttpURLConnection.HTTP_FORBIDDEN);
+ return;
+ }
+
+ File file = locateFile(request);
+
+ if (!file.exists())
+ {
+ response.sendError(HttpURLConnection.HTTP_NOT_FOUND); // file not found
+ return;
+ }
+
+ boolean success = IO.delete(file); // actual delete operation
+
+ if (success)
+ {
+ response.setStatus(HttpURLConnection.HTTP_NO_CONTENT); // we return no content
+ }
+ else
+ {
+ response.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR); // could not be deleted due to internal error
+ }
+ }
+
+ public void destroy()
+ {
+ // nothing to destroy
+ }
+}
+
Propchange: activemq/trunk/activemq-fileserver/src/main/java/org/apache/activemq/util/RestFilter.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/trunk/activemq-fileserver/src/main/webapp/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-fileserver/src/main/webapp/WEB-INF/web.xml?view=auto&rev=527701
==============================================================================
--- activemq/trunk/activemq-fileserver/src/main/webapp/WEB-INF/web.xml (added)
+++ activemq/trunk/activemq-fileserver/src/main/webapp/WEB-INF/web.xml Wed Apr 11 15:05:37 2007
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+
+<!DOCTYPE web-app
+ PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
+ "http://java.sun.com/dtd/web-app_2_3.dtd">
+
+<web-app>
+
+ <display-name>RESTful file access application</display-name>
+
+ <servlet>
+ <servlet-name>DefaultServlet</servlet-name>
+ <servlet-class>org.mortbay.jetty.servlet.DefaultServlet</servlet-class>
+ </servlet>
+
+ <servlet-mapping>
+ <servlet-name>DefaultServlet</servlet-name>
+ <url-pattern>/*</url-pattern>
+ </servlet-mapping>
+
+ <filter>
+ <filter-name>RestFilter</filter-name>
+ <filter-class>org.apache.activemq.util.RestFilter</filter-class>
+ </filter>
+
+ <filter>
+ <filter-name>FilenameGuardFilter</filter-name>
+ <filter-class>org.apache.activemq.util.FilenameGuardFilter</filter-class>
+ </filter>
+
+ <filter-mapping>
+ <filter-name>FilenameGuardFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+ <filter-mapping>
+ <filter-name>RestFilter</filter-name>
+ <url-pattern>/*</url-pattern>
+ </filter-mapping>
+
+</web-app>
Propchange: activemq/trunk/activemq-fileserver/src/main/webapp/WEB-INF/web.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/trunk/activemq-fileserver/src/main/webapp/index.html
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-fileserver/src/main/webapp/index.html?view=auto&rev=527701
==============================================================================
--- activemq/trunk/activemq-fileserver/src/main/webapp/index.html (added)
+++ activemq/trunk/activemq-fileserver/src/main/webapp/index.html Wed Apr 11 15:05:37 2007
@@ -0,0 +1,14 @@
+<html>
+<head>
+<title>ActiveMQ Console</title>
+</head>
+<body>
+
+<h1>RESTful file access</h1>
+
+<p>
+ This webapp provides RESTful file access.
+</p>
+
+</body>
+</html>
Propchange: activemq/trunk/activemq-fileserver/src/main/webapp/index.html
------------------------------------------------------------------------------
svn:eol-style = native
Added: activemq/trunk/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java
URL: http://svn.apache.org/viewvc/activemq/trunk/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java?view=auto&rev=527701
==============================================================================
--- activemq/trunk/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java (added)
+++ activemq/trunk/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java Wed Apr 11 15:05:37 2007
@@ -0,0 +1,56 @@
+package org.apache.activemq.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
+import junit.framework.TestCase;
+
+import org.mortbay.util.IO;
+
+public class RestFilterTest extends TestCase {
+
+ public RestFilterTest(String s) {
+ super(s);
+ }
+
+ public void test() throws Exception {
+ byte[] fileContents = new byte[] {'a', 'b', 'c'};
+ URL url = new URL("http://localhost:8080/fileserver/repository/file.txt");
+
+ // 1. upload
+ HttpURLConnection connection = (HttpURLConnection)url.openConnection();
+ connection.setRequestMethod("PUT");
+ connection.setDoOutput(true);
+ connection.setChunkedStreamingMode(fileContents.length);
+ OutputStream os = connection.getOutputStream();
+ IO.copy(new ByteArrayInputStream(fileContents), os);
+ os.close();
+ assertTrue(isSuccessfulCode(connection.getResponseCode()));
+ connection.disconnect();
+
+ // 2. download
+ connection = (HttpURLConnection)url.openConnection();
+ InputStream is = connection.getInputStream();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ IO.copy(is, baos);
+ is.close();
+ assertTrue(isSuccessfulCode(connection.getResponseCode()));
+ connection.disconnect();
+ assertEquals(fileContents.length, baos.size());
+
+ // 3. remove
+ connection = (HttpURLConnection)url.openConnection();
+ connection.setRequestMethod("DELETE");
+ is = connection.getInputStream();
+ is.close();
+ assertTrue(isSuccessfulCode(connection.getResponseCode()));
+ }
+
+ private boolean isSuccessfulCode(int responseCode) {
+ return responseCode >= 200 && responseCode < 300; // 2xx => successful
+ }
+}
Propchange: activemq/trunk/activemq-fileserver/src/test/java/org/apache/activemq/util/RestFilterTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: activemq/trunk/pom.xml
URL: http://svn.apache.org/viewvc/activemq/trunk/pom.xml?view=diff&rev=527701&r1=527700&r2=527701
==============================================================================
--- activemq/trunk/pom.xml (original)
+++ activemq/trunk/pom.xml Wed Apr 11 15:05:37 2007
@@ -176,6 +176,7 @@
<module>activemq-book</module>
<module>activemq-core</module>
<module>activemq-console</module>
+ <module>activemq-fileserver</module>
<module>activemq-jaas</module>
<module>activemq-jpa-store</module>
<module>activemq-openwire-generator</module>
@@ -248,6 +249,11 @@
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-console</artifactId>
+ <version>${activemq-version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
+ <artifactId>activemq-fileserver</artifactId>
<version>${activemq-version}</version>
</dependency>
<dependency>