From: Mathieu Baudier Date: Thu, 17 Jun 2010 19:51:51 +0000 (+0000) Subject: Improve JCR X-Git-Tag: argeo-commons-2.1.30~1603 X-Git-Url: https://git.argeo.org/?a=commitdiff_plain;h=3a9e434fc0f80eab9568b1e5b8bb90f9fcc4310e;p=lgpl%2Fargeo-commons.git Improve JCR git-svn-id: https://svn.argeo.org/commons/trunk@3606 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/server/modules/org.argeo.server.ext.jackrabbit/.project b/server/modules/org.argeo.server.ext.jackrabbit/.project new file mode 100644 index 000000000..e9939b5e9 --- /dev/null +++ b/server/modules/org.argeo.server.ext.jackrabbit/.project @@ -0,0 +1,22 @@ + + + org.argeo.server.ext.jackrabbit + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/server/modules/org.argeo.server.ext.jackrabbit/.settings/org.eclipse.pde.core.prefs b/server/modules/org.argeo.server.ext.jackrabbit/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 000000000..32c9e3fff --- /dev/null +++ b/server/modules/org.argeo.server.ext.jackrabbit/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +#Tue Jun 15 19:05:36 CEST 2010 +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/server/modules/org.argeo.server.ext.jackrabbit/META-INF/MANIFEST.MF b/server/modules/org.argeo.server.ext.jackrabbit/META-INF/MANIFEST.MF new file mode 100644 index 000000000..1b8b61055 --- /dev/null +++ b/server/modules/org.argeo.server.ext.jackrabbit/META-INF/MANIFEST.MF @@ -0,0 +1,6 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Jackrabbit +Bundle-SymbolicName: org.argeo.server.ext.jackrabbit +Bundle-Version: 1.0.0.qualifier +Fragment-Host: org.argeo.dep.osgi.jackrabbit diff --git a/server/modules/org.argeo.server.ext.jackrabbit/build.properties b/server/modules/org.argeo.server.ext.jackrabbit/build.properties new file mode 100644 index 000000000..5f22cdd44 --- /dev/null +++ b/server/modules/org.argeo.server.ext.jackrabbit/build.properties @@ -0,0 +1 @@ +bin.includes = META-INF/ diff --git a/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/fs/db/sybase.ddl b/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/fs/db/sybase.ddl new file mode 100644 index 000000000..fb8a0e8ca --- /dev/null +++ b/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/fs/db/sybase.ddl @@ -0,0 +1,16 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +create table ${schemaObjectPrefix}FSENTRY (FSENTRY_PATH varchar(2048) not null, FSENTRY_NAME varchar(255) not null, FSENTRY_DATA image null, FSENTRY_LASTMOD decimal(19,0) not null, FSENTRY_LENGTH decimal(19,0) not null) +#create unique index ${schemaObjectPrefix}FSENTRY_IDX on ${schemaObjectPrefix}FSENTRY (FSENTRY_PATH, FSENTRY_NAME) diff --git a/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/journal/sybase.ddl b/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/journal/sybase.ddl new file mode 100644 index 000000000..d0f62428c --- /dev/null +++ b/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/journal/sybase.ddl @@ -0,0 +1,22 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. + +create table ${schemaObjectPrefix}JOURNAL (REVISION_ID decimal(19,0) NOT NULL, JOURNAL_ID varchar(255), PRODUCER_ID varchar(255), REVISION_DATA IMAGE) +create unique index ${schemaObjectPrefix}JOURNAL_IDX on ${schemaObjectPrefix}JOURNAL (REVISION_ID) +create table ${schemaObjectPrefix}GLOBAL_REVISION (REVISION_ID decimal(19,0) NOT NULL) +create unique index ${schemaObjectPrefix}GLOBAL_REVISION_IDX on ${schemaObjectPrefix}GLOBAL_REVISION (REVISION_ID) + +# Inserting the one and only revision counter record now helps avoiding race conditions +insert into ${schemaObjectPrefix}GLOBAL_REVISION VALUES(0) diff --git a/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/persistence/bundle/sybase.ddl b/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/persistence/bundle/sybase.ddl new file mode 100644 index 000000000..47c6b71cf --- /dev/null +++ b/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/persistence/bundle/sybase.ddl @@ -0,0 +1,22 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +create table ${schemaObjectPrefix}BUNDLE (NODE_ID binary(16) not null, BUNDLE_DATA image not null) +create unique index ${schemaObjectPrefix}BUNDLE_IDX on ${schemaObjectPrefix}BUNDLE (NODE_ID) +create table ${schemaObjectPrefix}REFS (NODE_ID binary(16) not null, REFS_DATA image not null) +create unique index ${schemaObjectPrefix}REFS_IDX on ${schemaObjectPrefix}REFS (NODE_ID) +create table ${schemaObjectPrefix}BINVAL (BINVAL_ID varchar(64) not null, BINVAL_DATA image not null) +create unique index ${schemaObjectPrefix}BINVAL_IDX on ${schemaObjectPrefix}BINVAL (BINVAL_ID) +#create table ${schemaObjectPrefix}NAMES (ID INTEGER IDENTITY(1,1) PRIMARY KEY, NAME varchar(255) COLLATE Latin1_General_CS_AS not null) +create table ${schemaObjectPrefix}NAMES (ID INTEGER IDENTITY PRIMARY KEY, NAME varchar(255)) diff --git a/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/persistence/db/sybase.ddl b/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/persistence/db/sybase.ddl new file mode 100644 index 000000000..2bde3231e --- /dev/null +++ b/server/modules/org.argeo.server.ext.jackrabbit/org/apache/jackrabbit/core/persistence/db/sybase.ddl @@ -0,0 +1,22 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You 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. +create table ${schemaObjectPrefix}NODE (NODE_ID char(36) not null, NODE_DATA image not null) +create unique index ${schemaObjectPrefix}NODE_IDX on ${schemaObjectPrefix}NODE (NODE_ID) +create table ${schemaObjectPrefix}PROP (PROP_ID varchar(1024) not null, PROP_DATA image not null) +create unique index ${schemaObjectPrefix}PROP_IDX on ${schemaObjectPrefix}PROP (PROP_ID) +create table ${schemaObjectPrefix}REFS (NODE_ID char(36) not null, REFS_DATA image not null) +create unique index ${schemaObjectPrefix}REFS_IDX on ${schemaObjectPrefix}REFS (NODE_ID) +create table ${schemaObjectPrefix}BINVAL (BINVAL_ID varchar(1024) not null, BINVAL_DATA image not null) +create unique index ${schemaObjectPrefix}BINVAL_IDX on ${schemaObjectPrefix}BINVAL (BINVAL_ID) diff --git a/server/modules/org.argeo.server.jdbc/.project b/server/modules/org.argeo.server.jdbc/.project new file mode 100644 index 000000000..283257ba8 --- /dev/null +++ b/server/modules/org.argeo.server.jdbc/.project @@ -0,0 +1,22 @@ + + + org.argeo.server.jdbc + + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + + diff --git a/server/modules/org.argeo.server.jdbc/.settings/org.eclipse.pde.core.prefs b/server/modules/org.argeo.server.jdbc/.settings/org.eclipse.pde.core.prefs new file mode 100644 index 000000000..e9fc089d1 --- /dev/null +++ b/server/modules/org.argeo.server.jdbc/.settings/org.eclipse.pde.core.prefs @@ -0,0 +1,4 @@ +#Tue Jun 15 17:44:26 CEST 2010 +eclipse.preferences.version=1 +pluginProject.extensions=false +resolve.requirebundle=false diff --git a/server/modules/org.argeo.server.jdbc/META-INF/MANIFEST.MF b/server/modules/org.argeo.server.jdbc/META-INF/MANIFEST.MF index 94f457734..14fd4f1f7 100644 --- a/server/modules/org.argeo.server.jdbc/META-INF/MANIFEST.MF +++ b/server/modules/org.argeo.server.jdbc/META-INF/MANIFEST.MF @@ -9,3 +9,4 @@ Import-Package: com.microsoft.sqlserver.jdbc;resolution:=optional, org.apache.derby.jdbc;resolution:=optional, org.hsqldb;resolution:=optional, org.postgresql;resolution:=optional +Bundle-Name: Argeo Spring JDBC Extension diff --git a/server/modules/org.argeo.server.jdbc/build.properties b/server/modules/org.argeo.server.jdbc/build.properties new file mode 100644 index 000000000..5f22cdd44 --- /dev/null +++ b/server/modules/org.argeo.server.jdbc/build.properties @@ -0,0 +1 @@ +bin.includes = META-INF/ diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrResourceAdapter.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrResourceAdapter.java index c5225204b..c0d00447d 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrResourceAdapter.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrResourceAdapter.java @@ -114,14 +114,16 @@ public class JcrResourceAdapter { Node fileNode = (Node) session().getItem(path); Node contentNode = fileNode.getNode("jcr:content"); - fileNode.checkout(); + if (versioning) + fileNode.checkout(); contentNode.setProperty("jcr:data", in); Calendar lastModified = Calendar.getInstance(); // lastModified.setTimeInMillis(file.lastModified()); contentNode.setProperty("jcr:lastModified", lastModified); session().save(); - fileNode.checkin(); + if (versioning) + fileNode.checkin(); if (log.isDebugEnabled()) log.debug("Updated " + path); diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java index d3174a1ca..caf2abdb0 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/JcrUtils.java @@ -18,9 +18,17 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; +/** Utility methods to simplify common JCR operations. */ public class JcrUtils { private final static Log log = LogFactory.getLog(JcrUtils.class); + /** + * Queries one single node. + * + * @return one single node or null if none was found + * @throws ArgeoException + * if more than one node was found + */ public static Node querySingleNode(Query query) { NodeIterator nodeIterator; try { @@ -40,12 +48,14 @@ public class JcrUtils { return node; } + /** Removes forbidden characters from a path, replacing them with '_' */ public static String removeForbiddenCharacters(String str) { return str.replace('[', '_').replace(']', '_').replace('/', '_') .replace('*', '_'); } + /** Retrieves the parent path of the provided path */ public static String parentPath(String path) { if (path.equals("/")) throw new ArgeoException("Root path '/' has no parent path"); @@ -59,7 +69,13 @@ public class JcrUtils { return pathT.substring(0, index); } + /** The provided data as a path ('/' at the end, not the beginning) */ public static String dateAsPath(Calendar cal) { + return dateAsPath(cal, false); + } + + /** The provided data as a path ('/' at the end, not the beginning) */ + public static String dateAsPath(Calendar cal, Boolean addHour) { StringBuffer buf = new StringBuffer(14); buf.append('Y').append(cal.get(Calendar.YEAR));// 5 buf.append('/');// 1 @@ -74,6 +90,13 @@ public class JcrUtils { buf.append(0); buf.append('D').append(day);// 3 buf.append('/');// 1 + if (addHour) { + int hour = cal.get(Calendar.HOUR_OF_DAY); + if (hour < 10) + buf.append(0); + buf.append('H').append(hour);// 3 + buf.append('/');// 1 + } return buf.toString(); } @@ -94,10 +117,12 @@ public class JcrUtils { return path.substring(index + 1); } + /** Creates the nodes making path, if they don't exist. */ public static Node mkdirs(Session session, String path) { return mkdirs(session, path, null, false); } + /** Creates the nodes making path, if they don't exist. */ public static Node mkdirs(Session session, String path, String type, Boolean versioning) { try { @@ -164,37 +189,42 @@ public class JcrUtils { } /** 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(ArgeoJcrConstants.JCR_SYSTEM)) { - return; - } + public static void debug(Node node) { + try { + // First output the node path + log.debug(node.getPath()); + // Skip the virtual (and large!) jcr:system subtree + if (node.getName().equals(ArgeoJcrConstants.JCR_SYSTEM)) { + return; + } - // Then the children nodes (recursive) - NodeIterator it = node.getNodes(); - while (it.hasNext()) { - Node childNode = it.nextNode(); - debug(childNode); - } + // Then the children nodes (recursive) + NodeIterator it = node.getNodes(); + while (it.hasNext()) { + Node childNode = it.nextNode(); + debug(childNode); + } - // Then output the properties - PropertyIterator properties = node.getProperties(); - // log.debug("Property are : "); - - 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()); + // Then output the properties + PropertyIterator properties = node.getProperties(); + // log.debug("Property are : "); + + 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()); } - } else { - // A single-valued property - log.debug(property.getPath() + "=" + property.getString()); } + } catch (Exception e) { + log.error("Could not debug " + node, e); } } diff --git a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java index 9996b7bd1..f26a255ab 100644 --- a/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java +++ b/server/runtime/org.argeo.server.jcr/src/main/java/org/argeo/jcr/ThreadBoundJcrSessionFactory.java @@ -10,6 +10,7 @@ import java.util.List; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; +import javax.jcr.SimpleCredentials; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -62,7 +63,9 @@ public class ThreadBoundJcrSessionFactory implements FactoryBean, protected Session login() { try { - Session sess = repository.login(); + SimpleCredentials sc = new SimpleCredentials("demo", "demo" + .toCharArray()); + Session sess = repository.login(sc); if (log.isTraceEnabled()) log.trace("Log in to JCR session " + sess + "; userId=" + sess.getUserID());