]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/proxy/AbstractUrlProxy.java
Update license headers
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.jcr / src / main / java / org / argeo / jcr / proxy / AbstractUrlProxy.java
index 7bec5ee7a264c27653cb68c921d3294a3ad328e5..e088e1f0c4c6b88d3e9877f4f1b09bcfdc520415 100644 (file)
@@ -1,5 +1,21 @@
+/*
+ * Copyright (C) 2007-2012 Mathieu Baudier
+ *
+ * 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;
 
@@ -24,15 +40,15 @@ public abstract class AbstractUrlProxy implements ResourceProxy {
        private Repository jcrRepository;
        private Session jcrAdminSession;
 
-       protected abstract String retrieve(String relativePath);
+       protected abstract Node retrieve(Session session, String relativePath);
 
        void init() {
                try {
                        jcrAdminSession = jcrRepository.login();
-                       beforeInitSessionSave();
+                       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 +58,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,76 +73,79 @@ public abstract class AbstractUrlProxy implements ResourceProxy {
        protected void beforeDestroySessionLogout() throws RepositoryException {
        }
 
-       public Node proxy(Session jcrSession, String path) {
-               Node node;
+       public Node proxy(Session session, String path) {
                try {
+                       if (session.hasPendingChanges())
+                               throw new ArgeoException(
+                                               "Cannot proxy based on a session with pending changes");
                        String nodePath = getNodePath(path);
-                       if (!jcrSession.itemExists(nodePath)) {
-                               String nodeIdentifier = retrieve(path);
-                               if (nodeIdentifier == null) {
-                                       // log.warn("Could not proxy " + path);
+                       if (!session.itemExists(nodePath)) {
+                               Node nodeT = retrieveAndSave(path);
+                               if (nodeT == null)
                                        return null;
-                               } else {
-                                       node = jcrSession.getNodeByIdentifier(nodeIdentifier);
-                               }
-                       } else {
-                               node = jcrSession.getNode(nodePath);
                        }
+                       return session.getNode(nodePath);
                } catch (RepositoryException e) {
+                       JcrUtils.discardQuietly(jcrAdminSession);
                        throw new ArgeoException("Cannot proxy " + path, e);
                }
-               return node;
        }
 
-       protected Node proxyUrl(String baseUrl, String path) {
+       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);
+               }
+       }
+
+       /** Session is not saved */
+       protected Node proxyUrl(Session session, String baseUrl, String path)
+                       throws RepositoryException {
+               String nodePath = getNodePath(path);
+               if (jcrAdminSession.itemExists(nodePath))
+                       throw new ArgeoException("Node " + nodePath + " already exists");
                Node node = null;
                String remoteUrl = baseUrl + path;
-               if (log.isTraceEnabled())
-                       log.trace("baseUrl=" + 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);
-               } catch (Exception e) {
-                       if (log.isTraceEnabled())
+                       node = importFile(session, nodePath, in);
+               } catch (IOException e) {
+                       if (log.isTraceEnabled()) {
                                log.trace("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) {
+       protected Node importFile(Session session, String nodePath, InputStream in)
+                       throws RepositoryException {
                // FIXME allow parallel proxying
                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);
+                       binary = session.getValueFactory().createBinary(in);
                        content.setProperty(Property.JCR_DATA, binary);
-                       jcrAdminSession.save();
                        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;
-       }
-
        public void setJcrRepository(Repository jcrRepository) {
                this.jcrRepository = jcrRepository;
        }