log4j.logger.org.apache.catalina=INFO
log4j.logger.org.apache.coyote=INFO
log4j.logger.org.apache.tomcat=INFO
+log4j.logger.org.springframework.osgi.web.deployer.tomcat=WARN
log4j.logger.org.apache.directory.server=INFO
log4j.logger.org.apache.directory.server.core.partition=ERROR
Bundle-Version: 0.2.3.SNAPSHOT
Web-ContextPath: org.argeo.jcr.webapp
Bundle-Vendor: Argeo
+DynamicImport-Package: *
Import-Package: javax.jcr,
javax.servlet,
javax.servlet.http,
javax.servlet.resources,
+ org.aopalliance.aop;version="1.0.0",
org.argeo.jackrabbit.remote,
org.argeo.jcr,
org.argeo.jcr.mvc,
org.argeo.server.json,
org.argeo.server.mvc,
+ org.springframework.aop;version="2.5.6.SEC01",
+ org.springframework.aop.framework;version="2.5.6.SEC01",
+ org.springframework.aop.scope;version="2.5.6.SEC01",
org.springframework.osgi.web.context.support;version="1.2.1",
org.springframework.security;version="2.0.6.RELEASE",
org.springframework.security.ui.webapp;version="2.0.6.RELEASE",
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
<import resource="osgi.xml" />
<bean id="repositoryRegister" class="org.argeo.jcr.DefaultRepositoryRegister" />
- <bean id="osivInterceptor"
- class="org.argeo.jcr.mvc.OpenSessionInViewJcrInterceptor">
-<!-- <property name="session" ref="jcrSession" />-->
+ <bean id="sessionProvider" scope="session" destroy-method="dispose"
+ class="org.argeo.jackrabbit.remote.SimpleSessionProvider">
+ <aop:scoped-proxy proxy-target-class="false" />
+ </bean>
+
+ <bean id="osivInterceptor" class="org.argeo.jcr.mvc.OpenSessionInViewJcrInterceptor">
+ <!-- <property name="session" ref="jcrSession" /> -->
</bean>
</beans>
\ No newline at end of file
<bean id="urlMapping"
class="org.argeo.jackrabbit.remote.JcrRemotingHandlerMapping">
<property name="repositoryRegister" ref="repositoryRegister" />
+ <property name="sessionProvider" ref="sessionProvider" />
</bean>
</beans>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
<bean id="servletHandler"
class="org.springframework.web.servlet.handler.SimpleServletHandlerAdapter" />
- <bean id="urlMapping"
- class="org.argeo.jackrabbit.remote.WebdavHandlerMapping">
+ <bean id="urlMapping" class="org.argeo.jackrabbit.remote.SimpleWebdavHandlerMapping">
+ <property name="configuration" value="/WEB-INF/webdav-config.xml" />
<property name="repositoryRegister" ref="repositoryRegister" />
- <property name="configuration" value="osgibundle:/WEB-INF/webdav-config.xml" />
+ <property name="sessionProvider" ref="sessionProvider" />
</bean>
</beans>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.argeo.server.webextender</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ </natures>
+</projectDescription>
--- /dev/null
+#Fri Feb 25 14:51:26 CET 2011
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
Manifest-Version: 1.0
-Fragment-Host: org.springframework.osgi.web.extender
-Bundle-Version: 0.2.3.SNAPSHOT
+Bundle-ManifestVersion: 2
+Bundle-Name: Webextender
Bundle-SymbolicName: org.argeo.server.webextender
-Import-Package: org.apache.catalina,org.apache.catalina.connector
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: Argeo
+Fragment-Host: org.springframework.osgi.web.extender
+Import-Package: org.apache.catalina,
+ org.apache.catalina.connector
--- /dev/null
+bin.includes = META-INF/
Import-Package: org.apache.catalina;version="6.0.24",
org.apache.catalina.connector;version="6.0.24",
org.apache.catalina.core;version="6.0.24",
+ org.apache.catalina.startup;version="6.0.24",
org.apache.catalina.util;version="6.0.24",
org.apache.commons.logging;version="1.1.1",
org.apache.naming.resources;version="6.0.24",
org.osgi.framework;version="1.5.0",
org.osgi.service.url;version="1.0.0",
- org.springframework.beans.factory;version="2.5.6.SEC01"
+ org.springframework.aop;version="2.5.6.SEC01",
+ org.springframework.beans.factory;version="2.5.6.SEC01",
+ org.springframework.osgi.web.deployer;version="1.2.1"
</Export-Package>
<Import-Package>
javax.servlet,
+ org.apache.jackrabbit.webdav.server,
+ org.springframework.web.context,
org.xml.sax;version="0.0.0",
org.apache.jackrabbit.webdav.jcr,
org.springframework.security.providers.jaas;resolution:="optional",
import org.apache.jackrabbit.commons.JcrUtils;
import org.apache.jackrabbit.commons.NamespaceHelper;
import org.apache.jackrabbit.commons.cnd.CndImporter;
-import org.apache.jackrabbit.core.RepositoryFactoryImpl;
import org.apache.jackrabbit.core.RepositoryImpl;
import org.apache.jackrabbit.core.TransientRepository;
import org.apache.jackrabbit.core.config.RepositoryConfig;
--- /dev/null
+package org.argeo.jackrabbit.remote;
+
+import org.apache.jackrabbit.server.SessionProvider;
+import org.argeo.jcr.mvc.MultipleRepositoryHandlerMapping;
+
+public abstract class AbstractJackrabbitHandlerMapping extends
+ MultipleRepositoryHandlerMapping {
+ private SessionProvider sessionProvider;
+
+ protected SessionProvider getSessionProvider() {
+ return sessionProvider;
+ }
+
+ public void setSessionProvider(SessionProvider sessionProvider) {
+ this.sessionProvider = sessionProvider;
+ }
+
+}
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
-import org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet;
-import org.argeo.jcr.mvc.MultipleRepositoryHandlerMapping;
-
-public class JcrRemotingHandlerMapping extends MultipleRepositoryHandlerMapping {
+public class JcrRemotingHandlerMapping extends AbstractJackrabbitHandlerMapping {
protected HttpServlet createServlet(Repository repository, String pathPrefix)
throws ServletException {
- JcrRemotingServlet servlet = new JcrRemotingServlet(repository);
+ JcrRemotingServlet servlet = new JcrRemotingServlet(repository,
+ getSessionProvider());
Properties initParameters = new Properties();
initParameters.setProperty(
- JCRWebdavServerServlet.INIT_PARAM_RESOURCE_PATH_PREFIX,
- pathPrefix);
+ JcrRemotingServlet.INIT_PARAM_RESOURCE_PATH_PREFIX, pathPrefix);
servlet.init(new DelegatingServletConfig(pathPrefix.replace('/', '_'),
initParameters));
return servlet;
package org.argeo.jackrabbit.remote;
import javax.jcr.Repository;
-import javax.jcr.SimpleCredentials;
import org.apache.jackrabbit.server.SessionProvider;
private static final long serialVersionUID = 3131835511468341309L;
private final Repository repository;
+ private final SessionProvider sessionProvider;
- public JcrRemotingServlet(Repository repository) {
+ public JcrRemotingServlet(Repository repository,
+ SessionProvider sessionProvider) {
this.repository = repository;
+ this.sessionProvider = sessionProvider;
}
@Override
@Override
protected SessionProvider getSessionProvider() {
- return new CachingSessionProvider(new SimpleCredentials("demo",
- "demo".toCharArray()));
+ return sessionProvider;
}
}
--- /dev/null
+package org.argeo.jackrabbit.remote;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.Credentials;
+import javax.jcr.LoginException;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.jackrabbit.server.SessionProvider;
+
+/** To be injected, typically of scope="session" */
+public class SimpleSessionProvider implements SessionProvider, Serializable {
+ private static final long serialVersionUID = 2270957712453841368L;
+
+ private final static Log log = LogFactory
+ .getLog(SimpleSessionProvider.class);
+
+ private transient Map<String, Session> sessions = Collections
+ .synchronizedMap(new HashMap<String, Session>());
+
+ private Credentials credentials = null;
+
+ public Session getSession(HttpServletRequest request, Repository rep,
+ String workspace) throws LoginException, ServletException,
+ RepositoryException {
+
+ if (!sessions.containsKey(workspace)) {
+ Session session = rep.login(credentials, workspace);
+ sessions.put(workspace, session);
+ return session;
+ } else {
+ Session session = sessions.get(workspace);
+ if (!session.isLive()) {
+ sessions.remove(workspace);
+ session = rep.login(credentials, workspace);
+ sessions.put(workspace, session);
+ }
+ return session;
+ }
+ }
+
+ public void releaseSession(Session session) {
+ if (log.isDebugEnabled())
+ log.debug("Releasing JCR session " + session);
+ // session.logout();
+ // FIXME: find a way to log out when the HTTP session is expired
+ }
+
+ public void dispose() {
+ for (String workspace : sessions.keySet()) {
+ Session session = sessions.get(workspace);
+ if (session.isLive())
+ session.logout();
+ }
+ }
+}
--- /dev/null
+package org.argeo.jackrabbit.remote;
+
+import java.util.Properties;
+
+import javax.jcr.Repository;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+
+public class SimpleWebdavHandlerMapping extends
+ AbstractJackrabbitHandlerMapping {
+ private String configuration;
+
+ protected HttpServlet createServlet(Repository repository, String pathPrefix)
+ throws ServletException {
+
+ SimpleWebdavServlet servlet = new SimpleWebdavServlet(repository,
+ getSessionProvider());
+ Properties initParameters = new Properties();
+ initParameters.setProperty(
+ SimpleWebdavServlet.INIT_PARAM_RESOURCE_CONFIG, configuration);
+ initParameters
+ .setProperty(
+ SimpleWebdavServlet.INIT_PARAM_RESOURCE_PATH_PREFIX,
+ pathPrefix);
+ servlet.init(new DelegatingServletConfig(pathPrefix.replace('/', '_'),
+ initParameters));
+ return servlet;
+ }
+
+ public void setConfiguration(String configuration) {
+ this.configuration = configuration;
+ }
+}
--- /dev/null
+/*
+ * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
+ *
+ * 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.argeo.jackrabbit.remote;
+
+import javax.jcr.Repository;
+
+import org.apache.jackrabbit.server.SessionProvider;
+
+public class SimpleWebdavServlet extends
+ org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet {
+ private static final long serialVersionUID = -369787931175177080L;
+ private final Repository repository;
+
+ public SimpleWebdavServlet(Repository repository, SessionProvider sessionProvider) {
+ this.repository = repository;
+ setSessionProvider(sessionProvider);
+ }
+
+ public Repository getRepository() {
+ return repository;
+ }
+
+}
+++ /dev/null
-/*
- * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
- *
- * 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.argeo.jackrabbit.remote;
-
-import java.io.IOException;
-
-import javax.jcr.Repository;
-import javax.jcr.SimpleCredentials;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.jackrabbit.server.SessionProvider;
-import org.apache.jackrabbit.webdav.simple.ResourceConfig;
-import org.apache.jackrabbit.webdav.simple.SimpleWebdavServlet;
-import org.argeo.ArgeoException;
-import org.springframework.core.io.Resource;
-
-public class WebDavServlet extends SimpleWebdavServlet {
-
- private static final long serialVersionUID = 1L;
- private final static Log log = LogFactory.getLog(WebDavServlet.class);
-
- private final Repository repository;
- private final Resource resourceConfiguration;
-
- public WebDavServlet(Repository repository, Resource configuration) {
- this.repository = repository;
- this.resourceConfiguration = configuration;
- }
-
- @Override
- public void init() throws ServletException {
- super.init();
-
- if (resourceConfiguration != null) {
- ResourceConfig resourceConfig = new ResourceConfig(null);
- try {
- resourceConfig.parse(resourceConfiguration.getURL());
- } catch (IOException e) {
- throw new ArgeoException("Cannot parse resource configuration "
- + resourceConfiguration, e);
- }
- setResourceConfig(resourceConfig);
- }
- }
-
- @Override
- protected void service(HttpServletRequest request,
- HttpServletResponse response) throws ServletException, IOException {
- if (log.isTraceEnabled())
- log.trace("Received request " + request);
- super.service(request, response);
-
- if (log.isTraceEnabled()) {
- log.trace("Webdav response: " + response);
- // response.
- }
- }
-
- public Repository getRepository() {
- return repository;
- }
-
- @Override
- public SessionProvider getSessionProvider() {
- return new CachingSessionProvider(new SimpleCredentials("demo",
- "demo".toCharArray()));
- }
-
-}
+++ /dev/null
-package org.argeo.jackrabbit.remote;
-
-import java.util.Properties;
-
-import javax.jcr.Repository;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-
-import org.apache.jackrabbit.webdav.jcr.JCRWebdavServerServlet;
-import org.argeo.jcr.mvc.MultipleRepositoryHandlerMapping;
-import org.springframework.core.io.Resource;
-
-public class WebdavHandlerMapping extends MultipleRepositoryHandlerMapping {
- private Resource configuration;
-
- protected HttpServlet createServlet(Repository repository, String pathPrefix)
- throws ServletException {
-
- WebDavServlet servlet = new WebDavServlet(repository, configuration);
- Properties initParameters = new Properties();
- initParameters.setProperty(
- JCRWebdavServerServlet.INIT_PARAM_RESOURCE_PATH_PREFIX,
- pathPrefix);
- servlet.init(new DelegatingServletConfig(pathPrefix.replace('/', '_'),
- initParameters));
- return servlet;
- }
-
- public void setConfiguration(Resource configuration) {
- this.configuration = configuration;
- }
-
-}