]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/proxy/AbstractUrlProxy.java
Add dep folder
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jcr / src / main / java / org / argeo / jcr / proxy / AbstractUrlProxy.java
index 7bec5ee7a264c27653cb68c921d3294a3ad328e5..8a66f3102dccebf1a1adb76e3c9accede7673f32 100644 (file)
@@ -1,5 +1,21 @@
+/*
+ * Copyright (C) 2007-2012 Argeo GmbH
+ *
+ * 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.jcr.proxy;
 
+import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 
@@ -23,16 +39,18 @@ public abstract class AbstractUrlProxy implements ResourceProxy {
 
        private Repository jcrRepository;
        private Session jcrAdminSession;
+       private String proxyWorkspace = "proxy";
 
-       protected abstract String retrieve(String relativePath);
+       protected abstract Node retrieve(Session session, String path);
 
        void init() {
                try {
-                       jcrAdminSession = jcrRepository.login();
-                       beforeInitSessionSave();
+                       jcrAdminSession = JcrUtils.loginOrCreateWorkspace(jcrRepository,
+                                       proxyWorkspace);
+                       beforeInitSessionSave(jcrAdminSession);
                        if (jcrAdminSession.hasPendingChanges())
                                jcrAdminSession.save();
-               } catch (RepositoryException e) {
+               } catch (Exception e) {
                        JcrUtils.discardQuietly(jcrAdminSession);
                        throw new ArgeoException("Cannot initialize Maven proxy", e);
                }
@@ -42,7 +60,8 @@ public abstract class AbstractUrlProxy implements ResourceProxy {
         * Called before the (admin) session is saved at the end of the
         * initialization. Does nothing by default, to be overridden.
         */
-       protected void beforeInitSessionSave() throws RepositoryException {
+       protected void beforeInitSessionSave(Session session)
+                       throws RepositoryException {
        }
 
        void destroy() {
@@ -56,78 +75,104 @@ public abstract class AbstractUrlProxy implements ResourceProxy {
        protected void beforeDestroySessionLogout() throws RepositoryException {
        }
 
-       public Node proxy(Session jcrSession, String path) {
-               Node node;
+       public Node proxy(String path) {
+               // we open a JCR session with client credentials in order not to use the
+               // admin session in multiple thread or make it a bottleneck.
+               Node nodeAdmin = null;
+               Node nodeClient = null;
+               Session clientSession = null;
                try {
-                       String nodePath = getNodePath(path);
-                       if (!jcrSession.itemExists(nodePath)) {
-                               String nodeIdentifier = retrieve(path);
-                               if (nodeIdentifier == null) {
-                                       // log.warn("Could not proxy " + path);
-                                       return null;
-                               } else {
-                                       node = jcrSession.getNodeByIdentifier(nodeIdentifier);
-                               }
-                       } else {
-                               node = jcrSession.getNode(nodePath);
-                       }
+                       clientSession = jcrRepository.login(proxyWorkspace);
+                       if (!clientSession.itemExists(path)
+                                       || shouldUpdate(clientSession, path)) {
+                               nodeAdmin = retrieveAndSave(path);
+                               if (nodeAdmin != null)
+                                       nodeClient = clientSession.getNode(path);
+                       } else
+                               nodeClient = clientSession.getNode(path);
+                       return nodeClient;
                } catch (RepositoryException e) {
                        throw new ArgeoException("Cannot proxy " + path, e);
+               } finally {
+                       if (nodeClient == null)
+                               JcrUtils.logoutQuietly(clientSession);
+               }
+       }
+
+       protected synchronized Node retrieveAndSave(String path) {
+               try {
+                       Node node = retrieve(jcrAdminSession, path);
+                       if (node == null)
+                               return null;
+                       jcrAdminSession.save();
+                       return node;
+               } catch (RepositoryException e) {
+                       JcrUtils.discardQuietly(jcrAdminSession);
+                       throw new ArgeoException("Cannot retrieve and save " + path, e);
+               } finally {
+                       notifyAll();
                }
-               return node;
        }
 
-       protected Node proxyUrl(String baseUrl, String path) {
+       /** Session is not saved */
+       protected synchronized Node proxyUrl(Session session, String remoteUrl,
+                       String path) throws RepositoryException {
                Node node = null;
-               String remoteUrl = baseUrl + path;
-               if (log.isTraceEnabled())
-                       log.trace("baseUrl=" + remoteUrl);
+               if (session.itemExists(path)) {
+                       // throw new ArgeoException("Node " + path + " already exists");
+               }
                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);
-               } catch (Exception e) {
-                       if (log.isTraceEnabled())
-                               log.trace("Cannot read " + remoteUrl + ", skipping... "
+                       node = importFile(session, path, in);
+               } catch (IOException e) {
+                       if (log.isDebugEnabled()) {
+                               log.debug("Cannot read " + remoteUrl + ", skipping... "
                                                + e.getMessage());
-                       if (log.isTraceEnabled()) {
-                               log.trace("Cannot read because of ", e);
+                               // log.trace("Cannot read because of ", e);
                        }
+                       JcrUtils.discardQuietly(session);
                } finally {
                        IOUtils.closeQuietly(in);
                }
-
                return node;
        }
 
-       protected synchronized Node importFile(String nodePath, InputStream in) {
-               // FIXME allow parallel proxying
+       protected synchronized Node importFile(Session session, String path,
+                       InputStream in) throws RepositoryException {
                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);
+                       Node content = null;
+                       Node node = null;
+                       if (!session.itemExists(path)) {
+                               node = JcrUtils.mkdirs(session, path, NodeType.NT_FILE,
+                                               NodeType.NT_FOLDER, false);
+                               content = node.addNode(Node.JCR_CONTENT, NodeType.NT_RESOURCE);
+                       } else {
+                               node = session.getNode(path);
+                               content = node.getNode(Node.JCR_CONTENT);
+                       }
+                       binary = session.getValueFactory().createBinary(in);
                        content.setProperty(Property.JCR_DATA, binary);
-                       jcrAdminSession.save();
+                       JcrUtils.updateLastModifiedAndParents(node, null);
                        return node;
-               } catch (RepositoryException e) {
-                       JcrUtils.discardQuietly(jcrAdminSession);
-                       throw new ArgeoException("Cannot initialize Maven proxy", e);
                } finally {
                        JcrUtils.closeQuietly(binary);
                }
        }
 
-       protected Session getJcrAdminSession() {
-               return jcrAdminSession;
+       /** Whether the file should be updated. */
+       protected Boolean shouldUpdate(Session clientSession, String nodePath) {
+               return false;
        }
 
        public void setJcrRepository(Repository jcrRepository) {
                this.jcrRepository = jcrRepository;
        }
 
+       public void setProxyWorkspace(String localWorkspace) {
+               this.proxyWorkspace = localWorkspace;
+       }
+
 }