X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=server%2Fruntime%2Forg.argeo.server.jcr%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fjcr%2Fproxy%2FAbstractUrlProxy.java;h=7692163e3a008a5ea4b70f71fc34e9933c68c93f;hb=27aafca96a635f284c7b5b7f00b929ef30d757c6;hp=7bec5ee7a264c27653cb68c921d3294a3ad328e5;hpb=2d4dd736ab07b1ef3aaec0a9e5d29f30c551de9c;p=lgpl%2Fargeo-commons.git diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/proxy/AbstractUrlProxy.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/proxy/AbstractUrlProxy.java index 7bec5ee7a..7692163e3 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/proxy/AbstractUrlProxy.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/proxy/AbstractUrlProxy.java @@ -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,98 @@ 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. + 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); + clientSession = jcrRepository.login(proxyWorkspace); + if (!clientSession.itemExists(path) + || shouldUpdate(clientSession, path)) { + Node nodeT = retrieveAndSave(path); + if (nodeT == null) return null; - } else { - node = jcrSession.getNodeByIdentifier(nodeIdentifier); - } - } else { - node = jcrSession.getNode(nodePath); } + return clientSession.getNode(path); } catch (RepositoryException e) { 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); + } finally { + notifyAll(); + } + } + + /** 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; + } + }