X-Git-Url: https://git.argeo.org/?a=blobdiff_plain;f=org.argeo.jcr%2Fsrc%2Forg%2Fargeo%2Fjcr%2FJcrRepositoryWrapper.java;h=d4bf4381ed1efd88149ea1bb00c44df680f51164;hb=25e4528153640a2e211e217468f8f5aa01607cf0;hp=6c23acaac2438852ffacfc0321b7148178359f6c;hpb=e66b9893b0e511f8ab295e3cee42b7dc966f1597;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.jcr/src/org/argeo/jcr/JcrRepositoryWrapper.java b/org.argeo.jcr/src/org/argeo/jcr/JcrRepositoryWrapper.java index 6c23acaac..d4bf4381e 100644 --- a/org.argeo.jcr/src/org/argeo/jcr/JcrRepositoryWrapper.java +++ b/org.argeo.jcr/src/org/argeo/jcr/JcrRepositoryWrapper.java @@ -15,13 +15,24 @@ */ package org.argeo.jcr; +import java.io.InputStream; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Calendar; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.jcr.Binary; import javax.jcr.Credentials; import javax.jcr.LoginException; import javax.jcr.NoSuchWorkspaceException; +import javax.jcr.PropertyType; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Value; +import javax.jcr.ValueFormatException; /** * Wrapper around a JCR repository which allows to simplify configuration and @@ -34,21 +45,35 @@ public abstract class JcrRepositoryWrapper implements Repository { // wrapped repository private Repository repository; + private Map additionalDescriptors = new HashMap<>(); + private Boolean autocreateWorkspaces = false; + public JcrRepositoryWrapper(Repository repository) { + setRepository(repository); + } + /** - * Empty constructor, {@link #init()} should be called after properties have - * been set + * Empty constructor */ public JcrRepositoryWrapper() { } - /** Initializes */ - public void init() { - } + // /** Initializes */ + // public void init() { + // } + // + // /** Shutdown the repository */ + // public void destroy() throws Exception { + // } - /** Shutdown the repository */ - public void destroy() throws Exception { + protected void putDescriptor(String key, String value) { + if (Arrays.asList(getRepository().getDescriptorKeys()).contains(key)) + throw new IllegalArgumentException("Descriptor key " + key + " is already defined in wrapped repository"); + if (value == null) + additionalDescriptors.remove(key); + else + additionalDescriptors.put(key, value); } /* @@ -56,17 +81,22 @@ public abstract class JcrRepositoryWrapper implements Repository { */ public String getDescriptor(String key) { + if (additionalDescriptors.containsKey(key)) + return additionalDescriptors.get(key); return getRepository().getDescriptor(key); } public String[] getDescriptorKeys() { - return getRepository().getDescriptorKeys(); + if (additionalDescriptors.size() == 0) + return getRepository().getDescriptorKeys(); + List keys = Arrays.asList(getRepository().getDescriptorKeys()); + keys.addAll(additionalDescriptors.keySet()); + return keys.toArray(new String[keys.size()]); } /** Central login method */ public Session login(Credentials credentials, String workspaceName) - throws LoginException, NoSuchWorkspaceException, - RepositoryException { + throws LoginException, NoSuchWorkspaceException, RepositoryException { Session session; try { session = getRepository().login(credentials, workspaceName); @@ -76,7 +106,7 @@ public abstract class JcrRepositoryWrapper implements Repository { else throw e; } - processNewSession(session); + processNewSession(session, workspaceName); return session; } @@ -84,37 +114,35 @@ public abstract class JcrRepositoryWrapper implements Repository { return login(null, null); } - public Session login(Credentials credentials) throws LoginException, - RepositoryException { + public Session login(Credentials credentials) throws LoginException, RepositoryException { return login(credentials, null); } - public Session login(String workspaceName) throws LoginException, - NoSuchWorkspaceException, RepositoryException { + public Session login(String workspaceName) throws LoginException, NoSuchWorkspaceException, RepositoryException { return login(null, workspaceName); } /** Called after a session has been created, does nothing by default. */ - protected void processNewSession(Session session) { + protected void processNewSession(Session session, String workspaceName) { } /** Wraps access to the repository, making sure it is available. */ protected synchronized Repository getRepository() { -// if (repository == null) { -// throw new ArgeoJcrException("No repository initialized." -// + " Was the init() method called?" -// + " The destroy() method should also" -// + " be called on shutdown."); -// } + // if (repository == null) { + // throw new ArgeoJcrException("No repository initialized." + // + " Was the init() method called?" + // + " The destroy() method should also" + // + " be called on shutdown."); + // } return repository; } /** - * Logs in to the default workspace, creates the required workspace, logs - * out, logs in to the required workspace. + * Logs in to the default workspace, creates the required workspace, logs out, + * logs in to the required workspace. */ - protected Session createWorkspaceAndLogsIn(Credentials credentials, - String workspaceName) throws RepositoryException { + protected Session createWorkspaceAndLogsIn(Credentials credentials, String workspaceName) + throws RepositoryException { if (workspaceName == null) throw new ArgeoJcrException("No workspace specified."); Session session = getRepository().login(credentials); @@ -128,10 +156,14 @@ public abstract class JcrRepositoryWrapper implements Repository { } public boolean isSingleValueDescriptor(String key) { + if (additionalDescriptors.containsKey(key)) + return true; return getRepository().isSingleValueDescriptor(key); } public Value getDescriptorValue(String key) { + if (additionalDescriptors.containsKey(key)) + return new StrValue(additionalDescriptors.get(key)); return getRepository().getDescriptorValue(key); } @@ -147,4 +179,74 @@ public abstract class JcrRepositoryWrapper implements Repository { this.autocreateWorkspaces = autocreateWorkspaces; } + protected static class StrValue implements Value { + private final String str; + + public StrValue(String str) { + this.str = str; + } + + @Override + public String getString() throws ValueFormatException, IllegalStateException, RepositoryException { + return str; + } + + @Override + public InputStream getStream() throws RepositoryException { + throw new UnsupportedOperationException(); + } + + @Override + public Binary getBinary() throws RepositoryException { + throw new UnsupportedOperationException(); + } + + @Override + public long getLong() throws ValueFormatException, RepositoryException { + try { + return Long.parseLong(str); + } catch (NumberFormatException e) { + throw new ValueFormatException("Cannot convert", e); + } + } + + @Override + public double getDouble() throws ValueFormatException, RepositoryException { + try { + return Double.parseDouble(str); + } catch (NumberFormatException e) { + throw new ValueFormatException("Cannot convert", e); + } + } + + @Override + public BigDecimal getDecimal() throws ValueFormatException, RepositoryException { + try { + return new BigDecimal(str); + } catch (NumberFormatException e) { + throw new ValueFormatException("Cannot convert", e); + } + } + + @Override + public Calendar getDate() throws ValueFormatException, RepositoryException { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getBoolean() throws ValueFormatException, RepositoryException { + try { + return Boolean.parseBoolean(str); + } catch (NumberFormatException e) { + throw new ValueFormatException("Cannot convert", e); + } + } + + @Override + public int getType() { + return PropertyType.STRING; + } + + } + }