From: Mathieu Baudier Date: Mon, 19 Apr 2010 10:13:24 +0000 (+0000) Subject: Improve JCR X-Git-Tag: argeo-commons-2.1.30~1631 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=a7c020ac67bc460cf65cf1fd18bc267f795f6c50;p=lgpl%2Fargeo-commons.git Improve JCR git-svn-id: https://svn.argeo.org/commons/trunk@3478 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/BeanNodeMapper.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/BeanNodeMapper.java index 6f282bac7..a526bcf5e 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/BeanNodeMapper.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/BeanNodeMapper.java @@ -22,14 +22,12 @@ import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.ValueFactory; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; public class BeanNodeMapper implements NodeMapper { - private final static Log log = LogFactory.getLog(BeanNodeMapper.class); + // private final static Log log = LogFactory.getLog(BeanNodeMapper.class); private final static String NODE_VALUE = "value"; @@ -99,7 +97,6 @@ public class BeanNodeMapper implements NodeMapper { */ public Node save(Session session, String path, Object obj) { try { - BeanWrapper beanWrapper = createBeanWrapper(obj); final Node node; String parentPath = JcrUtils.parentPath(path); // find or create parent node @@ -120,7 +117,6 @@ public class BeanNodeMapper implements NodeMapper { // Check specific cases if (nodeMapperProvider != null) { - NodeMapper nodeMapper = nodeMapperProvider.findNodeMapper(node); if (nodeMapper != this) { nodeMapper.update(node, obj); @@ -158,124 +154,128 @@ public class BeanNodeMapper implements NodeMapper { */ protected Object nodeToBean(Node node) throws RepositoryException { - String clssName = node.getProperty(classProperty).getValue() - .getString(); - - BeanWrapper beanWrapper = createBeanWrapper(loadClass(clssName)); - - // process properties - PropertyIterator propIt = node.getProperties(); - props: while (propIt.hasNext()) { - Property prop = propIt.nextProperty(); - if (!beanWrapper.isWritableProperty(prop.getName())) - continue props; - - PropertyDescriptor pd = beanWrapper.getPropertyDescriptor(prop - .getName()); - Class propClass = pd.getPropertyType(); - - // Process case of List and its derived classes - // primitive list - if (propClass != null && List.class.isAssignableFrom(propClass)) { - List lst = new ArrayList(); - Class valuesClass = classFromProperty(prop); - if (valuesClass != null) - for (Value value : prop.getValues()) { - lst.add(asObject(value, valuesClass)); - } - continue props; + try { + String clssName = node.getProperty(classProperty).getValue() + .getString(); + + BeanWrapper beanWrapper = createBeanWrapper(loadClass(clssName)); + + // process properties + PropertyIterator propIt = node.getProperties(); + props: while (propIt.hasNext()) { + Property prop = propIt.nextProperty(); + if (!beanWrapper.isWritableProperty(prop.getName())) + continue props; + + PropertyDescriptor pd = beanWrapper.getPropertyDescriptor(prop + .getName()); + Class propClass = pd.getPropertyType(); + + // Process case of List and its derived classes + // primitive list + if (propClass != null && List.class.isAssignableFrom(propClass)) { + List lst = new ArrayList(); + Class valuesClass = classFromProperty(prop); + if (valuesClass != null) + for (Value value : prop.getValues()) { + lst.add(asObject(value, valuesClass)); + } + continue props; + } + + // Case of other type of property accepted by jcr + // Long, Double, String, Binary, Date, Boolean, Name + Object value = asObject(prop.getValue(), pd.getPropertyType()); + if (value != null) + beanWrapper.setPropertyValue(prop.getName(), value); } - // Case of other type of property accepted by jcr - // Long, Double, String, Binary, Date, Boolean, Name - Object value = asObject(prop.getValue(), pd.getPropertyType()); - if (value != null) - beanWrapper.setPropertyValue(prop.getName(), value); - } + // process children nodes + NodeIterator nodeIt = node.getNodes(); + nodes: while (nodeIt.hasNext()) { + Node childNode = nodeIt.nextNode(); + String name = childNode.getName(); + if (!beanWrapper.isWritableProperty(name)) + continue nodes; + + PropertyDescriptor pd = beanWrapper.getPropertyDescriptor(name); + Class propClass = pd.getPropertyType(); + + // objects list + if (propClass != null && List.class.isAssignableFrom(propClass)) { + String lstClass = childNode.getProperty(classProperty) + .getString(); + List lst; + try { + lst = (List) loadClass(lstClass).newInstance(); + } catch (Exception e) { + lst = new ArrayList(); + } - // process children nodes - NodeIterator nodeIt = node.getNodes(); - nodes: while (nodeIt.hasNext()) { - Node childNode = nodeIt.nextNode(); - String name = childNode.getName(); - if (!beanWrapper.isWritableProperty(name)) - continue nodes; - - PropertyDescriptor pd = beanWrapper.getPropertyDescriptor(name); - Class propClass = pd.getPropertyType(); - - // objects list - if (propClass != null && List.class.isAssignableFrom(propClass)) { - String lstClass = childNode.getProperty(classProperty) - .getString(); - List lst; - try { - lst = (List) loadClass(lstClass).newInstance(); - } catch (Exception e) { - lst = new ArrayList(); - } + NodeIterator valuesIt = childNode.getNodes(); + while (valuesIt.hasNext()) { + Node lstValueNode = valuesIt.nextNode(); + Object lstValue = nodeToBean(lstValueNode); + lst.add(lstValue); + } - NodeIterator valuesIt = childNode.getNodes(); - while (valuesIt.hasNext()) { - Node lstValueNode = valuesIt.nextNode(); - Object lstValue = nodeToBean(lstValueNode); - lst.add(lstValue); + beanWrapper.setPropertyValue(name, lst); + continue nodes; } - beanWrapper.setPropertyValue(name, lst); - continue nodes; - } - - // objects map - if (propClass != null && Map.class.isAssignableFrom(propClass)) { - String mapClass = childNode.getProperty(classProperty) - .getString(); - Map map; - try { - map = (Map) loadClass(mapClass) - .newInstance(); - } catch (Exception e) { - map = new HashMap(); - } + // objects map + if (propClass != null && Map.class.isAssignableFrom(propClass)) { + String mapClass = childNode.getProperty(classProperty) + .getString(); + Map map; + try { + map = (Map) loadClass(mapClass) + .newInstance(); + } catch (Exception e) { + map = new HashMap(); + } - // properties - PropertyIterator keysPropIt = childNode.getProperties(); - keyProps: while (keysPropIt.hasNext()) { - Property keyProp = keysPropIt.nextProperty(); - // FIXME: use property editor - String key = keyProp.getName(); - if (classProperty.equals(key)) - continue keyProps; - - Class keyPropClass = classFromProperty(keyProp); - if (keyPropClass != null) { - Object mapValue = asObject(keyProp.getValue(), - keyPropClass); - map.put(key, mapValue); + // properties + PropertyIterator keysPropIt = childNode.getProperties(); + keyProps: while (keysPropIt.hasNext()) { + Property keyProp = keysPropIt.nextProperty(); + // FIXME: use property editor + String key = keyProp.getName(); + if (classProperty.equals(key)) + continue keyProps; + + Class keyPropClass = classFromProperty(keyProp); + if (keyPropClass != null) { + Object mapValue = asObject(keyProp.getValue(), + keyPropClass); + map.put(key, mapValue); + } } - } - // node - NodeIterator keysIt = childNode.getNodes(); - while (keysIt.hasNext()) { - Node mapValueNode = keysIt.nextNode(); - // FIXME: use property editor - Object key = mapValueNode.getName(); + // node + NodeIterator keysIt = childNode.getNodes(); + while (keysIt.hasNext()) { + Node mapValueNode = keysIt.nextNode(); + // FIXME: use property editor + Object key = mapValueNode.getName(); - Object mapValue = nodeToBean(mapValueNode); + Object mapValue = nodeToBean(mapValueNode); - map.put(key, mapValue); + map.put(key, mapValue); + } + beanWrapper.setPropertyValue(name, map); + continue nodes; } - beanWrapper.setPropertyValue(name, map); - continue nodes; - } - // default - Object value = nodeToBean(childNode); - beanWrapper.setPropertyValue(name, value); + // default + Object value = nodeToBean(childNode); + beanWrapper.setPropertyValue(name, value); + } + return beanWrapper.getWrappedInstance(); + } catch (Exception e) { + throw new ArgeoException("Cannot map node " + node, e); } - return beanWrapper.getWrappedInstance(); } /** diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java index 8792a36de..bf199ffda 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/jcr/JcrUtils.java @@ -38,10 +38,10 @@ public class JcrUtils { throw new ArgeoException("Query returned more than one node."); return node; } - - public static String removeForbiddenCharacters(String str){ - return str.replace('[', '_').replace(']', '_') - .replace('/', '_').replace('*', '_'); + + public static String removeForbiddenCharacters(String str) { + return str.replace('[', '_').replace(']', '_').replace('/', '_') + .replace('*', '_'); } @@ -146,8 +146,8 @@ public class JcrUtils { // Then output the properties PropertyIterator properties = node.getProperties(); - //log.debug("Property are : "); - + // log.debug("Property are : "); + while (properties.hasNext()) { Property property = properties.nextProperty(); if (property.getDefinition().isMultiple()) { diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java index 21209b511..f6ae9357e 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/java/org/argeo/server/jackrabbit/JackrabbitContainer.java @@ -12,6 +12,8 @@ import javax.jcr.Session; 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.RepositoryImpl; import org.apache.jackrabbit.core.TransientRepository; import org.apache.jackrabbit.core.config.RepositoryConfig; @@ -21,6 +23,8 @@ import org.springframework.core.io.Resource; public class JackrabbitContainer implements InitializingBean, DisposableBean, Repository { + private Log log = LogFactory.getLog(JackrabbitContainer.class); + private Resource configuration; private File homeDirectory; @@ -29,6 +33,11 @@ public class JackrabbitContainer implements InitializingBean, DisposableBean, private Repository repository; public void afterPropertiesSet() throws Exception { + if (inMemory && homeDirectory.exists()) { + FileUtils.deleteDirectory(homeDirectory); + log.warn("Deleted Jackrabbit home directory " + homeDirectory); + } + RepositoryConfig config; InputStream in = configuration.getInputStream(); try { @@ -44,6 +53,9 @@ public class JackrabbitContainer implements InitializingBean, DisposableBean, repository = new TransientRepository(config); else repository = RepositoryImpl.create(config); + + log.info("Initialized Jackrabbit repository " + repository + " in " + + homeDirectory + " with config " + configuration); } public void destroy() throws Exception { @@ -55,8 +67,14 @@ public class JackrabbitContainer implements InitializingBean, DisposableBean, } if (inMemory) - if (homeDirectory.exists()) + if (homeDirectory.exists()) { FileUtils.deleteDirectory(homeDirectory); + if (log.isDebugEnabled()) + log.debug("Deleted Jackrabbit home directory " + + homeDirectory); + } + log.info("Destroyed Jackrabbit repository " + repository + " in " + + homeDirectory + " with config " + configuration); } // JCR REPOSITORY (delegated) @@ -97,4 +115,8 @@ public class JackrabbitContainer implements InitializingBean, DisposableBean, this.configuration = configuration; } + public void setInMemory(Boolean inMemory) { + this.inMemory = inMemory; + } + } diff --git a/server/runtime/org.argeo.server.jackrabbit/src/main/resources/org/argeo/server/jackrabbit/repository-inMemory.xml b/server/runtime/org.argeo.server.jackrabbit/src/main/resources/org/argeo/server/jackrabbit/repository-inMemory.xml index f05192337..d980f8bd1 100644 --- a/server/runtime/org.argeo.server.jackrabbit/src/main/resources/org/argeo/server/jackrabbit/repository-inMemory.xml +++ b/server/runtime/org.argeo.server.jackrabbit/src/main/resources/org/argeo/server/jackrabbit/repository-inMemory.xml @@ -1,139 +1,152 @@ - + 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. + --> - + - - - - + + + + - - - - - - - - + + + + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - + + + + + - - - - - - + + + + + + + + - - - - - - + + + + + +