+/*
+ * 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;
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);
}
* 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() {
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;
}