From 5f097724cb2f64045c3e636db5804a5909db096f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 25 Nov 2009 21:51:18 +0000 Subject: [PATCH] Introduce JcrResource adapter git-svn-id: https://svn.argeo.org/commons/trunk@3167 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../src/main/resources/log4j.properties | 17 +- .../org.argeo.server.jackrabbit/.classpath | 2 + .../org.argeo.server.jackrabbit/pom.xml | 19 +- .../repository.xml | 139 +++++++++ .../argeo/server/jcr/JcrResourceAdapter.java | 291 ++++++++++++++++++ .../server/jcr/JcrResourceAdapterTest.java | 93 ++++++ .../src/test/resources/log4j.properties | 13 + .../org/argeo/server/jcr/dummy00.xls | Bin 0 -> 6656 bytes .../org/argeo/server/jcr/dummy01.xls | Bin 0 -> 6656 bytes .../org/argeo/server/jcr/dummy02.xls | Bin 0 -> 6656 bytes .../org/argeo/server/jcr/dummy03.xls | Bin 0 -> 6656 bytes .../org/argeo/server/jcr/repository.xml | 139 +++++++++ .../argeo/server/jxl/dao/JxlDaoSupport.java | 9 +- 13 files changed, 709 insertions(+), 13 deletions(-) create mode 100644 server/runtime/org.argeo.server.jackrabbit/repository.xml create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/test/java/org/argeo/server/jcr/JcrResourceAdapterTest.java create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/test/resources/log4j.properties create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy00.xls create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy01.xls create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy02.xls create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy03.xls create mode 100644 server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/repository.xml diff --git a/sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/resources/log4j.properties b/sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/resources/log4j.properties index c2edab75e..94ceb6ebb 100644 --- a/sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/resources/log4j.properties +++ b/sandbox/runtime/org.argeo.sandbox.jackrabbit/src/main/resources/log4j.properties @@ -1,10 +1,13 @@ -# ***** Set root logger level to DEBUG and its only appender to A. -log4j.rootLogger=WARN, A +log4j.rootLogger=WARN, console +## Levels log4j.logger.org.argeo=DEBUG +log4j.logger.org.apache.jackrabbit=INFO -# ***** A is set to be a ConsoleAppender. -log4j.appender.A=org.apache.log4j.ConsoleAppender -# ***** A uses PatternLayout. -log4j.appender.A.layout=org.apache.log4j.PatternLayout -log4j.appender.A.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n +## Appenders +# console is set to be a ConsoleAppender. +log4j.appender.console=org.apache.log4j.ConsoleAppender + +# console uses PatternLayout. +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n diff --git a/server/runtime/org.argeo.server.jackrabbit/.classpath b/server/runtime/org.argeo.server.jackrabbit/.classpath index 16f01e2ee..d3bdab048 100644 --- a/server/runtime/org.argeo.server.jackrabbit/.classpath +++ b/server/runtime/org.argeo.server.jackrabbit/.classpath @@ -1,6 +1,8 @@ + + diff --git a/server/runtime/org.argeo.server.jackrabbit/pom.xml b/server/runtime/org.argeo.server.jackrabbit/pom.xml index d48451e01..a00612998 100644 --- a/server/runtime/org.argeo.server.jackrabbit/pom.xml +++ b/server/runtime/org.argeo.server.jackrabbit/pom.xml @@ -30,7 +30,8 @@ - org.argeo.server.jackrabbit.* + org.argeo.server.jackrabbit.*, + org.argeo.server.jcr.* @@ -76,5 +77,21 @@ org.slf4j com.springsource.slf4j.org.apache.commons.logging + + + + org.argeo.commons.basic + org.argeo.support.junit + 0.1.2-SNAPSHOT + test + + + org.argeo.commons.basic + org.argeo.basic.dep.log4j + 0.1.2-SNAPSHOT + pom + test + + diff --git a/server/runtime/org.argeo.server.jackrabbit/repository.xml b/server/runtime/org.argeo.server.jackrabbit/repository.xml new file mode 100644 index 000000000..666919d28 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/repository.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java new file mode 100644 index 000000000..b770a89a8 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jcr/JcrResourceAdapter.java @@ -0,0 +1,291 @@ +package org.argeo.server.jcr; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; +import java.util.StringTokenizer; + +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.PropertyIterator; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.SimpleCredentials; +import javax.jcr.Value; +import javax.jcr.version.Version; +import javax.jcr.version.VersionHistory; +import javax.jcr.version.VersionIterator; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.ArgeoException; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.io.Resource; + +public class JcrResourceAdapter implements InitializingBean, DisposableBean { + private final static Log log = LogFactory.getLog(JcrResourceAdapter.class); + + private Repository repository; + + private String username; + private String password; + + private Session session; + + private Boolean versioning = true; + private String defaultEncoding = "UTF-8"; + + // private String restoreBase = "/.restore"; + + public void mkdirs(String path) { + try { + StringTokenizer st = new StringTokenizer(path, "/"); + StringBuffer current = new StringBuffer("/"); + Node currentNode = session().getRootNode(); + while (st.hasMoreTokens()) { + String part = st.nextToken(); + current.append(part).append('/'); + if (!session().itemExists(current.toString())) { + currentNode = currentNode.addNode(part, "nt:folder"); + if (versioning) + currentNode.addMixin("mix:versionable"); + if (log.isTraceEnabled()) + log.debug("Added folder " + part + " as " + current); + } else { + currentNode = (Node) session().getItem(current.toString()); + } + } + session().save(); + } catch (RepositoryException e) { + throw new ArgeoException("Cannot mkdirs " + path, e); + } + } + + public void create(String path, Resource file, String mimeType) { + try { + if (session().itemExists(path)) + throw new ArgeoException("Node " + path + " already exists."); + + int index = path.lastIndexOf('/'); + String parentPath = path.substring(0, index); + String fileName = path.substring(index + 1); + if (!session().itemExists(parentPath)) + throw new ArgeoException("Parent folder of node " + path + + " does not exist: " + parentPath); + + Node folderNode = (Node) session().getItem(parentPath); + Node fileNode = folderNode.addNode(fileName, "nt:file"); + + Node contentNode = fileNode.addNode("jcr:content", "nt:resource"); + contentNode.setProperty("jcr:mimeType", mimeType); + contentNode.setProperty("jcr:encoding", defaultEncoding); + contentNode.setProperty("jcr:data", file.getInputStream()); + Calendar lastModified = Calendar.getInstance(); + lastModified.setTimeInMillis(file.lastModified()); + contentNode.setProperty("jcr:lastModified", lastModified); + // resNode.addMixin("mix:referenceable"); + + if (versioning) + fileNode.addMixin("mix:versionable"); + + session().save(); + + if (versioning) + fileNode.checkin(); + + if (log.isDebugEnabled()) + log.debug("Created " + path + " from " + file); + } catch (Exception e) { + throw new ArgeoException("Cannot create node from resource " + file + + " under " + path, e); + } + + } + + public void update(String path, Resource file) { + try { + Node fileNode = (Node) session().getItem(path); + Node contentNode = fileNode.getNode("jcr:content"); + fileNode.checkout(); + contentNode.setProperty("jcr:data", file.getInputStream()); + Calendar lastModified = Calendar.getInstance(); + lastModified.setTimeInMillis(file.lastModified()); + contentNode.setProperty("jcr:lastModified", lastModified); + + session().save(); + fileNode.checkin(); + + if (log.isDebugEnabled()) + log.debug("Updated " + path + " from " + file); + } catch (Exception e) { + throw new ArgeoException("Cannot update node " + path + + " from resource" + file, e); + } + } + + public List listVersions(String path) { + if (!versioning) + throw new ArgeoException("Versioning is not activated"); + + try { + List versions = new ArrayList(); + Node fileNode = (Node) session().getItem(path); + VersionHistory history = fileNode.getVersionHistory(); + for (VersionIterator it = history.getAllVersions(); it.hasNext();) { + Version version = (Version) it.next(); + versions.add(version.getCreated()); + if (log.isTraceEnabled()) { + log.debug(version); + // debug(version); + } + } + return versions; + } catch (Exception e) { + throw new ArgeoException("Cannot list version of node " + path, e); + } + } + + public InputStream retrieve(String path) { + try { + Node node = (Node) session().getItem(path + "/jcr:content"); + Property property = node.getProperty("jcr:data"); + return property.getStream(); + } catch (Exception e) { + throw new ArgeoException("Cannot retrieve " + path, e); + } + } + + public synchronized InputStream retrieve(String path, Integer revision) { + if (!versioning) + throw new ArgeoException("Versioning is not activated"); + + try { + Node fileNode = (Node) session().getItem(path); + + // if (revision == 0) { + // InputStream in = fromVersion(fileNode.getBaseVersion()); + // if (log.isDebugEnabled()) + // log.debug("Retrieved " + path + " at base revision "); + // return in; + // } + + VersionHistory history = fileNode.getVersionHistory(); + int count = 0; + Version version = null; + for (VersionIterator it = history.getAllVersions(); it.hasNext();) { + version = (Version) it.next(); + if (count == revision + 1) { + InputStream in = fromVersion(version); + if (log.isDebugEnabled()) + log.debug("Retrieved " + path + " at revision " + + revision); + return in; + } + count++; + } + } catch (Exception e) { + throw new ArgeoException("Cannot retrieve version " + revision + + " of " + path, e); + } + + throw new ArgeoException("Version " + revision + + " does not exist for node " + path); + } + + protected InputStream fromVersion(Version version) + throws RepositoryException { + Node frozenNode = version.getNode("jcr:frozenNode"); + InputStream in = frozenNode.getNode("jcr:content").getProperty( + "jcr:data").getStream(); + return in; + } + + // protected InputStream restoreOrGetRevision(Node fileNode, Version + // version, + // Integer revision) throws RepositoryException { + // Node parentFolder = (Node) fileNode + // .getAncestor(fileNode.getDepth() - 1); + // String restoreFolderPath = restoreBase + parentFolder.getPath(); + // mkdirs(restoreFolderPath); + // String subNodeName = fileNode.getName() + "__" + fill(revision); + // Node restoreFolder = (Node) session().getItem(restoreFolderPath); + // if (!restoreFolder.hasNode(subNodeName)) { + // parentFolder.restore(version, subNodeName, true); + // } + // return parentFolder.getNode(subNodeName + "/jcr:content").getProperty( + // "jcr:data").getStream(); + // } + + protected Session session() { + return session; + } + + public void afterPropertiesSet() throws Exception { + session = repository.login(new SimpleCredentials(username, password + .toCharArray())); + } + + public void destroy() throws Exception { + session.logout(); + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setPassword(String password) { + this.password = password; + } + + public void setVersioning(Boolean versioning) { + this.versioning = versioning; + } + + public void setDefaultEncoding(String defaultEncoding) { + this.defaultEncoding = defaultEncoding; + } + + /** Recursively outputs the contents of the given node. */ + public static void debug(Node node) throws RepositoryException { + // First output the node path + log.debug(node.getPath()); + // Skip the virtual (and large!) jcr:system subtree + if (node.getName().equals("jcr:system")) { + return; + } + + // Then output the properties + PropertyIterator properties = node.getProperties(); + while (properties.hasNext()) { + Property property = properties.nextProperty(); + if (property.getDefinition().isMultiple()) { + // A multi-valued property, print all values + Value[] values = property.getValues(); + for (int i = 0; i < values.length; i++) { + log.debug(property.getPath() + " = " + + values[i].getString()); + } + } else { + // A single-valued property + log.debug(property.getPath() + " = " + property.getString()); + } + } + + } + + protected String fill(Integer number) { + int size = 4; + String str = number.toString(); + for (int i = str.length(); i < size; i++) { + str = "0" + str; + } + return str; + } +} diff --git a/server/runtime/org.argeo.server.jackrabbit/src/test/java/org/argeo/server/jcr/JcrResourceAdapterTest.java b/server/runtime/org.argeo.server.jackrabbit/src/test/java/org/argeo/server/jcr/JcrResourceAdapterTest.java new file mode 100644 index 000000000..9c72a1e15 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/test/java/org/argeo/server/jcr/JcrResourceAdapterTest.java @@ -0,0 +1,93 @@ +package org.argeo.server.jcr; + +import java.io.File; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.List; + +import junit.framework.TestCase; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.jackrabbit.core.TransientRepository; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; + +public class JcrResourceAdapterTest extends TestCase { + private static SimpleDateFormat sdf = new SimpleDateFormat( + "yyyyMMdd:hhmmss.SSS"); + + private final static Log log = LogFactory + .getLog(JcrResourceAdapterTest.class); + + private JcrResourceAdapter jra; + private TransientRepository repository; + + public void testCreate() throws Exception { + String basePath = "/test/subdir"; + jra.mkdirs(basePath); + Resource res = new ClassPathResource("org/argeo/server/jcr/dummy00.xls"); + String filePath = basePath + "/dummy.xml"; + jra.create(filePath, res, "application/vnd.ms-excel"); + InputStream in = jra.retrieve(filePath); + assertTrue(IOUtils.contentEquals(res.getInputStream(), in)); + } + + public void testVersioning() throws Exception { + String basePath = "/test/versions"; + jra.mkdirs(basePath); + String filePath = basePath + "/dummy.xml"; + Resource res00 = new ClassPathResource( + "org/argeo/server/jcr/dummy00.xls"); + jra.create(filePath, res00, "application/vnd.ms-excel"); + Resource res01 = new ClassPathResource( + "org/argeo/server/jcr/dummy01.xls"); + jra.update(filePath, res01); + Resource res02 = new ClassPathResource( + "org/argeo/server/jcr/dummy02.xls"); + jra.update(filePath, res02); + + List versions = jra.listVersions(filePath); + for (Calendar version : versions) + log.debug(sdf.format(version.getTime())); + assertEquals(4, versions.size()); + + InputStream in = jra.retrieve(filePath, 1); + assertTrue(IOUtils.contentEquals(res01.getInputStream(), in)); + in = jra.retrieve(filePath, 0); + assertTrue(IOUtils.contentEquals(res00.getInputStream(), in)); + in = jra.retrieve(filePath, 2); + assertTrue(IOUtils.contentEquals(res02.getInputStream(), in)); + Resource res03 = new ClassPathResource( + "org/argeo/server/jcr/dummy03.xls"); + jra.update(filePath, res03); + in = jra.retrieve(filePath, 1); + assertTrue(IOUtils.contentEquals(res01.getInputStream(), in)); + } + + @Override + protected void setUp() throws Exception { + File homeDir = new File(System.getProperty("java.io.tmpdir"), + JcrResourceAdapterTest.class.getSimpleName()); + FileUtils.deleteDirectory(homeDir); + Resource res = new ClassPathResource( + "org/argeo/server/jcr/repository.xml"); + repository = new TransientRepository(res.getFile(), homeDir); + + jra = new JcrResourceAdapter(); + jra.setRepository(repository); + jra.setUsername("demo"); + jra.setPassword("demo"); + jra.afterPropertiesSet(); + } + + @Override + protected void tearDown() throws Exception { + jra.destroy(); + // repository.shutdown(); + } + +} diff --git a/server/runtime/org.argeo.server.jackrabbit/src/test/resources/log4j.properties b/server/runtime/org.argeo.server.jackrabbit/src/test/resources/log4j.properties new file mode 100644 index 000000000..ca995af8e --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/test/resources/log4j.properties @@ -0,0 +1,13 @@ +log4j.rootLogger=WARN, console + +## Levels +log4j.logger.org.argeo=DEBUG +log4j.logger.org.apache.jackrabbit=OFF + +## Appenders +# console is set to be a ConsoleAppender. +log4j.appender.console=org.apache.log4j.ConsoleAppender + +# console uses PatternLayout. +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n diff --git a/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy00.xls b/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy00.xls new file mode 100644 index 0000000000000000000000000000000000000000..e5846fef7262b74c71fa79612ddf0697d39b8a3c GIT binary patch literal 6656 zcmeHLUu=_A6hB|Lj&=;z{X+#EpHsHMHr&{Q7)82`;V^7017o5j+HK!lpI?8jkpvb4s@^$z|CR2=&Kv5pxI(7%KDXHW zkhG~8`o(2sj?9utyc8Az09S(PZ$vN}RDL1AxB~J zzd(?ueDAnr#XCspaL&C_wvh5WFMesB&SNi5kl2PJI+$nuBZQxevJ7WZq2c`ZB;|Su451siCH++90v|N`q?U}vfPC5~t zjE|#yF%+4yFyY5TlT)GCVN7(VH5_9#g{O&6X2H)e#gJvYw!jUptpW#q6wBatROz7) zKtJYgL&2dtOO zq3A?tvUMODn+Qc38auW$cGV%4A+jyaHW+%&G8+evX!oyc-iWDmYPz(&$yIMg{Ycxn znYMGu?HgV7lkjbREYQ&3jIK{Odq64%6+fD;%pVx;v!_%Nc8%N3SH3@)*ehlEd?HzzYaTehF?G(TfFU{L;G5W~< zP<%XWO_|-HsnM_%(>Gc!I%WCp3Id6S^_+&*SuzEIL|vrTJNY$ZJSOqf)2y?)IOSSD z$MDR3J9lF9y1?*e-)fk=vR9_C{t3KX`R#8P zUbthb6H?-M(MCbZotmBT>BI9~|7P%BcDnS+4va9ObFlOaWMT8!dJF5{g0bVy_{&ig Ny8rI)Z~yi9e*xrBiZ=iN literal 0 HcmV?d00001 diff --git a/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy01.xls b/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy01.xls new file mode 100644 index 0000000000000000000000000000000000000000..b5c6b55395e29c5f6d4ef850f9c808714a111c7f GIT binary patch literal 6656 zcmeHLU2IfE6h3!<%H6iK+tNh^#Vgt$`hzW%h%wl0OQ9HA8o>BMqPOMNUD)pGvQ>Fd zmm+VNXn4>E5<+ZZjEO=_^uZ>UH)Av!lPdaD;EBk?q8LL2*6*8pmtIQO?vh4DJDYE2 z_RO3)GjqkD3Q~}k%GN1+s0n35A zfV+WvfEB<>;9lT9U=?sbU;qyQtAPiBhk#n34yXqjfHgoP&;&FCocmg*WW5dbbwImA zTkn)JJF-~&s~rgF&|-;SK3n<~UB2@DXJHX1eW#UOoC9sQJWt!`He*A^-<7)5988V2 zxlt>@J;MVVJ%+pjHbrW+%9pA9Bh_z0^Qb=c9Afx%&TC>3;0IrhFDx z$dudXCVL+;Hg$%+CJ((i54|xDJuoNz#(a29Q)$vT>cKfpOO|CY?Nwz}xW zrI)C(ChgBY3+vb9FwVjsVC3oF8L_NX8!3k!f1oJqNZG>6V6IR55%`2A{C<|bj0TxO zHcCl`URy(`;DC%O1Z~kdQmV|++NCVR=JsA%;*E~Mbi@<= zcZ8g)vR>U$c~1pK67f_7<%?!))WU?HG~=UY@&LAEvo)Ax6^(snaww9;(?ypF%!*-* zAsIfIj#&GRe(NP;M`FZ`H}@x!BW7%MUE8|4&JbcNeOs^gok90dL##V4MynLkY)#)xqZgUok5=HOU2|TSwmkcvh8qRP<3E-m zaEQF>;Xk&WbJ|D^+4hEcQhgzLVPokJ?~We~lb5nWwoRhld!zmQnN#75GC-AQdeH~! z&QQIS#qO2j&9tIgDL&h>C6KXK%?>lkBc+OuJTN(V!c#4usK;}7rW0;I7|*8$*U%F+ z?SF2G+-b)4+p)x%jdg3#aBC2%ELwx$xuHQN;ua0sf|ZG&x~Rbg)?lk!gYecxYY;p| zYtYtd(Yb~fi5C{YJ9bc~7ef43xoqZ}r!P8`Ozck#r;MJLhpd?K*rP4G%t0#_vk*u{ zx}w9w_QllZDLRJ{+Cq!wv>C4B%N@_(>_p?9K79O_E88Q%58l$Hss7_1=?5o(oPX>^ zo#Ai5p+!*gijW3)D2@PpH@*Wf=#B$?Kb{0A@xnFxEl7XbXQm=iYt-m6NB2anqkQ1bP{!gk4FTzCyswh7PX^U@ zsC_oEh@7uL?l6cBAFr?;SsV|Vl&1b`Htp5?nPC4=yq9}I%-QVB-Y59Kwv~Q1+ literal 0 HcmV?d00001 diff --git a/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy02.xls b/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy02.xls new file mode 100644 index 0000000000000000000000000000000000000000..d73bc6605c45683e4422fd90fa9f0afbbc8f5fb6 GIT binary patch literal 6656 zcmeHLU2IfE6h3!<%5M4TwscWJ@rt$u+9IX?U`$~P6v5Ea0O|{g-j-Xtu-nCDtMZ^M zAa9tcJm3R~A@V{@6k?(e)>z(*(O^u7)hEy=A`gqf7!um``_8>fFKajKl177eHs8$b zH-Bg5oH;Xdzdv7l@#NWsm!v2>EqA&g6{XnVxPoK~IKL?l#%mZow905`b)B*E>dLRlc0PX?q z1?~eD0*iqAfd_!az=MDZJOnHO9tIu(8h}Qi30Mj&1C|5LKnu_cQ2s~Vl=)T2w*!y4 z+!Jm(xhgZcQY#P+L5o#E`C{(3bouK0FTo@ccu&+x%UPavKLn<87M@qCRx(Rw2q$CPH!N^^lv84#_UWZLn!iO|%Ibo$#G;u_Q5_r4ZEH^Wwl9 zImNU2nXaC$ZJk>#>Yh6#f8M{}Qa$~}XvXh1+0D}+*T+Js z%F$~ZI4U5Co+><9Xp8Qa(zL*}%j_IakFRjo49P(Q1B6D67~+^LzRL3j=S>Kmg>asP z{=|`ULpmUVmMubJCYNo%O3CzVcGi6xC~s~S6_IP)5ASFP82 z*)|({4{P^tY1{}=+BIBW+vLeFMgDN>*rC?3+}dTH{7Lx0FeYf|?~t?@Ek>bzAvNSV z^c|KrbfLsZSMzK~@bUb2UJB0LA>^Z`n0H-`Q6uCWjo-@An-tfhH57APPA@m^zC0Zn zoPP#x8ytiGm`2e;DzU<3@JY3{ zV;h*Ltnt;!XZq-lO;*CK3H=4Na|6|oGydn6%a!Jx;7%-ea$&t1G`$*xDl66?+T7Hj z4)He)Is>bTAUmVMY1ZIMuLj}WE7l;|RIEWqr*|A1c+L1>3A~?2LiAL)KWHo)`DW^l z_oq|)QUe*Y>-By+VLtU_>kg~WP9$tS2G_+02Aqqn)28AW#^?-MaZ9Jc1it)n9~K81 z`Nbn2{C<7wVC18BL(<&z=}+{BBS67VZbF{Ewb$hak@AX>1-LojV)fnmK2oR#_b=!D zc?Ky*ygcr_CFxhYt;}HD9yZrm!@J^kTHlzZc(&zxF$QGUB%ep3d8Q08ARA582Zz4l zT}0&c`H>Lv%oc}I^XC}83*TKhv0_o=*m2Ci<@(1Pzy*uAo#6ORX6FQDW?Rm!6p!L* z3)A`iN98ZF;i&}Wc{|Dv2?#IXeU+9y(x=~{_Bdn(F<*gPFWM3JP`OPz`9TB0ko6cj zi5Kox$gtZXD~LHh=fklX%4xa+l{UK-4UC%*yPRfI*5U2O8QF=atW-p<#Q%Di3(9sG z#{83bx$@iJX1s6*R3~IIc+sZ7lnzVX@##0qoqrqZUU9n&$_9+kuQJ&B1+p@ER^P$= WAII1kcl_x{DqVl?_qTt0{J#Jn?T}gk literal 0 HcmV?d00001 diff --git a/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy03.xls b/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/dummy03.xls new file mode 100644 index 0000000000000000000000000000000000000000..0759cb92773ad3c3a420dc15f6b349bb0d005fd2 GIT binary patch literal 6656 zcmeHLU2IfE6h3#mTXxG&w?B&tidU5K(-tZ92V;V~D`|eP`}=m$e&qNuxnKH)m$< zH#7H~Ip@ronfvWGb?1&8pL1S{(vwmpH?kqAF2F6+YjW>l5g+QrZe+9B9E|Ezx`Q-u z-IJ9z^uve&5N$pU6aVumZ>)CW1NJ|a zI#mY8qHnIWs&UTn!AB1vp9P;HTCaJ7<{xXnQ<_H=c~kS1>YL~s6?+8=o>$Jm-#C62 za!WqdF+VBN2G9EfE!o%K@|MMPs~gdANMafx*P$Gdt;pNp(*->-CSY|ScE-e!_+++1 z(84dz^Usi@+?${7>h0Rt(S1(W+)?>GYeR-y8ncOW3W{GT52sEh>R$@yS10QKU&RB^ zyrnUVGi1u?x!LF;W6(UlxCGu(0$)-B4^4=V%fn-urZM}V59>57S(f2+m6mnsYAx&2 zek~i))3j_%2eL1~`z_gzwGiUL537IEkn5(}i2UZo14Wh-`GkkTT%Yy>hzZSjF3L9U z2AO^~N_B=&+rm}>Npx4?&O%@GmXww`tX-yOxO;q#vu05CSYQwwv!ckOGVe0?7wk7d zd@P9lB=`rmoNKaL&!!X(A`d4fkCPl=r;Z)T zSRAZ-oZVSmWP)-EGICSn24@0c_@+QO17Tq+CPyXJX^048)U^*Tf8W#Jx9WMt(?D`* z0o5;8WDi70OT6z=7VJAMnscm^v zM+7_Hf?IX#b6#}qroMgp`8PCgf++2pF05KuP+x@lzSgsQThC@zEiR}ZK_m=ef|fpe zrNwHoa^rKQCC}p9A$e65C04SAJ3Nw)rvS5Gm=i?MM|-jE1stnZh#9-zj4`GZ_oGh~ zV^n7`21DM2UH9&!MlSPa;T%G~d}A5G2$9!(d}G@nK(-N$7%#TPGP*~=v zVhfJj*urh53O42WJRD>^5*gE6*7DBO6B|e-b|wZ>cGoKdZrpz2@z%{wzZ;Lc8d^GI zgM;Q^YsOTZ!>tU{ibt9OH}L0=E2=orUC-@5{Oi>XL*WnK4odUF6F)MtodV?|-a6D7 zLHj&x2qljgX%O8UfmH9E@1cZ}asD#*&toXb@xpa;mt=(OaZ*Duchv55Mz_Y?q~0-0 z;T+4mViY7N|J=eN%FIhql<7#kF);Ea&mxlUK76qObyWYBO3j}v6*!RGSb<;YOPPQaUa2_%i~Q tJO4KHz2to|AZx&3KxJ_C4`gNXthkN&KMLL{kN;#8mFmCn|J%RK|1Wf@mumn3 literal 0 HcmV?d00001 diff --git a/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/repository.xml b/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/repository.xml new file mode 100644 index 000000000..f05192337 --- /dev/null +++ b/server/runtime/org.argeo.server.jackrabbit/src/test/resources/org/argeo/server/jcr/repository.xml @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java index 76ac7dd55..e8bb7107f 100644 --- a/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java +++ b/server/runtime/org.argeo.server.jxl/src/main/java/org/argeo/server/jxl/dao/JxlDaoSupport.java @@ -20,13 +20,12 @@ import jxl.WorkbookSettings; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.server.ArgeoServerException; +import org.argeo.ArgeoException; import org.argeo.server.dao.AbstractTabularDaoSupport; import org.argeo.server.dao.LightDaoSupport; import org.springframework.beans.BeanWrapper; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContextAware; -import org.springframework.core.io.Resource; import org.springframework.util.StringUtils; public class JxlDaoSupport extends AbstractTabularDaoSupport implements @@ -47,7 +46,7 @@ public class JxlDaoSupport extends AbstractTabularDaoSupport implements loadSheet(sheet, references); } } catch (Exception e) { - throw new ArgeoServerException("Cannot load workbook", e); + throw new ArgeoException("Cannot load workbook", e); } } @@ -79,7 +78,7 @@ public class JxlDaoSupport extends AbstractTabularDaoSupport implements if (keyProperty == null) keyProperty = fieldName; if (!espSt.hasMoreTokens()) - throw new ArgeoServerException("Badly formatted sheetname " + throw new ArgeoException("Badly formatted sheetname " + sheetName); String fieldValue = espSt.nextToken(); bw.setPropertyValue(fieldName, fieldValue); @@ -272,7 +271,7 @@ public class JxlDaoSupport extends AbstractTabularDaoSupport implements String formula = ((FormulaCell) cell).getFormula(); int index = formula.indexOf('!'); if (index < 0) - throw new ArgeoServerException("Cannot interpret formula " + throw new ArgeoException("Cannot interpret formula " + formula); ; String targetSheet = formula.substring(0, index); -- 2.30.2