From: Mathieu Baudier Date: Wed, 21 Sep 2011 18:39:33 +0000 (+0000) Subject: First working Maven proxy X-Git-Tag: argeo-slc-2.1.7~900 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=10dd7ee7dc2bdd8d3bc39e8873a9080debfcd8e5;p=gpl%2Fargeo-slc.git First working Maven proxy git-svn-id: https://svn.argeo.org/slc/trunk@4750 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/modules/server/org.argeo.slc.server.repo.webapp/META-INF/MANIFEST.MF b/modules/server/org.argeo.slc.server.repo.webapp/META-INF/MANIFEST.MF index 01404071b..04874c01c 100644 --- a/modules/server/org.argeo.slc.server.repo.webapp/META-INF/MANIFEST.MF +++ b/modules/server/org.argeo.slc.server.repo.webapp/META-INF/MANIFEST.MF @@ -5,6 +5,28 @@ Bundle-SymbolicName: org.argeo.slc.server.repo.webapp Bundle-Version: 0.13.1.SNAPSHOT Web-ContextPath: org.argeo.slc.repo.webapp Bundle-Vendor: Argeo -Import-Package: javax.servlet, +Import-Package: javax.jcr;version="2.0.0", + javax.servlet, javax.servlet.http, - javax.servlet.resources + javax.servlet.resources, + org.argeo.security.core, + org.argeo.security.jcr, + org.argeo.slc.aether.spring, + org.argeo.slc.repo.maven.proxy, + org.springframework.osgi.web.context.support;version="1.2.1", + org.springframework.security;version="2.0.6.RELEASE", + org.springframework.security.context;version="2.0.6.RELEASE", + org.springframework.security.intercept.web;version="2.0.6.RELEASE", + org.springframework.security.providers.anonymous;version="2.0.6.RELEASE", + org.springframework.security.ui;version="2.0.6.RELEASE", + org.springframework.security.ui.basicauth;version="2.0.6.RELEASE", + org.springframework.security.ui.logout;version="2.0.6.RELEASE", + org.springframework.security.ui.rememberme;version="2.0.6.RELEASE", + org.springframework.security.userdetails;version="2.0.6.RELEASE", + org.springframework.security.util;version="2.0.6.RELEASE", + org.springframework.security.vote;version="2.0.6.RELEASE", + org.springframework.security.wrapper;version="2.0.6.RELEASE", + org.springframework.web.context;version="2.5.6.SEC01", + org.springframework.web.filter;version="2.5.6.SEC01", + org.springframework.web.servlet;version="2.5.6.SEC01", + org.springframework.web.servlet.handler;version="2.5.6.SEC01" diff --git a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/applicationContext.xml b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/applicationContext.xml index 38267a458..a45053fd5 100644 --- a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/applicationContext.xml +++ b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/applicationContext.xml @@ -6,5 +6,6 @@ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"> + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/maven-servlet.xml b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/maven-servlet.xml index 6ab60c584..0c0d817e3 100644 --- a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/maven-servlet.xml +++ b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/maven-servlet.xml @@ -1,11 +1,11 @@ + http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd + http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd + "> @@ -17,12 +17,58 @@ class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> - companyRemoteService + mavenProxyServlet - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/osgi.xml b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/osgi.xml index 34fe6ad81..15231c8cb 100644 --- a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/osgi.xml +++ b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/osgi.xml @@ -8,11 +8,14 @@ http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-2.0.xsd"> - - - + + + + - - + + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/security.xml b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/security.xml new file mode 100644 index 000000000..340c8e76d --- /dev/null +++ b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/security.xml @@ -0,0 +1,128 @@ + + + + + + + + + + + + + + CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON + PATTERN_TYPE_APACHE_ANT + /public/**=IS_AUTHENTICATED_ANONYMOUSLY + /**=ROLE_USER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Argeo + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/web.xml b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/web.xml index 7adc82ad3..a998cda0d 100644 --- a/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/web.xml +++ b/modules/server/org.argeo.slc.server.repo.webapp/WEB-INF/web.xml @@ -34,4 +34,16 @@ maven /maven/* + + + + springSecurityFilterChain + org.springframework.web.filter.DelegatingFilterProxy + + + + springSecurityFilterChain + /* + + diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyService.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyService.java new file mode 100644 index 000000000..a1b7ffbe9 --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyService.java @@ -0,0 +1,8 @@ +package org.argeo.slc.repo.maven.proxy; + +/** Synchronizes JCR and Maven repositories */ +public interface MavenProxyService { + public String getNodePath(String path); + + public String proxyFile(String path); +} diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java new file mode 100644 index 000000000..9e2cfd00a --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServiceImpl.java @@ -0,0 +1,140 @@ +package org.argeo.slc.repo.maven.proxy; + +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import javax.jcr.Binary; +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.nodetype.NodeType; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.jcr.ArgeoNames; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcException; +import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.repo.RepoConstants; +import org.sonatype.aether.repository.RemoteRepository; + +/** Synchronizes the node repository with remote Maven repositories */ +public class MavenProxyServiceImpl implements MavenProxyService, ArgeoNames, + SlcNames { + private final static Log log = LogFactory + .getLog(MavenProxyServiceImpl.class); + + private Repository jcrRepository; + private Session jcrAdminSession; + private List defaultRepositories = new ArrayList(); + + public void init() { + try { + jcrAdminSession = jcrRepository.login(); + + JcrUtils.mkdirs(jcrAdminSession, RepoConstants.ARTIFACTS_BASE_PATH); + Node proxiedRepositories = JcrUtils.mkdirs(jcrAdminSession, + RepoConstants.PROXIED_REPOSITORIES); + for (RemoteRepository repository : defaultRepositories) { + if (!proxiedRepositories.hasNode(repository.getId())) { + Node proxiedRepository = proxiedRepositories + .addNode(repository.getId()); + proxiedRepository.setProperty(SLC_URL, repository.getUrl()); + proxiedRepository.setProperty(SLC_TYPE, + repository.getContentType()); + } + } + jcrAdminSession.save(); + } catch (RepositoryException e) { + JcrUtils.discardQuietly(jcrAdminSession); + throw new SlcException("Cannot initialize Maven proxy", e); + } + } + + public void destroy() { + JcrUtils.logoutQuietly(jcrAdminSession); + } + + /** + * Retrieve and add this file to the repository + */ + public synchronized String proxyFile(String path) { + try { + Node node = null; + proxiedRepositories: for (NodeIterator nit = jcrAdminSession + .getNode(RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit + .hasNext();) { + Node proxiedRepository = nit.nextNode(); + String repoUrl = proxiedRepository.getProperty(SLC_URL) + .getString(); + String remoteUrl = repoUrl + path; + if (log.isTraceEnabled()) + log.trace("remoteUrl=" + remoteUrl); + InputStream in = null; + try { + URL u = new URL(remoteUrl); + in = u.openStream(); + node = importFile(getNodePath(path), in); + if (log.isDebugEnabled()) + log.debug("Imported " + remoteUrl + " to " + node); + break proxiedRepositories; + } catch (Exception e) { + if (log.isDebugEnabled()) + log.debug("Cannot read " + remoteUrl + ", skipping... " + + e.getMessage()); + // e.printStackTrace(); + } finally { + IOUtils.closeQuietly(in); + } + } + + if (node != null) + return node.getIdentifier(); + else { + log.warn("Could not proxy " + path); + return null; + } + } catch (RepositoryException e) { + throw new SlcException("Cannot proxy " + path, e); + } + } + + /** The JCR path where this file could be found */ + public String getNodePath(String path) { + return RepoConstants.ARTIFACTS_BASE_PATH + path; + } + + protected Node importFile(String nodePath, InputStream in) { + Binary binary = null; + try { + Node node = JcrUtils.mkdirs(jcrAdminSession, nodePath, + NodeType.NT_FILE, NodeType.NT_FOLDER, false); + Node content = node.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE); + binary = jcrAdminSession.getValueFactory().createBinary(in); + content.setProperty(Property.JCR_DATA, binary); + jcrAdminSession.save(); + return node; + } catch (RepositoryException e) { + JcrUtils.discardQuietly(jcrAdminSession); + throw new SlcException("Cannot initialize Maven proxy", e); + } finally { + JcrUtils.closeQuietly(binary); + } + } + + public void setJcrRepository(Repository jcrRepository) { + this.jcrRepository = jcrRepository; + } + + public void setDefaultRepositories( + List defaultRepositories) { + this.defaultRepositories = defaultRepositories; + } + +} diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServlet.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServlet.java index 39badba89..acb0fb6c6 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServlet.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/proxy/MavenProxyServlet.java @@ -2,17 +2,12 @@ package org.argeo.slc.repo.maven.proxy; import java.io.IOException; import java.io.InputStream; -import java.net.URL; -import java.util.ArrayList; -import java.util.List; import javax.jcr.Binary; import javax.jcr.Node; -import javax.jcr.NodeIterator; import javax.jcr.Property; import javax.jcr.RepositoryException; import javax.jcr.Session; -import javax.jcr.nodetype.NodeType; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -26,8 +21,6 @@ import org.argeo.jcr.ArgeoNames; import org.argeo.jcr.JcrUtils; import org.argeo.slc.SlcException; import org.argeo.slc.jcr.SlcNames; -import org.argeo.slc.repo.RepoConstants; -import org.sonatype.aether.repository.RemoteRepository; /** * Expose the SLC repository as a regular Maven repository, proxying third party @@ -39,86 +32,46 @@ public class MavenProxyServlet extends HttpServlet implements ArgeoNames, private final static Log log = LogFactory.getLog(MavenProxyServlet.class); + private MavenProxyService proxyService; + private Session jcrSession; - private List defaultRepositories = new ArrayList(); private String contentTypeCharset = "UTF-8"; - @Override - public void init() throws ServletException { - try { - Node proxiedRepositories = JcrUtils.mkdirs(jcrSession, - RepoConstants.PROXIED_REPOSITORIES); - for (RemoteRepository repository : defaultRepositories) { - if (!proxiedRepositories.hasNode(repository.getId())) { - Node proxiedRepository = proxiedRepositories - .addNode(repository.getId()); - proxiedRepository.setProperty(SLC_URL, repository.getUrl()); - proxiedRepository.setProperty(SLC_TYPE, - repository.getContentType()); - } - } - jcrSession.save(); - } catch (RepositoryException e) { - JcrUtils.discardQuietly(jcrSession); - throw new SlcException("Cannot initialize Maven proxy", e); - } - } - @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String path = request.getPathInfo(); - String nodePath = RepoConstants.ARTIFACTS_BASE_PATH + path; - if (log.isDebugEnabled()) - log.debug("path=" + path + ", nodePath=" + nodePath); + String nodePath = proxyService.getNodePath(path); + if (log.isTraceEnabled()) + log.trace("path=" + path + ", nodePath=" + nodePath); try { - Node node = null; - if (jcrSession.itemExists(nodePath)) { - node = jcrSession.getNode(nodePath); - } else { - proxiedRepositories: for (NodeIterator nit = jcrSession - .getNode(RepoConstants.PROXIED_REPOSITORIES).getNodes(); nit - .hasNext();) { - Node proxiedRepository = nit.nextNode(); - String repoUrl = proxiedRepository.getProperty(SLC_URL) - .getString(); - String remoteUrl = repoUrl + path; - if (log.isDebugEnabled()) - log.debug("remoteUrl=" + remoteUrl); - InputStream in = null; - try { - URL u = new URL(remoteUrl); - in = u.openStream(); - node = importFile(nodePath, in); - break proxiedRepositories; - } catch (Exception e) { - if (log.isTraceEnabled()) - log.trace("Cannot read " + remoteUrl - + ", skipping..."); - } finally { - IOUtils.closeQuietly(in); - } - } - - if (node == null) { + Node node; + if (!jcrSession.itemExists(nodePath)) { + String nodeIdentifier = proxyService.proxyFile(path); + if (nodeIdentifier == null) { + //log.warn("Could not proxy " + path); response.sendError(404); return; - // throw new SlcException("Could not find " + path - // + " among proxies"); + } else { + node = jcrSession.getNodeByIdentifier(nodeIdentifier); } + } else { + node = jcrSession.getNode(nodePath); } processResponse(nodePath, node, response); } catch (RepositoryException e) { throw new SlcException("Cannot proxy " + request, e); } - super.doGet(request, response); + //super.doGet(request, response); } - /** Download the content of the node. */ + /** Retrieve the content of the node. */ protected void processResponse(String path, Node node, HttpServletResponse response) { + Binary binary = null; + InputStream in = null; try { String fileName = node.getName(); String ext = FilenameUtils.getExtension(fileName); @@ -146,26 +99,25 @@ public class MavenProxyServlet extends HttpServlet implements ArgeoNames, response.setHeader("Pragma", "no-cache"); response.setContentType(contentType); - } catch (RepositoryException e) { - throw new SlcException("Cannot download " + node, e); - } - } - protected Node importFile(String nodePath, InputStream in) { - Binary binary = null; - try { - Node node = JcrUtils.mkdirs(jcrSession, nodePath, NodeType.NT_FILE, - NodeType.NT_FOLDER, false); - Node content = node.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE); - binary = jcrSession.getValueFactory().createBinary(in); - content.setProperty(Property.JCR_DATA, binary); - jcrSession.save(); - return node; - } catch (RepositoryException e) { - JcrUtils.discardQuietly(jcrSession); - throw new SlcException("Cannot initialize Maven proxy", e); + binary = node.getNode(Property.JCR_CONTENT) + .getProperty(Property.JCR_DATA).getBinary(); + in = binary.getStream(); + IOUtils.copy(in, response.getOutputStream()); + } catch (Exception e) { + throw new SlcException("Cannot download " + node, e); } finally { + IOUtils.closeQuietly(in); JcrUtils.closeQuietly(binary); } } + + public void setJcrSession(Session jcrSession) { + this.jcrSession = jcrSession; + } + + public void setProxyService(MavenProxyService proxyService) { + this.proxyService = proxyService; + } + }