exo-jcr SVN: r206 - jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-04 15:39:27 -0400 (Sun, 04 Oct 2009)
New Revision: 206
Modified:
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIteratorImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIteratorImpl.java
Log:
EXOJCR-161 : Improved support of TwoWayIterator.
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIteratorImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIteratorImpl.java 2009-10-04 19:38:09 UTC (rev 205)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIteratorImpl.java 2009-10-04 19:39:27 UTC (rev 206)
@@ -189,7 +189,7 @@
{
throw new IllegalArgumentException("skipNum must not be negative");
}
- scoreNodes.skipBack(skipNum - 1);
+ scoreNodes.skipBack(skipNum + 1);
fetchNext();
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIteratorImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIteratorImpl.java 2009-10-04 19:38:09 UTC (rev 205)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIteratorImpl.java 2009-10-04 19:39:27 UTC (rev 206)
@@ -16,9 +16,11 @@
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
+import java.util.ListIterator;
import java.util.NoSuchElementException;
import javax.jcr.RangeIterator;
@@ -27,11 +29,22 @@
* <code>ScoreNodeIteratorImpl</code> implements a {@link ScoreNodeIterator}
* over an array of {@link ScoreNode ScoreNode[]}.
*/
-public class ScoreNodeIteratorImpl implements ScoreNodeIterator{
+public class ScoreNodeIteratorImpl implements ScoreNodeIterator
+{
+ //private final ScoreNode[][] scoreNodes;
+
+ private ListIterator<ScoreNode[]> iterator;
+
+
public ScoreNodeIteratorImpl(ScoreNode[][] scoreNodes)
{
- this(Arrays.asList(scoreNodes));
+
+ iterator = Arrays.asList(scoreNodes).listIterator();
+ //this.scoreNodes = scoreNodes;
+ ///this(Arrays.asList(scoreNodes));
+ this.size = scoreNodes.length;
+ //this.position = -1;
}
/**
@@ -47,54 +60,54 @@
*/
//public static final RangeIterator EMPTY = new RangeIteratorAdapter(Collections.EMPTY_LIST);
- /**
- * The adapted iterator instance.
- */
- private final Iterator iterator;
+ // /**
+ // * The adapted iterator instance.
+ // */
+ // private final Iterator iterator;
/**
* Number of elements in the adapted iterator, or -1 if unknown.
*/
- private long size;
+ private int size;
/**
* Current position of the iterator.
*/
- private long position;
+ // private int position;
- /**
- * Creates an adapter for the given iterator of the given size.
- *
- * @param iterator adapted iterator
- * @param size size of the iterator, or -1 if unknown
- */
- public ScoreNodeIteratorImpl(Iterator iterator, long size)
- {
- this.iterator = iterator;
- this.size = size;
- this.position = 0;
- }
+ // /**
+ // * Creates an adapter for the given iterator of the given size.
+ // *
+ // * @param iterator adapted iterator
+ // * @param size size of the iterator, or -1 if unknown
+ // */
+ // public ScoreNodeIteratorImpl(Iterator iterator, long size)
+ // {
+ // this.iterator = iterator;
+ // this.size = size;
+ // this.position = 0;
+ // }
- /**
- * Creates an adapter for the given iterator of unknown size.
- *
- * @param iterator adapted iterator
- */
- public ScoreNodeIteratorImpl(Iterator iterator)
- {
- this(iterator, -1);
- }
+ // /**
+ // * Creates an adapter for the given iterator of unknown size.
+ // *
+ // * @param iterator adapted iterator
+ // */
+ // public ScoreNodeIteratorImpl(Iterator iterator)
+ // {
+ // this(iterator, -1);
+ // }
+ //
+ // /**
+ // * Creates a {@link RangeIterator} for the given collection.
+ // *
+ // * @param collection the collection to iterate
+ // */
+ // public ScoreNodeIteratorImpl(Collection collection)
+ // {
+ // this(collection.iterator(), collection.size());
+ // }
- /**
- * Creates a {@link RangeIterator} for the given collection.
- *
- * @param collection the collection to iterate
- */
- public ScoreNodeIteratorImpl(Collection collection)
- {
- this(collection.iterator(), collection.size());
- }
-
//-------------------------------------------------------< RangeIterator >
/**
@@ -104,7 +117,7 @@
*/
public long getPosition()
{
- return position;
+ return iterator.nextIndex();
}
/**
@@ -130,6 +143,7 @@
{
throw new IllegalArgumentException("skip(" + n + ")");
}
+
for (long i = 0; i < n; i++)
{
next();
@@ -148,18 +162,19 @@
*/
public boolean hasNext()
{
- if (iterator.hasNext())
- {
- return true;
- }
- else
- {
- if (size == -1)
- {
- size = position;
- }
- return false;
- }
+ // if (iterator.hasNext())
+ // {
+ // return true;
+ // }
+ // else
+ // {
+ // if (size == -1)
+ // {
+ // size = position;
+ // }
+ // return false;
+ // }
+ return iterator.hasNext();
}
/**
@@ -172,20 +187,7 @@
*/
public Object next() throws NoSuchElementException
{
- try
- {
- Object next = iterator.next();
- position++;
- return next;
- }
- catch (NoSuchElementException e)
- {
- if (size == -1)
- {
- size = position;
- }
- throw e;
- }
+ return iterator.next();
}
/**
@@ -197,28 +199,23 @@
*/
public void remove() throws UnsupportedOperationException, IllegalStateException
{
- iterator.remove();
- position--;
- if (size != -1)
- {
- size--;
- }
+ iterator.remove();
+ size--;
}
public void skipBack(long skipNum)
{
if (skipNum < 0)
{
- throw new IllegalArgumentException("skipNum must not be negative");
+ throw new IllegalArgumentException("skip(" + skipNum + ")");
}
- if ((position - skipNum) < 0)
+ if ((iterator.nextIndex() - skipNum) < 0)
{
throw new NoSuchElementException();
}
- if (skipNum > 0)
+ for (long i = 0; i < skipNum; i++)
{
- position -= skipNum + 1;
- next();
+ iterator.previous();
}
}
14 years, 7 months
exo-jcr SVN: r205 - jcr/trunk/component/core.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-04 15:38:09 -0400 (Sun, 04 Oct 2009)
New Revision: 205
Modified:
jcr/trunk/component/core/pom.xml
Log:
EXOJCR-161 : Exclude wrong tck test. Remove iterator test from exclude.
Modified: jcr/trunk/component/core/pom.xml
===================================================================
--- jcr/trunk/component/core/pom.xml 2009-10-04 09:58:13 UTC (rev 204)
+++ jcr/trunk/component/core/pom.xml 2009-10-04 19:38:09 UTC (rev 205)
@@ -431,7 +431,6 @@
</includes>
<excludes>
<exclude>**/TestValueConstraints.java</exclude>
- <exclude>**/TestTwoWayRangeIterator.java</exclude>
<exclude>**/TestIndexingConfig.java</exclude>
<exclude>**/TestExcerpt.java</exclude>
@@ -538,6 +537,8 @@
org.apache.jackrabbit.test.api.nodetype.PredefinedNodeTypeTest#testSimpleVersionable
org.apache.jackrabbit.test.api.nodetype.PredefinedNodeTypeTest#testActivity
org.apache.jackrabbit.test.api.nodetype.PredefinedNodeTypeTest#testConfiguration
+ org.apache.jackrabbit.test.api.nodetype.PredefinedNodeTypeTest#testVersionable
+ org.apache.jackrabbit.test.api.nodetype.PredefinedNodeTypeTest#testVersion
org.apache.jackrabbit.test.api.NamespaceRegistryTest#testRegisterNamespace
</value>
</property>
14 years, 7 months
exo-jcr SVN: r204 - jcr/trunk/component/webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/proppatch.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-04 05:58:13 -0400 (Sun, 04 Oct 2009)
New Revision: 204
Modified:
jcr/trunk/component/webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/proppatch/PropPatchResponseEntity.java
Log:
EXOJCR-161 : Update to fit new NodetypeDataManager interface
Modified: jcr/trunk/component/webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/proppatch/PropPatchResponseEntity.java
===================================================================
--- jcr/trunk/component/webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/proppatch/PropPatchResponseEntity.java 2009-10-04 09:57:36 UTC (rev 203)
+++ jcr/trunk/component/webdav/src/main/java/org/exoplatform/services/jcr/webdav/command/proppatch/PropPatchResponseEntity.java 2009-10-04 09:58:13 UTC (rev 204)
@@ -354,7 +354,7 @@
InternalQName propName =
((SessionImpl)node.getSession()).getLocationFactory().parseJCRName(propertyName).getInternalName();
PropertyDefinitionDatas propdefs =
- nodeTypeHolder.findPropertyDefinitions(propName, data.getPrimaryTypeName(), data.getMixinTypeNames());
+ nodeTypeHolder.getPropertyDefinitions(propName, data.getPrimaryTypeName(), data.getMixinTypeNames());
if (propdefs == null)
{
throw new RepositoryException();
14 years, 7 months
exo-jcr SVN: r203 - jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/metadata.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-04 05:57:36 -0400 (Sun, 04 Oct 2009)
New Revision: 203
Modified:
jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/metadata/AddMetadataAction.java
Log:
EXOJCR-161 : Update to fit new NodetypeDataManager interface
Modified: jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/metadata/AddMetadataAction.java
===================================================================
--- jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/metadata/AddMetadataAction.java 2009-10-04 09:38:22 UTC (rev 202)
+++ jcr/trunk/component/ext/src/main/java/org/exoplatform/services/jcr/ext/metadata/AddMetadataAction.java 2009-10-04 09:57:36 UTC (rev 203)
@@ -131,7 +131,7 @@
new InternalQName(qname.getNamespace(), qname.getName()));
PropertyDefinitionDatas pds =
- parent.getSession().getWorkspace().getNodeTypesHolder().findPropertyDefinitions(
+ parent.getSession().getWorkspace().getNodeTypesHolder().getPropertyDefinitions(
jcrName.getInternalName(), ((NodeData)parent.getData()).getPrimaryTypeName(),
((NodeData)parent.getData()).getMixinTypeNames());
if (pds.getDefinition(true) != null)
14 years, 7 months
exo-jcr SVN: r202 - jcr/trunk/component/core/src/test/java/conf/standalone.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-04 05:38:22 -0400 (Sun, 04 Oct 2009)
New Revision: 202
Modified:
jcr/trunk/component/core/src/test/java/conf/standalone/test-jcr-config.xml
Log:
EXOJCR-161 : Configuration update.
Modified: jcr/trunk/component/core/src/test/java/conf/standalone/test-jcr-config.xml
===================================================================
--- jcr/trunk/component/core/src/test/java/conf/standalone/test-jcr-config.xml 2009-10-04 09:37:43 UTC (rev 201)
+++ jcr/trunk/component/core/src/test/java/conf/standalone/test-jcr-config.xml 2009-10-04 09:38:22 UTC (rev 202)
@@ -76,13 +76,7 @@
<query-handler class="org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex">
<properties>
<property name="index-dir" value="target/temp/index/db1/ws" />
- <property name="synonymprovider-class" value="org.exoplatform.services.jcr.impl.core.query.lucene.PropertiesSynonymProvider" />
- <property name="synonymprovider-config-path" value="../../synonyms.properties" />
- <property name="support-highlighting" value="true" />
- <property name="indexing-configuration-path" value="../../indexing-configuration.xml" />
- <property name="query-class" value="org.exoplatform.services.jcr.impl.core.query.QueryImpl" />
- <property name="spellchecker-class" value="org.exoplatform.services.jcr.impl.core.query.lucene.spell.LuceneSpellChecker$FiveSecondsRefreshInterval" />
- </properties>
+ </properties>
</query-handler>
<lock-manager>
<time-out>15m</time-out>
14 years, 7 months
exo-jcr SVN: r201 - jcr/trunk/component/core.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-04 05:37:43 -0400 (Sun, 04 Oct 2009)
New Revision: 201
Modified:
jcr/trunk/component/core/pom.xml
Log:
EXOJCR-161 : Remove test from excludes
Modified: jcr/trunk/component/core/pom.xml
===================================================================
--- jcr/trunk/component/core/pom.xml 2009-10-04 09:36:54 UTC (rev 200)
+++ jcr/trunk/component/core/pom.xml 2009-10-04 09:37:43 UTC (rev 201)
@@ -430,29 +430,11 @@
<include>**/impl/**/Test*.java</include>
</includes>
<excludes>
- <exclude>**/ExcerptTest.java</exclude>
- <exclude>**/TestSearchManagerIndexing.java</exclude>
- <exclude>**/TestIndexRules.java</exclude>
- <exclude>**/TestNodeIndexer.java</exclude>
- <exclude>**/IndexingAggregateTest.java</exclude>
+ <exclude>**/TestValueConstraints.java</exclude>
+ <exclude>**/TestTwoWayRangeIterator.java</exclude>
<exclude>**/TestIndexingConfig.java</exclude>
- <exclude>**/TestNodeTypeRegistration.java</exclude>
- <exclude>**/TestExcerpt.java</exclude>
- <exclude>**/TestNodeTypeManager.java</exclude>
- <exclude>**/TestSuperTypeChanges.java</exclude>
- <exclude>**/TestTwoWayRangeIterator.java</exclude>
- <exclude>**/TestNamespaceRegistry.java</exclude>
- <exclude>**/TestAggregateRules.java</exclude>
- <exclude>**/IndexingAggregateTest.java</exclude>
- <exclude>**/IndexingRuleTest.java</exclude>
- <exclude>**/TestExcelFileSearch.java</exclude>
- <exclude>**/TestRewriteNode.java</exclude>
- <exclude>**/TestArabicSearch.java</exclude>
- <exclude>**/TestDateSearch.java</exclude>
- <exclude>**/TestBinarySearch.java</exclude>
+ <exclude>**/TestExcerpt.java</exclude>
-
-
<exclude>**/TestImport.java</exclude>
<exclude>**/TestRollbackBigFiles.java</exclude>
<exclude>**/TestErrorMultithreading.java</exclude>
14 years, 7 months
exo-jcr SVN: r200 - in jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr: api/core/query and 5 other directories.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-04 05:36:54 -0400 (Sun, 04 Oct 2009)
New Revision: 200
Added:
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeTest.java
Removed:
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestAggregateRules.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestSearchManagerIndexing.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestSystemSearchManager.java
Modified:
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/ExoRepositoryStub.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/core/query/RangeIteratorAdapter.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/namespaces/TestNamespaceRegistry.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestAutoCreatedProperty.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestDiscoveringNodeTypeDefinition.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeTypeConstraints.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeTypeManager.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestValueConstraints.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/search/TestBinarySearch.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestItemDefinitionsHolder.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestNodeTypeRegistration.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestNtAutorcreating.java
jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestSuperTypeChanges.java
Log:
EXOJCR-161 :Test change. Node type and namespaces changes to fit new query interfaces
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/ExoRepositoryStub.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/ExoRepositoryStub.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/ExoRepositoryStub.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -180,12 +180,12 @@
InternalQName testVersioable = session.getLocationFactory().parseJCRName("test:versionable").getInternalName();
NodeTypeDataManager ntHolder = session.getWorkspace().getNodeTypesHolder();
- if (ntHolder.findNodeType(testVersioable) == null)
+ if (ntHolder.getNodeType(testVersioable) == null)
{
InputStream xml = getResource("test-nodetypes.xml");
try
{
- ntHolder.registerNodeTypes(xml, ExtendedNodeTypeManager.FAIL_IF_EXISTS);
+ ntHolder.registerNodeTypes(xml, ExtendedNodeTypeManager.FAIL_IF_EXISTS, NodeTypeDataManager.TEXT_XML);
}
finally
{
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/core/query/RangeIteratorAdapter.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/core/query/RangeIteratorAdapter.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/core/query/RangeIteratorAdapter.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -16,6 +16,8 @@
*/
package org.exoplatform.services.jcr.api.core.query;
+import org.exoplatform.services.jcr.impl.core.query.lucene.TwoWayRangeIterator;
+
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
@@ -28,7 +30,7 @@
* This helper class is used by the adapter classes in this package to
* implement the JCR iterator interfaces on top of normal Java iterators.
*/
-public class RangeIteratorAdapter implements RangeIterator {
+public class RangeIteratorAdapter implements TwoWayRangeIterator {
/**
* Static instance of an empty {@link RangeIterator}.
@@ -176,4 +178,22 @@
}
}
+ public void skipBack(long skipNum)
+ {
+ if (skipNum < 0)
+ {
+ throw new IllegalArgumentException("skipNum must not be negative");
+ }
+ if ((position - skipNum) < 0)
+ {
+ throw new NoSuchElementException();
+ }
+ if (skipNum > 0)
+ {
+ position -= skipNum + 1;
+ next();
+ }
+
+ }
+
}
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/namespaces/TestNamespaceRegistry.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/namespaces/TestNamespaceRegistry.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/namespaces/TestNamespaceRegistry.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -21,9 +21,10 @@
import org.apache.commons.lang.ArrayUtils;
import org.apache.lucene.search.BooleanQuery;
import org.exoplatform.services.jcr.JcrAPIBaseTest;
+import org.exoplatform.services.jcr.core.WorkspaceContainerFacade;
import org.exoplatform.services.jcr.impl.core.ExtendedNamespaceRegistry;
-import org.exoplatform.services.jcr.impl.core.NamespaceRegistryImpl;
import org.exoplatform.services.jcr.impl.core.NodeImpl;
+import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder;
import java.util.Set;
@@ -43,6 +44,7 @@
{
protected ExtendedNamespaceRegistry namespaceRegistry;
+ private RepositoryIndexSearcherHolder indexSearcherHolder;
public void initRepository() throws RepositoryException
{
@@ -59,6 +61,19 @@
}
}
+ @Override
+ public void setUp() throws Exception
+ {
+ // TODO Auto-generated method stub
+ super.setUp();
+ WorkspaceContainerFacade wsc = repository.getWorkspaceContainer(session.getWorkspace().getName());
+
+ indexSearcherHolder = (RepositoryIndexSearcherHolder)wsc.getComponent(RepositoryIndexSearcherHolder.class);
+
+ //indexSearcherHolder = (RepositoryIndexSearcherHolder)container.getComponentInstanceOfType(RepositoryIndexSearcherHolder.class);
+
+ }
+
public void testGetPrefixes() throws RepositoryException
{
// namespaceRegistry.registerNamespace("newMapping", "http://dumb.uri/jcr");
@@ -255,7 +270,7 @@
test3.setProperty("blahtesturi", "v2");
session.save();
- Set<String> nodes = ((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri");
+ Set<String> nodes = indexSearcherHolder.getNodesByUri("http://testquery.uri/www"); //((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri");
assertEquals(1, nodes.size());
assertFalse(nodes.contains(((NodeImpl)test1).getData().getIdentifier()));
assertFalse(nodes.contains(((NodeImpl)test3).getData().getIdentifier()));
@@ -269,7 +284,7 @@
Node test3 = root.addNode("blahtesturiNodeName1");
session.save();
- Set<String> nodes = ((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri");
+ Set<String> nodes = indexSearcherHolder.getNodesByUri("http://testquery.uri/www"); //((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri");
assertEquals(1, nodes.size());
assertTrue(nodes.contains(((NodeImpl)test1).getData().getIdentifier()));
assertFalse(nodes.contains(((NodeImpl)test2).getData().getIdentifier()));
@@ -285,7 +300,7 @@
test2.setProperty("prop", "v2");
session.save();
- Set<String> nodes = ((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri");
+ Set<String> nodes = indexSearcherHolder.getNodesByUri("http://testquery.uri/www"); //((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri");
assertEquals(1, nodes.size());
assertTrue(nodes.contains(((NodeImpl)test1).getData().getIdentifier()));
assertFalse(nodes.contains(((NodeImpl)test2).getData().getIdentifier()));
@@ -301,8 +316,8 @@
Node test3 = root.addNode("nodeName2");
test3.setProperty("prop", "blablatesturi:v2");
session.save();
-
- Set<String> nodes = ((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri");
+
+ Set<String> nodes = indexSearcherHolder.getNodesByUri("http://testquery.uri/www"); //((NamespaceRegistryImpl)namespaceRegistry).getNodes("testuri");
assertEquals(1, nodes.size());
assertTrue(nodes.contains(((NodeImpl)test1).getData().getIdentifier()));
assertFalse(nodes.contains(((NodeImpl)test2).getData().getIdentifier()));
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestAutoCreatedProperty.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestAutoCreatedProperty.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestAutoCreatedProperty.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -19,6 +19,7 @@
package org.exoplatform.services.jcr.api.nodetypes;
import org.exoplatform.services.jcr.JcrImplBaseTest;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
import java.io.ByteArrayInputStream;
@@ -35,8 +36,9 @@
import javax.jcr.version.VersionException;
/**
- * Created by The eXo Platform SAS Author : Alex Reshetnyak alex.reshetnyak(a)exoplatform.com.ua
- * reshetnyak.alex(a)gmail.com 13.03.2007 18:00:03
+ * Created by The eXo Platform SAS Author : Alex Reshetnyak
+ * alex.reshetnyak(a)exoplatform.com.ua reshetnyak.alex(a)gmail.com 13.03.2007
+ * 18:00:03
*
* @version $Id: TestAutoCreatedProperty.java 13.03.2007 18:00:03 rainfox
*/
@@ -52,7 +54,7 @@
byte[] xmlData = readXmlContent("/org/exoplatform/services/jcr/api/nodetypes/nodetypes-api-test.xml");
ByteArrayInputStream xmlInput = new ByteArrayInputStream(xmlData);
ntManager = (NodeTypeManagerImpl)session.getWorkspace().getNodeTypeManager();
- ntManager.registerNodeTypes(xmlInput, 0);
+ ntManager.registerNodeTypes(xmlInput, 0, NodeTypeDataManager.TEXT_XML);
assertNotNull(ntManager.getNodeType("exo:autoCreate"));
assertNotNull(ntManager.getNodeType("exo:refRoot"));
assertNotNull(ntManager.getNodeType("exo:autoCreate2"));
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestDiscoveringNodeTypeDefinition.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestDiscoveringNodeTypeDefinition.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestDiscoveringNodeTypeDefinition.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -28,13 +28,17 @@
* Created by The eXo Platform SAS.
*
* @author <a href="mailto:geaz@users.sourceforge.net">Gennady Azarenkov</a>
- * @version $Id: TestDiscoveringNodeTypeDefinition.java 11907 2008-03-13 15:36:21Z ksm $
+ * @version $Id: TestDiscoveringNodeTypeDefinition.java 11907 2008-03-13
+ * 15:36:21Z ksm $
*/
public class TestDiscoveringNodeTypeDefinition extends JcrAPIBaseTest
{
- public void testPrimaryNodeTypeDefinitionProperties() throws Exception
+ /*
+ * removed as hard to support test
+ */
+ public void _testPrimaryNodeTypeDefinitionProperties() throws Exception
{
Node node = root.addNode("node1", "nt:resource");
NodeType type = node.getPrimaryNodeType();
@@ -54,7 +58,7 @@
public void testMixinNodeTypeDefinitionProperties() throws Exception
{
- Node node = root.addNode("node1", "nt:base");
+ Node node = root.addNode("node1");
node.addMixin("mix:referenceable");
assertEquals(1, node.getMixinNodeTypes().length);
NodeType type = node.getMixinNodeTypes()[0];
@@ -98,7 +102,8 @@
node = root.addNode("node3", "nt:folder");
type = node.getPrimaryNodeType();
// Residual,
- // 6.7.22.8 nt:folder, ChildNodeDefinition, Name * RequiredPrimaryType[nt:hierarchyNode]
+ // 6.7.22.8 nt:folder, ChildNodeDefinition, Name *
+ // RequiredPrimaryType[nt:hierarchyNode]
assertTrue(type.canAddChildNode("jcr:content", "nt:hierarchyNode"));
assertFalse(type.canAddChildNode("jcr:othernode"));
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeTypeConstraints.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeTypeConstraints.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeTypeConstraints.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -36,7 +36,7 @@
public void testRemoveProtectedProperty() throws Exception
{
- Node node1 = root.addNode("test", "nt:base");
+ Node node1 = root.addNode("test");
// log.debug(">>> node "+node1.getPrimaryNodeType().canRemoveItem("jct:primaryType"));
try
{
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeTypeManager.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeTypeManager.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestNodeTypeManager.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -18,29 +18,11 @@
*/
package org.exoplatform.services.jcr.api.nodetypes;
-import org.apache.lucene.search.MatchAllDocsQuery;
import org.exoplatform.services.jcr.JcrAPIBaseTest;
-import org.exoplatform.services.jcr.datamodel.InternalQName;
-import org.exoplatform.services.jcr.impl.Constants;
-import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeDataManagerImpl;
-import org.exoplatform.services.jcr.impl.core.query.QueryHandler;
-import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
-import org.exoplatform.services.jcr.impl.core.query.lucene.QueryHits;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.jcr.ItemExistsException;
-import javax.jcr.Node;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.RepositoryException;
-import javax.jcr.lock.LockException;
-import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.nodetype.NodeType;
import javax.jcr.nodetype.NodeTypeManager;
-import javax.jcr.version.VersionException;
/**
* Created by The eXo Platform SAS.
@@ -55,8 +37,8 @@
public void testGetNodeType() throws Exception
{
- NodeTypeManager ntManager = session.getWorkspace().getNodeTypeManager();
- NodeType type = ntManager.getNodeType("nt:unstructured");
+ final NodeTypeManager ntManager = this.session.getWorkspace().getNodeTypeManager();
+ final NodeType type = ntManager.getNodeType("nt:unstructured");
assertEquals("nt:unstructured", type.getName());
try
@@ -64,7 +46,7 @@
ntManager.getNodeType("nt:not-found");
fail("exception should have been thrown");
}
- catch (NoSuchNodeTypeException e)
+ catch (final NoSuchNodeTypeException e)
{
}
@@ -72,73 +54,21 @@
public void testGetNodeTypes() throws Exception
{
- NodeTypeManager ntManager = session.getWorkspace().getNodeTypeManager();
+ final NodeTypeManager ntManager = this.session.getWorkspace().getNodeTypeManager();
assertTrue(ntManager.getAllNodeTypes().getSize() > 0);
assertTrue(ntManager.getPrimaryNodeTypes().getSize() > 0);
assertTrue(ntManager.getMixinNodeTypes().getSize() > 0);
- //assertEquals("nt",ntManager.getPrimaryNodeTypes().nextNodeType().getName()
- // .substring(0,2));
- //assertEquals("mix",ntManager.getMixinNodeTypes().nextNodeType().getName().
- // substring(0,3));
}
- // public void testNodeTypesOrder() throws Exception {
- // NodeTypeManager ntManager = session.getWorkspace().getNodeTypeManager();
- // NodeTypeIterator nts = ntManager.getPrimaryNodeTypes();
- // assertTrue(nts.getSize() > 0);
- // assertEquals("nt:base", nts.nextNodeType().getName());
- // // Prerequisites : the second entry in nodetypes.xml should be
- // // "nt:unstructured" !!!!!
- // assertEquals("nt:unstructured", nts.nextNodeType().getName());
- // }
-
- public void testNtQuery() throws Exception{
-// {
-// NodeTypeDataManagerImpl ntManager = (NodeTypeDataManagerImpl)session.getWorkspace().getNodeTypesHolder();
-// QueryHandler qh = ntManager.getQueryHandlers().iterator().next();
-// QueryHits hits = qh.executeQuery(new MatchAllDocsQuery(), true, new InternalQName[0], new boolean[0]);
-// List<String> uuidList = new ArrayList<String>(hits.length());
-// for (int i = 0; i < hits.length(); i++)
-// {
-// uuidList.add(hits.getFieldContent(i, FieldNames.UUID));
-// }
-// assertTrue(uuidList.size() > 0);
- }
-
- public void testNtQueryNtBase() throws Exception
- {
- NodeTypeDataManagerImpl ntManager = (NodeTypeDataManagerImpl)session.getWorkspace().getNodeTypesHolder();
-
- assertTrue(ntManager.getNodes(Constants.MIX_VERSIONABLE).size() == 0);
- Node t = root.addNode("tt");
- t.addMixin("mix:versionable");
- session.save();
- assertTrue(ntManager.getNodes(Constants.MIX_VERSIONABLE).size() != 0);
- }
-
- public void testNtQueryFindNodeByProperty() throws ItemExistsException, PathNotFoundException, VersionException,
- ConstraintViolationException, LockException, RepositoryException, IOException
- {
- NodeTypeDataManagerImpl ntManager = (NodeTypeDataManagerImpl)session.getWorkspace().getNodeTypesHolder();
- int refNodes = ntManager.getNodes(Constants.MIX_REFERENCEABLE).size();
- Node testNode1 = root.addNode("test1");
- testNode1.addMixin("mix:referenceable");
- testNode1.setProperty("p1", 1);
- Node testNode2 = root.addNode("test2");
- testNode2.addMixin("mix:referenceable");
- testNode2.setProperty("p2", 2);
-
- session.save();
- assertEquals(2, ntManager.getNodes(Constants.MIX_REFERENCEABLE).size() - refNodes);
- assertEquals(1, ntManager.getNodes(Constants.MIX_REFERENCEABLE, new InternalQName[]{new InternalQName("", "p1")},
- new InternalQName[0]).size());
- assertEquals(1, ntManager.getNodes(Constants.MIX_REFERENCEABLE, new InternalQName[]{new InternalQName("", "p2")},
-
- new InternalQName[0]).size());
-
- assertEquals(0, ntManager.getNodes(Constants.MIX_REFERENCEABLE, new InternalQName[0],
- new InternalQName[]{new InternalQName("", "p1"), new InternalQName("", "p2")}).size()
- - refNodes);
-
- }
+ // public void testNtQueryNtBase() throws Exception
+ // {
+ // final NodeTypeDataManagerImpl ntManager =
+ // (NodeTypeDataManagerImpl)this.session.getWorkspace().getNodeTypesHolder();
+ //
+ // assertTrue(ntManager.getNodeSearcher().getNodesByNodeType(Constants.MIX_VERSIONABLE).size() == 0);
+ // final Node t = this.root.addNode("tt");
+ // t.addMixin("mix:versionable");
+ // this.session.save();
+ // assertTrue(ntManager.getNodeSearcher().getNodesByNodeType(Constants.MIX_VERSIONABLE).size() != 0);
+ // }
}
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestValueConstraints.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestValueConstraints.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/nodetypes/TestValueConstraints.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -19,6 +19,7 @@
package org.exoplatform.services.jcr.api.nodetypes;
import org.exoplatform.services.jcr.JcrAPIBaseTest;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
import java.io.ByteArrayInputStream;
@@ -30,6 +31,7 @@
import javax.jcr.Property;
import javax.jcr.PropertyType;
import javax.jcr.Value;
+import javax.jcr.nodetype.ConstraintViolationException;
/**
* Created by The eXo Platform SAS.
@@ -44,8 +46,6 @@
private Node refNodeNtUnstructured = null;
- private Node refNodeNtBase = null;
-
private String nodeTypeName = "jcr:testValueConstraints";
private static String LOCAL_BIG_FILE = null;
@@ -65,7 +65,7 @@
byte[] xmlData = readXmlContent("/org/exoplatform/services/jcr/api/nodetypes/nodetypes-api-test.xml");
ByteArrayInputStream xmlInput = new ByteArrayInputStream(xmlData);
ntManager = (NodeTypeManagerImpl)session.getWorkspace().getNodeTypeManager();
- ntManager.registerNodeTypes(xmlInput, 0);
+ ntManager.registerNodeTypes(xmlInput, 0, NodeTypeDataManager.TEXT_XML);
assertNotNull(ntManager.getNodeType(nodeTypeName));
Node ntRoot = (Node)repository.getSystemSession().getItem(NodeTypeManagerImpl.NODETYPES_ROOT);
assertTrue(ntRoot.hasNode(nodeTypeName));
@@ -73,8 +73,6 @@
testValueConstraintsNode.addMixin("mix:referenceable");
refNodeNtUnstructured = root.addNode("testref", "nt:unstructured");
refNodeNtUnstructured.addMixin("mix:referenceable");
- refNodeNtBase = root.addNode("testref", "nt:base");
- refNodeNtBase.addMixin("mix:referenceable");
session.save();
}
@@ -82,11 +80,11 @@
{
Property testProperty = testValueConstraintsNode.setProperty("jcr:testSTRING1", "abc");
- root.save();
+ session.save();
try
{
testProperty.setValue("abcd");
- root.save();
+ session.save();
fail("setValue(STRING value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -103,7 +101,7 @@
testProperty.setValue("");
testProperty.setValue("1234");
testProperty.setValue("true");
- root.save();
+ session.save();
}
public void testPATHProperty() throws Exception
@@ -113,11 +111,11 @@
testValueConstraintsNode.setProperty("jcr:testPATH", valueFactory.createValue("/abc", PropertyType.PATH));
Value value = valueFactory.createValue("../exojcrtest:def/ghi", PropertyType.PATH);
testProperty.setValue(value);
- root.save();
+ session.save();
try
{
testProperty.setValue(valueFactory.createValue("/abcd", PropertyType.PATH));
- root.save();
+ session.save();
fail("setValue(PATH value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -127,7 +125,7 @@
try
{
testProperty.setValue(valueFactory.createValue("../abc", PropertyType.PATH));
- root.save();
+ session.save();
fail("setValue(PATH value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -141,11 +139,11 @@
Property testProperty = testValueConstraintsNode.setProperty("jcr:testNAME", valueFactory.createValue("abc:"));
testProperty.setValue(valueFactory.createValue("abc:def"));
- root.save();
+ session.save();
try
{
testProperty.setValue(valueFactory.createValue("/abcd"));
- root.save();
+ session.save();
fail("setValue(NAME value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -155,7 +153,7 @@
try
{
testProperty.setValue(valueFactory.createValue("abc:de"));
- root.save();
+ session.save();
fail("setValue(NAME value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -164,30 +162,13 @@
}
}
- public void testREFERENCEProperty() throws Exception
- {
-
- Property testProperty = testValueConstraintsNode.setProperty("jcr:testREFERENCE", refNodeNtUnstructured);
- root.save();
- try
- {
- testProperty.setValue(refNodeNtBase);
- root.save();
- fail("setValue(REFERENCE value) must throw a ConstraintViolationException ");
- }
- catch (Exception e)
- {
- // success
- }
- }
-
public void testBINARYINCLUSIVEProperty() throws Exception
{
Property testProperty =
testValueConstraintsNode.setProperty("jcr:testBINARYINCLUSIVE", new FileInputStream(LOCAL_SMALL_FILE));
testProperty.setValue(new FileInputStream(LOCAL_BIG_FILE));
- root.save();
+ session.save();
}
public void testBINARYEXCLUSIVEProperty() throws Exception
@@ -198,7 +179,7 @@
Property testProperty =
testValueConstraintsNode.setProperty("jcr:testBINARYEXCLUSIVE", new FileInputStream(LOCAL_SMALL_FILE));
testProperty.setValue(new FileInputStream(LOCAL_BIG_FILE));
- root.save();
+ session.save();
fail("setValue(BINARY value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -210,7 +191,7 @@
{
Property testProperty =
testValueConstraintsNode.setProperty("jcr:testBINARYEXCLUSIVE", new FileInputStream(LOCAL_NORMAL_FILE));
- root.save();
+ session.save();
fail("setValue(BINARY value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -226,7 +207,7 @@
testValueConstraintsNode.setProperty("jcr:testDATEINCLUSIVE", valueFactory.createValue(
"1111-11-11T11:11:11.111Z", PropertyType.DATE));
testProperty.setValue(valueFactory.createValue("1222-11-11T11:11:11.111Z", PropertyType.DATE));
- root.save();
+ session.save();
}
public void testDATEEXCLUSIVEProperty() throws Exception
@@ -238,7 +219,7 @@
testValueConstraintsNode.setProperty("jcr:testDATEEXCLUSIVE", valueFactory.createValue(
"1111-11-11T11:11:11.111Z", PropertyType.DATE));
testProperty.setValue(valueFactory.createValue("1222-11-11T11:11:11.111Z", PropertyType.DATE));
- root.save();
+ session.save();
fail("setValue(DATE value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -251,7 +232,7 @@
Property testProperty =
testValueConstraintsNode.setProperty("jcr:testDATEEXCLUSIVE", valueFactory.createValue(
"1155-11-11T11:11:11.111Z", PropertyType.DATE));
- root.save();
+ session.save();
fail("setValue(DATE value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -265,7 +246,7 @@
Property testProperty = testValueConstraintsNode.setProperty("jcr:testLONGINCLUSIVE", 100);
testProperty.setValue(200);
- root.save();
+ session.save();
}
public void testLONGEXCLUSIVEProperty() throws Exception
@@ -275,7 +256,7 @@
{
Property testProperty = testValueConstraintsNode.setProperty("jcr:testLONGEXCLUSIVE", 100);
testProperty.setValue(200);
- root.save();
+ session.save();
fail("setValue(LONG value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -286,7 +267,7 @@
try
{
Property testProperty = testValueConstraintsNode.setProperty("jcr:testLONGEXCLUSIVE", 150);
- root.save();
+ session.save();
fail("setValue(LONG value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -300,7 +281,7 @@
Property testProperty = testValueConstraintsNode.setProperty("jcr:testDOUBLEINCLUSIVE", 100);
testProperty.setValue(200);
- root.save();
+ session.save();
}
public void testDOUBLEEXCLUSIVEProperty() throws Exception
@@ -310,7 +291,7 @@
{
Property testProperty = testValueConstraintsNode.setProperty("jcr:testDOUBLEEXCLUSIVE", 100);
testProperty.setValue(200);
- root.save();
+ session.save();
fail("setValue(DOUBLE value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -321,7 +302,7 @@
try
{
Property testProperty = testValueConstraintsNode.setProperty("jcr:testDOUBLEEXCLUSIVE", 150);
- root.save();
+ session.save();
fail("setValue(DOUBLE value) must throw a ConstraintViolationException ");
}
catch (Exception e)
@@ -334,15 +315,16 @@
{
Property testProperty = testValueConstraintsNode.setProperty("jcr:testBOOLEAN", true);
- root.save();
+ session.save();
try
{
testProperty.setValue(false);
- root.save();
+ session.save();
+ fail();
}
- catch (Exception e)
+ catch (ConstraintViolationException e)
{
- fail("setValue(BOOLEAN value) here should be no Exception ");
+ // ok
}
}
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/search/TestBinarySearch.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/search/TestBinarySearch.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/api/search/TestBinarySearch.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -93,7 +93,11 @@
queryResult = query.execute();
iter = queryResult.getNodes();
-
+
+ while(iter.hasNext()){
+ System.out.print(iter.nextNode().getPath());
+ }
+
assertEquals("Result nodes count is wrong", 1, iter.getSize());
while (iter.hasNext())
{
Added: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeTest.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeTest.java (rev 0)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeTest.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import org.exoplatform.services.jcr.JcrImplBaseTest;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+
+public abstract class AbstractNodeTypeTest extends JcrImplBaseTest
+{
+
+ protected NodeTypeManagerImpl nodeTypeManager;
+
+ protected NodeTypeDataManager nodeTypeDataManager;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setUp() throws Exception
+ {
+ super.setUp();
+ nodeTypeManager = (NodeTypeManagerImpl)session.getWorkspace().getNodeTypeManager();
+ nodeTypeDataManager = session.getWorkspace().getNodeTypesHolder();
+
+ }
+
+ private static int random = 0;
+
+ public AbstractNodeTypeTest()
+ {
+ super();
+ }
+
+ protected String getNewName(String prefix)
+ {
+
+ return prefix + (random++);
+ }
+
+}
Property changes on: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeTest.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestItemDefinitionsHolder.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestItemDefinitionsHolder.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestItemDefinitionsHolder.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -18,89 +18,51 @@
*/
package org.exoplatform.services.jcr.impl.core.nodetype;
-import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
-import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.impl.Constants;
-import javax.jcr.nodetype.NodeTypeIterator;
-
-public class TestItemDefinitionsHolder extends JcrImplBaseTest
+public class TestItemDefinitionsHolder extends AbstractNodeTypeTest
{
- private final boolean isImplemented = false;
- private boolean isLoaded = false;
-
- private NodeTypeDataManager holder;
-
- @Override
- public void setUp() throws Exception
- {
- super.setUp();
- if (isImplemented)
- {
- isLoaded = true;
- }
- else if (!isImplemented && !isLoaded)
- {
- NodeTypeManagerImpl ntManager = ((NodeTypeManagerImpl)repository.getNodeTypeManager());
- NodeTypeIterator nodeTypes = ntManager.getAllNodeTypes();
- holder = session.getWorkspace().getNodeTypesHolder();
- // while (nodeTypes.hasNext()) {
- // NodeType type = nodeTypes.nextNodeType();
- // holder.putDefinitions((ExtendedNodeType) type);
- // }
- isLoaded = true;
- }
-
- }
-
public void testNodeDefinition() throws Exception
{
- if (isLoaded)
- {
- NodeDefinitionData def1 = holder.findChildNodeDefinition(Constants.JCR_CONTENT, Constants.NT_FILE,
+ NodeDefinitionData def1 = nodeTypeDataManager.getChildNodeDefinition(Constants.JCR_CONTENT, Constants.NT_FILE,
- Constants.NT_BASE);
- NodeDefinitionData def2 = holder.findChildNodeDefinition(Constants.JCR_CONTENT, Constants.NT_FILE,
+ Constants.NT_BASE);
+ NodeDefinitionData def2 = nodeTypeDataManager.getChildNodeDefinition(Constants.JCR_CONTENT, Constants.NT_FILE,
- Constants.NT_RESOURCE);
+ Constants.NT_RESOURCE);
- assertNotNull(def1);
- assertNotNull(def2);
- assertEquals(def1, def2);
- assertEquals(Constants.JCR_CONTENT, def1.getName());
+ assertNotNull(def1);
+ assertNotNull(def2);
+ assertEquals(def1, def2);
+ assertEquals(Constants.JCR_CONTENT, def1.getName());
- assertNull(holder.findChildNodeDefinition(Constants.JCR_DEFAULTPRIMNARYTYPE, Constants.NT_FILE,
- Constants.NT_RESOURCE));
- }
+ assertNull(nodeTypeDataManager.getChildNodeDefinition(Constants.JCR_DEFAULTPRIMNARYTYPE, Constants.NT_FILE,
+ Constants.NT_RESOURCE));
+
}
public void testResidualNodeDefinition() throws Exception
{
- //System.out.println(">>>>>>>>>>>> "+holder.getChildNodeDefinition(Constants
- // .NT_FILE,
- // new InternalQName(null, "test"), Constants.NT_UNSTRUCTURED).getName());
- if (isLoaded)
- {
- NodeDefinitionData def1 =
- holder.findChildNodeDefinition(new InternalQName(null, "test"), Constants.NT_UNSTRUCTURED,
+ NodeDefinitionData def1 =
+ nodeTypeDataManager.getChildNodeDefinition(new InternalQName(null, "test"), Constants.NT_UNSTRUCTURED,
- Constants.NT_UNSTRUCTURED);
- NodeDefinitionData def2 =
- holder.findChildNodeDefinition(new InternalQName(Constants.NS_EXO_URI, "test11111"),
- Constants.NT_UNSTRUCTURED,
+ Constants.NT_UNSTRUCTURED);
+ NodeDefinitionData def2 =
+ nodeTypeDataManager.getChildNodeDefinition(new InternalQName(Constants.NS_EXO_URI, "test11111"),
+ Constants.NT_UNSTRUCTURED,
- Constants.NT_FILE);
+ Constants.NT_FILE);
- assertNotNull(def1);
- assertNotNull(def2);
- assertEquals(def1, def2);
- assertEquals(Constants.JCR_ANY_NAME, def1.getName());
- }
+ assertNotNull(def1);
+ assertNotNull(def2);
+ assertEquals(def1, def2);
+ assertEquals(Constants.JCR_ANY_NAME, def1.getName());
+
}
}
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestNodeTypeRegistration.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestNodeTypeRegistration.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestNodeTypeRegistration.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -18,9 +18,9 @@
*/
package org.exoplatform.services.jcr.impl.core.nodetype;
-import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionValue;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeValue;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionValue;
import org.exoplatform.services.log.ExoLogger;
@@ -29,6 +29,7 @@
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Calendar;
+import java.util.GregorianCalendar;
import java.util.List;
import javax.jcr.Node;
@@ -44,7 +45,7 @@
* @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
* @version $Id: $
*/
-public class TestNodeTypeRegistration extends JcrImplBaseTest
+public class TestNodeTypeRegistration extends AbstractNodeTypeTest
{
/**
* Class logger.
@@ -57,8 +58,6 @@
private NodeTypeValue testNtFileNodeTypeValue = null;
- private NodeTypeManagerImpl nodeTypeManager;
-
/**
*
*/
@@ -90,13 +89,6 @@
}
- @Override
- public void setUp() throws Exception
- {
- super.setUp();
- nodeTypeManager = (NodeTypeManagerImpl)session.getWorkspace().getNodeTypeManager();
- }
-
public void testRemoveNodeTypeUnexisted()
{
try
@@ -246,7 +238,7 @@
*
* @throws Exception
*/
- public void testReregisterProtected() throws Exception
+ public void _testReregisterProtected() throws Exception
{
NodeTypeValue testNValue = new NodeTypeValue();
@@ -276,19 +268,28 @@
tNode.addMixin("mix:versionable");
- // chenge mandatory
+ // chenge protected
List<PropertyDefinitionValue> props2 = new ArrayList<PropertyDefinitionValue>();
- props2.add(new PropertyDefinitionValue("tt", true, true, 1, true, def, false, PropertyType.STRING,
+ props2.add(new PropertyDefinitionValue("tt", true, false, 1, true, def, false, PropertyType.STRING,
new ArrayList<String>()));
testNValue.setDeclaredPropertyDefinitionValues(props2);
+
+ nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.REPLACE_IF_EXISTS);
+
+ tNode.setProperty("tt", "tt");
+ session.save();
+
+ property = tNode.getProperty("tt");
+ assertEquals("tt", property.getString());
try
{
- nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.REPLACE_IF_EXISTS);
+ property.remove();
+ session.save();
fail();
}
- catch (RepositoryException e)
+ catch (ConstraintViolationException e)
{
- // ok;
+ // ok
}
}
@@ -323,7 +324,7 @@
nodeTypeManager.registerNodeType(testNTValue, ExtendedNodeTypeManager.REPLACE_IF_EXISTS);
fail();
}
- catch (RepositoryException e)
+ catch (ConstraintViolationException e)
{
// ok
}
@@ -379,6 +380,7 @@
{
// ok;
}
+
tNode.setProperty("tt", "tt");
session.save();
@@ -699,7 +701,8 @@
testNValue.setDeclaredSupertypeNames(superType);
List<NodeDefinitionValue> nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("*", false, false, 1, false, "nt:base", new ArrayList<String>(), false));
+ nodes
+ .add(new NodeDefinitionValue("*", false, false, 1, false, "nt:unstructured", new ArrayList<String>(), false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.FAIL_IF_EXISTS);
@@ -781,7 +784,8 @@
testNValue.setDeclaredSupertypeNames(superType);
List<NodeDefinitionValue> nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:base", new ArrayList<String>(), false));
+ nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:unstructured", new ArrayList<String>(),
+ false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.FAIL_IF_EXISTS);
@@ -842,7 +846,8 @@
session.save();
List<NodeDefinitionValue> nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("child", false, true, 1, false, "nt:base", new ArrayList<String>(), false));
+ nodes.add(new NodeDefinitionValue("child", false, true, 1, false, "nt:unstructured", new ArrayList<String>(),
+ false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
try
@@ -856,7 +861,8 @@
}
testNValue = nodeTypeManager.getNodeTypeValue(testNValue.getName());
nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:base", new ArrayList<String>(), false));
+ nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:unstructured", new ArrayList<String>(),
+ false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.REPLACE_IF_EXISTS);
@@ -864,7 +870,8 @@
session.save();
nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("child", false, true, 1, false, "nt:base", new ArrayList<String>(), false));
+ nodes.add(new NodeDefinitionValue("child", false, true, 1, false, "nt:unstructured", new ArrayList<String>(),
+ false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.REPLACE_IF_EXISTS);
@@ -885,7 +892,8 @@
testNValue.setDeclaredSupertypeNames(superType);
List<NodeDefinitionValue> nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:base", new ArrayList<String>(), false));
+ nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:unstructured", new ArrayList<String>(),
+ false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.FAIL_IF_EXISTS);
@@ -895,7 +903,8 @@
session.save();
nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("child", false, true, 1, false, "nt:base", new ArrayList<String>(), false));
+ nodes.add(new NodeDefinitionValue("child", false, true, 1, false, "nt:unstructured", new ArrayList<String>(),
+ false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
try
@@ -929,7 +938,8 @@
testNValue.setDeclaredSupertypeNames(superType);
List<NodeDefinitionValue> nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:base", new ArrayList<String>(), false));
+ nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:unstructured", new ArrayList<String>(),
+ false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.FAIL_IF_EXISTS);
@@ -941,7 +951,8 @@
session.save();
nodes = new ArrayList<NodeDefinitionValue>();
- nodes.add(new NodeDefinitionValue("child", false, false, 1, true, "nt:base", new ArrayList<String>(), false));
+ nodes.add(new NodeDefinitionValue("child", false, false, 1, true, "nt:unstructured", new ArrayList<String>(),
+ false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
try
@@ -974,8 +985,9 @@
List<NodeDefinitionValue> nodes = new ArrayList<NodeDefinitionValue>();
List<String> requeredPrimaryType = new ArrayList<String>();
- requeredPrimaryType.add("nt:base");
- nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:base", requeredPrimaryType, false));
+ requeredPrimaryType.add("nt:hierarchyNode");
+ nodes
+ .add(new NodeDefinitionValue("child", false, false, 1, false, "nt:hierarchyNode", requeredPrimaryType, false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.FAIL_IF_EXISTS);
@@ -985,20 +997,25 @@
try
{
- testNode.addNode("wrongchild");
+ testNode.addNode("wrongchild", "nt:unstructured");
fail();
}
catch (ConstraintViolationException e)
{
// ok
}
- Node child = testNode.addNode("child", "nt:base");
+ Node child = testNode.addNode("child", "nt:file");
+ Node cont = child.addNode("jcr:content", "nt:resource");
+ cont.setProperty("jcr:mimeType", "text");
+ cont.setProperty("jcr:lastModified", new GregorianCalendar(2011, 3, 4));
+ cont.setProperty("jcr:data", "test text");
session.save();
nodes = new ArrayList<NodeDefinitionValue>();
requeredPrimaryType = new ArrayList<String>();
- requeredPrimaryType.add("nt:unstructured");
- nodes.add(new NodeDefinitionValue("child", false, false, 1, false, "nt:base", requeredPrimaryType, false));
+ requeredPrimaryType.add("nt:folder");
+ nodes
+ .add(new NodeDefinitionValue("child", false, false, 1, false, "nt:hierarchyNode", requeredPrimaryType, false));
testNValue.setDeclaredChildNodeDefinitionValues(nodes);
try
@@ -1014,7 +1031,7 @@
child.remove();
session.save();
- child = testNode.addNode("child", "nt:unstructured");
+ child = testNode.addNode("child", "nt:folder");
session.save();
nodeTypeManager.registerNodeType(testNValue, ExtendedNodeTypeManager.REPLACE_IF_EXISTS);
@@ -1044,7 +1061,11 @@
Node testNode = root.addNode("testNode", testNValue.getName());
session.save();
- Node child = testNode.addNode("child", "nt:base");
+ Node child = testNode.addNode("child", "nt:file");
+ Node cont = child.addNode("jcr:content", "nt:resource");
+ cont.setProperty("jcr:mimeType", "text");
+ cont.setProperty("jcr:lastModified", new GregorianCalendar(2011, 3, 4));
+ cont.setProperty("jcr:data", "test text");
session.save();
nodes = new ArrayList<NodeDefinitionValue>();
@@ -1198,8 +1219,13 @@
testNValue = nodeTypeManager.getNodeTypeValue(testNValue.getName());
Node testNode = root.addNode("testNode", testNValue.getName());
- Node child = testNode.addNode("child", "nt:base");
+ Node child = testNode.addNode("child", "nt:file");
+ Node cont = child.addNode("jcr:content", "nt:resource");
+ cont.setProperty("jcr:mimeType", "text");
+ cont.setProperty("jcr:lastModified", new GregorianCalendar(2011, 3, 4));
+ cont.setProperty("jcr:data", "test text");
session.save();
+ session.save();
nodes = new ArrayList<NodeDefinitionValue>();
List<String> requeredPrimaryType = new ArrayList<String>();
@@ -1456,7 +1482,7 @@
InputStream xml =
this.getClass().getResourceAsStream("/org/exoplatform/services/jcr/impl/core/nodetype/test-jcr589.xml");
repositoryService.getCurrentRepository().getNodeTypeManager().registerNodeTypes(xml,
- ExtendedNodeTypeManager.FAIL_IF_EXISTS);
+ ExtendedNodeTypeManager.FAIL_IF_EXISTS, NodeTypeDataManager.TEXT_XML);
Node tr = root.addNode("testRoot");
Node l1 = tr.addNode("t", "myNodeTypes");
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestNtAutorcreating.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestNtAutorcreating.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestNtAutorcreating.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -20,6 +20,7 @@
import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -89,7 +90,7 @@
InputStream xml =
this.getClass().getResourceAsStream("/org/exoplatform/services/jcr/impl/core/nodetype/test-nodetypes.xml");
repositoryService.getCurrentRepository().getNodeTypeManager().registerNodeTypes(xml,
- ExtendedNodeTypeManager.FAIL_IF_EXISTS);
+ ExtendedNodeTypeManager.FAIL_IF_EXISTS, NodeTypeDataManager.TEXT_XML);
registred = true;
}
}
Modified: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestSuperTypeChanges.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestSuperTypeChanges.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/nodetype/TestSuperTypeChanges.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -18,7 +18,6 @@
*/
package org.exoplatform.services.jcr.impl.core.nodetype;
-import org.exoplatform.services.jcr.JcrImplBaseTest;
import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeValue;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionValue;
@@ -39,22 +38,13 @@
* @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
* @version $Id: $
*/
-public class TestSuperTypeChanges extends JcrImplBaseTest
+public class TestSuperTypeChanges extends AbstractNodeTypeTest
{
/**
* Class logger.
*/
private static final Log LOG = ExoLogger.getLogger(TestSuperTypeChanges.class);
- private NodeTypeManagerImpl nodeTypeManager;
-
- @Override
- public void setUp() throws Exception
- {
- super.setUp();
- nodeTypeManager = (NodeTypeManagerImpl)session.getWorkspace().getNodeTypeManager();
- }
-
/**
* @throws Exception
*/
Deleted: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestAggregateRules.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestAggregateRules.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestAggregateRules.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2003-2007 eXo Platform SAS.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Affero General Public License
- * as published by the Free Software Foundation; either version 3
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see<http://www.gnu.org/licenses/>.
- */
-
-package org.exoplatform.services.jcr.impl.core.query.lucene;
-
-import org.exoplatform.services.jcr.impl.core.query.BaseQueryTest;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.StringBufferInputStream;
-import java.util.Calendar;
-
-import javax.jcr.Node;
-import javax.jcr.query.Query;
-import javax.jcr.query.QueryManager;
-import javax.jcr.query.QueryResult;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-/**
- * Created by The eXo Platform SAS Author : Sergey Karpenko <sergey.karpenko(a)exoplatform.com.ua>
- *
- * @version $Id: TestAggregateRules.java 11931 2008-03-14 09:29:17Z serg $
- */
-
-public class TestAggregateRules extends BaseQueryTest
-{
-
- public final String fileName = "FileName";
-
- public void testAdditionFile() throws Exception
- {
- try
- {
- // add aggregate rules to indexing configuration
-
- String conf =
- "<?xml version=\"1.0\"?>" + "\n"
- + "<!DOCTYPE configuration SYSTEM \"http://www.exoplatform.org/dtd/indexing-configuration-1.0.dtd\">"
- + "\n" + "<configuration xmlns:jcr=\"http://www.jcp.org/jcr/1.0\"" + "\n"
- + " xmlns:nt=\"http://www.jcp.org/jcr/nt/1.0\">" + "\n" + "<aggregate primaryType=\"nt:file\">" + "\n"
- + "<include>jcr:content</include>" + "\n" + "</aggregate>" + "\n" + "</configuration>";
-
- InputStream is = new StringBufferInputStream(conf);
-
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- builder.setEntityResolver(new IndexingConfigurationEntityResolver());
- Element indexingConfiguration = builder.parse(is).getDocumentElement();
- NodeList lst = indexingConfiguration.getChildNodes();
-
- org.w3c.dom.Node configNode = lst.item(0).getNextSibling();
-
- assertNotNull(configNode);
-
- IndexingConfigurationImpl indexingConfigurationImpl =
- (IndexingConfigurationImpl)defaultSearchIndex.getIndexingConfig();
- //indexingConfigurationImpl.addAggregateRule(configNode);
-
- // create node nt:file
- Node node = session.getRootNode().addNode(fileName, "nt:file");
- Node content = node.addNode("jcr:content", "nt:resource");
- content.setProperty("jcr:mimeType", "text/plain");
- content.setProperty("jcr:lastModified", Calendar.getInstance());
- content.setProperty("jcr:data", new ByteArrayInputStream("The quick brown fox jump over the lazy dog"
- .getBytes()));
- session.save();
-
- QueryManager qman = this.workspace.getQueryManager();
-
- Query q = qman.createQuery("SELECT * FROM nt:file " + " WHERE CONTAINS(., 'fox')", Query.SQL);
-
- QueryResult res = q.execute();
-
- assertEquals(1, res.getNodes().getSize());
-
- q = qman.createQuery("SELECT * FROM nt:resource " + " WHERE CONTAINS(., 'fox')", Query.SQL);
-
- res = q.execute();
- assertEquals(1, res.getNodes().getSize());
-
- // tear down
- //indexingConfigurationImpl.removeLastAggregateRule();
- }
- catch (Exception e)
- {
- e.printStackTrace();
- throw e;
- }
- }
-}
Deleted: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestSearchManagerIndexing.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestSearchManagerIndexing.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestSearchManagerIndexing.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2003-2007 eXo Platform SAS.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Affero General Public License
- * as published by the Free Software Foundation; either version 3
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see<http://www.gnu.org/licenses/>.
- */
-
-package org.exoplatform.services.jcr.impl.core.query.lucene;
-
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.Hits;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.BooleanClause.Occur;
-import org.exoplatform.services.jcr.JcrImplBaseTest;
-import org.exoplatform.services.jcr.datamodel.NodeData;
-import org.exoplatform.services.jcr.impl.core.NodeImpl;
-import org.exoplatform.services.jcr.impl.core.query.SearchManager;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-
-import java.util.Properties;
-
-import javax.jcr.NamespaceException;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-/**
- * Created by The eXo Platform SAS Author : Sergey Karpenko <sergey.karpenko(a)exoplatform.com.ua>
- *
- * @version $Id: TestSearchManagerIndexing.java 13111 2008-04-11 08:22:13Z serg $
- */
-
-public class TestSearchManagerIndexing extends JcrImplBaseTest
-{
- public static final Log logger = ExoLogger.getLogger(TestSearchManagerIndexing.class);
-
- private SearchManager manager;
-
- public void testAdditionNode() throws Exception
- {
- assertNotNull(manager);
- SearchIndex si = (SearchIndex)manager.getHandler();
- IndexReader ir = si.getIndex().getIndexReader();
- int docnum = ir.numDocs();
- ir.close();
-
- Node node = root.addNode("test");
- node.setProperty("prop", "string value");
- root.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum + 1, ir.numDocs());
-
- for (int i = 0; i < ir.numDocs(); i++)
- {
- if (!ir.isDeleted(i))
- {
- logger.info(" DOCUMENT [" + i + "] name [" + ir.document(i).getField(FieldNames.LABEL).stringValue() + "]");
- }
-
- }
- logger.info(" DOCUMENT [] name [" + getIndexPrefix(si, "") + "test" + "]");
-
- IndexSearcher is = new IndexSearcher(ir);
-
- // Test is next addings are in index
- TermQuery name = new TermQuery(new Term(FieldNames.LABEL, getIndexPrefix(si, "") + "test"));
- TermQuery prop1 =
- new TermQuery(new Term(FieldNames.PROPERTIES, getIndexPrefix(si, "") + "prop" + '[' + "string value"));
- TermQuery prop2 =
- new TermQuery(new Term(FieldNames.PROPERTIES, getIndexPrefix(si, "jcr") + "primaryType" + '['
- + getIndexPrefix(si, "nt") + "unstructured"));
- TermQuery full1 = new TermQuery(new Term(FieldNames.FULLTEXT, "string"));
- TermQuery full2 = new TermQuery(new Term(FieldNames.FULLTEXT, "value"));
-// TermQuery fullprop1 =
-// new TermQuery(new Term(FieldNames.createFullTextFieldName(getIndexPrefix(si, "") + "prop"), "string"));
-// TermQuery fullprop2 =
-// new TermQuery(new Term(FieldNames.createFullTextFieldName(getIndexPrefix(si, "") + "prop"), "value"));
-
- BooleanQuery compl = new BooleanQuery();
- compl.add(name, Occur.MUST);
- compl.add(prop1, Occur.MUST);
- compl.add(prop2, Occur.MUST);
- compl.add(full1, Occur.MUST);
- compl.add(full2, Occur.MUST);
-// compl.add(fullprop1, Occur.MUST);
-// compl.add(fullprop2, Occur.MUST);
-
- Hits hits = is.search(compl);
- assertEquals(1, hits.length());
-
- ir.close();
- is.close();
- }
-
- public void testRemoveNode() throws Exception
- {
- assertNotNull(manager);
-
- SearchIndex si = (SearchIndex)manager.getHandler();
- IndexReader ir = si.getIndex().getIndexReader();
-
- int docnum = ir.numDocs();
- ir.close();
-
- // add node
- Node node = root.addNode("test");
- root.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum + 1, ir.numDocs());
- ir.close();
-
- node.remove();
- root.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum, ir.numDocs());
- ir.close();
- }
-
- /**
- * Here is test of correct indexing changes in repository.
- *
- * @throws Exception
- */
- public void testMoveNode() throws Exception
- {
- assertNotNull(manager);
- SearchIndex si = (SearchIndex)manager.getHandler();
- IndexReader ir = si.getIndex().getIndexReader();
- int docnum = ir.numDocs();
- ir.close();
-
- Node mid = root.addNode("mid");
- Node node = mid.addNode("test");
- root.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum + 2, ir.numDocs());
-
- IndexSearcher is = new IndexSearcher(ir);
- NodeData data = (NodeData)((NodeImpl)node).getData();
-
- TermQuery query = new TermQuery(new Term(FieldNames.UUID, data.getIdentifier()));
- Hits hits = is.search(query);
- assertEquals(1, hits.length());
-
- Document doc = hits.doc(0);
- // check that "node" parent is "mid"
- assertEquals(((NodeData)((NodeImpl)mid).getData()).getIdentifier(), doc.getField(FieldNames.PARENT).stringValue());
-
- ir.close();
- is.close();
-
- // move
- session.move("/mid/test", "/test");
- session.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum + 2, ir.numDocs());
-
- is = new IndexSearcher(ir);
- hits = is.search(query);
- assertEquals(1, hits.length());
-
- doc = hits.doc(0);
- // check that "node" parent is root-node
- assertEquals(((NodeData)((NodeImpl)root).getData()).getIdentifier(), doc.getField(FieldNames.PARENT)
- .stringValue());
-
- ir.close();
- is.close();
- }
-
- public void testRenameNode() throws Exception
- {
- final String nodeName = "test";
- final String newNodeName = "newName";
-
- assertNotNull(manager);
- SearchIndex si = (SearchIndex)manager.getHandler();
- IndexReader ir = si.getIndex().getIndexReader();
- int docnum = ir.numDocs();
- ir.close();
-
- root.addNode(nodeName);
- root.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum + 1, ir.numDocs());
-
- IndexSearcher is = new IndexSearcher(ir);
- TermQuery query = new TermQuery(new Term(FieldNames.LABEL, getIndexPrefix(si, "") + nodeName));
- Hits hits = is.search(query);
- assertEquals(1, hits.length());
-
- ir.close();
- is.close();
-
- // rename
- session.move("/" + nodeName, "/" + newNodeName);
- session.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum + 1, ir.numDocs());
-
- is = new IndexSearcher(ir);
- query = new TermQuery(new Term(FieldNames.LABEL, getIndexPrefix(si, "") + newNodeName));
- hits = is.search(query);
- assertEquals(1, hits.length());
-
- ir.close();
- is.close();
- }
-
- public void testSameName() throws Exception
- {
- assertNotNull(manager);
- SearchIndex si = (SearchIndex)manager.getHandler();
- IndexReader ir = si.getIndex().getIndexReader();
- int docnum = ir.numDocs();
- ir.close();
-
- final String nodeName = "test";
-
- root.addNode(nodeName);
- root.addNode(nodeName);
- root.save();
-
- ir = si.getIndex().getIndexReader();
-
- assertEquals(docnum + 2, ir.numDocs());
-
- IndexSearcher is = new IndexSearcher(ir);
- TermQuery query = new TermQuery(new Term(FieldNames.LABEL, getIndexPrefix(si, "") + nodeName));
- Hits hits = is.search(query);
- assertEquals(2, hits.length());
- }
-
- public void testAddMixinType() throws Exception
- {
- assertNotNull(manager);
- SearchIndex si = (SearchIndex)manager.getHandler();
- IndexReader ir = si.getIndex().getIndexReader();
- int docnum = ir.numDocs();
- ir.close();
- final String nodeName = "test";
-
- Node node = root.addNode(nodeName);
- root.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum + 1, ir.numDocs());
-
- TermQuery name = new TermQuery(new Term(FieldNames.LABEL, getIndexPrefix(si, "") + nodeName));
-
- TermQuery prop1 =
- new TermQuery(new Term(FieldNames.PROPERTIES, getIndexPrefix(si, "jcr") + "primaryType" + '['
- + getIndexPrefix(si, "nt") + "unstructured"));
- BooleanQuery compl = new BooleanQuery();
- compl.add(name, Occur.MUST);
- compl.add(prop1, Occur.MUST);
-
- IndexSearcher is = new IndexSearcher(ir);
- Hits hits = is.search(compl);
- assertEquals(1, hits.length());
-
- // add mixin
- node.addMixin("mix:referenceable");
- root.save();
-
- ir = si.getIndex().getIndexReader();
- assertEquals(docnum + 1, ir.numDocs());
-
- TermQuery prop2 =
- new TermQuery(new Term(FieldNames.PROPERTIES, getIndexPrefix(si, "jcr") + "uuid" + '[' + node.getUUID()));
- compl.add(prop2, Occur.MUST);
-
- is = new IndexSearcher(ir);
- hits = is.search(compl);
- assertEquals(1, hits.length());
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- manager = (SearchManager)this.session.getContainer().getComponentInstanceOfType(SearchManager.class);
- }
-
- private String getIndexPrefix(SearchIndex si, String stPref) throws RepositoryException, NamespaceException
- {
-
- Properties props = new Properties();
- props.setProperty("", "");
- props.setProperty("jcr", "http://www.jcp.org/jcr/1.0");
- props.setProperty("nt", "http://www.jcp.org/jcr/nt/1.0");
- props.setProperty("mix", "http://www.jcp.org/jcr/mix/1.0");
- props.setProperty("xml", "http://www.w3.org/XML/1998/namespace");
- props.setProperty("sv", "http://www.jcp.org/jcr/sv/1.0");
- props.setProperty("exo", "http://www.exoplatform.com/jcr/exo/1.0");
- props.setProperty("xs", "http://www.w3.org/2001/XMLSchema");
- props.setProperty("fn", "http://www.w3.org/2004/10/xpath-functions");
-
- String result = (si.getNamespaceMappings().getNamespacePrefixByURI(props.getProperty(stPref)) + ":");
- return (result.equals(":") ? "" : result);
- }
-}
Deleted: jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestSystemSearchManager.java
===================================================================
--- jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestSystemSearchManager.java 2009-10-04 09:34:54 UTC (rev 199)
+++ jcr/trunk/component/core/src/test/java/org/exoplatform/services/jcr/impl/core/query/lucene/TestSystemSearchManager.java 2009-10-04 09:36:54 UTC (rev 200)
@@ -1,142 +0,0 @@
-/*
- * Copyright (C) 2003-2007 eXo Platform SAS.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Affero General Public License
- * as published by the Free Software Foundation; either version 3
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, see<http://www.gnu.org/licenses/>.
- */
-
-package org.exoplatform.services.jcr.impl.core.query.lucene;
-
-import org.apache.lucene.index.IndexReader;
-import org.exoplatform.services.jcr.JcrImplBaseTest;
-import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
-import org.exoplatform.services.jcr.impl.core.query.SearchManager;
-import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-
-import java.io.ByteArrayInputStream;
-
-import javax.jcr.Node;
-
-/**
- * Created by The eXo Platform SAS Author : Sergey Karpenko <sergey.karpenko(a)exoplatform.com.ua>
- *
- * @version $Id: TestSystemSearchManager.java 11907 2008-03-13 15:36:21Z ksm $
- *
- * There is test of system Search Manager
- */
-public class TestSystemSearchManager extends JcrImplBaseTest
-{
-
- public static final Log logger = ExoLogger.getLogger(TestSearchManagerIndexing.class);
-
- private SystemSearchManager manager;
-
- public void testRegisterNamespace() throws Exception
- {
- assertNotNull(manager);
- SearchIndex si = (SearchIndex)manager.getHandler();
-
- IndexReader ir = si.getIndex().getIndexReader();
-
- SearchManager sManager =
- (SearchManager)this.session.getContainer().getComponentInstanceOfType(SearchManager.class);
- SearchIndex ssi = (SearchIndex)sManager.getHandler();
- IndexReader sir = ssi.getIndex().getIndexReader();
-
- // remember document number, before any test
- int sysdocnum = ir.numDocs();
- int secdocnum = sir.numDocs();
-
- logger.info(" DOCNUM in system index[" + sysdocnum + "]");
- logger.info(" DOCNUM in second index[" + secdocnum + "]");
-
- workspace.getNamespaceRegistry().registerNamespace("test_my", "http://www.test_my.org/test_my");
-
- session.save();
-
- ir = si.getIndex().getIndexReader();
- sir = ssi.getIndex().getIndexReader();
- // assert that document num increased in system index
- assertEquals(sysdocnum + 1, ir.numDocs());
- // assert that document num havn't changed in other indexes
- assertEquals(secdocnum, sir.numDocs());
-
- ir.close();
- sir.close();
- }
-
- public void testCheckIn() throws Exception
- {
- assertNotNull(manager);
-
- final String nodename = "test_node";
-
- SearchIndex si = (SearchIndex)manager.getHandler();
-
- IndexReader ir = si.getIndex().getIndexReader();
- // remeber document number, before any test
- int docnum = ir.numDocs();
- logger.info(" DOCNUM [" + docnum + "]");
-
- Node node = root.addNode(nodename);
- node.addMixin("mix:versionable");
- root.save();
- node.checkin();
- root.save();
-
- ir = si.getIndex().getIndexReader();
-
- // jcr:VersionLabels doc
- // ??? doc
- // jcr:frozenNode doc
- // 1 doc
- // jcr:RoorVersion
- // 5 at all
- assertEquals(docnum + 5, ir.numDocs());
- ir.close();
- }
-
- public void testAddNodeType() throws Exception
- {
- SearchIndex si = (SearchIndex)manager.getHandler();
- IndexReader ir = si.getIndex().getIndexReader();
-
- // remeber document number, before any test
- int docnum = ir.numDocs();
- logger.info(" DOCNUM [" + docnum + "]");
-
- ExtendedNodeTypeManager typeManager = (ExtendedNodeTypeManager)session.getWorkspace().getNodeTypeManager();
-
- String cnd =
- "<nodeTypes><nodeType name='test_my:referenceable' isMixin='true' hasOrderableChildNodes='false' primaryItemName=''>"
- + "<supertypes>" + " <supertype>mix:referenceable</supertype>" + "</supertypes>" + "</nodeType>"
- + "</nodeTypes>";
-
- typeManager.registerNodeTypes(new ByteArrayInputStream(cnd.getBytes()), ExtendedNodeTypeManager.IGNORE_IF_EXISTS);
- session.save();
-
- ir = si.getIndex().getIndexReader();
-
- assertEquals(docnum + 1, ir.numDocs());
- ir.close();
- }
-
- public void setUp() throws Exception
- {
- super.setUp();
- manager = (SystemSearchManager)this.session.getContainer().getComponentInstanceOfType(SystemSearchManager.class);
- }
-
-}
14 years, 7 months
exo-jcr SVN: r199 - in jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr: core/nodetype and 10 other directories.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-04 05:34:54 -0400 (Sun, 04 Oct 2009)
New Revision: 199
Added:
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/ComponentPersister.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeRepository.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedItemDefinition.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedNodeDefinition.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/InmemoryNodeTypeRepository.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDefinitionImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeExistsException.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeRepository.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractItemDefinitionAccessProvider.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JcrNodeTypeDataPersister.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionAccessProvider.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeConverter.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataBuilder.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataPersister.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataValidator.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDefinitionAccessProvider.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeReadException.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionAccessProvider.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/UpdateNodeTypeObserver.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/XmlNodeTypeDataPersister.java
Removed:
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataPersister.java
Modified:
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/ExtendedNodeTypeManager.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/ItemDefinitionData.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeDefinitionData.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeDefinitionValue.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeData.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceDataPersister.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceRegistryImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/PropertyImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionDataHolder.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeDefinitionImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeManagerImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/PropertyDefinitionImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/VolatileNodeTypeDataManager.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractDefinitionComparator.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionComparator.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionComparator.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/PropertyTypeRegistry.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AggregateRuleImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocOrderScoreNodeIterator.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIteratorImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryResultImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIterator.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIteratorImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/misc/Pattern.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataCopyIgnoredVisitor.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java
Log:
EXOJCR-161 : Node type and namespaces changes to fit new query interfaces
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/ComponentPersister.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/ComponentPersister.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/ComponentPersister.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.core;
+
+import org.picocontainer.Startable;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public interface ComponentPersister extends Startable
+{
+ /**
+ * Indicate what storage filled with some data.
+ *
+ * @return isStorageFilled flag.
+ * @throws RepositoryException
+ */
+ public boolean isStorageFilled();
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/ComponentPersister.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/ExtendedNodeTypeManager.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/ExtendedNodeTypeManager.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/ExtendedNodeTypeManager.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -65,9 +65,22 @@
* @param alreadyExistsBehaviour a int
* @throws RepositoryException
*/
+ @Deprecated
NodeTypeIterator registerNodeTypes(InputStream xml, int alreadyExistsBehaviour) throws RepositoryException;
+
+
/**
+ * Registers all node types using XML binding value objects from xml stream.
+ *
+ * @param xml a InputStream
+ * @param alreadyExistsBehaviour a int
+ * @throws RepositoryException
+ */
+ NodeTypeIterator registerNodeTypes(InputStream xml, int alreadyExistsBehaviour, String contentType)
+ throws RepositoryException;
+
+ /**
* @return
* @throws RepositoryException
*/
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/ItemDefinitionData.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/ItemDefinitionData.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/ItemDefinitionData.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -22,11 +22,12 @@
import org.exoplatform.services.jcr.impl.Constants;
/**
- * Created by The eXo Platform SAS. <br/>Date: 25.11.2008
+ * Created by The eXo Platform SAS. <br/>
+ * Date: 25.11.2008
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter
* Nedonosko</a>
- * @version $Id: ItemDefinitionData.java 34801 2009-07-31 15:44:50Z dkatayev $
+ * @version $Id: ItemDefinitionData.java 26474 2009-01-09 16:15:25Z ksm $
*/
public class ItemDefinitionData
{
@@ -59,20 +60,6 @@
return this.getName().equals(Constants.JCR_ANY_NAME);
}
- @Override
- public boolean equals(Object obj)
- {
- if (this == obj)
- return true;
- if ((obj == null) || (obj.getClass() != this.getClass()))
- return false;
- // object must be Test at this point
- ItemDefinitionData test = (ItemDefinitionData)obj;
- return name == test.name && declaringNodeType == test.declaringNodeType && autoCreated == test.autoCreated
- && mandatory == test.mandatory && onParentVersion == test.onParentVersion
- && protectedItem == test.protectedItem;
- }
-
public InternalQName getName()
{
return name;
@@ -88,6 +75,83 @@
return autoCreated;
}
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + (autoCreated ? 1231 : 1237);
+ result = prime * result + ((declaringNodeType == null) ? 0 : declaringNodeType.hashCode());
+ result = prime * result + (mandatory ? 1231 : 1237);
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + onParentVersion;
+ result = prime * result + (protectedItem ? 1231 : 1237);
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (!(obj instanceof ItemDefinitionData))
+ {
+ return false;
+ }
+ ItemDefinitionData other = (ItemDefinitionData)obj;
+ if (autoCreated != other.autoCreated)
+ {
+ return false;
+ }
+ if (declaringNodeType == null)
+ {
+ if (other.declaringNodeType != null)
+ {
+ return false;
+ }
+ }
+ else if (!declaringNodeType.equals(other.declaringNodeType))
+ {
+ return false;
+ }
+ if (mandatory != other.mandatory)
+ {
+ return false;
+ }
+ if (name == null)
+ {
+ if (other.name != null)
+ {
+ return false;
+ }
+ }
+ else if (!name.equals(other.name))
+ {
+ return false;
+ }
+ if (onParentVersion != other.onParentVersion)
+ {
+ return false;
+ }
+ if (protectedItem != other.protectedItem)
+ {
+ return false;
+ }
+ return true;
+ }
+
public boolean isMandatory()
{
return mandatory;
@@ -108,5 +172,4 @@
{
return name.getAsString();
}
-
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeDefinitionData.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeDefinitionData.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeDefinitionData.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -21,17 +21,19 @@
import org.exoplatform.services.jcr.datamodel.InternalQName;
import java.util.Arrays;
+import java.util.Comparator;
/**
- * Created by The eXo Platform SAS. <br/>Date: 25.11.2008
+ * Created by The eXo Platform SAS. <br/>
+ * Date: 25.11.2008
*
* @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter
* Nedonosko</a>
- * @version $Id: NodeDefinitionData.java 34801 2009-07-31 15:44:50Z dkatayev $
+ * @version $Id: NodeDefinitionData.java 25471 2008-12-19 08:34:01Z ksm $
*/
+
public class NodeDefinitionData extends ItemDefinitionData
{
-
protected final InternalQName[] requiredPrimaryTypes;
protected final InternalQName defaultPrimaryType;
@@ -46,6 +48,14 @@
this.requiredPrimaryTypes = requiredPrimaryTypes;
this.defaultPrimaryType = defaultPrimaryType;
this.allowsSameNameSiblings = allowsSameNameSiblings;
+ Arrays.sort(requiredPrimaryTypes, new Comparator<InternalQName>()
+ {
+
+ public int compare(InternalQName o1, InternalQName o2)
+ {
+ return o1.getAsString().compareTo(o2.getAsString());
+ }
+ });
}
public InternalQName[] getRequiredPrimaryTypes()
@@ -58,21 +68,77 @@
return defaultPrimaryType;
}
- public boolean isAllowsSameNameSiblings()
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode()
{
- return allowsSameNameSiblings;
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + (allowsSameNameSiblings ? 1231 : 1237);
+ result = prime * result + ((defaultPrimaryType == null) ? 0 : defaultPrimaryType.hashCode());
+ result = prime * result + Arrays.hashCode(requiredPrimaryTypes);
+ return result;
}
+ /**
+ * {@inheritDoc}
+ */
@Override
public boolean equals(Object obj)
{
if (this == obj)
+ {
return true;
- if ((obj == null) || (obj.getClass() != this.getClass()))
+ }
+ if (!super.equals(obj))
+ {
return false;
- // object must be Test at this point
- NodeDefinitionData test = (NodeDefinitionData)obj;
- return defaultPrimaryType == test.defaultPrimaryType && allowsSameNameSiblings == test.allowsSameNameSiblings
- && super.equals(test) && Arrays.equals(this.requiredPrimaryTypes, test.requiredPrimaryTypes);
+ }
+ if (!(obj instanceof NodeDefinitionData))
+ {
+ return false;
+ }
+ NodeDefinitionData other = (NodeDefinitionData)obj;
+ if (allowsSameNameSiblings != other.allowsSameNameSiblings)
+ {
+ return false;
+ }
+ if (defaultPrimaryType == null)
+ {
+ if (other.defaultPrimaryType != null)
+ {
+ return false;
+ }
+ }
+ else if (!defaultPrimaryType.equals(other.defaultPrimaryType))
+ {
+ return false;
+ }
+ if (!Arrays.deepEquals(requiredPrimaryTypes, other.requiredPrimaryTypes))
+ {
+ return false;
+ }
+ return true;
}
+
+ public boolean isAllowsSameNameSiblings()
+ {
+ return allowsSameNameSiblings;
+ }
+
+ // @Override
+ // public boolean equals(Object obj) {
+ // if (this == obj)
+ // return true;
+ // if ((obj == null) || (obj.getClass() != this.getClass()))
+ // return false;
+ // // object must be Test at this point
+ // NodeDefinitionData test = (NodeDefinitionData) obj;
+ // return defaultPrimaryType == test.defaultPrimaryType
+ // && allowsSameNameSiblings == test.allowsSameNameSiblings &&
+ // super.equals(test)
+ // && Arrays.equals(this.requiredPrimaryTypes, test.requiredPrimaryTypes);
+ // }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeDefinitionValue.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeDefinitionValue.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeDefinitionValue.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -18,11 +18,15 @@
*/
package org.exoplatform.services.jcr.core.nodetype;
+import org.exoplatform.services.jcr.impl.core.nodetype.NodeDefinitionImpl;
+
+import java.util.Arrays;
import java.util.List;
+import javax.jcr.nodetype.NodeDefinition;
+
/**
- * Created by The eXo Platform SAS.<br/>
- * NodeDefinition value object
+ * Created by The eXo Platform SAS.<br/> NodeDefinition value object
*
* @author <a href="mailto:gennady.azarenkov@exoplatform.com">Gennady
* Azarenkov</a>
@@ -61,6 +65,14 @@
this.sameNameSiblings = sameNameSiblings;
}
+ public NodeDefinitionValue(NodeDefinition nodeDefinition)
+ {
+ super(nodeDefinition);
+ this.defaultNodeTypeName = ((NodeDefinitionImpl)nodeDefinition).getDefaultPrimaryTypeName();
+ this.requiredNodeTypeNames = Arrays.asList(((NodeDefinitionImpl)nodeDefinition).getRequiredPrimaryTypeNames());
+ this.sameNameSiblings = nodeDefinition.allowsSameNameSiblings();
+ }
+
/**
* @return Returns the defaultNodeTypeName.
*/
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeData.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeData.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeData.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -1,175 +1,103 @@
-/*
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.exoplatform.services.jcr.core.nodetype;
-
-import org.exoplatform.services.jcr.datamodel.InternalQName;
-
-import java.util.Arrays;
-
-/**
- * Created by The eXo Platform SAS. Define base abstraction for NodeType data
- * used in core. <br/>Date: 25.11.2008
- *
- * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter
- * Nedonosko</a>
- * @version $Id: NodeTypeData.java 34801 2009-07-31 15:44:50Z dkatayev $
- */
-
-public class NodeTypeData
-{
- protected InternalQName name;
-
- protected InternalQName primaryItemName;
-
- protected InternalQName[] declaredSupertypeNames;
-
- protected PropertyDefinitionData[] declaredPropertyDefinitions;
-
- protected NodeDefinitionData[] declaredChildNodeDefinitions;
-
- protected boolean hasOrderableChildNodes;
-
- protected boolean mixin;
-
- public NodeTypeData(InternalQName name, InternalQName primaryItemName, boolean mixin,
- boolean hasOrderableChildNodes, InternalQName[] declaredSupertypeNames,
- PropertyDefinitionData[] declaredPropertyDefinitions, NodeDefinitionData[] declaredChildNodeDefinitions)
- {
-
- this.name = name;
- this.primaryItemName = primaryItemName;
- this.mixin = mixin;
- this.hasOrderableChildNodes = hasOrderableChildNodes;
- this.declaredSupertypeNames = declaredSupertypeNames;
- this.declaredPropertyDefinitions = declaredPropertyDefinitions;
- this.declaredChildNodeDefinitions = declaredChildNodeDefinitions;
- }
-
- public NodeDefinitionData[] getDeclaredChildNodeDefinitions()
- {
- return declaredChildNodeDefinitions;
- }
-
- public PropertyDefinitionData[] getDeclaredPropertyDefinitions()
- {
- return declaredPropertyDefinitions;
- }
-
- @Override
- public int hashCode()
- {
- final int prime = 31;
- int result = 1;
- result = prime * result + Arrays.hashCode(declaredChildNodeDefinitions);
- result = prime * result + Arrays.hashCode(declaredPropertyDefinitions);
- result = prime * result + Arrays.hashCode(declaredSupertypeNames);
- result = prime * result + (hasOrderableChildNodes ? 1231 : 1237);
- result = prime * result + (mixin ? 1231 : 1237);
- result = prime * result + ((name == null) ? 0 : name.hashCode());
- result = prime * result + ((primaryItemName == null) ? 0 : primaryItemName.hashCode());
- return result;
- }
-
- @Override
- public boolean equals(Object obj)
- {
- if (this == obj)
- {
- return true;
- }
- if (obj == null)
- {
- return false;
- }
- if (getClass() != obj.getClass())
- {
- return false;
- }
- NodeTypeData other = (NodeTypeData)obj;
- if (!Arrays.equals(declaredChildNodeDefinitions, other.declaredChildNodeDefinitions))
- {
- return false;
- }
- if (!Arrays.equals(declaredPropertyDefinitions, other.declaredPropertyDefinitions))
- {
- return false;
- }
- if (!Arrays.equals(declaredSupertypeNames, other.declaredSupertypeNames))
- {
- return false;
- }
- if (hasOrderableChildNodes != other.hasOrderableChildNodes)
- {
- return false;
- }
- if (mixin != other.mixin)
- {
- return false;
- }
- if (name == null)
- {
- if (other.name != null)
- {
- return false;
- }
- }
- else if (!name.equals(other.name))
- {
- return false;
- }
- if (primaryItemName == null)
- {
- if (other.primaryItemName != null)
- {
- return false;
- }
- }
- else if (!primaryItemName.equals(other.primaryItemName))
- {
- return false;
- }
- return true;
- }
-
- public InternalQName[] getDeclaredSupertypeNames()
- {
- return declaredSupertypeNames;
- }
-
- public InternalQName getPrimaryItemName()
- {
- return primaryItemName;
- }
-
- public InternalQName getName()
- {
- return name;
- }
-
- public boolean hasOrderableChildNodes()
- {
- return hasOrderableChildNodes;
- }
-
- public boolean isMixin()
- {
- return mixin;
- }
-
-}
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.core.nodetype;
+
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeReadException;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $
+ *
+ */
+public interface NodeTypeData
+{
+
+// /**
+// * @return the isAbstract
+// */
+// public boolean isAbstract();
+
+ /**
+ *
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ */
+ public NodeDefinitionData[] getDeclaredChildNodeDefinitions();;
+
+ /**
+ *
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ */
+ public PropertyDefinitionData[] getDeclaredPropertyDefinitions();
+
+ /**
+ *
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ */
+ public InternalQName[] getDeclaredSupertypeNames();
+
+ /**
+ *
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ */
+ public InternalQName getPrimaryItemName();
+
+ /**
+ *
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ */
+ public InternalQName getName();
+
+ /**
+ *
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ */
+ public boolean hasOrderableChildNodes();
+
+ /**
+ *
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ */
+ public boolean isMixin();
+
+// /**
+// *
+// * @return
+// * @throws RepositoryException
+// * @throws NodeTypeReadException
+// */
+// public boolean isQueryable();
+
+}
\ No newline at end of file
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataImpl.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.core.nodetype;
+
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+
+import java.util.Arrays;
+
+/**
+ * Created by The eXo Platform SAS. Define base abstraction for NodeType data
+ * used in core. <br/>
+ * Date: 25.11.2008
+ *
+ * @author <a href="mailto:peter.nedonosko@exoplatform.com.ua">Peter
+ * Nedonosko</a>
+ * @version $Id: NodeTypeData.java 27741 2009-02-02 16:59:51Z ksm $
+ */
+
+public class NodeTypeDataImpl implements NodeTypeData
+{
+ protected InternalQName name;
+
+ protected InternalQName primaryItemName;
+
+ protected InternalQName[] declaredSupertypeNames;
+
+ protected PropertyDefinitionData[] declaredPropertyDefinitions;
+
+ protected NodeDefinitionData[] declaredChildNodeDefinitions;
+
+ protected Boolean hasOrderableChildNodes;
+
+ protected Boolean mixin;
+
+ // protected Boolean isAbstract;
+
+// /**
+// * Default true.
+// */
+// protected boolean isQueryable;
+
+ public NodeTypeDataImpl(InternalQName name, InternalQName primaryItemName, boolean mixin,
+ boolean hasOrderableChildNodes, InternalQName[] declaredSupertypeNames,
+ PropertyDefinitionData[] declaredPropertyDefinitions, NodeDefinitionData[] declaredChildNodeDefinitions)
+ {
+
+ this.name = name;
+ this.primaryItemName = primaryItemName;
+ this.mixin = mixin;
+ this.hasOrderableChildNodes = hasOrderableChildNodes;
+ //this.isAbstract = isAbstract;
+ //this.isQueryable = isQueryable;
+ this.declaredSupertypeNames = declaredSupertypeNames;
+ this.declaredPropertyDefinitions = declaredPropertyDefinitions;
+ this.declaredChildNodeDefinitions = declaredChildNodeDefinitions;
+ }
+//
+// /**
+// * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#isAbstract()
+// */
+// public boolean isAbstract()
+// {
+// return isAbstract;
+// }
+
+ /**
+ * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#getDeclaredChildNodeDefinitions()
+ */
+ public NodeDefinitionData[] getDeclaredChildNodeDefinitions()
+ {
+ return declaredChildNodeDefinitions;
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#getDeclaredPropertyDefinitions()
+ */
+ public PropertyDefinitionData[] getDeclaredPropertyDefinitions()
+ {
+ return declaredPropertyDefinitions;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + Arrays.hashCode(declaredChildNodeDefinitions);
+ result = prime * result + Arrays.hashCode(declaredPropertyDefinitions);
+ result = prime * result + Arrays.hashCode(declaredSupertypeNames);
+ result = prime * result + (hasOrderableChildNodes ? 1231 : 1237);
+ result = prime * result + (mixin ? 1231 : 1237);
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + ((primaryItemName == null) ? 0 : primaryItemName.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (getClass() != obj.getClass())
+ {
+ return false;
+ }
+ NodeTypeDataImpl other = (NodeTypeDataImpl)obj;
+ if (!Arrays.deepEquals(declaredChildNodeDefinitions, other.declaredChildNodeDefinitions))
+ {
+ return false;
+ }
+ if (!Arrays.deepEquals(declaredPropertyDefinitions, other.declaredPropertyDefinitions))
+ {
+ return false;
+ }
+ if (!Arrays.deepEquals(declaredSupertypeNames, other.declaredSupertypeNames))
+ {
+ return false;
+ }
+ if (hasOrderableChildNodes != other.hasOrderableChildNodes)
+ {
+ return false;
+ }
+ if (mixin != other.mixin)
+ {
+ return false;
+ }
+ if (name == null)
+ {
+ if (other.name != null)
+ {
+ return false;
+ }
+ }
+ else if (!name.equals(other.name))
+ {
+ return false;
+ }
+ if (primaryItemName == null)
+ {
+ if (other.primaryItemName != null)
+ {
+ return false;
+ }
+ }
+ else if (!primaryItemName.equals(other.primaryItemName))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#getDeclaredSupertypeNames()
+ */
+ public InternalQName[] getDeclaredSupertypeNames()
+ {
+ return declaredSupertypeNames;
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#getPrimaryItemName()
+ */
+ public InternalQName getPrimaryItemName()
+ {
+ return primaryItemName;
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#getName()
+ */
+ public InternalQName getName()
+ {
+ return name;
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#hasOrderableChildNodes()
+ */
+ public boolean hasOrderableChildNodes()
+ {
+ return hasOrderableChildNodes;
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#isMixin()
+ */
+ public boolean isMixin()
+ {
+ return mixin;
+ }
+
+// /**
+// * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeData#isQueryable()
+// */
+// public boolean isQueryable()
+// {
+// return isQueryable;
+// }
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataImpl.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -18,17 +18,17 @@
*/
package org.exoplatform.services.jcr.core.nodetype;
-import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
-import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.NodeData;
import java.io.InputStream;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.ConstraintViolationException;
/**
* Created by The eXo Platform SAS. <br/>
@@ -43,47 +43,25 @@
{
/**
- * Returns all supertypes of this node type in the node type inheritance
- * hierarchy. For primary types apart from <code>nt:base</code>, this list
- * will always include at least <code>nt:base</code>. For mixin types, there
- * is no required supertype.
+ * The standard XML content type to be used with XML-formatted node type
+ * streams.
*/
- public Set<InternalQName> getSupertypes(final InternalQName nodeTypeName);
+ String TEXT_XML = "text/xml";
- //void addQueryHandler(QueryHandler queryHandler);
-
/**
- * @param nodeName
- * @param nodeTypeNames
- * @return
+ * The experimental content type for the compact node type definition files.
*/
- NodeDefinitionData findChildNodeDefinition(InternalQName nodeName, InternalQName... nodeTypeNames);
+ String TEXT_X_JCR_CND = "text/x-jcr-cnd";
/**
- * @param nodeName
- * @param primaryNodeType
- * @param mixinTypes
- * @return
+ * Returns all supertypes of this node type in the node type inheritance
+ * hierarchy. For primary types apart from <code>nt:base</code>, this list
+ * will always include at least <code>nt:base</code>. For mixin types, there
+ * is no required supertype.
*/
- NodeDefinitionData findChildNodeDefinition(InternalQName nodeName, InternalQName primaryNodeType,
- InternalQName[] mixinTypes);
+ public Set<InternalQName> getSupertypes(final InternalQName nodeTypeName);
/**
- * @param typeName
- * @return
- */
- NodeTypeData findNodeType(InternalQName typeName);
-
- /**
- * @param propertyName
- * @param primaryNodeType
- * @param mixinTypes
- * @return
- */
- PropertyDefinitionDatas findPropertyDefinitions(InternalQName propertyName, InternalQName primaryNodeType,
- InternalQName[] mixinTypes);
-
- /**
* @param nodeTypeNames
* @return
*/
@@ -105,14 +83,23 @@
/**
* @param nodeName
- * @param nodeTypeName
- * @param parentTypeName
+ * @param nodeTypeNames
* @return
+ * @throws RepositoryException
*/
- NodeDefinitionData getChildNodeDefinition(InternalQName nodeName, InternalQName nodeTypeName,
- InternalQName parentTypeName);
+ NodeDefinitionData getChildNodeDefinition(InternalQName nodeName, InternalQName... nodeTypeNames)
+ throws RepositoryException;
/**
+ * @param nodeName
+ * @param primaryNodeType
+ * @param mixinTypes
+ * @return
+ */
+ NodeDefinitionData getChildNodeDefinition(InternalQName nodeName, InternalQName primaryNodeType,
+ InternalQName[] mixinTypes) throws RepositoryException;
+
+ /**
* Returns the <i>direct</i> subtypes of this node type in the node type
* inheritance hierarchy, that is, those which actually declared this node
* type in their list of supertypes.
@@ -126,31 +113,40 @@
* @param mixinTypes
* @return
*/
- List<ItemDefinitionData> getManadatoryItemDefs(InternalQName primaryNodeType, InternalQName[] mixinTypes);
+ List<ItemDefinitionData> getManadatoryItemDefs(InternalQName primaryNodeType, InternalQName[] mixinTypes)
+ throws RepositoryException;
+ // /**
+ // * @param nodeName
+ // * @param nodeTypeName
+ // * @param parentTypeName
+ // * @return
+ // */
+ // NodeDefinitionData getChildNodeDefinition(InternalQName nodeName, InternalQName nodeTypeName,
+ // InternalQName parentTypeName) throws RepositoryException;
+
/**
- * @param name
+ * @param typeName
* @return
- * @throws RepositoryException
*/
- Set<String> getNodes(InternalQName name) throws RepositoryException;
+ NodeTypeData getNodeType(InternalQName typeName);
/**
- * @param name
- * @param internalQNames
- * @param internalQNames2
+ * @param propertyName
+ * @param nodeTypeNames
* @return
- * @throws RepositoryException
*/
- Set<String> getNodes(InternalQName name, InternalQName[] includeProperties, InternalQName[] excludeProperties)
+ PropertyDefinitionDatas getPropertyDefinitions(InternalQName propertyName, InternalQName... nodeTypeNames)
throws RepositoryException;
/**
* @param propertyName
- * @param nodeTypeNames
+ * @param primaryNodeType
+ * @param mixinTypes
* @return
*/
- PropertyDefinitionDatas getPropertyDefinitions(InternalQName propertyName, InternalQName... nodeTypeNames);
+ PropertyDefinitionDatas getPropertyDefinitions(InternalQName propertyName, InternalQName primaryNodeType,
+ InternalQName[] mixinTypes) throws RepositoryException;
/**
* Returns all subtypes of this node type in the node type inheritance
@@ -168,7 +164,7 @@
* @return
*/
boolean isChildNodePrimaryTypeAllowed(InternalQName childNodeTypeName, InternalQName parentNodeType,
- InternalQName[] parentMixinNames);
+ InternalQName[] parentMixinNames) throws RepositoryException;
/**
* @param testTypeName
@@ -190,40 +186,7 @@
* @param mixinTypes
* @return
*/
- boolean isOrderableChildNodesSupported(InternalQName primaryNodeType, InternalQName[] mixinTypes);
-
- /**
- * Create PlainChangesLog of autocreated items to this node. No checks will be
- * passed for autocreated items.
- *
- * @throws RepositoryException
- */
- PlainChangesLog makeAutoCreatedItems(NodeData parent, InternalQName nodeTypeName, ItemDataConsumer dataManager,
- String owner) throws RepositoryException;
-
- /**
- * @param nodeData
- * @param name
- * @param nodeDefinitionDatas
- * @param persister
- * @param owner
- * @return
- * @throws RepositoryException
- */
- ItemStateChangesLog makeAutoCreatedNodes(NodeData nodeData, InternalQName name,
- NodeDefinitionData[] nodeDefinitionDatas, ItemDataConsumer dataManager, String owner) throws RepositoryException;
-
- /**
- * @param nodeData
- * @param name
- * @param propertyDefinitionDatas
- * @param persister
- * @param owner
- * @return
- * @throws RepositoryException
- */
- PlainChangesLog makeAutoCreatedProperties(NodeData nodeData, InternalQName name,
- PropertyDefinitionData[] propertyDefinitionDatas, ItemDataConsumer dataManager, String owner)
+ boolean isOrderableChildNodesSupported(InternalQName primaryNodeType, InternalQName[] mixinTypes)
throws RepositoryException;
/**
@@ -232,7 +195,8 @@
* @return
* @throws RepositoryException
*/
- List<NodeTypeData> registerNodeTypes(InputStream xml, int alreadyExistsBehaviour) throws RepositoryException;
+ List<NodeTypeData> registerNodeTypes(InputStream xml, int alreadyExistsBehaviour, String contentType)
+ throws RepositoryException;
/**
* @param ntValues
@@ -244,8 +208,22 @@
throws RepositoryException;
/**
+ * Changes the primary node type of this node to nodeTypeName.
+ *
+ * @param nodeData
* @param nodeTypeName
+ * @return
* @throws RepositoryException
*/
+ PlainChangesLog setPrimaryType(NodeData nodeData, InternalQName nodeTypeName) throws RepositoryException;
+
+ /**
+ * @param nodeTypeName
+ * @throws RepositoryException
+ */
void unregisterNodeType(InternalQName nodeTypeName) throws RepositoryException;
+
+ PlainChangesLog updateNodeType(NodeTypeData ancestorDefinition, NodeTypeData recipientDefinition,
+ Map<InternalQName, NodeTypeData> volatileNodeTypes) throws ConstraintViolationException, RepositoryException;
+
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -44,8 +44,8 @@
import org.exoplatform.services.jcr.impl.core.access.DefaultAccessManagerImpl;
import org.exoplatform.services.jcr.impl.core.lock.LockManagerImpl;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeDataManagerImpl;
-import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeDataPersister;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.JcrNodeTypeDataPersister;
import org.exoplatform.services.jcr.impl.core.observation.ObservationManagerRegistry;
import org.exoplatform.services.jcr.impl.core.query.QueryManagerFactory;
import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder;
@@ -570,7 +570,8 @@
}
if (log.isDebugEnabled())
log.debug("Trying register node types from xml-file " + nodeTypeFilesName);
- ntManager.registerNodeTypes(inXml, ExtendedNodeTypeManager.IGNORE_IF_EXISTS);
+ ntManager.registerNodeTypes(inXml, ExtendedNodeTypeManager.IGNORE_IF_EXISTS,
+ NodeTypeDataManager.TEXT_XML);
if (log.isDebugEnabled())
log.debug("Node types is registered from xml-file " + nodeTypeFilesName);
}
@@ -590,7 +591,8 @@
throw new RepositoryException(e);
}
log.info("Trying register node types (" + this.getName() + ") from xml-file " + nodeTypeFilesName);
- ntManager.registerNodeTypes(inXml, ExtendedNodeTypeManager.IGNORE_IF_EXISTS);
+ ntManager.registerNodeTypes(inXml, ExtendedNodeTypeManager.IGNORE_IF_EXISTS,
+ NodeTypeDataManager.TEXT_XML);
log.info("Node types is registered (" + this.getName() + ") from xml-file " + nodeTypeFilesName);
}
}
@@ -605,21 +607,24 @@
registerComponentImplementation(RepositoryIndexSearcherHolder.class);
- registerComponentImplementation(NamespaceDataPersister.class);
- registerComponentImplementation(NamespaceRegistryImpl.class);
-
- addNamespaces();
-
registerComponentImplementation(WorkspaceFileCleanerHolder.class);
registerComponentImplementation(LocationFactory.class);
registerComponentImplementation(ValueFactoryImpl.class);
- registerComponentImplementation(NodeTypeDataPersister.class);
+
+ registerComponentImplementation(JcrNodeTypeDataPersister.class);
+ registerComponentImplementation(NamespaceDataPersister.class);
+ registerComponentImplementation(NamespaceRegistryImpl.class);
+
registerComponentImplementation(NodeTypeManagerImpl.class);
registerComponentImplementation(NodeTypeDataManagerImpl.class);
-
+
+
+ //node types first
+ addNamespaces();
registerNodeTypes();
-
+
+
registerComponentImplementation(DefaultAccessManagerImpl.class);
registerComponentImplementation(SessionRegistry.class);
@@ -670,14 +675,23 @@
*/
private void load() throws RepositoryException
{
- NamespaceRegistryImpl nsRegistry = (NamespaceRegistryImpl)getNamespaceRegistry();
- NodeTypeDataPersister nodeTypeDataPersister =
- (NodeTypeDataPersister)getComponentInstanceOfType(NodeTypeDataPersister.class);
+ JcrNodeTypeDataPersister nodeTypePersister =
+ (JcrNodeTypeDataPersister)this.getComponentInstanceOfType(JcrNodeTypeDataPersister.class);
+ NamespaceDataPersister namespacePersister =
+ (NamespaceDataPersister)this.getComponentInstanceOfType(NamespaceDataPersister.class);
// Load from persistence
- nsRegistry.loadFromStorage();
- nodeTypeDataPersister.loadFromStorage();
+ nodeTypePersister.start();
+ namespacePersister.start();
+
+ NamespaceRegistryImpl nsRegistry = (NamespaceRegistryImpl)getNamespaceRegistry();
+ NodeTypeDataManagerImpl ntManager =
+ (NodeTypeDataManagerImpl)this.getComponentInstanceOfType(NodeTypeDataManagerImpl.class);
+ // initialize internal components.
+ nsRegistry.start();
+ ntManager.start();
+
}
/**
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/ItemImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -417,7 +417,7 @@
return nullProperty;
}
defs =
- ntm.findPropertyDefinitions(propertyName, parentData.getPrimaryTypeName(), parentData.getMixinTypeNames());
+ ntm.getPropertyDefinitions(propertyName, parentData.getPrimaryTypeName(), parentData.getMixinTypeNames());
state = ItemState.ADDED;
}
@@ -426,7 +426,7 @@
oldProp = (PropertyImpl)oldItem;
isMultiValue = oldProp.isMultiValued();
defs =
- ntm.findPropertyDefinitions(propertyName, parentData.getPrimaryTypeName(), parentData.getMixinTypeNames());
+ ntm.getPropertyDefinitions(propertyName, parentData.getPrimaryTypeName(), parentData.getMixinTypeNames());
identifier = oldProp.getInternalIdentifier();
version = oldProp.getData().getPersistedVersion();
@@ -725,10 +725,10 @@
NodeTypeData[] nodeTypes = new NodeTypeData[mixinNames.length + 1];
NodeTypeDataManager ntm = session.getWorkspace().getNodeTypesHolder();
- nodeTypes[0] = ntm.findNodeType(primaryTypeName);
+ nodeTypes[0] = ntm.getNodeType(primaryTypeName);
for (int i = 1; i <= mixinNames.length; i++)
{
- nodeTypes[i] = ntm.findNodeType(mixinNames[i - 1]);
+ nodeTypes[i] = ntm.getNodeType(mixinNames[i - 1]);
}
return nodeTypes;
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceDataPersister.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceDataPersister.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceDataPersister.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -20,9 +20,13 @@
import org.exoplatform.services.jcr.access.AccessControlEntry;
import org.exoplatform.services.jcr.access.AccessControlList;
+import org.exoplatform.services.jcr.access.AccessControlPolicy;
+import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.core.ComponentPersister;
import org.exoplatform.services.jcr.core.ExtendedPropertyType;
import org.exoplatform.services.jcr.dataflow.DataManager;
import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
import org.exoplatform.services.jcr.dataflow.TransactionChangesLog;
@@ -45,130 +49,38 @@
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import javax.jcr.InvalidItemStateException;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
/**
* Created by The eXo Platform SAS.
*
- * @author <a href="mailto:gennady.azarenkov@exoplatform.com">Gennady Azarenkov</a>
- * @version $Id: NamespaceDataPersister.java 13962 2008-05-07 16:00:48Z pnedonosko $
+ * @author <a href="mailto:gennady.azarenkov@exoplatform.com">Gennady
+ * Azarenkov</a>
+ * @version $Id: NamespaceDataPersister.java 13962 2008-05-07 16:00:48Z
+ * pnedonosko $
*/
-public class NamespaceDataPersister
+public class NamespaceDataPersister implements ComponentPersister
{
- public static Log log = ExoLogger.getLogger("jcr.NamespaceDataPersister");
+ public static Log log = ExoLogger.getLogger(NamespaceDataPersister.class.getName());
- private DataManager dataManager;
+ private final DataManager dataManager;
- private PlainChangesLog changesLog;
-
private NodeData nsRoot;
- public NamespaceDataPersister(DataManager dataManager)
- {
- this.dataManager = dataManager;
- this.changesLog = new PlainChangesLogImpl();
- try
- {
- NodeData jcrSystem = (NodeData)dataManager.getItemData(Constants.SYSTEM_UUID);
- if (jcrSystem != null)
- this.nsRoot = (NodeData)dataManager.getItemData(jcrSystem, new QPathEntry(Constants.EXO_NAMESPACES, 1));
- }
- catch (RepositoryException e)
- {
- log.warn("Namespace storage (/jcr:system/exo:namespaces node) is not initialized");
- }
- }
+ private final RepositoryEntry repConfig;
- DataManager getDataManager()
- {
- return dataManager;
- }
+ private boolean started = false;
- /**
- * Creates namespaces storage and fill it with given namespaces.
- *
- * @param nsSystem
- * @param addACL
- * @param namespaces
- * @throws RepositoryException
- */
- public void initStorage(NodeData nsSystem, boolean addACL, Map<String, String> namespaces)
- throws RepositoryException
+ public NamespaceDataPersister(DataManager dataManager, RepositoryEntry repConfig) throws RepositoryException
{
-
- TransientNodeData exoNamespaces =
- TransientNodeData.createNodeData(nsSystem, Constants.EXO_NAMESPACES, Constants.NT_UNSTRUCTURED);
-
- TransientPropertyData primaryType =
- TransientPropertyData.createPropertyData(exoNamespaces, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false);
- primaryType.setValue(new TransientValueData(exoNamespaces.getPrimaryTypeName()));
-
- changesLog.add(ItemState.createAddedState(exoNamespaces)).add(ItemState.createAddedState(primaryType));
-
- if (addACL)
- {
- AccessControlList acl = new AccessControlList();
-
- InternalQName[] mixins = new InternalQName[]{Constants.EXO_OWNEABLE, Constants.EXO_PRIVILEGEABLE};
- exoNamespaces.setMixinTypeNames(mixins);
-
- // jcr:mixinTypes
- List<ValueData> mixValues = new ArrayList<ValueData>();
- for (InternalQName mixin : mixins)
- {
- mixValues.add(new TransientValueData(mixin));
- }
- TransientPropertyData exoMixinTypes =
- TransientPropertyData.createPropertyData(exoNamespaces, Constants.JCR_MIXINTYPES, PropertyType.NAME, true,
- mixValues);
-
- TransientPropertyData exoOwner =
- TransientPropertyData.createPropertyData(exoNamespaces, Constants.EXO_OWNER, PropertyType.STRING, false,
- new TransientValueData(acl.getOwner()));
-
- List<ValueData> permsValues = new ArrayList<ValueData>();
- for (int i = 0; i < acl.getPermissionEntries().size(); i++)
- {
- AccessControlEntry entry = acl.getPermissionEntries().get(i);
- permsValues.add(new TransientValueData(entry));
- }
- TransientPropertyData exoPerms =
- TransientPropertyData.createPropertyData(exoNamespaces, Constants.EXO_PERMISSIONS,
- ExtendedPropertyType.PERMISSION, true, permsValues);
-
- changesLog.add(ItemState.createAddedState(exoMixinTypes)).add(ItemState.createAddedState(exoOwner)).add(
- ItemState.createAddedState(exoPerms));
- changesLog.add(new ItemState(exoNamespaces, ItemState.MIXIN_CHANGED, false, null));
- }
-
- nsRoot = exoNamespaces;
-
- Iterator<String> i = namespaces.keySet().iterator();
- while (i.hasNext())
- {
- String nsKey = i.next();
- if (nsKey != null)
- {
- if (log.isDebugEnabled())
- log.debug("Namespace " + nsKey + " " + namespaces.get(nsKey));
- addNamespace(nsKey, namespaces.get(nsKey));
- if (log.isDebugEnabled())
- log.debug("Namespace " + nsKey + " is initialized.");
- }
- else
- {
- log.warn("Namespace is " + nsKey + " " + namespaces.get(nsKey));
- }
- }
- saveChanges();
+ this.dataManager = dataManager;
+ this.repConfig = repConfig;
}
/**
@@ -183,13 +95,21 @@
*/
public void addNamespace(String prefix, String uri) throws RepositoryException
{
-
- if (!isInialized())
+ if (!started)
{
- log.warn("Namespace storage (/jcr:system/exo:namespaces node) is not initialized");
+ if(log.isDebugEnabled())
+ log.debug("Unable save namespace " + uri + "=" + prefix + " in to the storage. Storage not initialized");
return;
}
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+ internallAdd(changesLog, prefix, uri);
+ dataManager.save(new TransactionChangesLog(changesLog));
+
+ }
+
+ private PlainChangesLog internallAdd(PlainChangesLog changesLog, String prefix, String uri)
+ {
TransientNodeData nsNode =
TransientNodeData.createNodeData(nsRoot, new InternalQName("", prefix), Constants.EXO_NAMESPACE);
@@ -207,17 +127,65 @@
changesLog.add(ItemState.createAddedState(nsNode)).add(ItemState.createAddedState(primaryType)).add(
ItemState.createAddedState(exoUri)).add(ItemState.createAddedState(exoPrefix));
+ return changesLog;
+ }
+ /**
+ * Add new namespace.
+ *
+ * @param prefix NS prefix
+ * @param uri NS URI
+ * @throws RepositoryException Repository error
+ */
+ public void addNamespaces(Map<String, String> namespaceMap) throws RepositoryException
+ {
+ if (!started)
+ {
+ log.warn("Unable save namespaces in to the storage. Storage not initialized");
+ return;
+ }
+
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+ for (Map.Entry<String, String> entry : namespaceMap.entrySet())
+ {
+ String prefix = entry.getKey();
+ String uri = entry.getValue();
+
+ if (prefix != null)
+ {
+ if (log.isDebugEnabled())
+ log.debug("Namespace " + uri + ":" + prefix);
+ internallAdd(changesLog, prefix, uri);
+ }
+ }
+ dataManager.save(new TransactionChangesLog(changesLog));
+
}
+ public boolean isStorageFilled()
+ {
+ try
+ {
+ List<NodeData> storageContent = dataManager.getChildNodesData(nsRoot);
+ return storageContent.size() > 0;
+ }
+ catch (RepositoryException e)
+ {
+ log.error(e.getLocalizedMessage(), e);
+
+ }
+ return false;
+ }
+
public void removeNamespace(String prefix) throws RepositoryException
{
- if (!isInialized())
+ if (!started)
{
- log.warn("Namespace storage (/jcr:system/exo:namespaces node) is not initialized");
+ log.warn("Unable remove namspace "+prefix+" from the storage. Storage not initialized");
return;
}
+
PlainChangesLogImpl plainChangesLogImpl = new PlainChangesLogImpl();
ItemData prefData = dataManager.getItemData(nsRoot, new QPathEntry(new InternalQName("", prefix), 0));
@@ -237,9 +205,60 @@
}
- dataManager.save(new TransactionChangesLog(plainChangesLogImpl));
+ dataManager.save(new TransactionChangesLog(plainChangesLogImpl));
+
}
+ /**
+ * {@inheritDoc}
+ */
+ public void start()
+ {
+ if (!started)
+ {
+ try
+ {
+ NodeData jcrSystem = (NodeData)dataManager.getItemData(Constants.SYSTEM_UUID);
+ if (jcrSystem != null)
+ {
+ NodeData exoNamespaces =
+ (NodeData)dataManager.getItemData(jcrSystem, new QPathEntry(Constants.EXO_NAMESPACES, 1));
+ if (exoNamespaces == null)
+ {
+ initStorage(jcrSystem, !repConfig.getAccessControl().equals(AccessControlPolicy.DISABLE));
+ this.nsRoot =
+ (NodeData)dataManager.getItemData(jcrSystem, new QPathEntry(Constants.EXO_NAMESPACES, 1));
+ }
+ else
+ {
+ this.nsRoot = exoNamespaces;
+ }
+ }
+ else
+ {
+ throw new RepositoryException("Nodetypes storage (/jcr:systemnode) is not initialized.");
+
+ }
+ }
+ catch (RepositoryException e)
+ {
+ throw new RuntimeException(e.getLocalizedMessage(), e);
+ }
+
+ started = true;
+ }
+ }
+
+ public void stop()
+ {
+ }
+
+ @Deprecated
+ DataManager getDataManager()
+ {
+ return dataManager;
+ }
+
void loadNamespaces(Map<String, String> namespacesMap, Map<String, String> urisMap) throws RepositoryException
{
@@ -294,17 +313,7 @@
log.warn("Namespace storage (/jcr:system/exo:namespaces node) is not initialized. No namespaces loaded.");
}
- void saveChanges() throws RepositoryException, InvalidItemStateException
- {
- dataManager.save(new TransactionChangesLog(changesLog));
- changesLog = new PlainChangesLogImpl();
- }
- private boolean isInialized()
- {
- return nsRoot != null;
- }
-
/**
* Copy <code>PropertyData prop<code> to new TransientItemData
*
@@ -336,4 +345,71 @@
newData.setValues(values);
return newData;
}
+
+ /**
+ * Creates namespaces storage and fill it with given namespaces.
+ *
+ * @param nsSystem
+ * @param addACL
+ * @param namespaces
+ * @throws RepositoryException
+ */
+ private void initStorage(NodeData nsSystem, boolean addACL) throws RepositoryException
+ {
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+ TransientNodeData exoNamespaces =
+ TransientNodeData.createNodeData(nsSystem, Constants.EXO_NAMESPACES, Constants.NT_UNSTRUCTURED);
+
+ TransientPropertyData primaryType =
+ TransientPropertyData.createPropertyData(exoNamespaces, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false);
+ primaryType.setValue(new TransientValueData(exoNamespaces.getPrimaryTypeName()));
+
+ changesLog.add(ItemState.createAddedState(exoNamespaces)).add(ItemState.createAddedState(primaryType));
+
+ if (addACL)
+ {
+ AccessControlList acl = new AccessControlList();
+
+ InternalQName[] mixins = new InternalQName[]{Constants.EXO_OWNEABLE, Constants.EXO_PRIVILEGEABLE};
+ exoNamespaces.setMixinTypeNames(mixins);
+
+ // jcr:mixinTypes
+ List<ValueData> mixValues = new ArrayList<ValueData>();
+ for (InternalQName mixin : mixins)
+ {
+ mixValues.add(new TransientValueData(mixin));
+ }
+ TransientPropertyData exoMixinTypes =
+ TransientPropertyData.createPropertyData(exoNamespaces, Constants.JCR_MIXINTYPES, PropertyType.NAME, true,
+ mixValues);
+
+ TransientPropertyData exoOwner =
+ TransientPropertyData.createPropertyData(exoNamespaces, Constants.EXO_OWNER, PropertyType.STRING, false,
+ new TransientValueData(acl.getOwner()));
+
+ List<ValueData> permsValues = new ArrayList<ValueData>();
+ for (int i = 0; i < acl.getPermissionEntries().size(); i++)
+ {
+ AccessControlEntry entry = acl.getPermissionEntries().get(i);
+ permsValues.add(new TransientValueData(entry));
+ }
+ TransientPropertyData exoPerms =
+ TransientPropertyData.createPropertyData(exoNamespaces, Constants.EXO_PERMISSIONS,
+ ExtendedPropertyType.PERMISSION, true, permsValues);
+
+ changesLog.add(ItemState.createAddedState(exoMixinTypes)).add(ItemState.createAddedState(exoOwner)).add(
+ ItemState.createAddedState(exoPerms));
+ changesLog.add(new ItemState(exoNamespaces, ItemState.MIXIN_CHANGED, false, null));
+ }
+
+ nsRoot = exoNamespaces;
+ dataManager.save(new TransactionChangesLog(changesLog));
+ }
+
+ // TODO remove me
+ @Deprecated
+ private boolean isInialized()
+ {
+ return nsRoot != null;
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceRegistryImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceRegistryImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceRegistryImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -23,6 +23,7 @@
import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
+import org.picocontainer.Startable;
import java.io.IOException;
import java.util.HashMap;
@@ -41,7 +42,7 @@
* @version $Id: NamespaceRegistryImpl.java 11907 2008-03-13 15:36:21Z ksm $
*/
-public class NamespaceRegistryImpl implements ExtendedNamespaceRegistry
+public class NamespaceRegistryImpl implements ExtendedNamespaceRegistry, Startable
{
public static final Map<String, String> DEF_NAMESPACES = new HashMap<String, String>();
@@ -52,6 +53,7 @@
protected final static Log log = ExoLogger.getLogger("jcr.NamespaceRegistryImpl");
+ private boolean started = false;
static
{
@@ -88,39 +90,36 @@
}
- private Map<String, String> namespaces;
+ private final DataManager dataManager;
- private NamespaceDataPersister persister;
+ private final RepositoryIndexSearcherHolder indexSearcherHolder;
- private Map<String, String> prefixes;
+ private final Map<String, String> namespaces;
- // private HashSet<QueryHandler> queryHandlers;
+ private final Map<String, String> prefixes;
- private final RepositoryIndexSearcherHolder indexSearcherHolder;
+ private NamespaceDataPersister persister;
- // private final NodeTypeDataManager nodeTypeDataManager;
-
/**
* for tests.
*/
public NamespaceRegistryImpl()
{
- this.namespaces = DEF_NAMESPACES;
- this.prefixes = DEF_PREFIXES;
- this.indexSearcherHolder = new RepositoryIndexSearcherHolder();
- // this.queryHandlers = new HashSet<QueryHandler>();
- // this.nodeTypeDataManager = null;
+ this.namespaces = new HashMap<String, String>(DEF_NAMESPACES);
+ this.prefixes = new HashMap<String, String>(DEF_PREFIXES);
+ this.dataManager = null;
+ this.indexSearcherHolder = null;
}
- public NamespaceRegistryImpl(NamespaceDataPersister persister, RepositoryIndexSearcherHolder indexSearcherHolder)
+ public NamespaceRegistryImpl(NamespaceDataPersister persister, DataManager dataManager,
+ RepositoryIndexSearcherHolder indexSearcherHolder)
{
+ this.dataManager = dataManager;
this.indexSearcherHolder = indexSearcherHolder;
- // this.nodeTypeDataManager = nodeTypeDataManager;
this.namespaces = new HashMap<String, String>(DEF_NAMESPACES);
this.prefixes = new HashMap<String, String>(DEF_PREFIXES);
this.persister = persister;
- // this.queryHandlers = new HashSet<QueryHandler>();
}
/**
@@ -148,6 +147,22 @@
}
/**
+ * Return
+ *
+ * @param nodeType
+ * @return
+ * @throws RepositoryException
+ * @throws IOException
+ */
+ @Deprecated
+ public Set<String> getNodes(String uri) throws RepositoryException
+ {
+ validate();
+
+ return indexSearcherHolder.getNodesByUri(uri);
+ }
+
+ /**
* {@inheritDoc}
*/
public String getPrefix(String uri) throws NamespaceException
@@ -209,21 +224,6 @@
return prefixes.containsKey(uri);
}
- public void loadFromStorage() throws RepositoryException
- {
-
- try
- {
- persister.loadNamespaces(namespaces, prefixes);
- }
- catch (PathNotFoundException e)
- {
- log.info("Namespaces storage (/jcr:system/exo:namespaces) is not accessible."
- + " Default namespaces only will be used. " + e);
- return;
- }
- }
-
// //////////////////// NamespaceAccessor
/**
@@ -234,7 +234,6 @@
validateNamespace(prefix, uri);
- // if (namespaces.containsKey(prefix) || prefixes.containsKey(uri)) {
if (namespaces.containsKey(prefix))
{
unregisterNamespace(prefix);
@@ -243,17 +242,51 @@
{
unregisterNamespace(prefixes.get(uri));
}
+ if (persister != null)
+ {
+ persister.addNamespace(prefix, uri);
+ // persister.saveChanges();
+ }
+ final String newPrefix = new String(prefix);
+ final String newUri = new String(uri);
- persister.addNamespace(prefix, uri);
- persister.saveChanges();
-
- String newPrefix = new String(prefix);
- String newUri = new String(uri);
-
namespaces.put(newPrefix, newUri);
prefixes.put(newUri, newPrefix);
}
+ public void start()
+ {
+ if (!started)
+ {
+
+ // save default
+ if (persister != null)
+ {
+ // no save default
+ try
+ {
+ if (!persister.isStorageFilled())
+ {
+ persister.addNamespaces(DEF_NAMESPACES);
+ }
+ else
+ {
+ persister.loadNamespaces(namespaces, prefixes);
+ }
+ }
+ catch (final RepositoryException e)
+ {
+ throw new RuntimeException(e.getLocalizedMessage(), e);
+ }
+ }
+ started = true;
+ }
+ }
+
+ public void stop()
+ {
+ }
+
/**
* {@inheritDoc}
*/
@@ -269,37 +302,39 @@
{
throw new NamespaceException("Prefix " + prefix + " is protected");
}
-
- // throw new NamespaceException("Unregistration is not supported as"
- // + " may cause integrity problems. (todo issue #46)");
-
- Set<String> nodes = getNodes(prefix);
- if (nodes.size() > 0)
+ String uri = getURI(prefix);
+ if (indexSearcherHolder != null)
{
- StringBuffer buffer = new StringBuffer();
- buffer.append("Fail to unregister namespace");
- buffer.append(prefix);
- buffer.append(" because of following nodes: ");
- DataManager dm = persister.getDataManager();
- for (String uuid : nodes)
+ final Set<String> nodes = indexSearcherHolder.getNodesByUri(uri);
+ if (nodes.size() > 0)
{
- ItemData item = dm.getItemData(uuid);
- if (item != null && item.isNode())
- buffer.append(item.getQPath().getAsString());
+ StringBuffer buffer = new StringBuffer();
+ buffer.append("Fail to unregister namespace");
+ buffer.append(prefix);
+ buffer.append(" because of following nodes: ");
+
+ for (String uuid : nodes)
+ {
+ ItemData item = dataManager.getItemData(uuid);
+ if (item != null && item.isNode())
+ {
+ buffer.append(item.getQPath().getAsString());
+ }
+ }
+ buffer.append(" contains whese prefix ");
+ throw new NamespaceException(buffer.toString());
}
- buffer.append(" contains whese prefix ");
- throw new NamespaceException(buffer.toString());
}
-
- prefixes.remove(getURI(prefix));
+ prefixes.remove(uri);
namespaces.remove(prefix);
- persister.removeNamespace(prefix);
-
+ if (persister != null)
+ {
+ persister.removeNamespace(prefix);
+ }
}
public void validateNamespace(String prefix, String uri) throws NamespaceException, RepositoryException
{
-
if (prefix.indexOf(":") > 0)
{
throw new RepositoryException("Namespace prefix should not contain ':' " + prefix);
@@ -309,9 +344,9 @@
{
if (uri == null)
{
- throw new NamespaceException("Can not remove built-in namespace");
+ throw new NamespaceException("Can not remove built-in namespace " + prefix);
}
- throw new NamespaceException("Can not change built-in namespace");
+ throw new NamespaceException("Can not change built-in namespace " + prefix);
}
if (prefix.toLowerCase().startsWith("xml"))
{
@@ -323,134 +358,17 @@
}
}
- // public void addQueryHandler(QueryHandler queryHandler)
- // {
- // queryHandlers.add(queryHandler);
- // }
-
- /**
- * Return
- *
- * @param nodeType
- * @return
- * @throws RepositoryException
- * @throws IOException
- */
- public Set<String> getNodes(String prefix) throws RepositoryException
+ private void validate() throws RepositoryException
{
+ if (dataManager == null)
+ {
+ throw new RepositoryException("Datamanager not initialized");
+ }
+ if (indexSearcherHolder == null)
+ {
+ throw new RepositoryException("RepositoryIndexSearcherHolder not initialized");
+ }
- // LocationFactory locationFactory = new LocationFactory(this);
- // ValueFactoryImpl valueFactory = new ValueFactoryImpl(locationFactory);
- //
- // BooleanQuery query = new BooleanQuery();
- // // query.add(new MatchAllDocsQuery(), Occur.MUST);
- // // name of the node
- // query.add(new WildcardQuery(new Term(FieldNames.LABEL, prefix + ":*")), Occur.SHOULD);
- // // name of the property
- // query.add(new WildcardQuery(new Term(FieldNames.PROPERTIES_SET, prefix + ":*")), Occur.SHOULD);
- //
- // Set<String> result = getNodes(query);
- //
- // // value of the property
- // Set<String> propSet = getNodes(new WildcardQuery(new Term(FieldNames.PROPERTIES, "*" + prefix + ":*")));
- // // Manually check property values;
- // for (String uuid : propSet)
- // {
- // if (isPrefixMatch(valueFactory, uuid, prefix))
- // result.add(uuid);
- // }
-
- return indexSearcherHolder.getNodesByUri(prefix);
}
- // /**
- // * @param valueFactory
- // * @param dm
- // * @param uuid
- // * @param prefix
- // * @throws RepositoryException
- // */
- // private boolean isPrefixMatch(ValueFactoryImpl valueFactory, String uuid, String prefix) throws RepositoryException
- // {
- // DataManager dm = persister.getDataManager();
- // ItemData node = dm.getItemData(uuid);
- // if (node != null && node.isNode())
- // {
- // List<PropertyData> props = dm.getChildPropertiesData((NodeData)node);
- // for (PropertyData propertyData : props)
- // {
- // if (propertyData.getType() == PropertyType.PATH || propertyData.getType() == PropertyType.NAME)
- // {
- // for (ValueData vdata : propertyData.getValues())
- // {
- // Value val =
- // valueFactory.loadValue(((AbstractValueData)vdata).createTransientCopy(), propertyData.getType());
- // if (propertyData.getType() == PropertyType.PATH)
- // {
- // if (isPrefixMatch(((PathValue)val).getQPath(), prefix))
- // return true;
- // }
- // else if (propertyData.getType() == PropertyType.NAME)
- // {
- // if (isPrefixMatch(((NameValue)val).getQName(), prefix))
- // return true;
- // }
- // }
- // }
- // }
- // }
- // return false;
- // }
- //
- // private boolean isPrefixMatch(QPath value, String prefix) throws NamespaceException
- // {
- // for (int i = 0; i < value.getEntries().length; i++)
- // {
- // if (isPrefixMatch(value.getEntries()[i], prefix))
- // return true;
- // }
- // return false;
- // }
- //
- // private boolean isPrefixMatch(InternalQName value, String prefix) throws NamespaceException
- // {
- // return (value.getNamespace().equals(getURI(prefix)));
- // }
-
- // /**
- // * @param query
- // * @return
- // * @throws RepositoryException
- // */
- // private Set<String> getNodes(Query query) throws RepositoryException
- // {
- // Set<String> result = new HashSet<String>();
- //
- // Iterator<QueryHandler> it = queryHandlers.iterator();
- // try
- // {
- // while (it.hasNext())
- // {
- // QueryHandler queryHandler = it.next();
- // QueryHits hits = queryHandler.executeQuery(query);
- //
- // ScoreNode sn;
- //
- // while ((sn = hits.nextScoreNode()) != null)
- // {
- // result.add(sn.getNodeId());
- // }
- // // for (int i = 0; i < hits.getSize(); i++)
- // // {
- // // result.add(hits.getFieldContent(i, FieldNames.UUID));
- // // }
- // }
- // }
- // catch (IOException e)
- // {
- // throw new RepositoryException(e.getLocalizedMessage(), e);
- // }
- // return result;
- // }
-
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -44,6 +44,7 @@
import org.exoplatform.services.jcr.impl.core.itemfilters.ItemFilter;
import org.exoplatform.services.jcr.impl.core.itemfilters.NamePatternFilter;
import org.exoplatform.services.jcr.impl.core.lock.LockImpl;
+import org.exoplatform.services.jcr.impl.core.nodetype.ItemAutocreator;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeDefinitionImpl;
import org.exoplatform.services.jcr.impl.core.version.ItemDataMergeVisitor;
import org.exoplatform.services.jcr.impl.core.version.VersionHistoryImpl;
@@ -183,7 +184,7 @@
}
}
- NodeTypeData type = session.getWorkspace().getNodeTypesHolder().findNodeType(name);
+ NodeTypeData type = session.getWorkspace().getNodeTypesHolder().getNodeType(name);
// Mixin or not
if (type == null || !type.isMixin())
@@ -240,7 +241,7 @@
// find node type
NodeDefinitionData nodeDef =
- session.getWorkspace().getNodeTypesHolder().findChildNodeDefinition(name, nodeData().getPrimaryTypeName(),
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(name, nodeData().getPrimaryTypeName(),
nodeData().getMixinTypeNames());
if (nodeDef == null)
@@ -300,7 +301,7 @@
checkValid();
NodeTypeData type =
- session.getWorkspace().getNodeTypesHolder().findNodeType(
+ session.getWorkspace().getNodeTypesHolder().getNodeType(
locationFactory.parseJCRName(mixinName).getInternalName());
if (type == null)
@@ -584,8 +585,11 @@
dataManager.update(state, false);
NodeTypeDataManager ntmanager = session.getWorkspace().getNodeTypesHolder();
+ ItemAutocreator itemAutocreator = new ItemAutocreator(ntmanager, valueFactory, dataManager);
+
PlainChangesLog changes =
- ntmanager.makeAutoCreatedItems(nodeData(), type.getName(), dataManager, session.getUserID());
+ itemAutocreator.makeAutoCreatedItems(nodeData(), type.getName(), dataManager, session.getUserID());
+
for (ItemState autoCreatedState : changes.getAllStates())
{
dataManager.update(autoCreatedState, false);
@@ -833,9 +837,13 @@
{
NodeType required =
nodeTypeManager.getNodeType(locationFactory.createJCRName(Constants.NT_BASE).getAsString());
+ InternalQName requiredName = sysLocFactory.parseJCRName(required.getName()).getInternalName();
+ NodeDefinitionData ntData =
+ new NodeDefinitionData(null, null, true, true, OnParentVersionAction.ABORT, false,
+ new InternalQName[]{requiredName}, null, true);
this.nodeDefinition =
- new NodeDefinitionImpl(null, null, new NodeType[]{required}, null, true, true,
- OnParentVersionAction.ABORT, false, false);
+ new NodeDefinitionImpl(ntData, nodeTypesHolder, nodeTypeManager, sysLocFactory, session
+ .getValueFactory());
}
}
else
@@ -844,7 +852,7 @@
NodeData parent = (NodeData)dataManager.getItemData(getParentIdentifier());
this.definition =
- nodeTypesHolder.findChildNodeDefinition(getInternalName(), parent.getPrimaryTypeName(), parent
+ nodeTypesHolder.getChildNodeDefinition(getInternalName(), parent.getPrimaryTypeName(), parent
.getMixinTypeNames());
if (definition == null)
@@ -857,17 +865,10 @@
rnts[j] = nodeTypeManager.findNodeType(rnames[j]);
}
- String name =
- locationFactory.createJCRName(
- definition.getName() != null ? definition.getName() : Constants.JCR_ANY_NAME).getAsString();
- NodeType defType =
- definition.getDefaultPrimaryType() != null ? nodeTypeManager.findNodeType(definition
- .getDefaultPrimaryType()) : null;
- NodeType declaringNodeType = nodeTypeManager.findNodeType(definition.getDeclaringNodeType());
nodeDefinition =
- new NodeDefinitionImpl(name, declaringNodeType, rnts, defType, definition.isAutoCreated(), definition
- .isMandatory(), definition.getOnParentVersion(), definition.isProtected(), definition
- .isAllowsSameNameSiblings());
+ new NodeDefinitionImpl(definition, nodeTypesHolder, nodeTypeManager, sysLocFactory, session
+ .getValueFactory());
+
}
}
@@ -1020,11 +1021,11 @@
// load nodeDatas
List<NodeTypeData> nodeTypes = new ArrayList<NodeTypeData>();
- nodeTypes.add(nodeTypeDataManager.findNodeType(nodeData().getPrimaryTypeName()));
+ nodeTypes.add(nodeTypeDataManager.getNodeType(nodeData().getPrimaryTypeName()));
InternalQName[] mixinNames = nodeData().getMixinTypeNames();
for (int i = 0; i < mixinNames.length; i++)
{
- nodeTypes.add(nodeTypeDataManager.findNodeType(mixinNames[i]));
+ nodeTypes.add(nodeTypeDataManager.getNodeType(mixinNames[i]));
}
// Searching default
@@ -2088,7 +2089,7 @@
// Check if nodeType exists and not mixin
NodeTypeDataManager nodeTypeDataManager = session.getWorkspace().getNodeTypesHolder();
- NodeTypeData nodeType = nodeTypeDataManager.findNodeType(primaryTypeName);
+ NodeTypeData nodeType = nodeTypeDataManager.getNodeType(primaryTypeName);
if (nodeType == null)
throw new NoSuchNodeTypeException("Nodetype not found "
+ sysLocFactory.createJCRName(primaryTypeName).getAsString());
@@ -2109,7 +2110,7 @@
}
// Check if node is not protected
NodeDefinitionData childNodeDefinition =
- session.getWorkspace().getNodeTypesHolder().findChildNodeDefinition(name, nodeData().getPrimaryTypeName(),
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(name, nodeData().getPrimaryTypeName(),
nodeData().getMixinTypeNames());
if (childNodeDefinition == null)
throw new ConstraintViolationException("Can't find child node definition for "
@@ -2518,8 +2519,10 @@
NodeImpl node = (NodeImpl)dataManager.update(state, true);
NodeTypeDataManager ntmanager = session.getWorkspace().getNodeTypesHolder();
+ ItemAutocreator itemAutocreator = new ItemAutocreator(ntmanager, valueFactory, dataManager);
+
PlainChangesLog changes =
- ntmanager.makeAutoCreatedItems(node.nodeData(), primaryTypeName, dataManager, session.getUserID());
+ itemAutocreator.makeAutoCreatedItems(node.nodeData(), primaryTypeName, dataManager, session.getUserID());
for (ItemState autoCreatedState : changes.getAllStates())
{
dataManager.update(autoCreatedState, false);
@@ -2547,7 +2550,7 @@
if (sibling.getQPath().getName().equals(nameToAdd))
{
NodeDefinitionData def =
- session.getWorkspace().getNodeTypesHolder().findChildNodeDefinition(nameToAdd,
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(nameToAdd,
parentNode.getPrimaryTypeName(), parentNode.getMixinTypeNames());
if (LOG.isDebugEnabled())
LOG.debug("Calculate index for " + nameToAdd + " " + sibling.getQPath().getAsString());
@@ -2617,7 +2620,7 @@
NodeData parent = (NodeData)dataManager.getItemData(getParentIdentifier());
this.definition =
- session.getWorkspace().getNodeTypesHolder().findChildNodeDefinition(getInternalName(),
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(getInternalName(),
parent.getPrimaryTypeName(), parent.getMixinTypeNames());
if (definition == null)
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/PropertyImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/PropertyImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/PropertyImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -301,10 +301,9 @@
}
}
- return new PropertyDefinitionImpl(name, nodeTypeManager.findNodeType(propertyDef.getDeclaringNodeType()),
- propertyDef.getRequiredType(), propertyDef.getValueConstraints(), defaultValues, propertyDef.isAutoCreated(),
- propertyDef.isMandatory(), propertyDef.getOnParentVersion(), propertyDef.isProtected(), propertyDef
- .isMultiple());
+ return new PropertyDefinitionImpl(propertyDef, session.getWorkspace().getNodeTypesHolder(),
+ (ExtendedNodeTypeManager)session.getWorkspace().getNodeTypeManager(), session.getSystemLocationFactory(),
+ session.getValueFactory());
}
@@ -318,7 +317,7 @@
NodeData parent = parentData();
InternalQName pname = getData().getQPath().getName();
PropertyDefinitionDatas definitions =
- session.getWorkspace().getNodeTypesHolder().findPropertyDefinitions(pname, parent.getPrimaryTypeName(),
+ session.getWorkspace().getNodeTypesHolder().getPropertyDefinitions(pname, parent.getPrimaryTypeName(),
parent.getMixinTypeNames());
if (definitions == null)
throw new ConstraintViolationException("Definition for property " + getPath() + " not found.");
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/ScratchWorkspaceInitializer.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -26,7 +26,6 @@
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ExtendedPropertyType;
-import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.dataflow.DataManager;
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
@@ -37,7 +36,6 @@
import org.exoplatform.services.jcr.datamodel.QPath;
import org.exoplatform.services.jcr.datamodel.ValueData;
import org.exoplatform.services.jcr.impl.Constants;
-import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeDataPersister;
import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
@@ -78,23 +76,17 @@
private final String accessControlType;
- private final NamespaceDataPersister nsPersister;
+ // private final NamespaceDataPersister nsPersister;
- private final NodeTypeDataPersister ntPersister;
-
private final String rootPermissions;
private final InternalQName rootNodeType;
- private final NodeTypeDataManager nodeTypeDataManager;
-
public ScratchWorkspaceInitializer(WorkspaceEntry config, RepositoryEntry repConfig,
- CacheableWorkspaceDataManager dataManager, LocationFactory locationFactory, NamespaceDataPersister nsPersister,
- NodeTypeDataManager nodeTypeDataManager, NodeTypeDataPersister ntPersister)
+ CacheableWorkspaceDataManager dataManager, LocationFactory locationFactory)
throws RepositoryConfigurationException, PathNotFoundException, RepositoryException
{
- this.nodeTypeDataManager = nodeTypeDataManager;
this.systemWorkspaceName = repConfig.getSystemWorkspaceName();
this.accessControlType = repConfig.getAccessControl();
this.workspaceName = config.getName();
@@ -147,9 +139,9 @@
: Constants.NT_UNSTRUCTURED;
this.dataManager = dataManager;
- this.nsPersister = nsPersister;
+ // this.nsPersister = nsPersister;
// this.ntRegistry = ntRegistry;
- this.ntPersister = ntPersister;
+
}
public NodeData initWorkspace() throws RepositoryException
@@ -329,13 +321,15 @@
dataManager.save(new TransactionChangesLog(changesLog));
- nsPersister.initStorage(jcrSystem, addACL, NamespaceRegistryImpl.DEF_NAMESPACES);
+ //nsPersister.initStorage(jcrSystem, addACL, NamespaceRegistryImpl.DEF_NAMESPACES);
// nodeTypes save
- changesLog = new PlainChangesLogImpl();
- changesLog.addAll(ntPersister.initNodetypesRoot(jcrSystem, addACL).getAllStates());
- changesLog.addAll(ntPersister.initStorage(nodeTypeDataManager.getAllNodeTypes()).getAllStates());
- ntPersister.saveChanges(changesLog);
+ // changesLog = new PlainChangesLogImpl();
+ // changesLog.addAll(ntPersister.initNodetypesRoot(jcrSystem,
+ // addACL).getAllStates());
+ // changesLog.addAll(ntPersister.initStorage(nodeTypeDataManager.getAllNodeTypes()).getAllStates());
+ // ntPersister.saveChanges(changesLog);
+ // nodeTypeDataManager.initDefaultNodeTypes(addACL);
return jcrSystem;
}
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeRepository.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeRepository.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeRepository.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import org.exoplatform.services.jcr.access.AccessControlPolicy;
+import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeDataPersister;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.UpdateNodeTypeObserver;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.RepositoryException;
+
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $
+ *
+ */
+public abstract class AbstractNodeTypeRepository implements NodeTypeRepository
+{
+ protected final NodeTypeDataPersister nodeTypeDataPersister;
+
+ /**
+ * @param nodeTypeDataPersister
+ */
+ public AbstractNodeTypeRepository(NodeTypeDataPersister nodeTypeDataPersister)
+ {
+ super();
+ this.nodeTypeDataPersister = nodeTypeDataPersister;
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeRepository#getAllNodeTypes()
+ */
+ public List<NodeTypeData> getAllNodeTypes() throws RepositoryException
+ {
+ // TODO Auto-generated method stub
+ return nodeTypeDataPersister.getAllNodeTypes();
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.core.ComponentPersister#isStorageFilled()
+ */
+ public boolean isStorageFilled()
+ {
+ // TODO Auto-generated method stub
+ return nodeTypeDataPersister.isStorageFilled();
+ }
+
+ /**
+ * @throws RepositoryException
+ * @see org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeRepository#update(java.util.List, org.exoplatform.services.jcr.impl.core.nodetype.registration.UpdateNodeTypeObserver)
+ */
+ public void registerNodeType(final List<NodeTypeData> nodeTypes, final NodeTypeDataManager nodeTypeDataManager,
+ final String accessControlPolicy, final int alreadyExistsBehaviour) throws RepositoryException
+ {
+ // create map to speedUp registration process
+ final Map<InternalQName, NodeTypeData> volatileNodeTypes = new HashMap<InternalQName, NodeTypeData>();
+ for (final NodeTypeData nodeTypeData : nodeTypes)
+ {
+ volatileNodeTypes.put(nodeTypeData.getName(), nodeTypeData);
+ }
+ final List<NodeTypeData> wait4RegistrationNodeTypes = new ArrayList<NodeTypeData>();
+
+ // persist changes
+ if (this.nodeTypeDataPersister != null)
+ {
+ this.nodeTypeDataPersister.update(nodeTypes, new UpdateNodeTypeObserver()
+ {
+
+ public void afterUpdate(final NodeTypeData updatetNodetype, final Object context)
+ {
+
+ }
+
+ public void beforeUpdate(final NodeTypeData updatetNodetype, final Object context)
+ throws RepositoryException
+ {
+ if (updatetNodetype == null)
+ {
+ throw new RepositoryException("NodeTypeData object " + updatetNodetype + " is null");
+ }
+
+ if (accessControlPolicy.equals(AccessControlPolicy.DISABLE)
+ && updatetNodetype.getName().equals("exo:privilegeable"))
+ {
+ throw new RepositoryException("NodeType exo:privilegeable is DISABLED");
+ }
+
+ final InternalQName qname = updatetNodetype.getName();
+ if (qname == null)
+ {
+ throw new RepositoryException("NodeType implementation class " + updatetNodetype.getClass().getName()
+ + " is not supported in this method");
+ }
+
+ final NodeTypeData registeredNodeType = getNodeType(qname);
+ if (registeredNodeType != null)
+ {
+ switch (alreadyExistsBehaviour)
+ {
+ case ExtendedNodeTypeManager.FAIL_IF_EXISTS :
+ throw new NodeTypeExistsException("NodeType " + updatetNodetype.getName()
+ + " is already registered");
+ case ExtendedNodeTypeManager.REPLACE_IF_EXISTS :
+ ((PlainChangesLog)context).addAll(nodeTypeDataManager.updateNodeType(registeredNodeType,
+ updatetNodetype, volatileNodeTypes).getAllStates());
+ break;
+ }
+ }
+ else
+ {
+ wait4RegistrationNodeTypes.add(updatetNodetype);
+ }
+ }
+
+ public boolean shouldSkip(final NodeTypeData updatetNodetype, final Object context)
+ throws RepositoryException
+ {
+ final NodeTypeData registeredNodeType = getNodeType(updatetNodetype.getName());
+ if (registeredNodeType != null && alreadyExistsBehaviour == ExtendedNodeTypeManager.IGNORE_IF_EXISTS)
+ {
+ return true;
+
+ }
+ return false;
+ }
+ });
+ }
+ // register new node types
+ for (final NodeTypeData nodeTypeData : wait4RegistrationNodeTypes)
+ {
+ addNodeType(nodeTypeData, volatileNodeTypes);
+ }
+ }
+
+ /**
+ * @see org.picocontainer.Startable#start()
+ */
+ public void start()
+ {
+ // TODO Auto-generated method stub
+
+ }
+
+ /**
+ * @see org.picocontainer.Startable#stop()
+ */
+ public void stop()
+ {
+ // TODO Auto-generated method stub
+
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/AbstractNodeTypeRepository.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedItemDefinition.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedItemDefinition.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedItemDefinition.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+
+import javax.jcr.nodetype.ItemDefinition;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public interface ExtendedItemDefinition extends ItemDefinition
+{
+
+ /**
+ * @return
+ */
+ public InternalQName getQName();
+
+ /**
+ * @return
+ */
+ public InternalQName getDeclaringNodeTypeQName();
+
+ /**
+ * @return
+ */
+ public boolean isResidualSet();
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedItemDefinition.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedNodeDefinition.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedNodeDefinition.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedNodeDefinition.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+
+import javax.jcr.nodetype.NodeDefinition;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public interface ExtendedNodeDefinition extends NodeDefinition
+{
+
+ public InternalQName getDefaultPrimaryTypeQName();
+
+ /**
+ * @return
+ */
+
+ public InternalQName[] getRequiredPrimaryTypeQNames();
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ExtendedNodeDefinition.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/InmemoryNodeTypeRepository.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/InmemoryNodeTypeRepository.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/InmemoryNodeTypeRepository.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,245 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionDatas;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeDataPersister;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $
+ *
+ */
+public class InmemoryNodeTypeRepository extends AbstractNodeTypeRepository
+{
+ private final Log log = ExoLogger.getLogger(InmemoryNodeTypeRepository.class.getName());
+
+ private final ItemDefinitionDataHolder defsHolder;
+
+ private final NodeTypeDataHierarchyHolder hierarchy;
+
+ private boolean haveTypes = false;
+
+
+
+ /**
+ * @param defsHolder
+ * @param hierarchy
+ */
+ public InmemoryNodeTypeRepository(ItemDefinitionDataHolder defsHolder, NodeTypeDataHierarchyHolder hierarchy,
+ NodeTypeDataPersister nodeTypeDataPersister)
+ {
+ super(nodeTypeDataPersister);
+ this.defsHolder = defsHolder;
+ this.hierarchy = hierarchy;
+ }
+
+ /**
+ * @param defsHolder
+ * @param hierarchy
+ */
+ public InmemoryNodeTypeRepository(NodeTypeDataPersister nodeTypeDataPersister)
+ {
+ super(nodeTypeDataPersister);
+ this.hierarchy = new NodeTypeDataHierarchyHolder();
+ this.defsHolder = new ItemDefinitionDataHolder();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addNodeType(NodeTypeData nodeType, Map<InternalQName, NodeTypeData> volatileNodeTypes)
+ throws RepositoryException
+ {
+
+ hierarchy.addNodeType(nodeType, volatileNodeTypes);
+ defsHolder.putDefinitions(nodeType.getName(), nodeType);
+ // put supers
+ final Set<InternalQName> supers = hierarchy.getSupertypes(nodeType.getName(), volatileNodeTypes);
+
+ for (final InternalQName superName : supers)
+ {
+ defsHolder.putDefinitions(nodeType.getName(), hierarchy.getNodeType(superName, volatileNodeTypes));
+ }
+ haveTypes = true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public List<NodeTypeData> getAllNodeTypes()
+ {
+ if (!haveTypes)
+ try
+ {
+ return super.getAllNodeTypes();
+ }
+ catch (RepositoryException e)
+ {
+ log.error(e.getLocalizedMessage(), e);
+ }
+
+ return hierarchy.getAllNodeTypes();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public NodeDefinitionData getChildNodeDefinition(InternalQName parentTypeName, InternalQName nodeName,
+ InternalQName nodeTypeName)
+ {
+ return defsHolder.getChildNodeDefinition(parentTypeName, nodeName, nodeTypeName);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Set<InternalQName> getDeclaredSubtypes(InternalQName nodeTypeName)
+ {
+
+ return hierarchy.getDeclaredSubtypes(nodeTypeName);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public NodeDefinitionData getDefaultChildNodeDefinition(InternalQName nodeName, InternalQName[] nodeTypeNames)
+ {
+
+ return defsHolder.getDefaultChildNodeDefinition(nodeName, nodeTypeNames);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public NodeTypeData getNodeType(InternalQName typeName)
+ {
+
+ return hierarchy.getNodeType(typeName);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public NodeTypeData getNodeType(InternalQName superName, Map<InternalQName, NodeTypeData> volatileNodeTypes)
+ {
+
+ return hierarchy.getNodeType(superName, volatileNodeTypes);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public PropertyDefinitionDatas getPropertyDefinitions(InternalQName propertyName, InternalQName[] nodeTypeNames)
+ {
+
+ return defsHolder.getPropertyDefinitions(propertyName, nodeTypeNames);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Set<InternalQName> getSubtypes(InternalQName nodeTypeName)
+ {
+
+ return hierarchy.getSubtypes(nodeTypeName);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Set<InternalQName> getSupertypes(InternalQName ntname)
+ {
+
+ return hierarchy.getSupertypes(ntname);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @throws RepositoryException
+ */
+ public Set<InternalQName> getSupertypes(InternalQName name, Map<InternalQName, NodeTypeData> volatileNodeTypes)
+ throws RepositoryException
+ {
+
+ return hierarchy.getSupertypes(name, volatileNodeTypes);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isNodeType(InternalQName testTypeName, InternalQName[] typesNames)
+ {
+
+ return hierarchy.isNodeType(testTypeName, typesNames);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isNodeType(InternalQName testTypeName, InternalQName primaryType)
+ {
+ return hierarchy.isNodeType(testTypeName, primaryType);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public NodeTypeRepository createCopy()
+ {
+
+ return new InmemoryNodeTypeRepository(defsHolder.createCopy(), hierarchy.createCopy(), nodeTypeDataPersister);
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeRepository#removeNodeType(org.exoplatform.services.jcr.datamodel.InternalQName, org.exoplatform.services.jcr.core.nodetype.NodeTypeData)
+ */
+ public void removeNodeType(NodeTypeData nodeType)
+ {
+ InternalQName nodeTypeName = nodeType.getName();
+ // put supers
+ final Set<InternalQName> supers = hierarchy.getSubtypes(nodeTypeName);
+
+ // remove from internal lists
+ hierarchy.removeNodeType(nodeTypeName);
+
+ // remove supers
+ if (supers != null)
+ {
+ for (final InternalQName superName : supers)
+ {
+ defsHolder.removeDefinitions(nodeTypeName, hierarchy.getNodeType(superName));
+ }
+ }
+ // remove it self
+ defsHolder.removeDefinitions(nodeTypeName, nodeType);
+ haveTypes = hierarchy.getAllNodeTypes().size()>0;
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/InmemoryNodeTypeRepository.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,282 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import org.exoplatform.services.jcr.access.AccessControlEntry;
+import org.exoplatform.services.jcr.access.AccessControlList;
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
+import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.QPathEntry;
+import org.exoplatform.services.jcr.datamodel.ValueData;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.value.BaseValue;
+import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
+import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
+import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
+import org.exoplatform.services.jcr.impl.dataflow.version.VersionHistoryDataHelper;
+import org.exoplatform.services.jcr.util.IdGenerator;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.ValueFactory;
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $
+ *
+ */
+public class ItemAutocreator
+{
+
+ private final Log log = ExoLogger.getLogger(getClass().getName());
+
+ private final NodeTypeDataManager nodeTypeDataManager;
+
+ private final ItemDataConsumer dataConsumer;
+
+ private final ValueFactory valueFactory;
+
+ /**
+ * @param nodeTypeDataManager
+ */
+ public ItemAutocreator(NodeTypeDataManager nodeTypeDataManager, ValueFactory valueFactory,
+ ItemDataConsumer dataConsumer)
+ {
+ super();
+ this.nodeTypeDataManager = nodeTypeDataManager;
+ this.valueFactory = valueFactory;
+ this.dataConsumer = dataConsumer;
+ }
+
+ public PlainChangesLog makeAutoCreatedItems(final NodeData parent, final InternalQName nodeTypeName,
+ final ItemDataConsumer targetDataManager, final String owner) throws RepositoryException
+ {
+ final PlainChangesLogImpl changes = new PlainChangesLogImpl();
+ final NodeTypeData type = nodeTypeDataManager.getNodeType(nodeTypeName);
+
+ changes.addAll(makeAutoCreatedProperties(parent, nodeTypeName,
+ nodeTypeDataManager.getAllPropertyDefinitions(nodeTypeName), targetDataManager, owner).getAllStates());
+ // Add autocreated child nodes
+ changes.addAll(makeAutoCreatedNodes(parent, nodeTypeName,
+ nodeTypeDataManager.getAllChildNodeDefinitions(nodeTypeName), targetDataManager, owner).getAllStates());
+
+ // versionable
+ if (nodeTypeDataManager.isNodeType(Constants.MIX_VERSIONABLE, new InternalQName[]{type.getName()}))
+ {
+
+ // using VH helper as for one new VH, all changes in changes log
+ changes.addAll(makeMixVesionableChanges(parent).getAllStates());
+ }
+ return changes;
+ }
+
+ public PlainChangesLog makeAutoCreatedNodes(final NodeData parent, final InternalQName typeName,
+ final NodeDefinitionData[] nodeDefs, final ItemDataConsumer targetDataManager, final String owner)
+ throws RepositoryException
+ {
+ final PlainChangesLogImpl changes = new PlainChangesLogImpl();
+ final Set<InternalQName> addedNodes = new HashSet<InternalQName>();
+ for (final NodeDefinitionData ndef : nodeDefs)
+ {
+ if (ndef.isAutoCreated())
+ {
+ final ItemData pdata = targetDataManager.getItemData(parent, new QPathEntry(ndef.getName(), 0));
+ if (pdata == null && !addedNodes.contains(ndef.getName()) || pdata != null && !pdata.isNode())
+ {
+
+ final TransientNodeData childNodeData =
+ TransientNodeData.createNodeData(parent, ndef.getName(), ndef.getDefaultPrimaryType(), IdGenerator
+ .generate());
+ changes.add(ItemState.createAddedState(childNodeData, false));
+ changes.addAll(makeAutoCreatedItems(childNodeData, childNodeData.getPrimaryTypeName(),
+ targetDataManager, owner).getAllStates());
+ addedNodes.add(ndef.getName());
+ }
+ else
+ {
+ if (this.log.isDebugEnabled())
+ {
+ this.log.debug("Skipping existed node " + ndef.getName() + " in " + parent.getQPath().getAsString()
+ + " during the automatic creation of items for " + typeName.getAsString()
+ + " nodetype or mixin type");
+ }
+ }
+ }
+ }
+ return changes;
+
+ }
+
+ public PlainChangesLog makeAutoCreatedProperties(final NodeData parent, final InternalQName typeName,
+ final PropertyDefinitionData[] propDefs, final ItemDataConsumer targetDataManager, final String owner)
+ throws RepositoryException
+ {
+ final PlainChangesLogImpl changes = new PlainChangesLogImpl();
+
+ final Set<InternalQName> addedProperties = new HashSet<InternalQName>();
+
+ // Add autocreated child properties
+
+ for (final PropertyDefinitionData pdef : propDefs)
+ {
+
+ if (pdef.isAutoCreated())
+ {
+
+ final ItemData pdata = targetDataManager.getItemData(parent, new QPathEntry(pdef.getName(), 0));
+ if (pdata == null && !addedProperties.contains(pdef.getName()) || pdata != null && pdata.isNode())
+ {
+
+ final List<ValueData> listAutoCreateValue = autoCreatedValue(parent, typeName, pdef, owner);
+
+ if (listAutoCreateValue != null)
+ {
+ final TransientPropertyData propertyData =
+ TransientPropertyData.createPropertyData(parent, pdef.getName(), pdef.getRequiredType(), pdef
+ .isMultiple(), listAutoCreateValue);
+ changes.add(ItemState.createAddedState(propertyData));
+ addedProperties.add(pdef.getName());
+ }
+ }
+ else
+ {
+ // TODO if autocreated property exists it's has wrong data (e.g. ACL)
+ // - throw an exception
+ if (this.log.isDebugEnabled())
+ {
+ this.log.debug("Skipping existed property " + pdef.getName() + " in "
+ + parent.getQPath().getAsString() + " during the automatic creation of items for "
+ + typeName.getAsString() + " nodetype or mixin type");
+ }
+ }
+ }
+ }
+ return changes;
+ }
+
+ /**
+ * @param parent
+ * @param dataManager
+ * @param changes
+ * @return
+ * @throws RepositoryException
+ */
+ public PlainChangesLog makeMixVesionableChanges(final NodeData parent) throws RepositoryException
+ {
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+ new VersionHistoryDataHelper(parent, changesLog, dataConsumer, nodeTypeDataManager);
+ return changesLog;
+ }
+
+ protected List<ValueData> autoCreatedValue(final NodeData parent, final InternalQName typeName,
+ final PropertyDefinitionData def, final String owner) throws RepositoryException
+ {
+ final List<ValueData> vals = new ArrayList<ValueData>();
+
+ if (nodeTypeDataManager.isNodeType(Constants.NT_BASE, new InternalQName[]{typeName})
+ && def.getName().equals(Constants.JCR_PRIMARYTYPE))
+ {
+ vals.add(new TransientValueData(parent.getPrimaryTypeName()));
+
+ }
+ else if (nodeTypeDataManager.isNodeType(Constants.MIX_REFERENCEABLE, new InternalQName[]{typeName})
+ && def.getName().equals(Constants.JCR_UUID))
+ {
+ vals.add(new TransientValueData(parent.getIdentifier()));
+
+ }
+ else if (nodeTypeDataManager.isNodeType(Constants.NT_HIERARCHYNODE, new InternalQName[]{typeName})
+ && def.getName().equals(Constants.JCR_CREATED))
+ {
+ vals.add(new TransientValueData(Calendar.getInstance()));
+ }
+ else if (nodeTypeDataManager.isNodeType(Constants.NT_HIERARCHYNODE, new InternalQName[]{typeName})
+ && def.getName().equals(new InternalQName(Constants.NS_JCR_URI, "createdBy")))
+ {
+ vals.add(new TransientValueData(owner));
+
+ }
+ else if (nodeTypeDataManager.isNodeType(Constants.EXO_OWNEABLE, new InternalQName[]{typeName})
+ && def.getName().equals(Constants.EXO_OWNER))
+ {
+ // String owner = session.getUserID();
+ vals.add(new TransientValueData(owner));
+ parent.setACL(new AccessControlList(owner, parent.getACL().getPermissionEntries()));
+
+ }
+ else if (nodeTypeDataManager.isNodeType(Constants.EXO_PRIVILEGEABLE, new InternalQName[]{typeName})
+ && def.getName().equals(Constants.EXO_PERMISSIONS))
+ {
+ for (final AccessControlEntry ace : parent.getACL().getPermissionEntries())
+ {
+ vals.add(new TransientValueData(ace));
+ }
+
+ }
+ else
+ {
+ final String[] propVal = def.getDefaultValues();
+ // there can be null in definition but should not be null value
+ if (propVal != null && propVal.length != 0)
+ {
+ for (final String v : propVal)
+ {
+ if (v != null)
+ {
+ if (def.getRequiredType() == PropertyType.UNDEFINED)
+ {
+ vals.add(((BaseValue)this.valueFactory.createValue(v)).getInternalData());
+ }
+ else
+ {
+ vals.add(((BaseValue)this.valueFactory.createValue(v, def.getRequiredType())).getInternalData());
+ }
+ }
+ else
+ {
+ vals.add(null);
+ }
+ }
+ }
+ else
+ {
+ return null;
+ }
+ }
+
+ return vals;
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemAutocreator.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionDataHolder.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionDataHolder.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionDataHolder.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -58,6 +58,15 @@
this.defNodeDefinitions = new HashMap<DefaultNodeDefKey, NodeDefinitionData>();
}
+ private ItemDefinitionDataHolder(HashMap<ChildNodeDefKey, NodeDefinitionData> nodeDefinitions,
+ HashMap<PropertyDefKey, PropertyDefinitionData> propertyDefinitions,
+ HashMap<DefaultNodeDefKey, NodeDefinitionData> defNodeDefinitions)
+ {
+ this.nodeDefinitions = nodeDefinitions;
+ this.propertyDefinitions = propertyDefinitions;
+ this.defNodeDefinitions = defNodeDefinitions;
+ }
+
/**
* @param parentNodeType - name of parent node type
* @param childName name of child node
@@ -265,8 +274,21 @@
return def;
}
+ /**
+ * Create copy of holder.
+ *
+ * @return
+ */
+ protected ItemDefinitionDataHolder createCopy()
+ {
+ return new ItemDefinitionDataHolder(new HashMap<ChildNodeDefKey, NodeDefinitionData>(nodeDefinitions),
+ new HashMap<PropertyDefKey, PropertyDefinitionData>(propertyDefinitions),
+ new HashMap<DefaultNodeDefKey, NodeDefinitionData>(defNodeDefinitions));
+ }
+
private class ChildNodeDefKey extends ItemDefKey
{
+ private int hashCode = -1;
private final InternalQName childNodeType;
@@ -319,11 +341,16 @@
@Override
public int hashCode()
{
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + getOuterType().hashCode();
- result = prime * result + ((childNodeType == null) ? 0 : childNodeType.hashCode());
- return result;
+ if (hashCode == -1)
+ {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + getOuterType().hashCode();
+ result = prime * result + ((childNodeType == null) ? 0 : childNodeType.hashCode());
+ hashCode = result;
+ }
+
+ return hashCode;
}
/**
@@ -365,6 +392,8 @@
private final InternalQName childName;
+ private int hashCode = -1;
+
protected ItemDefKey(InternalQName parentNodeType, InternalQName childName)
{
this.parentNodeType = parentNodeType;
@@ -425,12 +454,16 @@
@Override
public int hashCode()
{
- final int prime = 31;
- int result = 1;
- result = prime * result + getOuterType().hashCode();
- result = prime * result + ((childName == null) ? 0 : childName.hashCode());
- result = prime * result + ((parentNodeType == null) ? 0 : parentNodeType.hashCode());
- return result;
+ if (hashCode == -1)
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + getOuterType().hashCode();
+ result = prime * result + ((childName == null) ? 0 : childName.hashCode());
+ result = prime * result + ((parentNodeType == null) ? 0 : parentNodeType.hashCode());
+ hashCode = result;
+ }
+ return hashCode;
}
/**
@@ -456,6 +489,8 @@
private final boolean multiValued;
+ private int hashCode = -1;
+
private PropertyDefKey(InternalQName parentNodeType, InternalQName childName, boolean multiValued)
{
super(parentNodeType, childName);
@@ -498,11 +533,16 @@
@Override
public int hashCode()
{
- final int prime = 31;
- int result = super.hashCode();
- result = prime * result + getOuterType().hashCode();
- result = prime * result + (multiValued ? 1231 : 1237);
- return result;
+ if (hashCode == -1)
+ {
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result + getOuterType().hashCode();
+ result = prime * result + (multiValued ? 1231 : 1237);
+ hashCode = result;
+ }
+
+ return hashCode;
}
/**
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/ItemDefinitionImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -18,74 +18,102 @@
*/
package org.exoplatform.services.jcr.impl.core.nodetype;
-import org.exoplatform.services.jcr.core.nodetype.ExtendedItemDefinition;
+import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
+import org.exoplatform.services.jcr.core.nodetype.ItemDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.LocationFactory;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import javax.jcr.RepositoryException;
+import javax.jcr.ValueFactory;
import javax.jcr.nodetype.NodeType;
/**
* Created by The eXo Platform SAS.
*
- * @author Gennady Azarenkov
- * @version $Id: ItemDefinitionImpl.java 11907 2008-03-13 15:36:21Z ksm $
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
*/
-
-public abstract class ItemDefinitionImpl implements ExtendedItemDefinition
+public class ItemDefinitionImpl implements ExtendedItemDefinition
{
+ /**
+ * Class logger.
+ */
+ private static final Log LOG = ExoLogger.getLogger(ItemDefinitionImpl.class);
- protected final NodeType declaringNodeType;
+ protected final NodeTypeDataManager nodeTypeDataManager;
- protected final String name;
+ protected final LocationFactory locationFactory;
- protected final boolean autoCreate;
+ protected final ExtendedNodeTypeManager nodeTypeManager;
- protected final int onVersion;
+ protected final ValueFactory valueFactory;
- protected final boolean readOnly;
+ private final ItemDefinitionData itemDefinitionData;
- protected final boolean mandatory;
+ /**
+ * @param name
+ * @param declaringNodeType
+ * @param onParentVersion
+ * @param autoCreated
+ * @param mandatory
+ * @param protectedItem
+ */
+ public ItemDefinitionImpl(ItemDefinitionData itemDefinitionData, NodeTypeDataManager nodeTypeDataManager,
+ ExtendedNodeTypeManager nodeTypeManager, LocationFactory locationFactory, ValueFactory valueFactory)
+ {
- protected int hashCode;
+ this.itemDefinitionData = itemDefinitionData;
+ this.nodeTypeDataManager = nodeTypeDataManager;
+ this.nodeTypeManager = nodeTypeManager;
+ this.locationFactory = locationFactory;
+ this.valueFactory = valueFactory;
+ }
- public ItemDefinitionImpl(String name, NodeType declaringNodeType, boolean autoCreate, int onVersion,
- boolean readOnly, boolean mandatory)
+ /**
+ * {@inheritDoc}
+ */
+ public NodeType getDeclaringNodeType()
{
- this.declaringNodeType = declaringNodeType;
- this.autoCreate = autoCreate;
- this.onVersion = onVersion;
- this.readOnly = readOnly;
- this.mandatory = mandatory;
- this.name = name;
- int hk = 7;
- hk = 31 * hk + (name != null ? name.hashCode() : 0);
- hk = 31 * hk + (autoCreate ? 0 : 1);
- hk = 31 * hk + (readOnly ? 0 : 1);
- hk = 31 * hk + (mandatory ? 0 : 1);
- hk = 31 * hk + onVersion;
- this.hashCode = hk;
+ return new NodeTypeImpl(nodeTypeDataManager.getNodeType(itemDefinitionData.getDeclaringNodeType()),
+ nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
}
- @Override
- public int hashCode()
+ /**
+ * {@inheritDoc}
+ */
+ public String getName()
{
- return hashCode;
+ String result = "";
+ try
+ {
+ result = locationFactory.createJCRName(itemDefinitionData.getName()).getAsString();
+ }
+ catch (RepositoryException e)
+ {
+ LOG.error(e.getLocalizedMessage(), e);
+ }
+ return result;
}
/**
* {@inheritDoc}
*/
- public String getName()
+ public InternalQName getQName()
{
- return name;
+ return itemDefinitionData.getName();
}
/**
* {@inheritDoc}
*/
- public boolean isAutoCreated()
+ public InternalQName getDeclaringNodeTypeQName()
{
- return autoCreate;
+ return itemDefinitionData.getDeclaringNodeType();
}
/**
@@ -93,15 +121,15 @@
*/
public int getOnParentVersion()
{
- return onVersion;
+ return itemDefinitionData.getOnParentVersion();
}
/**
* {@inheritDoc}
*/
- public boolean isProtected()
+ public boolean isAutoCreated()
{
- return readOnly;
+ return itemDefinitionData.isAutoCreated();
}
/**
@@ -109,15 +137,15 @@
*/
public boolean isMandatory()
{
- return mandatory;
+ return itemDefinitionData.isMandatory();
}
/**
* {@inheritDoc}
*/
- public NodeType getDeclaringNodeType()
+ public boolean isProtected()
{
- return declaringNodeType;
+ return itemDefinitionData.isProtected();
}
/**
@@ -125,6 +153,6 @@
*/
public boolean isResidualSet()
{
- return this.name.equals(Constants.JCR_ANY_NAME.getName());
+ return getName().equals(Constants.JCR_ANY_NAME.getName());
}
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeDefinitionImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeDefinitionImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeDefinitionImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -18,77 +18,152 @@
*/
package org.exoplatform.services.jcr.impl.core.nodetype;
-import javax.jcr.nodetype.NodeDefinition;
+import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.impl.core.LocationFactory;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.ValueFactory;
import javax.jcr.nodetype.NodeType;
/**
* Created by The eXo Platform SAS.
*
- * @author Gennady Azarenkov
- * @version $Id: NodeDefinitionImpl.java 11907 2008-03-13 15:36:21Z ksm $
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
*/
-
-public class NodeDefinitionImpl extends ItemDefinitionImpl implements NodeDefinition
+public class NodeDefinitionImpl extends ItemDefinitionImpl implements ExtendedNodeDefinition
{
- private final NodeType defaultNodeType;
+ /**
+ * Class logger.
+ */
+ private static final Log LOG = ExoLogger.getLogger(NodeDefinitionImpl.class);
- private final NodeType[] requiredNodeTypes;
+ private final NodeDefinitionData nodeDefinitionData;
- private final boolean multiple;
-
- public NodeDefinitionImpl(String name, NodeType declaringNodeType, NodeType[] requiredNodeTypes,
- NodeType defaultNodeType, boolean autoCreate, boolean mandatory, int onVersion, boolean readOnly, boolean multiple)
+ /**
+ * @param itemDefinitionData
+ * @param nodeTypeDataManager
+ * @param nodeTypeManager
+ * @param locationFactory
+ * @param valueFactory
+ */
+ public NodeDefinitionImpl(NodeDefinitionData nodeDefinitionData, NodeTypeDataManager nodeTypeDataManager,
+ ExtendedNodeTypeManager nodeTypeManager, LocationFactory locationFactory, ValueFactory valueFactory)
{
+ super(nodeDefinitionData, nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
+ this.nodeDefinitionData = nodeDefinitionData;
- super(name, declaringNodeType, autoCreate, onVersion, readOnly, mandatory);
+ }
- this.requiredNodeTypes = requiredNodeTypes;
- this.defaultNodeType = defaultNodeType;
- this.multiple = multiple;
+ /**
+ * @param itemDefinitionData
+ * @param nodeTypeDataManager
+ * @param locationFactory
+ * @param name
+ */
- int hk = 31 * this.hashCode + requiredNodeTypes.hashCode();
- if (defaultNodeType != null)
- hk = 31 * hk + defaultNodeType.hashCode();
- this.hashCode = 31 * hk + (multiple ? 0 : 1);
+ /**
+ * {@inheritDoc}
+ */
+ public boolean allowsSameNameSiblings()
+ {
+ return nodeDefinitionData.isAllowsSameNameSiblings();
}
/**
* {@inheritDoc}
*/
- public NodeType[] getRequiredPrimaryTypes()
+ public NodeType getDefaultPrimaryType()
{
+ if (nodeDefinitionData.getDefaultPrimaryType() == null)
+ return null;
+ return new NodeTypeImpl(nodeTypeDataManager.getNodeType(nodeDefinitionData.getDefaultPrimaryType()),
+ nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
+ }
- return requiredNodeTypes;
+ /**
+ * {@inheritDoc}
+ */
+ public String getDefaultPrimaryTypeName()
+ {
+ String result = null;
+ if (nodeDefinitionData.getDefaultPrimaryType() != null)
+ {
+ try
+ {
+ result = locationFactory.createJCRName(nodeDefinitionData.getDefaultPrimaryType()).getAsString();
+ }
+ catch (RepositoryException e)
+ {
+ LOG.error(e.getLocalizedMessage(), e);
+ }
+ }
+ return result;
}
/**
* {@inheritDoc}
*/
- public NodeType getDefaultPrimaryType()
+ public InternalQName getDefaultPrimaryTypeQName()
{
- return defaultNodeType;
+ return nodeDefinitionData.getDefaultPrimaryType();
}
/**
* {@inheritDoc}
*/
- public boolean allowsSameNameSiblings()
+ public String[] getRequiredPrimaryTypeNames()
{
- return multiple;
+ InternalQName[] requiredPrimaryTypes = nodeDefinitionData.getRequiredPrimaryTypes();
+ String[] result = new String[requiredPrimaryTypes.length];
+ try
+ {
+ for (int i = 0; i < requiredPrimaryTypes.length; i++)
+ {
+ result[i] = locationFactory.createJCRName(requiredPrimaryTypes[i]).getAsString();
+ }
+
+ }
+ catch (RepositoryException e)
+ {
+ LOG.error(e.getLocalizedMessage(), e);
+ }
+ return result;
}
/**
* {@inheritDoc}
*/
- public boolean equals(Object obj)
+
+ public InternalQName[] getRequiredPrimaryTypeQNames()
{
- if (obj == null)
- return false;
- if (!(obj instanceof NodeDefinitionImpl))
- return false;
- if (this.getName() == null)
- return ((NodeDefinitionImpl)obj).getName() == null;
- return this.getName().equals(((NodeDefinitionImpl)obj).getName());
+ return nodeDefinitionData.getRequiredPrimaryTypes();
}
+
+ /**
+ * {@inheritDoc}
+ */
+ public NodeType[] getRequiredPrimaryTypes()
+ {
+ InternalQName[] requiredPrimaryTypes = nodeDefinitionData.getRequiredPrimaryTypes();
+ NodeType[] result = new NodeType[requiredPrimaryTypes.length];
+ for (int i = 0; i < requiredPrimaryTypes.length; i++)
+ {
+ NodeTypeData ntData = nodeTypeDataManager.getNodeType(requiredPrimaryTypes[i]);
+ if (ntData == null)
+ {
+ LOG.error("NODE TYPE NOT FOUND " + requiredPrimaryTypes[i].getAsString());
+ }
+ else
+ result[i] = new NodeTypeImpl(ntData, nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
+ }
+ return result;
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataHierarchyHolder.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -48,25 +48,35 @@
private final Map<InternalQName, NodeTypeHolder> nodeTypes;
- class NodeTypeHolder
+ public NodeTypeDataHierarchyHolder()
{
+ nodeTypes = new ConcurrentHashMap<InternalQName, NodeTypeHolder>();
+ }
- final NodeTypeData nodeType;
+ /**
+ * Helper counstructor for create copy method.
+ *
+ * @param nodeTypes
+ */
+ public NodeTypeDataHierarchyHolder(Map<InternalQName, NodeTypeHolder> nodeTypes)
+ {
+ this.nodeTypes = nodeTypes;
+ }
- final Set<InternalQName> superTypes;
-
- NodeTypeHolder(NodeTypeData nodeType, Set<InternalQName> superTypes)
+ /**
+ * @return
+ */
+ public List<NodeTypeData> getAllNodeTypes()
+ {
+ Collection<NodeTypeHolder> hs = nodeTypes.values();
+ List<NodeTypeData> nts = new ArrayList<NodeTypeData>(hs.size());
+ for (NodeTypeHolder nt : hs)
{
- this.nodeType = nodeType;
- this.superTypes = superTypes;
+ nts.add(nt.nodeType);
}
+ return nts;
}
- public NodeTypeDataHierarchyHolder()
- {
- nodeTypes = new ConcurrentHashMap<InternalQName, NodeTypeHolder>();
- }
-
/**
* Returns the <i>direct</i> subtypes of this node type in the node type
* inheritance hierarchy, that is, those which actually declared this node
@@ -91,30 +101,9 @@
}
/**
- * Returns all subtypes of this node type in the node type inheritance
- * hierarchy.
- *
* @param nodeTypeName
* @return
*/
- public Set<InternalQName> getSubtypes(final InternalQName nodeTypeName)
- {
- // TODO Speed up this method
- Set<InternalQName> resultSet = new HashSet<InternalQName>();
- for (InternalQName ntName : nodeTypes.keySet())
- {
- if (getSupertypes(ntName).contains(nodeTypeName))
- {
- resultSet.add(ntName);
- }
- }
- return resultSet;
- }
-
- /**
- * @param nodeTypeName
- * @return
- */
public NodeTypeData getNodeType(final InternalQName nodeTypeName)
{
if (nodeTypeName != null)
@@ -143,9 +132,30 @@
}
/**
+ * Returns all subtypes of this node type in the node type inheritance
+ * hierarchy.
+ *
* @param nodeTypeName
* @return
*/
+ public Set<InternalQName> getSubtypes(final InternalQName nodeTypeName)
+ {
+ // TODO Speed up this method
+ Set<InternalQName> resultSet = new HashSet<InternalQName>();
+ for (InternalQName ntName : nodeTypes.keySet())
+ {
+ if (getSupertypes(ntName).contains(nodeTypeName))
+ {
+ resultSet.add(ntName);
+ }
+ }
+ return resultSet;
+ }
+
+ /**
+ * @param nodeTypeName
+ * @return
+ */
public Set<InternalQName> getSupertypes(final InternalQName nodeTypeName)
{
if (nodeTypeName != null)
@@ -175,20 +185,6 @@
}
/**
- * @return
- */
- public List<NodeTypeData> getAllNodeTypes()
- {
- Collection<NodeTypeHolder> hs = nodeTypes.values();
- List<NodeTypeData> nts = new ArrayList<NodeTypeData>(hs.size());
- for (NodeTypeHolder nt : hs)
- {
- nts.add(nt.nodeType);
- }
- return nts;
- }
-
- /**
* @param testTypeName
* @param typesNames
* @return
@@ -255,4 +251,26 @@
}
}
+
+ /**
+ * @return copy of holder.
+ */
+ protected NodeTypeDataHierarchyHolder createCopy()
+ {
+ return new NodeTypeDataHierarchyHolder(new ConcurrentHashMap<InternalQName, NodeTypeHolder>(nodeTypes));
+ }
+
+ class NodeTypeHolder
+ {
+
+ final NodeTypeData nodeType;
+
+ final Set<InternalQName> superTypes;
+
+ NodeTypeHolder(NodeTypeData nodeType, Set<InternalQName> superTypes)
+ {
+ this.nodeType = nodeType;
+ this.superTypes = superTypes;
+ }
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -18,26 +18,15 @@
*/
package org.exoplatform.services.jcr.impl.core.nodetype;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.search.BooleanClause.Occur;
-import org.exoplatform.services.jcr.access.AccessControlEntry;
-import org.exoplatform.services.jcr.access.AccessControlList;
-import org.exoplatform.services.jcr.access.AccessControlPolicy;
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
import org.exoplatform.services.jcr.core.nodetype.ItemDefinitionData;
import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
-import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionValue;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeValue;
-import org.exoplatform.services.jcr.core.nodetype.NodeTypeValuesList;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionDatas;
-import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionValue;
import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
@@ -45,33 +34,29 @@
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.ItemData;
import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.datamodel.QPathEntry;
-import org.exoplatform.services.jcr.datamodel.ValueData;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
+
import org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeDefinitionComparator;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeConverter;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeDataPersister;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeDataValidator;
import org.exoplatform.services.jcr.impl.core.nodetype.registration.PropertyDefinitionComparator;
+import org.exoplatform.services.jcr.impl.core.nodetype.registration.XmlNodeTypeDataPersister;
import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder;
-import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
-import org.exoplatform.services.jcr.impl.core.value.BaseValue;
import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
-import org.exoplatform.services.jcr.impl.dataflow.version.VersionHistoryDataHelper;
-import org.exoplatform.services.jcr.util.IdGenerator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
-import org.jibx.runtime.BindingDirectory;
-import org.jibx.runtime.IBindingFactory;
-import org.jibx.runtime.IUnmarshallingContext;
-import org.jibx.runtime.JiBXException;
+import org.picocontainer.Startable;
-import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -80,14 +65,9 @@
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
-import java.util.Map.Entry;
-import javax.jcr.InvalidItemStateException;
import javax.jcr.NamespaceRegistry;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
-import javax.jcr.ValueFormatException;
import javax.jcr.nodetype.ConstraintViolationException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
@@ -100,59 +80,55 @@
* @version $Id: NodeTypeDataManagerImpl.java 111 2008-11-11 11:11:11Z
* pnedonosko $
*/
-public class NodeTypeDataManagerImpl implements NodeTypeDataManager
+public class NodeTypeDataManagerImpl implements NodeTypeDataManager, Startable
{
- protected static final Log LOG = ExoLogger.getLogger("jcr.NodeTypeDataManagerImpl");
-
private static final String NODETYPES_FILE = "nodetypes.xml";
- protected final NamespaceRegistry namespaceRegistry;
+ private final Log log = ExoLogger.getLogger(NodeTypeDataManagerImpl.class.getName());
- protected final NodeTypeDataPersister persister;
+ protected final String accessControlPolicy;
- protected final LocationFactory locationFactory;
+ protected final ItemDataConsumer dataManager;
- protected final String accessControlPolicy;
+ protected final RepositoryIndexSearcherHolder indexSearcherHolder;
- protected final NodeTypeDataHierarchyHolder hierarchy;
+ protected final LocationFactory locationFactory;
- protected final ItemDefinitionDataHolder defsHolder;
+ protected final NamespaceRegistry namespaceRegistry;
private final Set<InternalQName> buildInNodeTypesNames;
+ protected final NodeTypeRepository nodeTypeRepository;
+
/**
* Listeners (soft references)
*/
private final Map<NodeTypeManagerListener, NodeTypeManagerListener> listeners;
- // protected HashSet<QueryHandler> queryHandlers;
-
private final ValueFactoryImpl valueFactory;
- protected final RepositoryIndexSearcherHolder indexSearcherHolder;
+ private boolean started = false;
- public NodeTypeDataManagerImpl(RepositoryEntry config, LocationFactory locationFactory,
- NamespaceRegistry namespaceRegistry, NodeTypeDataPersister persister,
- RepositoryIndexSearcherHolder indexSearcherHolder) throws RepositoryException
+ public NodeTypeDataManagerImpl(final RepositoryEntry config, final LocationFactory locationFactory,
+ final NamespaceRegistry namespaceRegistry, final NodeTypeDataPersister persister,
+ final ItemDataConsumer dataManager, final RepositoryIndexSearcherHolder indexSearcherHolder) throws RepositoryException
{
this.namespaceRegistry = namespaceRegistry;
- this.persister = persister;
-
this.locationFactory = locationFactory;
+ this.dataManager = dataManager;
this.indexSearcherHolder = indexSearcherHolder;
+
this.valueFactory = new ValueFactoryImpl(locationFactory);
this.accessControlPolicy = config.getAccessControl();
- this.hierarchy = new NodeTypeDataHierarchyHolder();
-
- this.defsHolder = new ItemDefinitionDataHolder();
+ this.nodeTypeRepository = new InmemoryNodeTypeRepository(persister);
+ //this.nodeTypeRepository = new PersistedNodeTypeRepository(persister);
this.listeners = Collections.synchronizedMap(new WeakHashMap<NodeTypeManagerListener, NodeTypeManagerListener>());
this.buildInNodeTypesNames = new HashSet<InternalQName>();
initDefault();
- //this.queryHandlers = new HashSet<QueryHandler>();
}
/**
@@ -162,26 +138,26 @@
* @param persister
* @throws RepositoryException
*/
- public NodeTypeDataManagerImpl(String accessControlPolicy, LocationFactory locationFactory,
- NamespaceRegistry namespaceRegistry, NodeTypeDataPersister persister,
- RepositoryIndexSearcherHolder indexSearcherHolder) throws RepositoryException
+ public NodeTypeDataManagerImpl(final String accessControlPolicy, final LocationFactory locationFactory,
+ final NamespaceRegistry namespaceRegistry, final NodeTypeDataPersister persister,
+ final ItemDataConsumer dataManager, final RepositoryIndexSearcherHolder indexSearcherHolder,
+ final NodeTypeRepository nodeTypeRepository) throws RepositoryException
{
this.namespaceRegistry = namespaceRegistry;
- this.persister = persister;
+ //this.persister = persister;
this.locationFactory = locationFactory;
+ this.dataManager = dataManager;
this.indexSearcherHolder = indexSearcherHolder;
+
this.valueFactory = new ValueFactoryImpl(locationFactory);
this.accessControlPolicy = accessControlPolicy;
- this.hierarchy = new NodeTypeDataHierarchyHolder();
-
- this.defsHolder = new ItemDefinitionDataHolder();
+ this.nodeTypeRepository = nodeTypeRepository;
this.listeners = Collections.synchronizedMap(new WeakHashMap<NodeTypeManagerListener, NodeTypeManagerListener>());
this.buildInNodeTypesNames = new HashSet<InternalQName>();
- //this.queryHandlers = new HashSet<QueryHandler>();
}
/**
@@ -190,283 +166,212 @@
* @param listener the new listener to be informed on (un)registration of node
* types
*/
- public void addListener(NodeTypeManagerListener listener)
+ public void addListener(final NodeTypeManagerListener listener)
{
- if (!listeners.containsKey(listener))
+ if (!this.listeners.containsKey(listener))
{
- listeners.put(listener, listener);
+ this.listeners.put(listener, listener);
}
}
- //
- // public void addQueryHandler(QueryHandler queryHandler)
- // {
- // queryHandlers.add(queryHandler);
- // }
-
/**
* {@inheritDoc}
+ * @throws RepositoryException
*/
- public NodeDefinitionData findChildNodeDefinition(InternalQName nodeName, InternalQName... nodeTypeNames)
- {
+ public NodeDefinitionData[] getAllChildNodeDefinitions(final InternalQName... nodeTypeNames)
- NodeDefinitionData ndResidual = defsHolder.getDefaultChildNodeDefinition(nodeName, nodeTypeNames);
-
- if (ndResidual == null && !Constants.JCR_ANY_NAME.equals(nodeName))
- ndResidual = findChildNodeDefinition(Constants.JCR_ANY_NAME, nodeTypeNames);
-
- return ndResidual;
-
- }
-
- /**
- * {@inheritDoc}
- */
- public NodeDefinitionData findChildNodeDefinition(InternalQName nodeName, InternalQName primaryNodeType,
- InternalQName[] mixinTypes)
{
+ final Collection<NodeDefinitionData> defs = new HashSet<NodeDefinitionData>();
- if (mixinTypes != null)
+ for (final InternalQName ntname : nodeTypeNames)
{
- InternalQName[] nts = new InternalQName[mixinTypes.length + 1];
- nts[0] = primaryNodeType;
- for (int i = 0; i < mixinTypes.length; i++)
+ for (final NodeDefinitionData cnd : this.nodeTypeRepository.getNodeType(ntname)
+ .getDeclaredChildNodeDefinitions())
{
- nts[i + 1] = mixinTypes[i];
+ defs.add(cnd);
}
- return findChildNodeDefinition(nodeName, nts);
+
+ for (final InternalQName suname : this.nodeTypeRepository.getSupertypes(ntname))
+ {
+ for (final NodeDefinitionData cnd : this.nodeTypeRepository.getNodeType(suname)
+ .getDeclaredChildNodeDefinitions())
+ {
+ defs.add(cnd);
+ }
+ }
}
- return findChildNodeDefinition(nodeName, primaryNodeType);
+ return defs.toArray(new NodeDefinitionData[defs.size()]);
}
/**
* {@inheritDoc}
+ * @throws RepositoryException
*/
- public NodeTypeData findNodeType(InternalQName typeName)
+ public List<NodeTypeData> getAllNodeTypes()
{
- return hierarchy.getNodeType(typeName);
+ try
+ {
+ return this.nodeTypeRepository.getAllNodeTypes();
+ }
+ catch (RepositoryException e)
+ {
+ log.error(e.getLocalizedMessage());
+ }
+ return new ArrayList<NodeTypeData>();
+
}
/**
* {@inheritDoc}
+ * @throws RepositoryException
*/
- public PropertyDefinitionDatas findPropertyDefinitions(InternalQName propertyName, InternalQName primaryNodeType,
- InternalQName[] mixinTypes)
+ public PropertyDefinitionData[] getAllPropertyDefinitions(final InternalQName... nodeTypeNames)
+
{
+ final Collection<PropertyDefinitionData> defs = new HashSet<PropertyDefinitionData>();
- if (mixinTypes != null)
+ for (final InternalQName ntname : nodeTypeNames)
{
- InternalQName[] nts = new InternalQName[mixinTypes.length + 1];
- nts[0] = primaryNodeType;
- for (int i = 0; i < mixinTypes.length; i++)
+ for (final PropertyDefinitionData pd : this.nodeTypeRepository.getNodeType(ntname)
+ .getDeclaredPropertyDefinitions())
{
- nts[i + 1] = mixinTypes[i];
+ defs.add(pd);
}
- return getPropertyDefinitions(propertyName, nts);
+
+ for (final InternalQName suname : this.nodeTypeRepository.getSupertypes(ntname))
+ {
+ for (final PropertyDefinitionData pd : this.nodeTypeRepository.getNodeType(suname)
+ .getDeclaredPropertyDefinitions())
+ {
+ defs.add(pd);
+ }
+ }
}
- return getPropertyDefinitions(propertyName, primaryNodeType);
+ return defs.toArray(new PropertyDefinitionData[defs.size()]);
}
/**
- * @return the accessControlPolicy
- */
- public String getAccessControlPolicy()
- {
- return accessControlPolicy;
- }
-
- /**
* {@inheritDoc}
+ * @throws RepositoryException
*/
- public NodeDefinitionData[] getAllChildNodeDefinitions(InternalQName... nodeTypeNames)
+ public NodeDefinitionData getChildNodeDefinition(final InternalQName nodeName, final InternalQName... nodeTypeNames)
+ throws RepositoryException
{
- Collection<NodeDefinitionData> defs = new HashSet<NodeDefinitionData>();
- for (InternalQName ntname : nodeTypeNames)
- {
- for (NodeDefinitionData cnd : hierarchy.getNodeType(ntname).getDeclaredChildNodeDefinitions())
- defs.add(cnd);
+ NodeDefinitionData ndResidual = this.nodeTypeRepository.getDefaultChildNodeDefinition(nodeName, nodeTypeNames);
- for (InternalQName suname : hierarchy.getSupertypes(ntname))
- {
- for (NodeDefinitionData cnd : hierarchy.getNodeType(suname).getDeclaredChildNodeDefinitions())
- defs.add(cnd);
- }
+ if (ndResidual == null && !Constants.JCR_ANY_NAME.equals(nodeName))
+ {
+ ndResidual = getChildNodeDefinition(Constants.JCR_ANY_NAME, nodeTypeNames);
}
- return defs.toArray(new NodeDefinitionData[defs.size()]);
- }
+ return ndResidual;
- /**
- * {@inheritDoc}
- */
- public List<NodeTypeData> getAllNodeTypes()
- {
- return hierarchy.getAllNodeTypes();
}
/**
* {@inheritDoc}
+ * @throws RepositoryException
*/
- public PropertyDefinitionData[] getAllPropertyDefinitions(InternalQName... nodeTypeNames)
+ public NodeDefinitionData getChildNodeDefinition(final InternalQName nodeName, final InternalQName primaryNodeType,
+ final InternalQName[] mixinTypes) throws RepositoryException
{
- Collection<PropertyDefinitionData> defs = new HashSet<PropertyDefinitionData>();
- for (InternalQName ntname : nodeTypeNames)
+ if (mixinTypes != null)
{
- for (PropertyDefinitionData pd : hierarchy.getNodeType(ntname).getDeclaredPropertyDefinitions())
- defs.add(pd);
-
- for (InternalQName suname : hierarchy.getSupertypes(ntname))
+ final InternalQName[] nts = new InternalQName[mixinTypes.length + 1];
+ nts[0] = primaryNodeType;
+ for (int i = 0; i < mixinTypes.length; i++)
{
- for (PropertyDefinitionData pd : hierarchy.getNodeType(suname).getDeclaredPropertyDefinitions())
- defs.add(pd);
+ nts[i + 1] = mixinTypes[i];
}
+ return getChildNodeDefinition(nodeName, nts);
}
- return defs.toArray(new PropertyDefinitionData[defs.size()]);
+ return getChildNodeDefinition(nodeName, primaryNodeType);
}
- // impl
-
/**
* {@inheritDoc}
+ * @throws RepositoryException
*/
- public NodeDefinitionData getChildNodeDefinition(InternalQName nodeName, InternalQName nodeTypeName,
- InternalQName parentTypeName)
- {
- NodeDefinitionData def = defsHolder.getChildNodeDefinition(parentTypeName, nodeName, nodeTypeName);
- // residual
- if (def == null)
- def = defsHolder.getChildNodeDefinition(parentTypeName, Constants.JCR_ANY_NAME, nodeTypeName);
- return def;
- }
-
- /**
- * {@inheritDoc}
- */
public Set<InternalQName> getDeclaredSubtypes(final InternalQName nodeTypeName)
{
- return hierarchy.getDeclaredSubtypes(nodeTypeName);
+ return this.nodeTypeRepository.getDeclaredSubtypes(nodeTypeName);
}
- public List<ItemDefinitionData> getManadatoryItemDefs(InternalQName primaryNodeType, InternalQName[] mixinTypes)
+ public List<ItemDefinitionData> getManadatoryItemDefs(final InternalQName primaryNodeType,
+ final InternalQName[] mixinTypes) throws RepositoryException
{
- Collection<ItemDefinitionData> mandatoryDefs = new HashSet<ItemDefinitionData>();
+ final Collection<ItemDefinitionData> mandatoryDefs = new HashSet<ItemDefinitionData>();
// primary type properties
ItemDefinitionData[] itemDefs = getAllPropertyDefinitions(new InternalQName[]{primaryNodeType});
- for (int i = 0; i < itemDefs.length; i++)
+ for (final ItemDefinitionData itemDef : itemDefs)
{
- if (itemDefs[i].isMandatory())
- mandatoryDefs.add(itemDefs[i]);
+ if (itemDef.isMandatory())
+ {
+ mandatoryDefs.add(itemDef);
+ }
}
// primary type nodes
itemDefs = getAllChildNodeDefinitions(new InternalQName[]{primaryNodeType});
- for (int i = 0; i < itemDefs.length; i++)
+ for (final ItemDefinitionData itemDef : itemDefs)
{
- if (itemDefs[i].isMandatory())
- mandatoryDefs.add(itemDefs[i]);
+ if (itemDef.isMandatory())
+ {
+ mandatoryDefs.add(itemDef);
+ }
}
// mixin properties
itemDefs = getAllPropertyDefinitions(mixinTypes);
- for (int i = 0; i < itemDefs.length; i++)
+ for (final ItemDefinitionData itemDef : itemDefs)
{
- if (itemDefs[i].isMandatory())
- mandatoryDefs.add(itemDefs[i]);
+ if (itemDef.isMandatory())
+ {
+ mandatoryDefs.add(itemDef);
+ }
}
// mixin nodes
itemDefs = getAllChildNodeDefinitions(mixinTypes);
- for (int i = 0; i < itemDefs.length; i++)
+ for (final ItemDefinitionData itemDef : itemDefs)
{
- if (itemDefs[i].isMandatory())
- mandatoryDefs.add(itemDefs[i]);
+ if (itemDef.isMandatory())
+ {
+ mandatoryDefs.add(itemDef);
+ }
}
return new ArrayList<ItemDefinitionData>(mandatoryDefs);
}
/**
- * Return
- *
- * @param nodeType
- * @return
- * @throws RepositoryException
- * @throws IOException
+ * {@inheritDoc}
+ * @throws RepositoryException
*/
- public Set<String> getNodes(InternalQName nodeType) throws RepositoryException
+ public NodeTypeData getNodeType(final InternalQName typeName)
{
- return indexSearcherHolder.getNodesByNodeType(nodeType);
+ return this.nodeTypeRepository.getNodeType(typeName);
}
/**
- * Return
- *
- * @param nodeType
- * @return
- * @throws RepositoryException
- * @throws IOException
- */
- public Set<String> getNodes(InternalQName nodeType, InternalQName[] includeProperties,
- InternalQName[] excludeProperties) throws RepositoryException
- {
- return new HashSet<String>();
-
- // Query query = getQuery(nodeType);
- // if (includeProperties.length > 0)
- // {
- // BooleanQuery tmp = new BooleanQuery();
- // for (int i = 0; i < includeProperties.length; i++)
- // {
- //
- // String field = locationFactory.createJCRName(includeProperties[i]).getAsString();
- // tmp.add(new TermQuery(new Term(FieldNames.PROPERTIES_SET, field)), Occur.MUST);
- // }
- // tmp.add(query, Occur.MUST);
- // query = tmp;
- // }
- //
- // if (excludeProperties.length > 0)
- // {
- // BooleanQuery tmp = new BooleanQuery();
- // for (int i = 0; i < excludeProperties.length; i++)
- // {
- //
- // String field = locationFactory.createJCRName(excludeProperties[i]).getAsString();
- // tmp.add(new TermQuery(new Term(FieldNames.PROPERTIES_SET, field)), Occur.MUST_NOT);
- // }
- // tmp.add(query, Occur.MUST);
- // query = tmp;
- // }
- //
- // Iterator<QueryHandler> it = queryHandlers.iterator();
- // Set<String> result = new HashSet<String>();
- //
- // try
- // {
- // indexSearcherHolder.getNodesByNodeType()
- // }
- // catch (IOException e)
- // {
- // throw new RepositoryException(e.getLocalizedMessage(), e);
- // }
- // return result;
- }
-
- /**
* {@inheritDoc}
+ * @throws RepositoryException
*/
- public PropertyDefinitionDatas getPropertyDefinitions(InternalQName propertyName, InternalQName... nodeTypeNames)
+ public PropertyDefinitionDatas getPropertyDefinitions(final InternalQName propertyName,
+ final InternalQName... nodeTypeNames) throws RepositoryException
{
- PropertyDefinitionDatas propertyDefinitions = defsHolder.getPropertyDefinitions(propertyName, nodeTypeNames);
+ PropertyDefinitionDatas propertyDefinitions =
+ this.nodeTypeRepository.getPropertyDefinitions(propertyName, nodeTypeNames);
// Try super
if (propertyDefinitions == null)
{
for (int i = 0; i < nodeTypeNames.length && propertyDefinitions == null; i++)
{
- InternalQName[] supers = hierarchy.getNodeType(nodeTypeNames[i]).getDeclaredSupertypeNames();
+ final InternalQName[] supers =
+ this.nodeTypeRepository.getNodeType(nodeTypeNames[i]).getDeclaredSupertypeNames();
propertyDefinitions = getPropertyDefinitions(propertyName, supers);
}
@@ -481,56 +386,81 @@
return propertyDefinitions;
}
- // // TODO make me private
- // public Set<QueryHandler> getQueryHandlers()
- // {
- // return queryHandlers;
- // }
+ /**
+ * {@inheritDoc}
+ * @throws RepositoryException
+ */
+ public PropertyDefinitionDatas getPropertyDefinitions(final InternalQName propertyName,
+ final InternalQName primaryNodeType, final InternalQName[] mixinTypes) throws RepositoryException
+ {
+ if (mixinTypes != null)
+ {
+ final InternalQName[] nts = new InternalQName[mixinTypes.length + 1];
+ nts[0] = primaryNodeType;
+ for (int i = 0; i < mixinTypes.length; i++)
+ {
+ nts[i + 1] = mixinTypes[i];
+ }
+ return getPropertyDefinitions(propertyName, nts);
+ }
+
+ return getPropertyDefinitions(propertyName, primaryNodeType);
+ }
+
/**
* @param nodeTypeName
* @return
+ * @throws RepositoryException
*/
public Set<InternalQName> getSubtypes(final InternalQName nodeTypeName)
{
- return hierarchy.getSubtypes(nodeTypeName);
+ return this.nodeTypeRepository.getSubtypes(nodeTypeName);
}
public Set<InternalQName> getSupertypes(final InternalQName nodeTypeName)
{
- return hierarchy.getSupertypes(nodeTypeName);
+ return this.nodeTypeRepository.getSupertypes(nodeTypeName);
}
- public boolean isChildNodePrimaryTypeAllowed(InternalQName childNodeTypeName, InternalQName parentNodeType,
- InternalQName[] parentMixinNames)
+ public boolean isChildNodePrimaryTypeAllowed(final InternalQName childNodeTypeName,
+ final InternalQName parentNodeType, final InternalQName[] parentMixinNames) throws RepositoryException
{
// NodeTypeData childDef = findNodeType(childNodeTypeName);
- Set<InternalQName> testSuperTypesNames = hierarchy.getSupertypes(childNodeTypeName);
+ final Set<InternalQName> testSuperTypesNames = this.nodeTypeRepository.getSupertypes(childNodeTypeName);
NodeDefinitionData[] allChildNodeDefinitions = getAllChildNodeDefinitions(parentNodeType);
- for (NodeDefinitionData cnd : allChildNodeDefinitions)
+ for (final NodeDefinitionData cnd : allChildNodeDefinitions)
{
- for (InternalQName req : cnd.getRequiredPrimaryTypes())
+ for (final InternalQName req : cnd.getRequiredPrimaryTypes())
{
if (childNodeTypeName.equals(req))
+ {
return true;
- for (InternalQName superName : testSuperTypesNames)
+ }
+ for (final InternalQName superName : testSuperTypesNames)
{
if (superName.equals(req))
+ {
return true;
+ }
}
}
}
allChildNodeDefinitions = getAllChildNodeDefinitions(parentMixinNames);
- for (NodeDefinitionData cnd : allChildNodeDefinitions)
+ for (final NodeDefinitionData cnd : allChildNodeDefinitions)
{
- for (InternalQName req : cnd.getRequiredPrimaryTypes())
+ for (final InternalQName req : cnd.getRequiredPrimaryTypes())
{
if (childNodeTypeName.equals(req))
+ {
return true;
- for (InternalQName superName : testSuperTypesNames)
+ }
+ for (final InternalQName superName : testSuperTypesNames)
{
if (superName.equals(req))
+ {
return true;
+ }
}
}
}
@@ -540,32 +470,41 @@
/**
* {@inheritDoc}
+ * @throws RepositoryException
*/
public boolean isNodeType(final InternalQName testTypeName, final InternalQName... typesNames)
+
{
- return hierarchy.isNodeType(testTypeName, typesNames);
+ return this.nodeTypeRepository.isNodeType(testTypeName, typesNames);
}
/**
* {@inheritDoc}
+ * @throws RepositoryException
*/
public boolean isNodeType(final InternalQName testTypeName, final InternalQName primaryType,
final InternalQName[] mixinTypes)
{
- if (hierarchy.isNodeType(testTypeName, primaryType))
+ if (this.nodeTypeRepository.isNodeType(testTypeName, primaryType))
+ {
return true;
+ }
- if (hierarchy.isNodeType(testTypeName, mixinTypes))
+ if (this.nodeTypeRepository.isNodeType(testTypeName, mixinTypes))
+ {
return true;
+ }
return false;
}
/**
* {@inheritDoc}
+ * @throws RepositoryException
*/
public boolean isOrderableChildNodesSupported(final InternalQName primaryType, final InternalQName[] mixinTypes)
+ throws RepositoryException
{
final int nlen = mixinTypes != null ? mixinTypes.length : 0;
@@ -573,23 +512,31 @@
{
InternalQName name;
if (i < 0)
+ {
name = primaryType;
+ }
else
+ {
name = mixinTypes[i];
+ }
- NodeTypeData nt = hierarchy.getNodeType(name);
+ final NodeTypeData nt = this.nodeTypeRepository.getNodeType(name);
if (nt != null)
{
if (nt.hasOrderableChildNodes())
+ {
return true;
+ }
- Set<InternalQName> supers = hierarchy.getSupertypes(nt.getName());
- for (InternalQName suName : supers)
+ final Set<InternalQName> supers = this.nodeTypeRepository.getSupertypes(nt.getName());
+ for (final InternalQName suName : supers)
{
- NodeTypeData su = hierarchy.getNodeType(suName);
+ final NodeTypeData su = this.nodeTypeRepository.getNodeType(suName);
if (su != null && su.hasOrderableChildNodes())
+ {
return true;
+ }
}
}
}
@@ -597,174 +544,57 @@
return false;
}
- public PlainChangesLog makeAutoCreatedItems(NodeData parent, InternalQName nodeTypeName,
- ItemDataConsumer dataManager, String owner) throws RepositoryException
+ /**
+ * {@inheritDoc}
+ */
+ public List<NodeTypeData> registerNodeTypes(final InputStream is, final int alreadyExistsBehaviour,
+ final String contentType) throws RepositoryException
{
- PlainChangesLogImpl changes = new PlainChangesLogImpl();
- NodeTypeData type = findNodeType(nodeTypeName);
- changes.addAll(makeAutoCreatedProperties(parent, nodeTypeName, getAllPropertyDefinitions(nodeTypeName),
- dataManager, owner).getAllStates());
- changes.addAll(makeAutoCreatedNodes(parent, nodeTypeName, getAllChildNodeDefinitions(nodeTypeName), dataManager,
- owner).getAllStates());
-
- // Add autocreated child nodes
-
- // versionable
- if (isNodeType(Constants.MIX_VERSIONABLE, new InternalQName[]{type.getName()}))
+ final NodeTypeConverter nodeTypeConverter = new NodeTypeConverter(this.locationFactory, this.accessControlPolicy);
+ final NodeTypeDataValidator nodeTypeDataValidator = new NodeTypeDataValidator(this.nodeTypeRepository);
+ NodeTypeDataPersister serializer = null;
+ if (contentType.equalsIgnoreCase(TEXT_XML))
{
-
- // using VH helper as for one new VH, all changes in changes log
- makeMixVesionableChanges(parent, dataManager, changes);
+ serializer = new XmlNodeTypeDataPersister(nodeTypeConverter, is);
}
- return changes;
- }
-
- public PlainChangesLog makeAutoCreatedNodes(NodeData parent, InternalQName typeName, NodeDefinitionData[] nodeDefs,
- ItemDataConsumer dataManager, String owner) throws RepositoryException
- {
- PlainChangesLogImpl changes = new PlainChangesLogImpl();
- Set<InternalQName> addedNodes = new HashSet<InternalQName>();
- for (NodeDefinitionData ndef : nodeDefs)
+ else if (contentType.equalsIgnoreCase(TEXT_X_JCR_CND))
{
- if (ndef.isAutoCreated())
- {
- ItemData pdata = dataManager.getItemData(parent, new QPathEntry(ndef.getName(), 0));
- if ((pdata == null && !addedNodes.contains(ndef.getName())) || (pdata != null && !pdata.isNode()))
- {
-
- TransientNodeData childNodeData =
- TransientNodeData.createNodeData(parent, ndef.getName(), ndef.getDefaultPrimaryType(), IdGenerator
- .generate());
- changes.add(ItemState.createAddedState(childNodeData, false));
- changes.addAll(makeAutoCreatedItems(childNodeData, childNodeData.getPrimaryTypeName(), dataManager,
- owner).getAllStates());
- addedNodes.add(ndef.getName());
- }
- else
- {
- if (LOG.isDebugEnabled())
- {
- LOG.debug("Skipping existed node " + ndef.getName() + " in " + parent.getQPath().getAsString()
- + " during the automatic creation of items for " + typeName.getAsString()
- + " nodetype or mixin type");
- }
- }
- }
+ throw new RepositoryException("Unsupported content type:" + contentType);
}
- return changes;
-
- }
-
- public PlainChangesLog makeAutoCreatedProperties(NodeData parent, InternalQName typeName,
- PropertyDefinitionData[] propDefs, ItemDataConsumer dataManager, String owner) throws RepositoryException
- {
- PlainChangesLogImpl changes = new PlainChangesLogImpl();
-
- Set<InternalQName> addedProperties = new HashSet<InternalQName>();
-
- // Add autocreated child properties
-
- for (PropertyDefinitionData pdef : propDefs)
+ else
{
- // if (propDefs[i] == null) // TODO it is possible for not mandatory
- // propDef
- // continue;
-
- if (pdef.isAutoCreated())
- {
-
- ItemData pdata = dataManager.getItemData(parent, new QPathEntry(pdef.getName(), 0));
- if ((pdata == null && !addedProperties.contains(pdef.getName())) || (pdata != null && pdata.isNode()))
- {
-
- List<ValueData> listAutoCreateValue = autoCreatedValue(parent, typeName, pdef, owner);
-
- if (listAutoCreateValue != null)
- {
- TransientPropertyData propertyData =
- TransientPropertyData.createPropertyData(parent, pdef.getName(), pdef.getRequiredType(), pdef
- .isMultiple(), listAutoCreateValue);
- changes.add(ItemState.createAddedState(propertyData));
- addedProperties.add(pdef.getName());
- }
- }
- else
- {
- // TODO if autocreated property exists it's has wrong data (e.g. ACL)
- // - throw an exception
- if (LOG.isDebugEnabled())
- {
- LOG.debug("Skipping existed property " + pdef.getName() + " in " + parent.getQPath().getAsString()
- + " during the automatic creation of items for " + typeName.getAsString()
- + " nodetype or mixin type");
- }
- }
- }
+ throw new RepositoryException("Unsupported content type:" + contentType);
}
- return changes;
- }
+ final List<NodeTypeData> nodeTypes = serializer.getAllNodeTypes();
- /**
- * {@inheritDoc}
- */
- public List<NodeTypeData> registerNodeTypes(InputStream xml, int alreadyExistsBehaviour) throws RepositoryException
- {
+ // validate
+ nodeTypeDataValidator.validateNodeType(nodeTypes);
- try
- {
-
- IBindingFactory factory = BindingDirectory.getFactory(NodeTypeValuesList.class);
- IUnmarshallingContext uctx = factory.createUnmarshallingContext();
- NodeTypeValuesList nodeTypeValuesList = (NodeTypeValuesList)uctx.unmarshalDocument(xml, null);
- List ntvList = nodeTypeValuesList.getNodeTypeValuesList();
-
- long start = System.currentTimeMillis();
- List<NodeTypeValue> nts = new ArrayList<NodeTypeValue>();
- for (int i = 0; i < ntvList.size(); i++)
- {
- if (ntvList.get(i) != null)
- {
- NodeTypeValue nodeTypeValue = (NodeTypeValue)ntvList.get(i);
- nts.add(nodeTypeValue);
- }
- else
- {
- // Hm! Smth is wrong in xml document
- LOG.error("Empty nodeTypeValue in xml document, index: " + i + ", skiping...");
- }
- }
- if (LOG.isDebugEnabled())
- LOG.debug("Nodetypes registered from xml definitions (count: " + ntvList.size() + "). "
- + (System.currentTimeMillis() - start) + " ms.");
-
- return registerNodeTypes(nts, alreadyExistsBehaviour);
-
- }
- catch (JiBXException e)
- {
- throw new RepositoryException("Error in config initialization " + e, e);
- }
+ //registerNodeType(nodeTypes, alreadyExistsBehaviour);
+ nodeTypeRepository.registerNodeType(nodeTypes, this, accessControlPolicy, alreadyExistsBehaviour);
+ return nodeTypes;
}
/**
* {@inheritDoc}
*/
- public List<NodeTypeData> registerNodeTypes(List<NodeTypeValue> ntvalues, int alreadyExistsBehaviour)
+ public List<NodeTypeData> registerNodeTypes(final List<NodeTypeValue> ntvalues, final int alreadyExistsBehaviour)
throws RepositoryException
{
- PlainChangesLog changesLog = new PlainChangesLogImpl();
+ final NodeTypeConverter nodeTypeConverter = new NodeTypeConverter(this.locationFactory, this.accessControlPolicy);
+ final NodeTypeDataValidator nodeTypeDataValidator = new NodeTypeDataValidator(this.nodeTypeRepository);
+ // convert to Node data.
+ final List<NodeTypeData> nodeTypes = nodeTypeConverter.convertFromValueToData(ntvalues);
- Map<InternalQName, NodeTypeData> nodeTypeDataList = parseNodeTypes(ntvalues);
+ // validate
+ nodeTypeDataValidator.validateNodeType(nodeTypes);
- for (NodeTypeData nodeTypeData : nodeTypeDataList.values())
- {
- changesLog.addAll(registerNodeType(nodeTypeData, alreadyExistsBehaviour, nodeTypeDataList).getAllStates());
- }
+ //registerNodeType(nodeTypes, alreadyExistsBehaviour);
+ nodeTypeRepository.registerNodeType(nodeTypes, this, accessControlPolicy, alreadyExistsBehaviour);
- persister.saveChanges(changesLog);
- return new ArrayList<NodeTypeData>(nodeTypeDataList.values());
+ return nodeTypes;
}
/**
@@ -772,780 +602,270 @@
*
* @param listener an existing listener
*/
- public void removeListener(NodeTypeManagerListener listener)
+ public void removeListener(final NodeTypeManagerListener listener)
{
- listeners.remove(listener);
+ this.listeners.remove(listener);
}
/**
- * Unregisters the specified node type. In order for a node type to be
- * successfully unregistered it must meet the following conditions:
- * <ol>
- * <li>the node type must obviously be registered.</li>
- * <li>a built-in node type can not be unregistered.</li>
- * <li>the node type must not have dependents, i.e. other node types that are
- * referencing it.</li>
- * <li>the node type must not be currently used by any workspace.</li>
- * </ol>
- *
- * @param ntName name of the node type to be unregistered
- * @throws NoSuchNodeTypeException if <code>ntName</code> does not denote a
- * registered node type.
- * @throws RepositoryException
- * @throws RepositoryException if another error occurs.
- * @see #unregisterNodeTypes(Collection)
+ * {@inheritDoc}
*/
- public void unregisterNodeType(InternalQName nodeTypeName) throws RepositoryException
+ public PlainChangesLog setPrimaryType(final NodeData nodeData, final InternalQName nodeTypeName)
+ throws RepositoryException
{
+ final PlainChangesLog changesLog = new PlainChangesLogImpl();
- NodeTypeData nodeType = hierarchy.getNodeType(nodeTypeName);
- if (nodeType == null)
- throw new NoSuchNodeTypeException(nodeTypeName.getAsString());
- // check build in
- if (buildInNodeTypesNames.contains(nodeTypeName))
- throw new RepositoryException(nodeTypeName.toString() + ": can't unregister built-in node type.");
- // check dependencies
- Set<InternalQName> descendantNt = hierarchy.getSubtypes(nodeTypeName);
- if (descendantNt.size() > 0)
+ final NodeTypeData ancestorDefinition = getNodeType(nodeData.getPrimaryTypeName());
+ final NodeTypeData recipientDefinition = getNodeType(nodeTypeName);
+
+ InternalQName[] ancestorAllNodeTypeNames = null;
+ if (nodeData.getMixinTypeNames() == null || nodeData.getMixinTypeNames().length == 0)
{
- String message =
- "Can not remove " + nodeTypeName.getAsString()
- + "nodetype, because the following node types depend on it: ";
- for (InternalQName internalQName : descendantNt)
- {
- message += internalQName.getAsString() + " ";
- }
- throw new RepositoryException(message);
+ ancestorAllNodeTypeNames = new InternalQName[]{nodeData.getPrimaryTypeName()};
}
- Set<String> nodes = getNodes(nodeTypeName);
- if (nodes.size() > 0)
+ else
{
- String message =
- "Can not remove " + nodeTypeName.getAsString()
- + " nodetype, because the following node types is used in nodes with uuid: ";
- for (String uuids : nodes)
- {
- message += uuids + " ";
- }
- throw new RepositoryException(message);
-
+ ancestorAllNodeTypeNames = new InternalQName[nodeData.getMixinTypeNames().length + 1];
+ ancestorAllNodeTypeNames[0] = nodeData.getPrimaryTypeName();
+ System.arraycopy(nodeData.getMixinTypeNames(), 0, ancestorAllNodeTypeNames, 1,
+ nodeData.getMixinTypeNames().length);
}
- internalUnregister(nodeTypeName, nodeType);
- }
-
- protected List<ValueData> autoCreatedValue(NodeData parent, InternalQName typeName, PropertyDefinitionData def,
- String owner) throws RepositoryException
- {
- NodeTypeDataManager typeDataManager = this;
- List<ValueData> vals = new ArrayList<ValueData>();
-
- if (typeDataManager.isNodeType(Constants.NT_BASE, new InternalQName[]{typeName})
- && def.getName().equals(Constants.JCR_PRIMARYTYPE))
+ InternalQName[] recipienAllNodeTypeNames = null;
+ if (nodeData.getMixinTypeNames() == null || nodeData.getMixinTypeNames().length == 0)
{
- vals.add(new TransientValueData(parent.getPrimaryTypeName()));
-
+ recipienAllNodeTypeNames = new InternalQName[]{nodeTypeName};
}
- else if (typeDataManager.isNodeType(Constants.MIX_REFERENCEABLE, new InternalQName[]{typeName})
- && def.getName().equals(Constants.JCR_UUID))
+ else
{
- vals.add(new TransientValueData(parent.getIdentifier()));
-
+ recipienAllNodeTypeNames = new InternalQName[nodeData.getMixinTypeNames().length + 1];
+ recipienAllNodeTypeNames[0] = nodeTypeName;
+ System.arraycopy(nodeData.getMixinTypeNames(), 0, recipienAllNodeTypeNames, 1,
+ nodeData.getMixinTypeNames().length);
}
- else if (typeDataManager.isNodeType(Constants.NT_HIERARCHYNODE, new InternalQName[]{typeName})
- && def.getName().equals(Constants.JCR_CREATED))
- {
- vals.add(new TransientValueData(Calendar.getInstance()));
- }
- else if (typeDataManager.isNodeType(Constants.EXO_OWNEABLE, new InternalQName[]{typeName})
- && def.getName().equals(Constants.EXO_OWNER))
- {
- // String owner = session.getUserID();
- vals.add(new TransientValueData(owner));
- parent.setACL(new AccessControlList(owner, parent.getACL().getPermissionEntries()));
+ final boolean recipientsMixVersionable = isNodeType(Constants.MIX_VERSIONABLE, recipienAllNodeTypeNames);
+ final boolean ancestorIsMixVersionable = isNodeType(Constants.MIX_VERSIONABLE, ancestorAllNodeTypeNames);
- }
- else if (typeDataManager.isNodeType(Constants.EXO_PRIVILEGEABLE, new InternalQName[]{typeName})
- && def.getName().equals(Constants.EXO_PERMISSIONS))
+ ItemAutocreator itemAutocreator = new ItemAutocreator(this, valueFactory, dataManager);
+ if (recipientsMixVersionable && !ancestorIsMixVersionable)
{
- for (AccessControlEntry ace : parent.getACL().getPermissionEntries())
- {
- vals.add(new TransientValueData(ace));
- }
+ changesLog.addAll(itemAutocreator.makeMixVesionableChanges(nodeData).getAllStates());
}
- else
+ else if (!recipientsMixVersionable && ancestorIsMixVersionable)
{
- String[] propVal = def.getDefaultValues();
- // there can be null in definition but should not be null value
- if (propVal != null && propVal.length != 0)
- {
- for (String v : propVal)
- {
- if (v != null)
- if (def.getRequiredType() == PropertyType.UNDEFINED)
- vals.add(((BaseValue)valueFactory.createValue(v)).getInternalData());
- else
- vals.add(((BaseValue)valueFactory.createValue(v, def.getRequiredType())).getInternalData());
- else
- {
- vals.add(null);
- }
- }
- }
- else
- return null;
- }
- return vals;
- }
+ final StringBuffer buffer = new StringBuffer();
+ buffer.append("Fail to change node type from ");
+ buffer.append(ancestorDefinition.getName().getAsString());
+ buffer.append(" to ");
+ buffer.append(recipientDefinition.getName().getAsString());
+ buffer.append(" because change from mix:versionable = true ");
+ buffer.append(" to mix:versionable = false is not alowed");
- protected void initDefault() throws RepositoryException
- {
- long start = System.currentTimeMillis();
- try
- {
- InputStream xml = NodeTypeManagerImpl.class.getResourceAsStream(NODETYPES_FILE);
- if (xml != null)
- {
- List<NodeTypeData> registerNodeTypes = registerNodeTypes(xml, ExtendedNodeTypeManager.IGNORE_IF_EXISTS);
- for (NodeTypeData nodeTypeData : registerNodeTypes)
- {
- buildInNodeTypesNames.add(nodeTypeData.getName());
- }
- }
- else
- {
- String msg =
- "Resource file '" + NODETYPES_FILE
- + "' with NodeTypes configuration does not found. Can not create node type manager";
- LOG.error(msg);
- throw new RepositoryException(msg);
- }
+ throw new ConstraintViolationException(buffer.toString());
}
- catch (RepositoryException e)
- {
- String msg =
- "Error of initialization default types. Resource file with NodeTypes configuration '" + NODETYPES_FILE
- + "'. " + e;
- LOG.error(msg);
- throw new RepositoryException(msg, e);
- }
- finally
- {
- LOG.info("Initialization of default nodetypes done. " + (System.currentTimeMillis() - start) + " ms.");
- }
- }
- /**
- * @param nodeType
- * @throws RepositoryException
- * @throws ValueFormatException
- * @throws PathNotFoundException
- */
- protected void internalRegister(NodeTypeData nodeType, Map<InternalQName, NodeTypeData> volatileNodeTypes)
- throws PathNotFoundException, ValueFormatException, RepositoryException
- {
- hierarchy.addNodeType(nodeType, volatileNodeTypes);
+ // update primary type
- defsHolder.putDefinitions(nodeType.getName(), nodeType);
- // put supers
- Set<InternalQName> supers = hierarchy.getSupertypes(nodeType.getName(), volatileNodeTypes);
+ final PropertyData item =
+ (PropertyData)this.dataManager.getItemData(nodeData, new QPathEntry(Constants.JCR_PRIMARYTYPE, 1));
- for (InternalQName superName : supers)
- {
- defsHolder.putDefinitions(nodeType.getName(), hierarchy.getNodeType(superName, volatileNodeTypes));
- }
- }
+ final TransientPropertyData primaryTypeData =
+ new TransientPropertyData(item.getQPath(), item.getIdentifier(), item.getPersistedVersion(), item.getType(),
+ item.getParentIdentifier(), item.isMultiValued());
+ primaryTypeData.setValue(new TransientValueData(nodeTypeName));
- //
- // /**
- // * @param nodeType
- // * @return
- // * @throws RepositoryException
- // */
- // private NodeDefinitionData[] getAllChildNodeDefinitions(NodeTypeData
- // nodeType) throws RepositoryException {
- // Collection<NodeDefinitionData> defs = new HashSet<NodeDefinitionData>();
- //
- // for (NodeDefinitionData cnd : nodeType.getDeclaredChildNodeDefinitions()) {
- // defs.add(cnd);
- // }
- //
- // for (InternalQName suname : nodeType.getDeclaredSupertypeNames()) {
- // NodeDefinitionData[] superDefinitionData =
- // getAllChildNodeDefinitions(hierarchy.getNodeType(suname));
- // for (int i = 0; i < superDefinitionData.length; i++) {
- // defs.add(superDefinitionData[i]);
- // }
- // }
- // return defs.toArray(new NodeDefinitionData[defs.size()]);
- // }
- //
- // /**
- // * @param nodeType
- // * @return
- // */
- // private PropertyDefinitionData[] getAllPropertyDefinitions(NodeTypeData
- // nodeType) {
- // Collection<PropertyDefinitionData> defs = new
- // HashSet<PropertyDefinitionData>();
- //
- // for (PropertyDefinitionData pd : nodeType.getDeclaredPropertyDefinitions())
- // defs.add(pd);
- //
- // for (InternalQName suname : nodeType.getDeclaredSupertypeNames()) {
- // PropertyDefinitionData[] superDefinitionData =
- // getAllPropertyDefinitions(hierarchy.getNodeType(suname));
- // for (int i = 0; i < superDefinitionData.length; i++) {
- // defs.add(superDefinitionData[i]);
- // }
- //
- // }
- //
- // return defs.toArray(new PropertyDefinitionData[defs.size()]);
- // }
+ changesLog.add(ItemState.createUpdatedState(primaryTypeData, true));
- /**
- * @param nodeTypeName
- * @param nodeType
- * @throws RepositoryException
- */
- protected void internalUnregister(InternalQName nodeTypeName, NodeTypeData nodeType) throws RepositoryException
- {
- // put supers
- Set<InternalQName> supers = hierarchy.getSupertypes(nodeTypeName);
+ final List<NodeData> affectedNodes = new ArrayList<NodeData>();
+ affectedNodes.add(nodeData);
- // remove from internal lists
- hierarchy.removeNodeType(nodeTypeName);
+ // child nodes
+ final NodeDefinitionComparator nodeDefinitionComparator =
+ new NodeDefinitionComparator(this, dataManager, itemAutocreator, affectedNodes);
+ changesLog.addAll(nodeDefinitionComparator.compare(recipientDefinition,
+ getAllChildNodeDefinitions(ancestorAllNodeTypeNames), getAllChildNodeDefinitions(recipienAllNodeTypeNames))
+ .getAllStates());
- // remove supers
- if (supers != null)
- for (InternalQName superName : supers)
- {
- defsHolder.removeDefinitions(nodeTypeName, hierarchy.getNodeType(superName));
- }
- // remove it self
- defsHolder.removeDefinitions(nodeTypeName, nodeType);
+ // properties defs
+ final PropertyDefinitionComparator propertyDefinitionComparator =
+ new PropertyDefinitionComparator(this, dataManager, itemAutocreator, affectedNodes, locationFactory);
+ changesLog.addAll(propertyDefinitionComparator.compare(recipientDefinition,
+ getAllPropertyDefinitions(ancestorAllNodeTypeNames), getAllPropertyDefinitions(recipienAllNodeTypeNames))
+ .getAllStates());
+
+ return changesLog;
}
- /**
- * parseNodeType.
- *
- * @param ntvalue
- * @return
- * @throws RepositoryException
- */
- protected Map<InternalQName, NodeTypeData> parseNodeTypes(List<NodeTypeValue> ntvalues) throws RepositoryException
+ public void start()
+
{
- Map<InternalQName, NodeTypeData> nodeTypeDataList = new HashMap<InternalQName, NodeTypeData>();
- for (NodeTypeValue ntvalue : ntvalues)
+ if (!started)
{
-
- if (accessControlPolicy.equals(AccessControlPolicy.DISABLE))
+ try
{
- List<String> nsupertypes = ntvalue.getDeclaredSupertypeNames();
- if (nsupertypes != null && nsupertypes.contains("exo:privilegeable")
- || ntvalue.getName().equals("exo:privilegeable"))
- {
- // skip this node, so it's not necessary at this runtime
- // + "' -- it's not necessary at this runtime";
- LOG.warn("Node type " + ntvalue.getName() + " is not register due to DISABLE control policy");
- break;
- }
- }
+ final InputStream xml = NodeTypeManagerImpl.class.getResourceAsStream(NODETYPES_FILE);
- // We have to validate node value before registering it
- ntvalue.validateNodeType();
- // throw new RepositoryException("Invalid node type value");
-
- // declaring NT name
- InternalQName ntName = locationFactory.parseJCRName(ntvalue.getName()).getInternalName();
-
- List<String> stlist = ntvalue.getDeclaredSupertypeNames();
- InternalQName[] supertypes = new InternalQName[stlist.size()];
- for (int i = 0; i < stlist.size(); i++)
- {
- supertypes[i] = locationFactory.parseJCRName(stlist.get(i)).getInternalName();
- }
-
- List<PropertyDefinitionValue> pdlist = ntvalue.getDeclaredPropertyDefinitionValues();
- PropertyDefinitionData[] props = new PropertyDefinitionData[pdlist.size()];
- for (int i = 0; i < pdlist.size(); i++)
- {
- PropertyDefinitionValue v = pdlist.get(i);
-
- PropertyDefinitionData pd;
- pd =
- new PropertyDefinitionData(locationFactory.parseJCRName(v.getName()).getInternalName(), ntName, v
- .isAutoCreate(), v.isMandatory(), v.getOnVersion(), v.isReadOnly(), v.getRequiredType(), v
- .getValueConstraints() != null ? v.getValueConstraints().toArray(
- new String[v.getValueConstraints().size()]) : new String[0], v.getDefaultValueStrings() == null
- ? new String[0] : v.getDefaultValueStrings().toArray(new String[v.getDefaultValueStrings().size()]),
- v.isMultiple());
-
- props[i] = pd;
- }
-
- List<NodeDefinitionValue> ndlist = ntvalue.getDeclaredChildNodeDefinitionValues();
- NodeDefinitionData[] nodes = new NodeDefinitionData[ndlist.size()];
- for (int i = 0; i < ndlist.size(); i++)
- {
- NodeDefinitionValue v = ndlist.get(i);
-
- List<String> rnts = v.getRequiredNodeTypeNames();
- InternalQName[] requiredNTs = new InternalQName[rnts.size()];
- for (int ri = 0; ri < rnts.size(); ri++)
+ if (xml != null)
{
- requiredNTs[ri] = locationFactory.parseJCRName(rnts.get(ri)).getInternalName();
- }
- InternalQName defaultNodeName = null;
- if (v.getDefaultNodeTypeName() != null)
- {
- defaultNodeName = locationFactory.parseJCRName(v.getDefaultNodeTypeName()).getInternalName();
- }
- NodeDefinitionData nd =
- new NodeDefinitionData(locationFactory.parseJCRName(v.getName()).getInternalName(), ntName, v
- .isAutoCreate(), v.isMandatory(), v.getOnVersion(), v.isReadOnly(), requiredNTs, defaultNodeName, v
- .isSameNameSiblings());
- nodes[i] = nd;
- }
- InternalQName primaryItemName = null;
- if (ntvalue.getPrimaryItemName() != null)
- primaryItemName = locationFactory.parseJCRName(ntvalue.getPrimaryItemName()).getInternalName();
+ final NodeTypeConverter nodeTypeConverter =
+ new NodeTypeConverter(this.locationFactory, this.accessControlPolicy);
+ final NodeTypeDataValidator nodeTypeDataValidator = new NodeTypeDataValidator(this.nodeTypeRepository);
+ final NodeTypeDataPersister serializer = new XmlNodeTypeDataPersister(nodeTypeConverter, xml);
- NodeTypeData nodeTypeData =
- new NodeTypeData(ntName, primaryItemName, ntvalue.isMixin(), ntvalue.isOrderableChild(), supertypes, props,
- nodes);
+ final List<NodeTypeData> defaultNodeTypes = serializer.getAllNodeTypes();
- validateNodeType(nodeTypeData);
- nodeTypeDataList.put(nodeTypeData.getName(), nodeTypeData);
- }
- checkCyclicDependencies(nodeTypeDataList);
- return nodeTypeDataList;
- }
+ // validate
+ nodeTypeDataValidator.validateNodeType(defaultNodeTypes);
- /**
- * Check according the JSR-170
- */
- protected void validateNodeType(NodeTypeData nodeType) throws RepositoryException
- {
- if (nodeType == null)
- {
- throw new RepositoryException("NodeType object " + nodeType + " is null");
- }
+ // check if default node type saved
+ if (!nodeTypeRepository.isStorageFilled())
+ {
- for (int i = 0; i < nodeType.getDeclaredSupertypeNames().length; i++)
- {
- if (nodeType.getName().equals(nodeType.getDeclaredSupertypeNames()[i]))
- {
- throw new RepositoryException("Invalid super type name"
- + nodeType.getDeclaredSupertypeNames()[i].getAsString());
- }
- }
- for (int i = 0; i < nodeType.getDeclaredPropertyDefinitions().length; i++)
- {
- if (!nodeType.getDeclaredPropertyDefinitions()[i].getDeclaringNodeType().equals(nodeType.getName()))
- {
- throw new RepositoryException("Invalid declared node type in property definitions with name "
- + nodeType.getDeclaredPropertyDefinitions()[i].getName().getAsString() + " not registred");
- }
- }
- for (int i = 0; i < nodeType.getDeclaredChildNodeDefinitions().length; i++)
- {
- if (!nodeType.getDeclaredChildNodeDefinitions()[i].getDeclaringNodeType().equals(nodeType.getName()))
- {
- throw new RepositoryException("Invalid declared node type in child node definitions with name "
- + nodeType.getDeclaredChildNodeDefinitions()[i].getName().getAsString() + " not registred");
- }
- }
+ //registerNodeType(defaultNodeTypes, ExtendedNodeTypeManager.IGNORE_IF_EXISTS);
+ nodeTypeRepository.registerNodeType(defaultNodeTypes, this, accessControlPolicy,
+ ExtendedNodeTypeManager.IGNORE_IF_EXISTS);
+ }
+ else
+ {
+ final List<NodeTypeData> allNodeTypes = nodeTypeRepository.getAllNodeTypes();
+ // register nodetypes in runtime
+ final Map<InternalQName, NodeTypeData> volatileNodeTypes = new HashMap<InternalQName, NodeTypeData>();
- if (nodeType.getName() == null)
- {
- throw new RepositoryException("NodeType implementation class " + nodeType.getClass().getName()
- + " is not supported in this method");
- }
- }
+ for (final NodeTypeData nodeTypeData : allNodeTypes)
+ {
+ volatileNodeTypes.put(nodeTypeData.getName(), nodeTypeData);
+ }
- private void checkCyclicDependencies(Map<InternalQName, NodeTypeData> nodeTypeDataList) throws RepositoryException
- {
- Set<InternalQName> unresolvedDependecies = new HashSet<InternalQName>();
- Set<InternalQName> resolvedDependecies = new HashSet<InternalQName>();
- for (Entry<InternalQName, NodeTypeData> entry : nodeTypeDataList.entrySet())
- {
- // / add itself
- NodeTypeData nodeTypeData = entry.getValue();
- resolvedDependecies.add(nodeTypeData.getName());
- // remove from unresolved
- unresolvedDependecies.remove(nodeTypeData.getName());
- // check suppers
- for (int i = 0; i < nodeTypeData.getDeclaredSupertypeNames().length; i++)
- {
- InternalQName superName = nodeTypeData.getDeclaredSupertypeNames()[i];
- if (hierarchy.getNodeType(superName) == null && !resolvedDependecies.contains(superName))
- {
- unresolvedDependecies.add(superName);
- }
- }
- // check node definition
- for (int i = 0; i < nodeTypeData.getDeclaredChildNodeDefinitions().length; i++)
- {
- NodeDefinitionData childnodeDefinitionData = nodeTypeData.getDeclaredChildNodeDefinitions()[i];
- for (int j = 0; j < childnodeDefinitionData.getRequiredPrimaryTypes().length; j++)
- {
- InternalQName requiredPrimaryTypeName = childnodeDefinitionData.getRequiredPrimaryTypes()[j];
- if (hierarchy.getNodeType(requiredPrimaryTypeName) == null
- && !resolvedDependecies.contains(requiredPrimaryTypeName))
+ for (final NodeTypeData nodeTypeData : allNodeTypes)
+ {
+ this.nodeTypeRepository.addNodeType(nodeTypeData, volatileNodeTypes);
+ }
+ }
+ // fill default node types map
+ for (final NodeTypeData nodeTypeData : defaultNodeTypes)
{
- unresolvedDependecies.add(requiredPrimaryTypeName);
+ this.buildInNodeTypesNames.add(nodeTypeData.getName());
}
+
}
- if (childnodeDefinitionData.getDefaultPrimaryType() != null)
+ else
{
- if (hierarchy.getNodeType(childnodeDefinitionData.getDefaultPrimaryType()) == null
- && !resolvedDependecies.contains(childnodeDefinitionData.getDefaultPrimaryType()))
- {
- unresolvedDependecies.add(childnodeDefinitionData.getDefaultPrimaryType());
-
- }
+ throw new RuntimeException("Resource file '" + NODETYPES_FILE
+ + "' with NodeTypes configuration does not found. Can not create node type manager");
}
}
- }
- if (unresolvedDependecies.size() > 0)
- {
- String msg = "Fail. Unresolved cyclic dependecy for :";
- for (InternalQName internalQName : resolvedDependecies)
+ catch (final RepositoryException e)
{
- msg += " " + internalQName.getAsString();
+ throw new RuntimeException(e.getLocalizedMessage(), e);
}
- throw new RepositoryException(msg);
+ started = true;
}
}
- private NodeDefinitionData[] getAllChildNodeDefinitions(NodeTypeData nodeType,
- Map<InternalQName, NodeTypeData> volatileNodeTypes)
+ public void stop()
{
- Collection<NodeDefinitionData> defs = new HashSet<NodeDefinitionData>();
-
- for (NodeDefinitionData cnd : nodeType.getDeclaredChildNodeDefinitions())
- {
- defs.add(cnd);
- }
-
- for (InternalQName suname : nodeType.getDeclaredSupertypeNames())
- {
- NodeTypeData superNodeType = volatileNodeTypes.get(suname);
- if (superNodeType == null)
- superNodeType = hierarchy.getNodeType(suname);
- NodeDefinitionData[] superDefinitionData = getAllChildNodeDefinitions(superNodeType, volatileNodeTypes);
- for (int i = 0; i < superDefinitionData.length; i++)
- {
- defs.add(superDefinitionData[i]);
- }
- }
- return defs.toArray(new NodeDefinitionData[defs.size()]);
}
/**
- * @param recipientDefinition
- * @param volatileNodeTypes
- * @return
- */
- private PropertyDefinitionData[] getAllPropertyDefinitions(NodeTypeData recipientDefinition,
- Map<InternalQName, NodeTypeData> volatileNodeTypes)
- {
- Collection<PropertyDefinitionData> defs = new HashSet<PropertyDefinitionData>();
-
- for (PropertyDefinitionData pd : recipientDefinition.getDeclaredPropertyDefinitions())
- defs.add(pd);
-
- for (InternalQName suname : recipientDefinition.getDeclaredSupertypeNames())
- {
- NodeTypeData superNodeType = volatileNodeTypes.get(suname);
- if (superNodeType == null)
- superNodeType = hierarchy.getNodeType(suname);
- PropertyDefinitionData[] superDefinitionData = getAllPropertyDefinitions(superNodeType, volatileNodeTypes);
- for (int i = 0; i < superDefinitionData.length; i++)
- {
- defs.add(superDefinitionData[i]);
- }
-
- }
-
- return defs.toArray(new PropertyDefinitionData[defs.size()]);
- }
-
- private Query getQuery(InternalQName nodeType) throws RepositoryException
- {
- List<Term> terms = new ArrayList<Term>();
- // try {
- String mixinTypesField = locationFactory.createJCRName(Constants.JCR_MIXINTYPES).getAsString();
- String primaryTypeField = locationFactory.createJCRName(Constants.JCR_PRIMARYTYPE).getAsString();
-
- // ExtendedNodeTypeManager ntMgr =
- // session.getWorkspace().getNodeTypeManager();
- NodeTypeData base = findNodeType(nodeType);
-
- if (base.isMixin())
- {
- // search for nodes where jcr:mixinTypes is set to this mixin
- Term t =
- new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(mixinTypesField, locationFactory.createJCRName(
- nodeType).getAsString()));
- terms.add(t);
- }
- else
- {
- // search for nodes where jcr:primaryType is set to this type
- Term t =
- new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(primaryTypeField, locationFactory
- .createJCRName(nodeType).getAsString()));
- terms.add(t);
- }
-
- // now search for all node types that are derived from base
- Set<InternalQName> allTypes = getSubtypes(nodeType);
- for (InternalQName descendantNt : allTypes)
- {
-
- String ntName = locationFactory.createJCRName(descendantNt).getAsString();
- NodeTypeData nt = findNodeType(descendantNt);
- Term t;
- if (nt.isMixin())
- {
- // search on jcr:mixinTypes
- t = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(mixinTypesField, ntName));
- }
- else
- {
- // search on jcr:primaryType
- t = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(primaryTypeField, ntName));
- }
- terms.add(t);
- }
- // now search for all node types that are derived from base
-
- if (terms.size() == 0)
- {
- // exception occured
- return new BooleanQuery();
- }
- else if (terms.size() == 1)
- {
- return new TermQuery(terms.get(0));
- }
- else
- {
- BooleanQuery b = new BooleanQuery();
- for (Term term : terms)
- {
- b.add(new TermQuery(term), Occur.SHOULD);
- }
- return b;
- }
- }
-
- /**
- * @param parent
- * @param dataManager
- * @param changes
+ * Unregisters the specified node type. In order for a node type to be
+ * successfully unregistered it must meet the following conditions:
+ * <ol>
+ * <li>the node type must obviously be registered.</li>
+ * <li>a built-in node type can not be unregistered.</li>
+ * <li>the node type must not have dependents, i.e. other node types that are
+ * referencing it.</li>
+ * <li>the node type must not be currently used by any workspace.</li>
+ * </ol>
+ *
+ * @param ntName name of the node type to be unregistered
+ * @throws NoSuchNodeTypeException if <code>ntName</code> does not denote a
+ * registered node type.
* @throws RepositoryException
+ * @throws RepositoryException if another error occurs.
+ * @see #unregisterNodeTypes(Collection)
*/
- private void makeMixVesionableChanges(NodeData parent, ItemDataConsumer dataManager, PlainChangesLog changes)
- throws RepositoryException
+ public void unregisterNodeType(final InternalQName nodeTypeName) throws RepositoryException
{
- new VersionHistoryDataHelper(parent, changes, dataManager, this);
- }
- /**
- * Notify the listeners that a node type <code>ntName</code> has been
- * registered.
- *
- * @param ntName NT name.
- */
- private void notifyRegistered(InternalQName ntName)
- {
- // copy listeners to array to avoid ConcurrentModificationException
- NodeTypeManagerListener[] la = listeners.values().toArray(new NodeTypeManagerListener[listeners.size()]);
- for (int i = 0; i < la.length; i++)
+ final NodeTypeData nodeType = this.nodeTypeRepository.getNodeType(nodeTypeName);
+ if (nodeType == null)
{
- if (la[i] != null)
- {
- la[i].nodeTypeRegistered(ntName);
- }
+ throw new NoSuchNodeTypeException(nodeTypeName.getAsString());
}
- }
-
- /**
- * Notify the listeners that a node type <code>ntName</code> has been
- * re-registered.
- *
- * @param ntName NT name.
- */
- private void notifyReRegistered(InternalQName ntName)
- {
- // copy listeners to array to avoid ConcurrentModificationException
- NodeTypeManagerListener[] la = listeners.values().toArray(new NodeTypeManagerListener[listeners.size()]);
- for (int i = 0; i < la.length; i++)
+ // check build in
+ if (this.buildInNodeTypesNames.contains(nodeTypeName))
{
- if (la[i] != null)
- {
- la[i].nodeTypeReRegistered(ntName);
- }
+ throw new RepositoryException(nodeTypeName.toString() + ": can't unregister built-in node type.");
}
- }
-
- /**
- * Notify the listeners that a node type <code>ntName</code> has been
- * unregistered.
- *
- * @param ntName NT name.
- */
- private void notifyUnregistered(InternalQName ntName)
- {
- // copy listeners to array to avoid ConcurrentModificationException
- NodeTypeManagerListener[] la = listeners.values().toArray(new NodeTypeManagerListener[listeners.size()]);
- for (int i = 0; i < la.length; i++)
+ // check dependencies
+ final Set<InternalQName> descendantNt = this.nodeTypeRepository.getSubtypes(nodeTypeName);
+ if (descendantNt.size() > 0)
{
- if (la[i] != null)
+ String message =
+ "Can not remove " + nodeTypeName.getAsString()
+ + "nodetype, because the following node types depend on it: ";
+ for (final InternalQName internalQName : descendantNt)
{
- la[i].nodeTypeUnregistered(ntName);
+ message += internalQName.getAsString() + " ";
}
+ throw new RepositoryException(message);
}
- }
-
- /**
- * @param nodeType
- * @param checkExistence
- * @return
- * @throws RepositoryException
- * @throws PathNotFoundException
- * @throws ValueFormatException
- */
- private PlainChangesLog persistNodeTypeData(NodeTypeData nodeType, boolean checkExistence)
- throws RepositoryException, PathNotFoundException, ValueFormatException
- {
- PlainChangesLog changesLog = new PlainChangesLogImpl();
- long start = System.currentTimeMillis();
- if (persister.isInitialized())
+ final Set<String> nodes = this.indexSearcherHolder.getNodesByNodeType(nodeTypeName);
+ if (nodes.size() > 0)
{
- try
+ String message =
+ "Can not remove " + nodeTypeName.getAsString()
+ + " nodetype, because the following node types is used in nodes with uuid: ";
+ for (final String uuids : nodes)
{
- if (!(checkExistence && persister.hasNodeTypeData(nodeType.getName())))
- {
- changesLog.addAll(persister.addNodeType(nodeType).getAllStates());
- }
+ message += uuids + " ";
}
- catch (InvalidItemStateException e)
- {
- LOG.warn("Error of storing node type " + nodeType.getName() + ". May be node type already registered .", e);
- }
- if (LOG.isDebugEnabled())
- LOG.debug("NodeType " + nodeType.getName() + " initialized. " + (System.currentTimeMillis() - start)
- + " ms");
- }
- else
- {
- if (LOG.isDebugEnabled())
- LOG.debug("NodeType " + nodeType.getName()
- + " registered but not initialized (storage is not initialized). "
- + (System.currentTimeMillis() - start) + " ms");
- }
- return changesLog;
- }
+ throw new RepositoryException(message);
- /**
- * {@inheritDoc}
- */
- private PlainChangesLog registerNodeType(NodeTypeData nodeType, int alreadyExistsBehaviour,
- Map<InternalQName, NodeTypeData> volatileNodeTypes) throws RepositoryException
- {
-
- if (nodeType == null)
- {
- throw new RepositoryException("NodeTypeData object " + nodeType + " is null");
}
-
- long start = System.currentTimeMillis();
-
- if (accessControlPolicy.equals(AccessControlPolicy.DISABLE) && nodeType.getName().equals("exo:privilegeable"))
- {
- throw new RepositoryException("NodeType exo:privilegeable is DISABLED");
- }
-
- InternalQName qname = nodeType.getName();
- if (qname == null)
- {
- throw new RepositoryException("NodeType implementation class " + nodeType.getClass().getName()
- + " is not supported in this method");
- }
- PlainChangesLog changesLog = new PlainChangesLogImpl();
-
- NodeTypeData registeredNodeType = findNodeType(qname);
- if (registeredNodeType != null)
- {
- switch (alreadyExistsBehaviour)
- {
- case ExtendedNodeTypeManager.FAIL_IF_EXISTS :
- throw new RepositoryException("NodeType " + nodeType.getName() + " is already registered");
- case ExtendedNodeTypeManager.IGNORE_IF_EXISTS :
- if (LOG.isDebugEnabled())
- LOG.debug("Skipped " + nodeType.getName().getAsString() + " as already registered");
- break;
- case ExtendedNodeTypeManager.REPLACE_IF_EXISTS :
- changesLog.addAll(reregisterNodeType(registeredNodeType, nodeType, volatileNodeTypes).getAllStates());
- break;
- }
- }
- else
- {
- internalRegister(nodeType, volatileNodeTypes);
- changesLog.addAll(persistNodeTypeData(nodeType, true).getAllStates());
-
- }
- return changesLog;
+ this.nodeTypeRepository.removeNodeType(nodeType);
}
/**
- * @param nodeType
- * @return
- * @throws RepositoryException
+ * @throws RepositoryException
+ * @throws ConstraintViolationException
+ * @see org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager#updateNodeType(org.exoplatform.services.jcr.core.nodetype.NodeTypeData, org.exoplatform.services.jcr.core.nodetype.NodeTypeData, java.util.Map)
*/
- private List<ItemState> removePersistedNodeType(NodeTypeData nodeType) throws RepositoryException
- {
- return persister.removeNodeType(nodeType);
- }
-
- private PlainChangesLog reregisterNodeType(NodeTypeData ancestorDefinition, NodeTypeData recipientDefinition,
+ public PlainChangesLog updateNodeType(NodeTypeData ancestorDefinition, NodeTypeData recipientDefinition,
Map<InternalQName, NodeTypeData> volatileNodeTypes) throws ConstraintViolationException, RepositoryException
{
+
if (!ancestorDefinition.getName().equals(recipientDefinition.getName()))
{
throw new RepositoryException("Unsupported Operation");
}
- if (buildInNodeTypesNames.contains(recipientDefinition.getName()))
+ if (this.buildInNodeTypesNames.contains(recipientDefinition.getName()))
{
throw new RepositoryException(recipientDefinition.getName() + ": can't reregister built-in node type.");
}
- PlainChangesLog changesLog = new PlainChangesLogImpl();
- VolatileNodeTypeDataManager volatileNodeTypeDataManager = new VolatileNodeTypeDataManager(this);
+ final PlainChangesLog changesLog = new PlainChangesLogImpl();
+ final VolatileNodeTypeDataManager volatileNodeTypeDataManager = new VolatileNodeTypeDataManager(this);
volatileNodeTypeDataManager.registerVolatileNodeTypes(volatileNodeTypes);
- Set<String> nodes = getNodes(recipientDefinition.getName());
+ ItemAutocreator itemAutocreator = new ItemAutocreator(volatileNodeTypeDataManager, valueFactory, dataManager);
+
+ final Set<String> nodes = this.indexSearcherHolder.getNodesByNodeType(recipientDefinition.getName());
// check add mix:versionable super
if (isNodeType(Constants.MIX_VERSIONABLE, recipientDefinition.getDeclaredSupertypeNames())
&& !isNodeType(Constants.MIX_VERSIONABLE, ancestorDefinition.getDeclaredSupertypeNames()))
{
- for (String uuid : nodes)
+ for (final String uuid : nodes)
{
- ItemData item = persister.getDataManager().getItemData(uuid);
+ final ItemData item = this.dataManager.getItemData(uuid);
if (item != null && item.isNode())
{
- makeMixVesionableChanges(((NodeData)item), persister.getDataManager(), changesLog);
+ changesLog.addAll(itemAutocreator.makeMixVesionableChanges((NodeData)item).getAllStates());
}
}
}
@@ -1554,66 +874,85 @@
{
if (nodes.size() > 0)
{
- StringBuffer buffer = new StringBuffer();
+ final StringBuffer buffer = new StringBuffer();
buffer.append("Fail to change ");
buffer.append(recipientDefinition.getName().getAsString());
buffer.append(" node type from mix:versionable = true to mix:versionable = false");
buffer.append(" because the folowing node exists: ");
- for (String uuid : nodes)
+ if (nodes.size() < 100)
{
- ItemData item = persister.getDataManager().getItemData(uuid);
- if (item != null && item.isNode())
+ for (final String uuid : nodes)
{
- buffer.append(item.getQPath().getAsString());
- buffer.append(" ");
+ final ItemData item = this.dataManager.getItemData(uuid);
+ if (item != null && item.isNode())
+ {
+ buffer.append(item.getQPath().getAsString());
+ buffer.append(" ");
+ }
}
}
throw new ConstraintViolationException(buffer.toString());
}
}
+ final List<NodeData> affectedNodes = new ArrayList<NodeData>();
+ for (final String uuid : nodes)
+ {
+ final ItemData nodeData = this.dataManager.getItemData(uuid);
+ if (nodeData != null)
+ {
+ if (nodeData.isNode())
+ {
+ affectedNodes.add((NodeData)nodeData);
+ }
+ }
+ }
+
// child nodes
- NodeDefinitionComparator nodeDefinitionComparator =
- new NodeDefinitionComparator(volatileNodeTypeDataManager, persister.getDataManager());
+ final NodeDefinitionComparator nodeDefinitionComparator =
+ new NodeDefinitionComparator(volatileNodeTypeDataManager, this.dataManager, itemAutocreator, affectedNodes);
changesLog.addAll(nodeDefinitionComparator.compare(recipientDefinition,
- getAllChildNodeDefinitions(ancestorDefinition, new HashMap<InternalQName, NodeTypeData>()),
- getAllChildNodeDefinitions(recipientDefinition, volatileNodeTypes)).getAllStates());
+ getAllChildNodeDefinitions(ancestorDefinition.getName()),
+ volatileNodeTypeDataManager.getAllChildNodeDefinitions(recipientDefinition.getName())).getAllStates());
// properties defs
- PropertyDefinitionComparator propertyDefinitionComparator =
- new PropertyDefinitionComparator(volatileNodeTypeDataManager, persister.getDataManager(), locationFactory);
+ final PropertyDefinitionComparator propertyDefinitionComparator =
+ new PropertyDefinitionComparator(volatileNodeTypeDataManager, this.dataManager, itemAutocreator,
+ affectedNodes, this.locationFactory);
changesLog.addAll(propertyDefinitionComparator.compare(recipientDefinition,
- getAllPropertyDefinitions(ancestorDefinition, new HashMap<InternalQName, NodeTypeData>()),
- getAllPropertyDefinitions(recipientDefinition, volatileNodeTypes))
+ getAllPropertyDefinitions(ancestorDefinition.getName()),
+ volatileNodeTypeDataManager.getAllPropertyDefinitions(recipientDefinition.getName()))
.getAllStates());
- // mixin changed
+ // notify listeners about changes
if (!Arrays.deepEquals(recipientDefinition.getDeclaredSupertypeNames(), ancestorDefinition
.getDeclaredSupertypeNames()))
{
- for (String uuid : nodes)
+ for (final String uuid : nodes)
{
- ItemData item = persister.getDataManager().getItemData(uuid);
+ ItemData item = this.dataManager.getItemData(uuid);
if (item != null && item.isNode())
{
if (!(item instanceof TransientNodeData))
+ {
item =
new TransientNodeData(item.getQPath(), item.getIdentifier(), item.getPersistedVersion(),
((NodeData)item).getPrimaryTypeName(), ((NodeData)item).getMixinTypeNames(), ((NodeData)item)
.getOrderNumber(), ((NodeData)item).getParentIdentifier(), ((NodeData)item).getACL());
+ }
changesLog.add(new ItemState(item, ItemState.MIXIN_CHANGED, false, null));
}
}
}
- // mixin
+ // mixin changed
if (ancestorDefinition.isMixin() != recipientDefinition.isMixin())
{
if (nodes.size() > 0)
{
- StringBuffer buffer = new StringBuffer();
+ final StringBuffer buffer = new StringBuffer();
buffer.append("Fail to change ");
buffer.append(recipientDefinition.getName().getAsString());
buffer.append(" node type from IsMixin=");
@@ -1621,25 +960,62 @@
buffer.append(" to IsMixin=");
buffer.append(recipientDefinition.isMixin());
buffer.append(" because the folowing node exists: ");
- for (String uuid : nodes)
+ if (nodes.size() < 100)
{
- ItemData item = persister.getDataManager().getItemData(uuid);
- if (item != null && item.isNode())
+ for (final String uuid : nodes)
{
- buffer.append(item.getQPath().getAsString());
- buffer.append(" ");
+ final ItemData item = this.dataManager.getItemData(uuid);
+ if (item != null && item.isNode())
+ {
+ buffer.append(item.getQPath().getAsString());
+ buffer.append(" ");
+ }
}
}
throw new ConstraintViolationException(buffer.toString());
}
}
- internalUnregister(ancestorDefinition.getName(), ancestorDefinition);
- changesLog.addAll(removePersistedNodeType(ancestorDefinition));
+ this.nodeTypeRepository.removeNodeType(ancestorDefinition);
- internalRegister(recipientDefinition, volatileNodeTypes);
- changesLog.addAll(persistNodeTypeData(recipientDefinition, false).getAllStates());
+ this.nodeTypeRepository.addNodeType(recipientDefinition, volatileNodeTypes);
return changesLog;
}
+ protected void initDefault() throws RepositoryException
+ {
+ long start = System.currentTimeMillis();
+ try
+ {
+ InputStream xml = NodeTypeManagerImpl.class.getResourceAsStream(NODETYPES_FILE);
+ if (xml != null)
+ {
+ List<NodeTypeData> registerNodeTypes = registerNodeTypes(xml, ExtendedNodeTypeManager.IGNORE_IF_EXISTS,TEXT_XML);
+ for (NodeTypeData nodeTypeData : registerNodeTypes)
+ {
+ buildInNodeTypesNames.add(nodeTypeData.getName());
+ }
+ }
+ else
+ {
+ String msg =
+ "Resource file '" + NODETYPES_FILE
+ + "' with NodeTypes configuration does not found. Can not create node type manager";
+ log.error(msg);
+ throw new RepositoryException(msg);
+ }
+ }
+ catch (RepositoryException e)
+ {
+ String msg =
+ "Error of initialization default types. Resource file with NodeTypes configuration '" + NODETYPES_FILE
+ + "'. " + e;
+ log.error(msg);
+ throw new RepositoryException(msg, e);
+ }
+ finally
+ {
+ log.info("Initialization of default nodetypes done. " + (System.currentTimeMillis() - start) + " ms.");
+ }
+ }
}
Deleted: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataPersister.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataPersister.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataPersister.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -1,805 +0,0 @@
-/*
- * Copyright (C) 2009 eXo Platform SAS.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.exoplatform.services.jcr.impl.core.nodetype;
-
-import org.exoplatform.services.jcr.access.AccessControlEntry;
-import org.exoplatform.services.jcr.access.AccessControlList;
-import org.exoplatform.services.jcr.core.ExtendedPropertyType;
-import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
-import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
-import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
-import org.exoplatform.services.jcr.dataflow.DataManager;
-import org.exoplatform.services.jcr.dataflow.ItemState;
-import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
-import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
-import org.exoplatform.services.jcr.dataflow.TransactionChangesLog;
-import org.exoplatform.services.jcr.datamodel.IllegalNameException;
-import org.exoplatform.services.jcr.datamodel.InternalQName;
-import org.exoplatform.services.jcr.datamodel.NodeData;
-import org.exoplatform.services.jcr.datamodel.QPathEntry;
-import org.exoplatform.services.jcr.datamodel.ValueData;
-import org.exoplatform.services.jcr.impl.Constants;
-import org.exoplatform.services.jcr.impl.dataflow.ItemDataRemoveVisitor;
-import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
-import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
-import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
-import org.exoplatform.services.jcr.impl.dataflow.ValueDataConvertor;
-import org.exoplatform.services.jcr.impl.util.NodeDataReader;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import javax.jcr.InvalidItemStateException;
-import javax.jcr.ItemExistsException;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.ValueFormatException;
-import javax.jcr.version.OnParentVersionAction;
-
-/**
- * Created by The eXo Platform SAS.
- *
- * @author Gennady Azarenkov
- * @version $Id: NodeTypeDataPersister.java 13962 2008-05-07 16:00:48Z
- * pnedonosko $
- */
-
-public class NodeTypeDataPersister
-{
-
- public static final Log LOG = ExoLogger.getLogger("jcr.NodeTypeDataPersister");
-
- private DataManager dataManager;
-
- private NodeData ntRoot;
-
- public NodeTypeDataPersister(DataManager dataManager)
- {
- this.dataManager = dataManager;
- try
- {
- NodeData jcrSystem = (NodeData)dataManager.getItemData(Constants.SYSTEM_UUID);
- if (jcrSystem != null)
- this.ntRoot = (NodeData)dataManager.getItemData(jcrSystem, new QPathEntry(Constants.JCR_NODETYPES, 1));
- }
- catch (RepositoryException e)
- {
- LOG.warn("Nodetypes storage (/jcr:system/jcr:nodetypes node) is not initialized.");
- }
- }
-
- public PlainChangesLog addNodeType(NodeTypeData nodeType) throws PathNotFoundException, RepositoryException,
- ValueFormatException
- {
- PlainChangesLog changesLog = new PlainChangesLogImpl();
- if (!isInitialized())
- {
- LOG.warn("Nodetypes storage (/jcr:system/jcr:nodetypes node) is not initialized.");
- return null;
- }
-
- NodeData ntNode = TransientNodeData.createNodeData(ntRoot, nodeType.getName(), Constants.NT_NODETYPE);
-
- TransientPropertyData primaryType =
- TransientPropertyData.createPropertyData(ntNode, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false);
- primaryType.setValue(new TransientValueData(ntNode.getPrimaryTypeName()));
-
- // jcr:nodeTypeName
- TransientPropertyData name =
- TransientPropertyData.createPropertyData(ntNode, Constants.JCR_NODETYPENAME, PropertyType.NAME, false);
- name.setValue(new TransientValueData(nodeType.getName()));
-
- // jcr:isMixin
- TransientPropertyData isMixin =
- TransientPropertyData.createPropertyData(ntNode, Constants.JCR_ISMIXIN, PropertyType.BOOLEAN, false);
- isMixin.setValue(new TransientValueData(nodeType.isMixin()));
-
- // jcr:hasOrderableChildNodes
- TransientPropertyData hasOrderableChildNodes =
- TransientPropertyData.createPropertyData(ntNode, Constants.JCR_HASORDERABLECHILDNODES, PropertyType.BOOLEAN,
- false);
- hasOrderableChildNodes.setValue(new TransientValueData(nodeType.hasOrderableChildNodes()));
-
- changesLog.add(ItemState.createAddedState(ntNode)).add(ItemState.createAddedState(primaryType)).add(
- ItemState.createAddedState(name)).add(ItemState.createAddedState(isMixin)).add(
- ItemState.createAddedState(hasOrderableChildNodes));
-
- if (nodeType.getPrimaryItemName() != null)
- {
- // jcr:primaryItemName
- TransientPropertyData primaryItemName =
- TransientPropertyData.createPropertyData(ntNode, Constants.JCR_PRIMARYITEMNAME, PropertyType.NAME, false);
- primaryItemName.setValue(new TransientValueData(nodeType.getPrimaryItemName()));
- changesLog.add(ItemState.createAddedState(primaryItemName));
- }
-
- List<ValueData> parents = new ArrayList<ValueData>();
- for (InternalQName nt : nodeType.getDeclaredSupertypeNames())
- parents.add(new TransientValueData(nt));
-
- if (parents.size() != 0)
- {
- // jcr:supertypes
- TransientPropertyData supertypes =
- TransientPropertyData.createPropertyData(ntNode, Constants.JCR_SUPERTYPES, PropertyType.NAME, true);
- supertypes.setValues(parents);
- changesLog.add(ItemState.createAddedState(supertypes));
- }
-
- for (int i = 0; i < nodeType.getDeclaredPropertyDefinitions().length; i++)
- {
- NodeData childProps =
- TransientNodeData.createNodeData(ntNode, Constants.JCR_PROPERTYDEFINITION, Constants.NT_PROPERTYDEFINITION,
- i + 1);
-
- TransientPropertyData cpPrimaryType =
- TransientPropertyData.createPropertyData(childProps, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false);
- cpPrimaryType.setValue(new TransientValueData(childProps.getPrimaryTypeName()));
-
- changesLog.add(ItemState.createAddedState(childProps)).add(ItemState.createAddedState(cpPrimaryType));
-
- changesLog.addAll(initPropertyDefProps(childProps, nodeType.getDeclaredPropertyDefinitions()[i]));
- }
-
- for (int i = 0; i < nodeType.getDeclaredChildNodeDefinitions().length; i++)
- {
- NodeData childNodes =
- TransientNodeData.createNodeData(ntNode, Constants.JCR_CHILDNODEDEFINITION,
- Constants.NT_CHILDNODEDEFINITION, i + 1);
-
- TransientPropertyData cnPrimaryType =
- TransientPropertyData.createPropertyData(childNodes, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false);
- cnPrimaryType.setValue(new TransientValueData(childNodes.getPrimaryTypeName()));
-
- changesLog.add(ItemState.createAddedState(childNodes)).add(ItemState.createAddedState(cnPrimaryType));
-
- changesLog.addAll(initNodeDefProps(childNodes, nodeType.getDeclaredChildNodeDefinitions()[i]));
- }
-
- return changesLog;
- }
-
- public boolean hasNodeTypeData(InternalQName nodeTypeName) throws RepositoryException
- {
- try
- {
- return getNodeTypesData(nodeTypeName).size() > 0;
- }
- catch (PathNotFoundException e)
- {
- return false;
- }
- }
-
- public synchronized PlainChangesLog initNodetypesRoot(NodeData nsSystem, boolean addACL)
- {
- PlainChangesLog changesLog = new PlainChangesLogImpl();
- if (ntRoot == null)
- {
-
- long start = System.currentTimeMillis();
-
- TransientNodeData jcrNodetypes =
- TransientNodeData.createNodeData(nsSystem, Constants.JCR_NODETYPES, Constants.NT_UNSTRUCTURED,
- Constants.NODETYPESROOT_UUID);
-
- TransientPropertyData primaryType =
- TransientPropertyData.createPropertyData(jcrNodetypes, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false);
- primaryType.setValue(new TransientValueData(jcrNodetypes.getPrimaryTypeName()));
-
- changesLog.add(ItemState.createAddedState(jcrNodetypes)).add(ItemState.createAddedState(primaryType));
-
- if (addACL)
- {
- AccessControlList acl = new AccessControlList();
- InternalQName[] mixins = new InternalQName[]{Constants.EXO_OWNEABLE, Constants.EXO_PRIVILEGEABLE};
- jcrNodetypes.setMixinTypeNames(mixins);
-
- // jcr:mixinTypes
- List<ValueData> mixValues = new ArrayList<ValueData>();
- for (InternalQName mixin : mixins)
- {
- mixValues.add(new TransientValueData(mixin));
- }
- TransientPropertyData exoMixinTypes =
- TransientPropertyData.createPropertyData(jcrNodetypes, Constants.JCR_MIXINTYPES, PropertyType.NAME,
- true, mixValues);
-
- TransientPropertyData exoOwner =
- TransientPropertyData.createPropertyData(jcrNodetypes, Constants.EXO_OWNER, PropertyType.STRING, false,
- new TransientValueData(acl.getOwner()));
-
- List<ValueData> permsValues = new ArrayList<ValueData>();
- for (int i = 0; i < acl.getPermissionEntries().size(); i++)
- {
- AccessControlEntry entry = acl.getPermissionEntries().get(i);
- permsValues.add(new TransientValueData(entry));
- }
- TransientPropertyData exoPerms =
- TransientPropertyData.createPropertyData(jcrNodetypes, Constants.EXO_PERMISSIONS,
- ExtendedPropertyType.PERMISSION, true, permsValues);
-
- changesLog.add(ItemState.createAddedState(exoMixinTypes)).add(ItemState.createAddedState(exoOwner)).add(
- ItemState.createAddedState(exoPerms));
-
- changesLog.add(new ItemState(jcrNodetypes, ItemState.MIXIN_CHANGED, false, null));
- }
-
- ntRoot = jcrNodetypes;
- if (LOG.isDebugEnabled())
- LOG.debug("/jcr:system/jcr:nodetypes is created, creation time: " + (System.currentTimeMillis() - start)
- + " ms");
- }
- else
- {
- LOG.warn("/jcr:system/jcr:nodetypes already exists");
- }
- return changesLog;
- }
-
- public synchronized PlainChangesLog initStorage(Collection<NodeTypeData> nodetypes) throws PathNotFoundException,
- RepositoryException
- {
- PlainChangesLog changesLog = new PlainChangesLogImpl();
- if (!isInitialized())
- {
- LOG
- .warn("Nodetypes storage (/jcr:system/jcr:nodetypes node) is not exists. Possible is not initialized (call initNodetypesRoot() before)");
- return changesLog;
- }
- long ntStart = System.currentTimeMillis();
- for (NodeTypeData nt : nodetypes)
- {
- try
- {
- changesLog.addAll(addNodeType(nt).getAllStates());
- if (LOG.isDebugEnabled())
- LOG.debug("Node type " + nt.getName() + " is initialized. ");
- }
- catch (ItemExistsException e)
- {
- LOG.warn("Node exists " + nt.getName() + ". Error: " + e.getMessage());
- }
- }
- // saveChanges();
- LOG.info("Node types initialized. Time: " + (System.currentTimeMillis() - ntStart) + " ms");
- return changesLog;
- }
-
- public List<NodeTypeData> loadFromStorage() throws PathNotFoundException, RepositoryException
- {
-
- if (!isInitialized())
- {
- NodeData jcrSystem = (NodeData)dataManager.getItemData(Constants.SYSTEM_UUID);
- if (jcrSystem != null)
- this.ntRoot = (NodeData)dataManager.getItemData(jcrSystem, new QPathEntry(Constants.JCR_NODETYPES, 1));
- else
- throw new RepositoryException("jcr:system is not found. Possible the workspace is not initialized properly");
- }
-
- if (isInitialized())
- {
-
- List<NodeTypeData> loadedList = new ArrayList<NodeTypeData>();
-
- long cycleStart = System.currentTimeMillis();
- if (LOG.isDebugEnabled())
- LOG.debug(">>> Node types registration cycle started");
-
- NodeDataReader ntReader = new NodeDataReader(ntRoot, dataManager);
- ntReader.forNodesByType(Constants.NT_NODETYPE); // for nt:nodeType
- ntReader.read();
-
- nextNodeType : for (NodeDataReader ntr : ntReader.getNodesByType(Constants.NT_NODETYPE))
- {
-
- long ntStart = System.currentTimeMillis();
-
- InternalQName ntName = null;
- try
- {
-
- ntr.forProperty(Constants.JCR_NODETYPENAME, PropertyType.NAME);
- ntr.read();
-
- try
- {
- ntName = ValueDataConvertor.readQName(ntr.getPropertyValue(Constants.JCR_NODETYPENAME));
- }
- catch (IllegalNameException e)
- {
- LOG.error("NodeType name is not valid. " + e + ". NodeType skipped.");
- continue nextNodeType;
- }
-
- if (LOG.isDebugEnabled())
- LOG.debug("Reading from storage " + ntName.getAsString() + " "
- + (System.currentTimeMillis() - ntStart));
-
- ntr.forProperty(Constants.JCR_PRIMARYTYPE, PropertyType.NAME).forProperty(Constants.JCR_ISMIXIN,
- PropertyType.BOOLEAN).forProperty(Constants.JCR_HASORDERABLECHILDNODES, PropertyType.BOOLEAN)
- .forProperty(Constants.JCR_PRIMARYITEMNAME, PropertyType.NAME).forProperty(Constants.JCR_SUPERTYPES,
- PropertyType.NAME);
- ntr.forNodesByType(Constants.NT_PROPERTYDEFINITION).forNodesByType(Constants.NT_CHILDNODEDEFINITION);
- ntr.read();
-
- boolean mixin = ValueDataConvertor.readBoolean(ntr.getPropertyValue(Constants.JCR_ISMIXIN));
- boolean hasOrderableChilds =
- ValueDataConvertor.readBoolean(ntr.getPropertyValue(Constants.JCR_HASORDERABLECHILDNODES));
- InternalQName primaryItemName;
- try
- {
- primaryItemName = ValueDataConvertor.readQName(ntr.getPropertyValue(Constants.JCR_PRIMARYITEMNAME));
- }
- catch (PathNotFoundException e)
- {
- primaryItemName = null;
- }
- catch (IllegalNameException e)
- {
- LOG.error("NodeType primary item name is not valid. " + e + ". NodeType " + ntName.getAsString()
- + " skipped.");
- continue nextNodeType;
- }
-
- // -------- Super types --------
- InternalQName[] declaredSupertypes;
- try
- {
- List<ValueData> dst = ntr.getPropertyValues(Constants.JCR_SUPERTYPES);
- InternalQName[] supertypes = new InternalQName[dst.size()];
- for (int i = 0; i < dst.size(); i++)
- supertypes[i] = ValueDataConvertor.readQName(dst.get(i));
-
- declaredSupertypes = supertypes;
- }
- catch (PathNotFoundException e)
- {
- declaredSupertypes = new InternalQName[0];
- }
- catch (IllegalNameException e)
- {
- LOG.error("NodeType supertype name is not valid. " + e + ". NodeType " + ntName.getAsString()
- + " skipped.");
- continue nextNodeType;
- }
-
- // -------- Property definitions --------
- if (LOG.isDebugEnabled())
- LOG.debug("Reading Property definitions for " + ntName.getAsString() + " "
- + (System.currentTimeMillis() - ntStart));
-
- PropertyDefinitionData[] declaredProperties;
- try
- {
- List<NodeDataReader> pdNodes = ntr.getNodesByType(Constants.NT_PROPERTYDEFINITION);
- PropertyDefinitionData[] declaredPropertyDefs = new PropertyDefinitionData[pdNodes.size()];
- for (int pdi = 0; pdi < pdNodes.size(); pdi++)
- {
- NodeDataReader pdr = pdNodes.get(pdi);
-
- pdr.forProperty(Constants.JCR_NAME, PropertyType.NAME) // jcr:name
- .forProperty(Constants.JCR_AUTOCREATED, PropertyType.BOOLEAN)
- // jcr:autoCreated
- .forProperty(Constants.JCR_MANDATORY, PropertyType.BOOLEAN)
- // jcr:mandatory
- .forProperty(Constants.JCR_PROTECTED, PropertyType.BOOLEAN)
- // jcr:protected
- .forProperty(Constants.JCR_MULTIPLE, PropertyType.BOOLEAN)
- // jcr:multiple
- .forProperty(Constants.JCR_ONPARENTVERSION, PropertyType.STRING)
- // jcr:onParentVersion
- .forProperty(Constants.JCR_REQUIREDTYPE, PropertyType.STRING)
- // jcr:requiredType
- .forProperty(Constants.JCR_VALUECONSTRAINTS, PropertyType.STRING)
- // jcr:valueConstraints
- .forProperty(Constants.JCR_DEFAULTVALUES, PropertyType.STRING);
- // jcr:defaultValues
- pdr.read();
-
- InternalQName pname;
- try
- {
- pname = ValueDataConvertor.readQName(pdr.getPropertyValue(Constants.JCR_NAME));
- }
- catch (PathNotFoundException e)
- {
- pname = null; // residual property definition
- }
- catch (IllegalNameException e)
- {
- LOG.error("Property definition name is not valid. " + e + ". NodeType " + ntName.getAsString()
- + " skipped.");
- continue nextNodeType;
- }
-
- String[] valueConstraints;
- try
- {
- List<ValueData> valueConstraintValues = pdr.getPropertyValues(Constants.JCR_VALUECONSTRAINTS);
- valueConstraints = new String[valueConstraintValues.size()];
- for (int j = 0; j < valueConstraintValues.size(); j++)
- valueConstraints[j] = ValueDataConvertor.readString(valueConstraintValues.get(j));
- }
- catch (PathNotFoundException e)
- {
- valueConstraints = new String[0];
- }
-
- String[] defaultValues;
- try
- {
- List<ValueData> dvl = pdr.getPropertyValues(Constants.JCR_DEFAULTVALUES);
- defaultValues = new String[dvl.size()];
- for (int i = 0; i < dvl.size(); i++)
- defaultValues[i] = ValueDataConvertor.readString(dvl.get(i));
- }
- catch (PathNotFoundException e)
- {
- defaultValues = new String[0];
- }
-
- PropertyDefinitionData pDef =
- new PropertyDefinitionData(pname, ntName, ValueDataConvertor.readBoolean(pdr
- .getPropertyValue(Constants.JCR_AUTOCREATED)), ValueDataConvertor.readBoolean(pdr
- .getPropertyValue(Constants.JCR_MANDATORY)), OnParentVersionAction
- .valueFromName(ValueDataConvertor.readString(pdr
- .getPropertyValue(Constants.JCR_ONPARENTVERSION))), ValueDataConvertor.readBoolean(pdr
- .getPropertyValue(Constants.JCR_PROTECTED)), ExtendedPropertyType
- .valueFromName(ValueDataConvertor.readString(pdr
- .getPropertyValue(Constants.JCR_REQUIREDTYPE))), valueConstraints, defaultValues,
- ValueDataConvertor.readBoolean(pdr.getPropertyValue(Constants.JCR_MULTIPLE)));
- if (LOG.isDebugEnabled())
- LOG.debug("Property definitions readed "
- + (pname != null ? pname.getAsString() : Constants.JCR_ANY_NAME.getAsString()) + " "
- + (System.currentTimeMillis() - ntStart));
-
- declaredPropertyDefs[pdi] = pDef;
- }
-
- declaredProperties = declaredPropertyDefs;
- }
- catch (PathNotFoundException e)
- {
- if (LOG.isDebugEnabled())
- LOG.debug("Property definitions is not found. " + e + ". NodeType " + ntName.getAsString());
- declaredProperties = new PropertyDefinitionData[]{};
- }
-
- // --------- Child nodes definitions ----------
- if (LOG.isDebugEnabled())
- LOG.debug("Reading Child nodes definitions for " + ntName.getAsString() + " "
- + (System.currentTimeMillis() - ntStart));
-
- NodeDefinitionData[] declaredChildNodes;
- try
- {
- List<NodeDataReader> cdNodes = ntr.getNodesByType(Constants.NT_CHILDNODEDEFINITION);
- NodeDefinitionData[] declaredChildNodesDefs = new NodeDefinitionData[cdNodes.size()];
- for (int cdi = 0; cdi < cdNodes.size(); cdi++)
- {
- NodeDataReader cdr = cdNodes.get(cdi);
-
- cdr.forProperty(Constants.JCR_NAME, PropertyType.NAME) // jcr:name
- .forProperty(Constants.JCR_REQUIREDPRIMARYTYPES, PropertyType.NAME)
- // jcr:requiredPrimaryTypes
- .forProperty(Constants.JCR_AUTOCREATED, PropertyType.BOOLEAN)
- // jcr:autoCreated
- .forProperty(Constants.JCR_MANDATORY, PropertyType.BOOLEAN)
- // jcr:mandatory
- .forProperty(Constants.JCR_PROTECTED, PropertyType.BOOLEAN)
- // jcr:protected
- .forProperty(Constants.JCR_ONPARENTVERSION, PropertyType.STRING)
- // jcr:onParentVersion
- .forProperty(Constants.JCR_SAMENAMESIBLINGS, PropertyType.STRING)
- // jcr:sameNameSiblings
- .forProperty(Constants.JCR_DEFAULTPRIMNARYTYPE, PropertyType.NAME); // jcr
- // :
- // defaultPrimaryType
- cdr.read();
-
- InternalQName nname;
- try
- {
- nname = ValueDataConvertor.readQName(cdr.getPropertyValue(Constants.JCR_NAME));
- }
- catch (PathNotFoundException e)
- {
- nname = null; // residual
- }
- catch (IllegalNameException e)
- {
- LOG.error("Child node definition name is not valid. " + e + ". NodeType "
- + ntName.getAsString() + " skipped.");
- continue nextNodeType;
- }
-
- InternalQName defaultNodeTypeName;
- try
- {
- try
- {
- defaultNodeTypeName =
- ValueDataConvertor.readQName(cdr.getPropertyValue(Constants.JCR_DEFAULTPRIMNARYTYPE));
- }
- catch (IllegalNameException e)
- {
- LOG.error("Child node default nodetype name is not valid. " + e + ". NodeType "
- + ntName.getAsString() + " skipped.");
- continue nextNodeType;
- }
- }
- catch (PathNotFoundException e)
- {
- defaultNodeTypeName = null;
- }
-
- List<ValueData> requiredNodeTypesValues =
- cdr.getPropertyValues(Constants.JCR_REQUIREDPRIMARYTYPES);
- InternalQName[] requiredNodeTypes = new InternalQName[requiredNodeTypesValues.size()];
- try
- {
- for (int j = 0; j < requiredNodeTypesValues.size(); j++)
- requiredNodeTypes[j] = ValueDataConvertor.readQName(requiredNodeTypesValues.get(j));
- }
- catch (IllegalNameException e)
- {
- LOG.error("Child node required nodetype name is not valid. " + e + ". NodeType "
- + ntName.getAsString() + " skipped.");
- continue nextNodeType;
- }
-
- NodeDefinitionData nDef =
- new NodeDefinitionData(nname, ntName, ValueDataConvertor.readBoolean(cdr
- .getPropertyValue(Constants.JCR_AUTOCREATED)), ValueDataConvertor.readBoolean(cdr
- .getPropertyValue(Constants.JCR_MANDATORY)), OnParentVersionAction
- .valueFromName(ValueDataConvertor.readString(cdr
- .getPropertyValue(Constants.JCR_ONPARENTVERSION))), ValueDataConvertor.readBoolean(cdr
- .getPropertyValue(Constants.JCR_PROTECTED)), requiredNodeTypes, defaultNodeTypeName,
- ValueDataConvertor.readBoolean(cdr.getPropertyValue(Constants.JCR_SAMENAMESIBLINGS)));
-
- declaredChildNodesDefs[cdi] = nDef;
-
- if (LOG.isDebugEnabled())
- LOG.debug("Child nodes definitions readed "
- + (nname != null ? nname.getAsString() : Constants.JCR_ANY_NAME.getAsString()) + " "
- + (System.currentTimeMillis() - ntStart));
- }
-
- declaredChildNodes = declaredChildNodesDefs;
- }
- catch (PathNotFoundException e)
- {
- if (LOG.isDebugEnabled())
- LOG.debug("Child nodes definitions not found. " + e + ". NodeType " + ntName.getAsString());
-
- declaredChildNodes = new NodeDefinitionData[]{};
- }
-
- // -------- NodeType done --------
- NodeTypeData ntype =
- new NodeTypeData(ntName, primaryItemName, mixin, hasOrderableChilds, declaredSupertypes,
- declaredProperties, declaredChildNodes);
- loadedList.add(ntype);
-
- if (LOG.isDebugEnabled())
- LOG.debug("NodeType " + ntype.getName().getAsString() + " readed. "
- + (System.currentTimeMillis() - ntStart) + " ms");
-
- }
- catch (IOException e)
- {
- LOG.error("Error of NodeType " + (ntName != null ? ntName.getAsString() : "") + " load. " + e);
- }
- }
-
- if (LOG.isDebugEnabled())
- LOG.debug("<<< Node types registration cycle finished. " + (System.currentTimeMillis() - cycleStart)
- + " ms");
-
- return loadedList;
- }
- else
- {
- LOG.warn("Nodetypes storage (/jcr:system/jcr:nodetypes node) is not initialized. No nodetypes loaded.");
- return new ArrayList<NodeTypeData>();
- }
- }
-
- public List<ItemState> removeNodeType(NodeTypeData nodeType) throws RepositoryException
- {
- if (!isInitialized())
- {
- LOG.warn("Nodetypes storage (/jcr:system/jcr:nodetypes node) is not initialized.");
- return new ArrayList<ItemState>();
- }
- NodeData nodeTypeData = (NodeData)dataManager.getItemData(ntRoot, new QPathEntry(nodeType.getName(), 0));
- ItemDataRemoveVisitor removeVisitor = new ItemDataRemoveVisitor(dataManager, ntRoot.getQPath());
- nodeTypeData.accept(removeVisitor);
- return removeVisitor.getRemovedStates();
- }
-
- public void saveChanges(PlainChangesLog changesLog) throws RepositoryException, InvalidItemStateException
- {
- dataManager.save(new TransactionChangesLog(changesLog));
- }
-
- DataManager getDataManager()
- {
- return dataManager;
- }
-
- boolean isInitialized()
- {
- return ntRoot != null;
- }
-
- private List<NodeDataReader> getNodeTypesData(InternalQName nodeTypeName) throws RepositoryException
- {
-
- NodeDataReader ntReader = new NodeDataReader(ntRoot, dataManager);
- ntReader.forNode(nodeTypeName);
- ntReader.read();
-
- ntReader.getNodes(nodeTypeName);
-
- return ntReader.getNodes(nodeTypeName);
- }
-
- private List<ItemState> initNodeDefProps(NodeData parent, NodeDefinitionData def) throws ValueFormatException,
- RepositoryException
- {
- List<ItemState> changes = new ArrayList<ItemState>();
- if (def.getName() != null)
- { // Mandatory false
- TransientPropertyData name =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_NAME, PropertyType.NAME, false);
- name.setValue(new TransientValueData(def.getName()));
- changes.add(ItemState.createAddedState(name));
- }
-
- TransientPropertyData autoCreated =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_AUTOCREATED, PropertyType.BOOLEAN, false);
- autoCreated.setValue(new TransientValueData(def.isAutoCreated()));
-
- TransientPropertyData isMandatory =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_MANDATORY, PropertyType.BOOLEAN, false);
- isMandatory.setValue(new TransientValueData(def.isMandatory()));
-
- TransientPropertyData onParentVersion =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_ONPARENTVERSION, PropertyType.STRING, false);
- onParentVersion.setValue(new TransientValueData(OnParentVersionAction.nameFromValue(def.getOnParentVersion())));
-
- TransientPropertyData isProtected =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_PROTECTED, PropertyType.BOOLEAN, false);
- isProtected.setValue(new TransientValueData(def.isProtected()));
-
- TransientPropertyData sameNameSiblings =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_SAMENAMESIBLINGS, PropertyType.BOOLEAN, false);
- sameNameSiblings.setValue(new TransientValueData(def.isAllowsSameNameSiblings()));
-
- if (def.getDefaultPrimaryType() != null)
- { // Mandatory false
- TransientPropertyData defaultPrimaryType =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_DEFAULTPRIMNARYTYPE, PropertyType.NAME,
- false);
- defaultPrimaryType.setValue(new TransientValueData(def.getDefaultPrimaryType()));
- changes.add(ItemState.createAddedState(defaultPrimaryType));
- }
-
- changes.add(ItemState.createAddedState(autoCreated));
- changes.add(ItemState.createAddedState(isMandatory));
- changes.add(ItemState.createAddedState(onParentVersion));
- changes.add(ItemState.createAddedState(isProtected));
- changes.add(ItemState.createAddedState(sameNameSiblings));
-
- if (def.getRequiredPrimaryTypes() != null && def.getRequiredPrimaryTypes().length != 0)
- {
- List<ValueData> requiredPrimaryTypesValues = new ArrayList<ValueData>();
- for (InternalQName rpt : def.getRequiredPrimaryTypes())
- requiredPrimaryTypesValues.add(new TransientValueData(rpt));
-
- TransientPropertyData requiredPrimaryTypes =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_REQUIREDPRIMARYTYPES, PropertyType.NAME,
- true);
- requiredPrimaryTypes.setValues(requiredPrimaryTypesValues);
- changes.add(ItemState.createAddedState(requiredPrimaryTypes));
- }
- return changes;
- }
-
- private List<ItemState> initPropertyDefProps(NodeData parent, PropertyDefinitionData def)
- throws ValueFormatException, RepositoryException
- {
- List<ItemState> changes = new ArrayList<ItemState>();
- if (def.getName() != null)
- {
- TransientPropertyData name =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_NAME, PropertyType.NAME, false);
- name.setValue(new TransientValueData(def.getName()));
- changes.add(ItemState.createAddedState(name));
- }
-
- TransientPropertyData autoCreated =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_AUTOCREATED, PropertyType.BOOLEAN, false);
- autoCreated.setValue(new TransientValueData(def.isAutoCreated()));
-
- TransientPropertyData isMandatory =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_MANDATORY, PropertyType.BOOLEAN, false);
- isMandatory.setValue(new TransientValueData(def.isMandatory()));
-
- TransientPropertyData onParentVersion =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_ONPARENTVERSION, PropertyType.STRING, false);
- onParentVersion.setValue(new TransientValueData(OnParentVersionAction.nameFromValue(def.getOnParentVersion())));
-
- TransientPropertyData isProtected =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_PROTECTED, PropertyType.BOOLEAN, false);
- isProtected.setValue(new TransientValueData(def.isProtected()));
-
- TransientPropertyData requiredType =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_REQUIREDTYPE, PropertyType.STRING, false);
- requiredType.setValue(new TransientValueData(ExtendedPropertyType.nameFromValue(def.getRequiredType())));
-
- TransientPropertyData isMultiple =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_MULTIPLE, PropertyType.BOOLEAN, false);
- isMultiple.setValue(new TransientValueData(def.isMultiple()));
-
- changes.add(ItemState.createAddedState(autoCreated));
- changes.add(ItemState.createAddedState(isMandatory));
- changes.add(ItemState.createAddedState(onParentVersion));
- changes.add(ItemState.createAddedState(isProtected));
- changes.add(ItemState.createAddedState(requiredType));
- changes.add(ItemState.createAddedState(isMultiple));
-
- if (def.getValueConstraints() != null && def.getValueConstraints().length != 0)
- {
- List<ValueData> valueConstraintsValues = new ArrayList<ValueData>();
- for (String vc : def.getValueConstraints())
- valueConstraintsValues.add(new TransientValueData(vc));
-
- TransientPropertyData valueConstraints =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_VALUECONSTRAINTS, PropertyType.STRING, true);
- valueConstraints.setValues(valueConstraintsValues);
- changes.add(ItemState.createAddedState(valueConstraints));
- }
-
- if (def.getDefaultValues() != null && def.getDefaultValues().length != 0)
- {
- List<ValueData> defaultValuesValues = new ArrayList<ValueData>();
- for (String dv : def.getDefaultValues())
- {
- if (dv != null) // TODO dv can be null?
- defaultValuesValues.add(new TransientValueData(dv));
- }
- TransientPropertyData defaultValues =
- TransientPropertyData.createPropertyData(parent, Constants.JCR_DEFAULTVALUES, PropertyType.STRING, true);
- defaultValues.setValues(defaultValuesValues);
- changes.add(ItemState.createAddedState(defaultValues));
- }
-
- return changes;
- }
-
-}
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDefinitionImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDefinitionImpl.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDefinitionImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,241 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.impl.core.LocationFactory;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.ValueFactory;
+import javax.jcr.nodetype.NodeDefinition;
+
+import javax.jcr.nodetype.PropertyDefinition;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class NodeTypeDefinitionImpl
+{
+ /**
+ * Class logger.
+ */
+ private static final Log LOG = ExoLogger.getLogger(NodeTypeDefinitionImpl.class);
+
+ protected NodeTypeData nodeTypeData;
+
+ protected final NodeTypeDataManager nodeTypeDataManager;
+
+ protected final LocationFactory locationFactory;
+
+ protected final ExtendedNodeTypeManager nodeTypeManager;
+
+ protected final ValueFactory valueFactory;
+
+ /**
+ * @param name
+ * @param declaredChildNodeDefinitions
+ * @param declaredPropertyDefinitions
+ * @param declaredSupertypeNames
+ * @param isAbstract
+ * @param isMixin
+ * @param orderableChildNodes
+ * @param primaryItemName
+ */
+ public NodeTypeDefinitionImpl(NodeTypeData nodeTypeData, NodeTypeDataManager nodeTypeDataManager,
+ ExtendedNodeTypeManager nodeTypeManager, LocationFactory locationFactory, ValueFactory valueFactory)
+ {
+ super();
+ this.nodeTypeData = nodeTypeData;
+ this.nodeTypeDataManager = nodeTypeDataManager;
+ this.nodeTypeManager = nodeTypeManager;
+ this.locationFactory = locationFactory;
+ this.valueFactory = valueFactory;
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public boolean equals(Object obj)
+ {
+ if (this == obj)
+ {
+ return true;
+ }
+ if (obj == null)
+ {
+ return false;
+ }
+ if (!(obj instanceof NodeTypeDefinitionImpl))
+ {
+ return false;
+ }
+ NodeTypeDefinitionImpl other = (NodeTypeDefinitionImpl)obj;
+ if (nodeTypeData == null)
+ {
+ if (other.nodeTypeData != null)
+ {
+ return false;
+ }
+ }
+ else if (!nodeTypeData.equals(other.nodeTypeData))
+ {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public NodeDefinition[] getDeclaredChildNodeDefinitions()
+ {
+ NodeDefinition[] result = new NodeDefinition[nodeTypeData.getDeclaredChildNodeDefinitions().length];
+ for (int i = 0; i < nodeTypeData.getDeclaredChildNodeDefinitions().length; i++)
+ {
+ result[i] =
+ new NodeDefinitionImpl(nodeTypeData.getDeclaredChildNodeDefinitions()[i], nodeTypeDataManager,
+ nodeTypeManager, locationFactory, valueFactory);
+ }
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public PropertyDefinition[] getDeclaredPropertyDefinitions()
+ {
+ PropertyDefinition[] result = new PropertyDefinition[nodeTypeData.getDeclaredPropertyDefinitions().length];
+ for (int i = 0; i < nodeTypeData.getDeclaredPropertyDefinitions().length; i++)
+ {
+ result[i] =
+ new PropertyDefinitionImpl(nodeTypeData.getDeclaredPropertyDefinitions()[i], nodeTypeDataManager,
+ nodeTypeManager, locationFactory, valueFactory);
+ }
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String[] getDeclaredSupertypeNames()
+ {
+ String[] result = new String[nodeTypeData.getDeclaredSupertypeNames().length];
+ try
+ {
+ for (int i = 0; i < nodeTypeData.getDeclaredSupertypeNames().length; i++)
+ {
+ result[i] = locationFactory.createJCRName(nodeTypeData.getDeclaredSupertypeNames()[i]).getAsString();
+ }
+
+ }
+ catch (RepositoryException e)
+ {
+ LOG.error(e.getLocalizedMessage(), e);
+ }
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getName()
+ {
+ String result = "";
+ try
+ {
+ result = locationFactory.createJCRName(nodeTypeData.getName()).getAsString();
+ }
+ catch (RepositoryException e)
+ {
+ LOG.error(e.getLocalizedMessage(), e);
+ }
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public String getPrimaryItemName()
+ {
+ String result = "";
+ try
+ {
+ result = locationFactory.createJCRName(nodeTypeData.getPrimaryItemName()).getAsString();
+ }
+ catch (RepositoryException e)
+ {
+ LOG.error(e.getLocalizedMessage(), e);
+ }
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode()
+ {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((nodeTypeData == null) ? 0 : nodeTypeData.hashCode());
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean hasOrderableChildNodes()
+ {
+ return nodeTypeData.hasOrderableChildNodes();
+ }
+
+// /**
+// * {@inheritDoc}
+// */
+// public boolean isAbstract()
+// {
+// return nodeTypeData.isAbstract();
+// }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isMixin()
+ {
+ return nodeTypeData.isMixin();
+ }
+
+// /**
+// * {@inheritDoc}
+// */
+// public boolean isQueryable()
+// {
+// return nodeTypeData.isQueryable();
+// }
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDefinitionImpl.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeExistsException.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeExistsException.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeExistsException.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2009 Day Management AG, Switzerland. All rights reserved.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Exception thrown when an attempt is made to register a node type that already
+ * exists, and <code>allowUpdate</code> has not been set to <code>true</code>.
+ *
+ * @since JCR 2.0
+ */
+public class NodeTypeExistsException extends RepositoryException {
+ /**
+ * Constructs a new instance of this class with <code>null</code> as its
+ * detail message.
+ */
+ public NodeTypeExistsException() {
+ super();
+ }
+
+ /**
+ * Constructs a new instance of this class with the specified detail
+ * message.
+ *
+ * @param message the detail message. The detail message is saved for later
+ * retrieval by the {@link #getMessage()} method.
+ */
+ public NodeTypeExistsException(String message) {
+ super(message);
+ }
+
+ /**
+ * Constructs a new instance of this class with the specified detail message
+ * and root cause.
+ *
+ * @param message the detail message. The detail message is saved for later
+ * retrieval by the {@link #getMessage()} method.
+ * @param rootCause root failure cause
+ */
+ public NodeTypeExistsException(String message, Throwable rootCause) {
+ super(message, rootCause);
+ }
+
+ /**
+ * Constructs a new instance of this class with the specified root cause.
+ *
+ * @param rootCause root failure cause
+ */
+ public NodeTypeExistsException(Throwable rootCause) {
+ super(rootCause);
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeExistsException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -58,36 +58,27 @@
* Nedonosko</a>
* @version $Id: NodeTypeImpl.java 111 2008-11-11 11:11:11Z pnedonosko $
*/
-public class NodeTypeImpl implements NodeType
+public class NodeTypeImpl extends NodeTypeDefinitionImpl implements NodeType
{
+ /**
+ * Logger.
+ */
+ protected static final Log LOG = ExoLogger.getLogger("jcr.NodeTypeImpl");
- private static final Log LOG = ExoLogger.getLogger("jcr.NodeTypeImpl");
-
- protected final NodeTypeData nodeTypeData;
-
- protected final NodeTypeDataManager nodeTypeDataManager;
-
- protected final ExtendedNodeTypeManager nodeTypeManager;
-
- protected final LocationFactory locationFactory;
-
- protected final ValueFactory valueFactory;
-
/**
* @param nodeTypeData
* @param nodeTypeDataManager
* @param nodeTypeManager
* @param locationFactory
* @param valueFactory
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
*/
public NodeTypeImpl(NodeTypeData nodeTypeData, NodeTypeDataManager nodeTypeDataManager,
ExtendedNodeTypeManager nodeTypeManager, LocationFactory locationFactory, ValueFactory valueFactory)
{
- this.nodeTypeData = nodeTypeData;
- this.nodeTypeDataManager = nodeTypeDataManager;
- this.nodeTypeManager = nodeTypeManager;
- this.locationFactory = locationFactory;
- this.valueFactory = valueFactory;
+ super(nodeTypeData, nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
+
}
/**
@@ -100,7 +91,7 @@
{
InternalQName cname = locationFactory.parseJCRName(childNodeName).getInternalName();
- NodeDefinitionData childNodeDef = nodeTypeDataManager.findChildNodeDefinition(cname, nodeTypeData.getName());
+ NodeDefinitionData childNodeDef = nodeTypeDataManager.getChildNodeDefinition(cname, nodeTypeData.getName());
return !(childNodeDef == null || childNodeDef.isProtected() || childNodeDef.getDefaultPrimaryType() == null);
}
catch (RepositoryException e)
@@ -121,7 +112,7 @@
InternalQName ntname = locationFactory.parseJCRName(nodeTypeName).getInternalName();
NodeDefinitionData childNodeDef =
- nodeTypeDataManager.findChildNodeDefinition(cname, ntname, nodeTypeData.getName());
+ nodeTypeDataManager.getChildNodeDefinition(cname, ntname, nodeTypeData.getName());
return !(childNodeDef == null || childNodeDef.isProtected()) && isChildNodePrimaryTypeAllowed(nodeTypeName);
}
catch (RepositoryException e)
@@ -148,7 +139,7 @@
if (pd != null)
return !(pd.isMandatory() || pd.isProtected());
}
- NodeDefinitionData cndef = nodeTypeDataManager.findChildNodeDefinition(iname, nodeTypeData.getName());
+ NodeDefinitionData cndef = nodeTypeDataManager.getChildNodeDefinition(iname, nodeTypeData.getName());
if (cndef != null)
return !(cndef.isMandatory() || cndef.isProtected());
@@ -249,23 +240,15 @@
for (int i = 0; i < nodeDefs.length; i++)
{
NodeDefinitionData cnd = nodeDefs[i];
- try
- {
- ndefs[i] = makeNodeDefinition(cnd);
- }
- catch (NoSuchNodeTypeException e)
- {
- LOG.error("Node type not found " + e, e);
- }
- catch (RepositoryException e)
- {
- LOG.error("Error of declared child node definition create " + e, e);
- }
+ ndefs[i] = new NodeDefinitionImpl(cnd, nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
}
return ndefs;
}
+ /**
+ * {@inheritDoc}
+ */
public NodeDefinition[] getDeclaredChildNodeDefinitions()
{
NodeDefinitionData[] cndefs = nodeTypeData.getDeclaredChildNodeDefinitions();
@@ -273,97 +256,21 @@
for (int i = 0; i < cndefs.length; i++)
{
NodeDefinitionData cnd = cndefs[i];
- try
- {
- ndefs[i] = makeNodeDefinition(cnd);
- }
- catch (NoSuchNodeTypeException e)
- {
- LOG.error("Node type not found " + e, e);
- }
- catch (RepositoryException e)
- {
- LOG.error("Error of declared child node definition create " + e, e);
- }
+ ndefs[i] = new NodeDefinitionImpl(cnd, nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
}
return ndefs;
}
- private NodeDefinition makeNodeDefinition(NodeDefinitionData data) throws NoSuchNodeTypeException,
- RepositoryException
- {
- InternalQName[] rnames = data.getRequiredPrimaryTypes();
- NodeType[] rnts = new NodeType[rnames.length];
- for (int j = 0; j < rnames.length; j++)
- {
- rnts[j] = nodeTypeManager.findNodeType(rnames[j]);
- }
-
- String name =
- locationFactory.createJCRName(data.getName() != null ? data.getName() : Constants.JCR_ANY_NAME).getAsString();
- NodeType defType =
- data.getDefaultPrimaryType() != null ? nodeTypeManager.findNodeType(data.getDefaultPrimaryType()) : null;
- return new NodeDefinitionImpl(name, this, rnts, defType, data.isAutoCreated(), data.isMandatory(), data
- .getOnParentVersion(), data.isProtected(), data.isAllowsSameNameSiblings());
- }
-
+ /**
+ * {@inheritDoc}
+ */
public PropertyDefinition[] getDeclaredPropertyDefinitions()
{
PropertyDefinitionData[] pdefs = nodeTypeData.getDeclaredPropertyDefinitions();
return getPropertyDefinition(pdefs);
}
- private PropertyDefinition[] getPropertyDefinition(PropertyDefinitionData[] pdefs)
- {
- PropertyDefinition[] propertyDefinitions = new PropertyDefinition[pdefs.length];
- // TODO same in PropertyImpl
- for (int i = 0; i < pdefs.length; i++)
- {
-
- try
- {
- PropertyDefinitionData propertyDef = pdefs[i];
- String name =
- locationFactory.createJCRName(
- propertyDef.getName() != null ? propertyDef.getName() : Constants.JCR_ANY_NAME).getAsString();
-
- Value[] defaultValues = new Value[propertyDef.getDefaultValues().length];
- String[] propVal = propertyDef.getDefaultValues();
- // there can be null in definition but should not be null value
- if (propVal != null)
- {
- for (int j = 0; j < propVal.length; j++)
- {
- if (propertyDef.getRequiredType() == PropertyType.UNDEFINED)
- defaultValues[j] = valueFactory.createValue(propVal[j]);
- else
- defaultValues[j] = valueFactory.createValue(propVal[j], propertyDef.getRequiredType());
- }
- }
-
- propertyDefinitions[i] =
- new PropertyDefinitionImpl(name, nodeTypeManager.findNodeType(propertyDef.getDeclaringNodeType()),
- propertyDef.getRequiredType(), propertyDef.getValueConstraints(), defaultValues, propertyDef
- .isAutoCreated(), propertyDef.isMandatory(), propertyDef.getOnParentVersion(), propertyDef
- .isProtected(), propertyDef.isMultiple());
- }
- catch (ValueFormatException e)
- {
- e.printStackTrace();
- }
- catch (NoSuchNodeTypeException e)
- {
- e.printStackTrace();
- }
- catch (RepositoryException e)
- {
- e.printStackTrace();
- }
- }
- return propertyDefinitions;
- }
-
public NodeType[] getDeclaredSupertypes()
{
InternalQName[] snames = nodeTypeData.getDeclaredSupertypeNames();
@@ -372,14 +279,17 @@
for (int i = 0; i < snames.length; i++)
{
+ NodeTypeData superNodeTypeData = nodeTypeDataManager.getNodeType(snames[i]);
supers[i] =
- new NodeTypeImpl(nodeTypeDataManager.findNodeType(snames[i]), nodeTypeDataManager, nodeTypeManager,
- locationFactory, valueFactory);
+ new NodeTypeImpl(superNodeTypeData, nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
}
return supers;
}
+ /**
+ * {@inheritDoc}
+ */
public String getName()
{
try
@@ -393,6 +303,9 @@
}
}
+ /**
+ * {@inheritDoc}
+ */
public String getPrimaryItemName()
{
try
@@ -409,6 +322,9 @@
}
}
+ /**
+ * {@inheritDoc}
+ */
public PropertyDefinition[] getPropertyDefinitions()
{
PropertyDefinitionData[] propertyDefs = nodeTypeDataManager.getAllPropertyDefinitions(nodeTypeData.getName());
@@ -418,6 +334,14 @@
/**
* {@inheritDoc}
*/
+ public InternalQName getQName()
+ {
+ return nodeTypeData.getName();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
public NodeType[] getSupertypes()
{
Set<InternalQName> supers = nodeTypeDataManager.getSupertypes(nodeTypeData.getName());
@@ -441,60 +365,64 @@
return superTypes;
}
+ /**
+ * {@inheritDoc}
+ */
public boolean hasOrderableChildNodes()
{
return nodeTypeData.hasOrderableChildNodes();
}
- public boolean isMixin()
+ public boolean isChildNodePrimaryTypeAllowed(String typeName)
{
- return nodeTypeData.isMixin();
- }
-
- public boolean isNodeType(String nodeTypeName)
- {
try
{
- return nodeTypeDataManager.isNodeType(locationFactory.parseJCRName(nodeTypeName).getInternalName(),
- nodeTypeData.getName());
+ InternalQName iname = locationFactory.parseJCRName(typeName).getInternalName();
+
+ return nodeTypeDataManager.isChildNodePrimaryTypeAllowed(iname, nodeTypeData.getName(), new InternalQName[0]);
}
catch (RepositoryException e)
{
- throw new RuntimeException("Wrong nodetype name " + e, e);
+ return false;
}
}
/**
* {@inheritDoc}
*/
- public InternalQName getQName()
+ public boolean isMixin()
{
- return nodeTypeData.getName();
+ return nodeTypeData.isMixin();
}
- public boolean isChildNodePrimaryTypeAllowed(String typeName)
+ public boolean isNodeType(InternalQName nodeTypeQName)
{
+ return nodeTypeDataManager.isNodeType(nodeTypeQName, nodeTypeData.getName(), new InternalQName[0]);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isNodeType(String nodeTypeName)
+ {
try
{
- InternalQName iname = locationFactory.parseJCRName(typeName).getInternalName();
-
- return nodeTypeDataManager.isChildNodePrimaryTypeAllowed(iname, nodeTypeData.getName(), new InternalQName[0]);
+ return nodeTypeDataManager.isNodeType(locationFactory.parseJCRName(nodeTypeName).getInternalName(),
+ nodeTypeData.getName());
}
catch (RepositoryException e)
{
- return false;
+ throw new RuntimeException("Wrong nodetype name " + e, e);
}
}
- public boolean isNodeType(InternalQName nodeTypeQName)
- {
- return nodeTypeDataManager.isNodeType(nodeTypeQName, nodeTypeData.getName(), new InternalQName[0]);
- }
-
- // internal stuff ============================
-
/**
- * Ported from 1.10. Check on empty value (property remove) removed.
+ * Returns true if satisfy type and constrains. Otherwise returns false.
+ *
+ * @param requiredType - type.
+ * @param value - value.
+ * @param constrains - constrains.
+ * @return a boolean.
*/
private boolean canSetPropertyForType(int requiredType, Value value, String[] constrains)
{
@@ -765,6 +693,13 @@
}
}
+ /**
+ * Check value constrains.
+ *
+ * @param constraints - string constrains.
+ * @param value - value to check.
+ * @return result of check.
+ */
private boolean checkValueConstraints(String[] constraints, Value value)
{
@@ -819,6 +754,21 @@
}
}
+ /**
+ * @param pdefs
+ * @return
+ */
+ private PropertyDefinition[] getPropertyDefinition(PropertyDefinitionData[] pdefs)
+ {
+ PropertyDefinition[] propertyDefinitions = new PropertyDefinition[pdefs.length];
+ for (int i = 0; i < pdefs.length; i++)
+ {
+ propertyDefinitions[i] =
+ new PropertyDefinitionImpl(pdefs[i], nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
+ }
+ return propertyDefinitions;
+ }
+
private boolean isCharsetString(String source, String charSetName)
{
try
@@ -832,4 +782,29 @@
}
}
+ /**
+ * @param nodeTypeData
+ * @return
+ * @throws NoSuchNodeTypeException
+ * @throws RepositoryException
+ */
+ private NodeDefinition makeNodeDefinition(NodeDefinitionData nodeTypeData) throws NoSuchNodeTypeException,
+ RepositoryException
+ {
+ InternalQName[] rnames = nodeTypeData.getRequiredPrimaryTypes();
+ NodeType[] rnts = new NodeType[rnames.length];
+ for (int j = 0; j < rnames.length; j++)
+ {
+ rnts[j] = nodeTypeManager.findNodeType(rnames[j]);
+ }
+
+ String name =
+ locationFactory
+ .createJCRName(nodeTypeData.getName() != null ? nodeTypeData.getName() : Constants.JCR_ANY_NAME)
+ .getAsString();
+ NodeType defType =
+ nodeTypeData.getDefaultPrimaryType() != null ? nodeTypeManager.findNodeType(nodeTypeData
+ .getDefaultPrimaryType()) : null;
+ return new NodeDefinitionImpl(nodeTypeData, nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeManagerImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeManagerImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeManagerImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -83,7 +83,7 @@
public NodeType findNodeType(InternalQName nodeTypeName) throws NoSuchNodeTypeException, RepositoryException
{
- NodeTypeData ntdata = typesManager.findNodeType(nodeTypeName);
+ NodeTypeData ntdata = typesManager.getNodeType(nodeTypeName);
if (ntdata != null)
return new NodeTypeImpl(ntdata, typesManager, this, locationFactory, valueFactory);
@@ -131,22 +131,27 @@
*/
public NodeType getNodeType(final String nodeTypeName) throws NoSuchNodeTypeException, RepositoryException
{
- NodeTypeData ntdata = typesManager.findNodeType(locationFactory.parseJCRName(nodeTypeName).getInternalName());
+ NodeTypeData ntdata = typesManager.getNodeType(locationFactory.parseJCRName(nodeTypeName).getInternalName());
if (ntdata != null)
return new NodeTypeImpl(ntdata, typesManager, this, locationFactory, valueFactory);
throw new NoSuchNodeTypeException("Nodetype not found " + nodeTypeName);
}
- // JSR-170 stuff ================================
- // Extended stuff ================================
+ /**
+ * {@inheritDoc}
+ */
+ public NodeTypeDataManager getNodeTypesHolder() throws RepositoryException
+ {
+ return typesManager;
+ }
/**
* {@inheritDoc}
*/
public NodeTypeValue getNodeTypeValue(String nodeTypeName) throws NoSuchNodeTypeException, RepositoryException
{
- NodeTypeData ntdata = typesManager.findNodeType(locationFactory.parseJCRName(nodeTypeName).getInternalName());
+ NodeTypeData ntdata = typesManager.getNodeType(locationFactory.parseJCRName(nodeTypeName).getInternalName());
if (ntdata != null)
{
NodeTypeValue nodeTypeValue = new NodeTypeValue();
@@ -210,6 +215,11 @@
return ec;
}
+ public boolean hasNodeType(String name) throws RepositoryException
+ {
+
+ return typesManager.getNodeType(locationFactory.parseJCRName(name).getInternalName()) != null;
+ }
/**
* {@inheritDoc}
*/
@@ -248,10 +258,29 @@
*
* @return
*/
+ public NodeTypeIterator registerNodeTypes(InputStream xml, int alreadyExistsBehaviour, String contentType)
+ throws RepositoryException
+ {
+
+ Collection<NodeTypeData> nts = typesManager.registerNodeTypes(xml, alreadyExistsBehaviour, contentType);
+ EntityCollection types = new EntityCollection();
+ for (NodeTypeData ntdata : nts)
+ types.add(new NodeTypeImpl(ntdata, typesManager, this, locationFactory, valueFactory));
+
+ return types;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * @return
+ * @deprecated use registerNodeTypes(InputStream xml, int alreadyExistsBehaviour, String contentType)
+ */
+ @Deprecated
public NodeTypeIterator registerNodeTypes(InputStream xml, int alreadyExistsBehaviour) throws RepositoryException
{
- Collection<NodeTypeData> nts = typesManager.registerNodeTypes(xml, alreadyExistsBehaviour);
+ Collection<NodeTypeData> nts = typesManager.registerNodeTypes(xml, alreadyExistsBehaviour, NodeTypeDataManager.TEXT_XML);
EntityCollection types = new EntityCollection();
for (NodeTypeData ntdata : nts)
types.add(new NodeTypeImpl(ntdata, typesManager, this, locationFactory, valueFactory));
@@ -266,7 +295,7 @@
RepositoryException
{
InternalQName nodeTypeName = locationFactory.parseJCRName(name).getInternalName();
- if (typesManager.findNodeType(nodeTypeName) == null)
+ if (typesManager.getNodeType(nodeTypeName) == null)
throw new NoSuchNodeTypeException(name);
typesManager.unregisterNodeType(nodeTypeName);
}
@@ -355,29 +384,24 @@
public int compare(NodeTypeData o1, NodeTypeData o2)
{
- return getIndex(o2.getName().getNamespace()) - getIndex(o1.getName().getNamespace());
+ return getIndex(o2) - getIndex(o1);
}
- private int getIndex(String nameSpace)
+ private int getIndex(NodeTypeData data)
{
+ InternalQName name;
+ int result = OTHER;
+ name = data.getName();
+ String nameSpace = name.getNamespace();
if (Constants.NS_NT_URI.equals(nameSpace))
- return NT;
+ result = NT;
else if (Constants.NS_MIX_URI.equals(nameSpace))
- return MIX;
+ result = MIX;
else if (Constants.NS_JCR_URI.equals(nameSpace))
- return JCR;
+ result = JCR;
else if (Constants.NS_EXO_URI.equals(nameSpace))
- return EXO;
- return OTHER;
+ result = EXO;
+ return result;
}
}
-
- /**
- * {@inheritDoc}
- */
- public NodeTypeDataManager getNodeTypesHolder() throws RepositoryException
- {
- return typesManager;
- }
-
}
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeRepository.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeRepository.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeRepository.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,138 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype;
+
+import org.exoplatform.services.jcr.core.ComponentPersister;
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionDatas;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $
+ *
+ */
+public interface NodeTypeRepository extends ComponentPersister
+{
+
+ /**
+ * @param nodeType
+ * @param volatileNodeTypes
+ * @throws RepositoryException
+ */
+ void addNodeType(NodeTypeData nodeType, Map<InternalQName, NodeTypeData> volatileNodeTypes)
+ throws RepositoryException;
+
+ /**
+ * @return
+ */
+ NodeTypeRepository createCopy();
+
+ /**
+ * @return
+ * @throws RepositoryException
+ */
+ List<NodeTypeData> getAllNodeTypes() throws RepositoryException;
+
+ /**
+ * @param nodeTypeName
+ * @return
+ * @throws RepositoryException
+ */
+ Set<InternalQName> getDeclaredSubtypes(InternalQName nodeTypeName);
+
+ /**
+ * @param nodeName
+ * @param nodeTypeNames
+ * @return
+ * @throws RepositoryException
+ */
+ NodeDefinitionData getDefaultChildNodeDefinition(InternalQName nodeName, InternalQName[] nodeTypeNames)
+ throws RepositoryException;
+
+ /**
+ * @param typeName
+ * @return
+ * @throws RepositoryException
+ */
+ NodeTypeData getNodeType(InternalQName typeName);
+
+ /**
+ * @param propertyName
+ * @param nodeTypeNames
+ * @return
+ * @throws RepositoryException
+ */
+ PropertyDefinitionDatas getPropertyDefinitions(InternalQName propertyName, InternalQName[] nodeTypeNames)
+ throws RepositoryException;
+
+ /**
+ * @param nodeTypeName
+ * @return
+ */
+ Set<InternalQName> getSubtypes(InternalQName nodeTypeName);
+
+ /**
+ * @param ntname
+ * @return
+ */
+ Set<InternalQName> getSupertypes(InternalQName ntname);
+
+ /**
+ * @param testTypeName
+ * @param primaryType
+ * @return
+ */
+ boolean isNodeType(InternalQName testTypeName, InternalQName primaryType);
+
+ /**
+ * @param testTypeName
+ * @param typesNames
+ * @return
+ */
+ boolean isNodeType(InternalQName testTypeName, InternalQName[] typesNames);
+
+ /**
+ * @param nodeTypeName
+ * @param nodeType
+ */
+ void removeNodeType(NodeTypeData nodeType);
+
+ /**
+ * Write node types to stream
+ *
+ * @param os output stream
+ * @param nodeTypes
+ * @throws RepositoryException
+ * @throws IOException
+ * @throws RepositoryException
+ */
+ void registerNodeType(final List<NodeTypeData> nodeTypes, final NodeTypeDataManager nodeTypeDataManager,
+ final String accessControlPolicy, final int alreadyExistsBehaviour) throws RepositoryException;
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeRepository.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/PropertyDefinitionImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/PropertyDefinitionImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/PropertyDefinitionImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -18,112 +18,115 @@
*/
package org.exoplatform.services.jcr.impl.core.nodetype;
+import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
+import org.exoplatform.services.jcr.impl.core.LocationFactory;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import javax.jcr.PropertyType;
import javax.jcr.Value;
-import javax.jcr.nodetype.NodeType;
+import javax.jcr.ValueFactory;
+import javax.jcr.ValueFormatException;
import javax.jcr.nodetype.PropertyDefinition;
/**
* Created by The eXo Platform SAS.
*
- * @author Gennady Azarenkov
- * @version $Id: PropertyDefinitionImpl.java 11907 2008-03-13 15:36:21Z ksm $
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
*/
-
public class PropertyDefinitionImpl extends ItemDefinitionImpl implements PropertyDefinition
{
- private final int requiredType;
+ private final PropertyDefinitionData propertyDefinitionData;
- private String[] valueConstraints;
-
- private Value[] defaultValues;
-
- private final boolean multiple;
-
- public PropertyDefinitionImpl(String name, NodeType declaringNodeType, int requiredType, String[] valueConstraints,
- Value[] defaultValues, boolean autoCreate, boolean mandatory, int onVersion, boolean readOnly, boolean multiple)
- {
-
- super(name, declaringNodeType, autoCreate, onVersion, readOnly, mandatory);
-
- this.requiredType = requiredType;
- this.valueConstraints = valueConstraints;
- this.defaultValues = defaultValues;
- this.multiple = multiple;
-
- int hk = 31 * this.hashCode + requiredType;
- hk = 31 * hk + valueConstraints.hashCode();
- hk = 31 * hk + defaultValues.hashCode();
- this.hashCode = 31 * hk + (multiple ? 0 : 1);
- }
-
/**
- * {@inheritDoc}
+ * @param propertyDefinitionData
+ * @param nodeTypeDataManager
+ * @param nodeTypeManager
+ * @param locationFactory
+ * @param valueFactory
*/
- public int getRequiredType()
+ public PropertyDefinitionImpl(PropertyDefinitionData propertyDefinitionData,
+ NodeTypeDataManager nodeTypeDataManager, ExtendedNodeTypeManager nodeTypeManager,
+ LocationFactory locationFactory, ValueFactory valueFactory)
{
- return requiredType;
+ super(propertyDefinitionData, nodeTypeDataManager, nodeTypeManager, locationFactory, valueFactory);
+ this.propertyDefinitionData = propertyDefinitionData;
}
/**
- * {@inheritDoc}
+ * Class logger.
*/
- public String[] getValueConstraints()
- {
- return valueConstraints;
- }
+ private static final Log LOG = ExoLogger.getLogger(PropertyDefinitionImpl.class);
/**
* {@inheritDoc}
*/
public Value[] getDefaultValues()
{
- if (defaultValues != null && defaultValues.length > 0)
- return defaultValues;
- else
+ String[] defaultValues = propertyDefinitionData.getDefaultValues();
+ if (defaultValues == null)
return null;
+ Value[] vals = new Value[defaultValues.length];
+ for (int i = 0; i < defaultValues.length; i++)
+ {
+ if (propertyDefinitionData.getRequiredType() == PropertyType.UNDEFINED)
+ {
+ vals[i] = valueFactory.createValue(defaultValues[i]);
+ }
+ else
+ try
+ {
+ vals[i] = valueFactory.createValue(defaultValues[i], propertyDefinitionData.getRequiredType());
+ }
+ catch (ValueFormatException e)
+ {
+ LOG.error(e.getLocalizedMessage(), e);
+ }
+ }
+ return vals;
}
- /**
- * {@inheritDoc}
- */
- public boolean isMultiple()
+ public int getRequiredType()
{
- return multiple;
+ return propertyDefinitionData.getRequiredType();
}
- /**
- * @param defaultValues
- * The defaultValues to set.
- */
- public void setDefaultValues(Value[] defaultValues)
+ public String[] getValueConstraints()
{
- this.defaultValues = defaultValues;
+ return propertyDefinitionData.getValueConstraints();
}
- /**
- * @param valueConstraints
- * The valueConstraints to set.
- */
- public void setValueConstraints(String[] valueConstraints)
+ public boolean isMultiple()
{
- this.valueConstraints = valueConstraints;
+ return propertyDefinitionData.isMultiple();
}
+//
+// /**
+// * {@inheritDoc}
+// */
+// public String[] getAvailableQueryOperators()
+// {
+// return propertyDefinitionData.getAvailableQueryOperators();
+// }
+//
+// /**
+// * {@inheritDoc}
+// */
+// public boolean isFullTextSearchable()
+// {
+// return propertyDefinitionData.isFullTextSearchable();
+// }
+//
+// /**
+// * {@inheritDoc}
+// */
+// public boolean isQueryOrderable()
+// {
+// return propertyDefinitionData.isQueryOrderable();
+// }
- /**
- * Compare property definitions for equality by name, required type and miltiplicity flag. NOTE:
- * UNDEFINED is equals to UNDEFINED only. NOTE: PD without name is equals to PD without name
- */
- public boolean equals(Object obj)
- {
- if (obj == null)
- return false;
- if (super.equals(obj))
- return true;
- if (obj instanceof PropertyDefinitionImpl)
- {
- return obj.hashCode() == hashCode;
- }
- return false;
- }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/VolatileNodeTypeDataManager.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/VolatileNodeTypeDataManager.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/VolatileNodeTypeDataManager.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -38,41 +38,41 @@
public class VolatileNodeTypeDataManager extends NodeTypeDataManagerImpl
{
- public VolatileNodeTypeDataManager(NodeTypeDataManagerImpl nodeTypeDataManagerImpl) throws RepositoryException
- {
- super(nodeTypeDataManagerImpl.accessControlPolicy, nodeTypeDataManagerImpl.locationFactory,
- nodeTypeDataManagerImpl.namespaceRegistry, nodeTypeDataManagerImpl.persister,
- nodeTypeDataManagerImpl.indexSearcherHolder);
- this.superNodeTypeDataManager = nodeTypeDataManagerImpl;
- //this.queryHandlers = new HashSet<QueryHandler>(nodeTypeDataManagerImpl.queryHandlers);
-
- registerVolatileNodeTypes(superNodeTypeDataManager.getAllNodeTypes());
- }
-
/**
* Class logger.
*/
private final Log log = ExoLogger.getLogger(VolatileNodeTypeDataManager.class);
- private final NodeTypeDataManagerImpl superNodeTypeDataManager;
+ public VolatileNodeTypeDataManager(final NodeTypeDataManagerImpl nodeTypeDataManagerImpl) throws RepositoryException
+ {
+ super(nodeTypeDataManagerImpl.accessControlPolicy, nodeTypeDataManagerImpl.locationFactory,
+ nodeTypeDataManagerImpl.namespaceRegistry,
+ null, // to be sure
+ nodeTypeDataManagerImpl.dataManager, nodeTypeDataManagerImpl.indexSearcherHolder,
+ nodeTypeDataManagerImpl.nodeTypeRepository.createCopy());
- public void registerVolatileNodeTypes(Collection<NodeTypeData> volatileNodeTypes) throws RepositoryException
+ }
+
+ public void registerVolatileNodeTypes(final Collection<NodeTypeData> volatileNodeTypes) throws RepositoryException
{
- Map<InternalQName, NodeTypeData> map = new HashMap<InternalQName, NodeTypeData>();
- for (NodeTypeData nodeTypeData : volatileNodeTypes)
+ final Map<InternalQName, NodeTypeData> map = new HashMap<InternalQName, NodeTypeData>();
+ for (final NodeTypeData nodeTypeData : volatileNodeTypes)
{
map.put(nodeTypeData.getName(), nodeTypeData);
}
registerVolatileNodeTypes(map);
}
- public void registerVolatileNodeTypes(Map<InternalQName, NodeTypeData> volatileNodeTypes) throws RepositoryException
+ public void registerVolatileNodeTypes(final Map<InternalQName, NodeTypeData> volatileNodeTypes)
+ throws RepositoryException
{
- for (Map.Entry<InternalQName, NodeTypeData> entry : volatileNodeTypes.entrySet())
+ for (final Map.Entry<InternalQName, NodeTypeData> entry : volatileNodeTypes.entrySet())
{
- if (findNodeType(entry.getKey()) != null)
- internalUnregister(entry.getKey(), entry.getValue());
- internalRegister(entry.getValue(), volatileNodeTypes);
+ if (getNodeType(entry.getKey()) != null)
+ {
+ this.nodeTypeRepository.removeNodeType(entry.getValue());
+ }
+ this.nodeTypeRepository.addNodeType(entry.getValue(), volatileNodeTypes);
}
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractDefinitionComparator.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractDefinitionComparator.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractDefinitionComparator.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -20,8 +20,6 @@
import org.exoplatform.services.jcr.core.nodetype.ItemDefinitionData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
-import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
-import org.exoplatform.services.jcr.dataflow.DataManager;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.impl.Constants;
@@ -39,27 +37,6 @@
*/
public abstract class AbstractDefinitionComparator<T extends ItemDefinitionData>
{
- /**
- * Data manager
- */
- protected final DataManager persister;
-
- /**
- * Node type data manager
- */
- protected final NodeTypeDataManager nodeTypeDataManager;
-
- /**
- * @param nodeTypeDataManager
- * @param persister
- */
- public AbstractDefinitionComparator(NodeTypeDataManager nodeTypeDataManager, DataManager persister)
- {
- super();
- this.nodeTypeDataManager = nodeTypeDataManager;
- this.persister = persister;
- }
-
public abstract PlainChangesLog compare(NodeTypeData registeredNodeType, T[] ancestorDefinition,
T[] recipientDefinition) throws ConstraintViolationException, RepositoryException;
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractItemDefinitionAccessProvider.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractItemDefinitionAccessProvider.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractItemDefinitionAccessProvider.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,397 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.nodetype.ItemDefinitionData;
+import org.exoplatform.services.jcr.dataflow.DataManager;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+import org.exoplatform.services.jcr.datamodel.IllegalNameException;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.PropertyData;
+import org.exoplatform.services.jcr.datamodel.QPathEntry;
+import org.exoplatform.services.jcr.datamodel.ValueData;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
+import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
+import org.exoplatform.services.jcr.impl.dataflow.ValueDataConvertor;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.version.OnParentVersionAction;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public abstract class AbstractItemDefinitionAccessProvider
+{
+
+ protected final DataManager dataManager;
+
+ public AbstractItemDefinitionAccessProvider(DataManager dataManager)
+ {
+ super();
+ this.dataManager = dataManager;
+ }
+
+ /**
+ * Load values.
+ *
+ * @param parentNode
+ * @param propertyName
+ * @return
+ * @throws RepositoryException
+ */
+ protected List<ValueData> loadPropertyValues(NodeData parentNode, InternalQName propertyName)
+ throws RepositoryException
+ {
+ ItemData property = dataManager.getItemData(parentNode, new QPathEntry(propertyName, 1));
+ if (property != null)
+ {
+ if (property.isNode())
+ throw new RepositoryException("Fail to load property " + propertyName + "not found for "
+ + parentNode.getQPath().getAsString());
+ return ((PropertyData)property).getValues();
+ }
+ return null;
+ }
+
+ public Boolean readBoolean(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ List<ValueData> values = loadPropertyValues(parentNode, propertyName);
+ if (values != null)
+ {
+ if (values.size() == 1)
+ {
+ try
+ {
+ return ValueDataConvertor.readBoolean(values.get(0));
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IllegalStateException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IOException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ }
+ }
+ return new Boolean(false);
+ }
+
+ public Long readLong(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ List<ValueData> values = loadPropertyValues(parentNode, propertyName);
+ if (values != null)
+ {
+ if (values.size() == 1)
+ {
+ try
+ {
+ return ValueDataConvertor.readLong(values.get(0));
+ }
+ catch (NumberFormatException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IllegalStateException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IOException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ }
+ }
+ return null;
+ }
+
+ public Boolean readMandatoryBoolean(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ Boolean name = readBoolean(parentNode, propertyName);
+ if (name == null)
+ throw new RepositoryException("Mandatory item " + propertyName + "not found for "
+ + parentNode.getQPath().getAsString());
+ return name;
+ }
+
+ public Long readMandatoryLong(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ Long name = readLong(parentNode, propertyName);
+ if (name == null)
+ throw new RepositoryException("Mandatory item " + propertyName + "not found for "
+ + parentNode.getQPath().getAsString());
+ return name;
+ }
+
+ public InternalQName readMandatoryName(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ InternalQName name = readName(parentNode, propertyName);
+ if (name == null)
+ throw new RepositoryException("Mandatory item " + propertyName + "not found for "
+ + parentNode.getQPath().getAsString());
+ return name;
+ }
+
+ public InternalQName[] readMandatoryNames(NodeData parentNode, InternalQName propertyName)
+ throws RepositoryException, NodeTypeReadException
+ {
+ InternalQName[] names = readNames(parentNode, propertyName);
+ if (names == null)
+ throw new RepositoryException("Mandatory item " + propertyName + "not found for "
+ + parentNode.getQPath().getAsString());
+ return names;
+ }
+
+ public String readMandatoryString(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ String name = readString(parentNode, propertyName);
+ if (name == null)
+ throw new RepositoryException("Mandatory item " + propertyName + "not found for "
+ + parentNode.getQPath().getAsString());
+ return name;
+ }
+
+ public String[] readMandatoryStrings(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ String[] name = readStrings(parentNode, propertyName);
+ if (name == null)
+ throw new RepositoryException("Mandatory item " + propertyName + "not found for "
+ + parentNode.getQPath().getAsString());
+ return name;
+ }
+
+ public InternalQName readName(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ List<ValueData> values = loadPropertyValues(parentNode, propertyName);
+ if (values != null)
+ {
+ if (values.size() == 1)
+ {
+ try
+ {
+ return ValueDataConvertor.readQName(values.get(0));
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IllegalNameException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IOException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ }
+ }
+ return null;
+ }
+
+ public InternalQName[] readNames(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ List<ValueData> values = loadPropertyValues(parentNode, propertyName);
+ if (values != null)
+ {
+ InternalQName[] result = new InternalQName[values.size()];
+ int i = 0;
+ for (ValueData valueData : values)
+ {
+ try
+ {
+ result[i++] = ValueDataConvertor.readQName(valueData);
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IllegalNameException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IOException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ }
+ return result;
+ }
+ return new InternalQName[0];
+ }
+
+ public String readString(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ List<ValueData> values = loadPropertyValues(parentNode, propertyName);
+ if (values != null)
+ {
+ if (values.size() == 1)
+ {
+ try
+ {
+ return ValueDataConvertor.readString(values.get(0));
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IOException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ }
+ }
+ return null;
+ }
+
+ public String[] readStrings(NodeData parentNode, InternalQName propertyName) throws RepositoryException,
+ NodeTypeReadException
+ {
+ List<ValueData> values = loadPropertyValues(parentNode, propertyName);
+ if (values != null)
+ {
+ if (values.size() > 0)
+ {
+ String[] result = new String[values.size()];
+ int i = 0;
+ for (ValueData valueData : values)
+ {
+ try
+ {
+ result[i++] = ValueDataConvertor.readString(valueData);
+ }
+ catch (UnsupportedEncodingException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ catch (IOException e)
+ {
+ throw new NodeTypeReadException(e.getLocalizedMessage(), e.getCause());
+ }
+ }
+ return result;
+ }
+ }
+ return new String[0];
+ }
+
+ protected void writeBoolean(PlainChangesLog changesLog, NodeData parentNode, InternalQName propertyName,
+ boolean value)
+ {
+ TransientPropertyData propertyData =
+ TransientPropertyData.createPropertyData(parentNode, propertyName, PropertyType.BOOLEAN, false);
+ propertyData.setValue(new TransientValueData(value));
+ changesLog.add(ItemState.createAddedState(propertyData));
+ }
+
+ protected void writeItemDefinition(PlainChangesLog changesLog, NodeData itemDefinition,
+ ItemDefinitionData nodeDefinitionData)
+ {
+ if (nodeDefinitionData.getName() != null)
+ { // Mandatory false
+
+ writeName(changesLog, itemDefinition, Constants.JCR_NAME, nodeDefinitionData.getName());
+ }
+ writeBoolean(changesLog, itemDefinition, Constants.JCR_PROTECTED, nodeDefinitionData.isProtected());
+
+ writeBoolean(changesLog, itemDefinition, Constants.JCR_AUTOCREATED, nodeDefinitionData.isAutoCreated());
+
+ writeBoolean(changesLog, itemDefinition, Constants.JCR_MANDATORY, nodeDefinitionData.isMandatory());
+
+ writeString(changesLog, itemDefinition, Constants.JCR_ONPARENTVERSION, OnParentVersionAction
+ .nameFromValue(nodeDefinitionData.getOnParentVersion()));
+ }
+
+ protected void writeName(PlainChangesLog changesLog, NodeData parentNode, InternalQName propertyName,
+ InternalQName value)
+ {
+ TransientPropertyData propertyData =
+ TransientPropertyData.createPropertyData(parentNode, propertyName, PropertyType.NAME, false);
+ propertyData.setValue(new TransientValueData(value));
+ changesLog.add(ItemState.createAddedState(propertyData));
+ }
+
+ protected void writeNames(PlainChangesLog changesLog, NodeData parentNode, InternalQName propertyName,
+ InternalQName[] value)
+ {
+ TransientPropertyData propertyData =
+ TransientPropertyData.createPropertyData(parentNode, propertyName, PropertyType.NAME, false);
+
+ List<ValueData> parents = new ArrayList<ValueData>();
+ for (InternalQName nt : value)
+ parents.add(new TransientValueData(nt));
+
+ propertyData.setValues(parents);
+ changesLog.add(ItemState.createAddedState(propertyData));
+ }
+
+ protected void writeString(PlainChangesLog changesLog, NodeData parentNode, InternalQName propertyName, String value)
+ {
+ TransientPropertyData propertyData =
+ TransientPropertyData.createPropertyData(parentNode, propertyName, PropertyType.STRING, false);
+ propertyData.setValue(new TransientValueData(value));
+ changesLog.add(ItemState.createAddedState(propertyData));
+ }
+
+ protected void writeStrings(PlainChangesLog changesLog, NodeData parentNode, InternalQName propertyName,
+ String[] value)
+ {
+ TransientPropertyData propertyData =
+ TransientPropertyData.createPropertyData(parentNode, propertyName, PropertyType.STRING, false);
+ List<ValueData> valueDatas = new ArrayList<ValueData>();
+ for (String vc : value)
+ {
+ if (vc != null)
+ valueDatas.add(new TransientValueData(vc));
+ }
+
+ propertyData.setValues(valueDatas);
+ changesLog.add(ItemState.createAddedState(propertyData));
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/AbstractItemDefinitionAccessProvider.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JcrNodeTypeDataPersister.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JcrNodeTypeDataPersister.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JcrNodeTypeDataPersister.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,413 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.access.AccessControlEntry;
+import org.exoplatform.services.jcr.access.AccessControlList;
+import org.exoplatform.services.jcr.access.AccessControlPolicy;
+import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.core.ExtendedPropertyType;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.dataflow.DataManager;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
+import org.exoplatform.services.jcr.dataflow.TransactionChangesLog;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.QPathEntry;
+import org.exoplatform.services.jcr.datamodel.ValueData;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.dataflow.ItemDataRemoveVisitor;
+import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
+import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
+import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class JcrNodeTypeDataPersister implements NodeTypeDataPersister
+{
+
+ protected final Log log = ExoLogger.getLogger(getClass().getName());
+
+ private final DataManager dataManager;
+
+ private NodeData nodeTypeStorageRoot;
+
+ private final NodeTypeDefinitionAccessProvider definitionAccessProvider;
+
+ private final boolean addACL;
+
+ private boolean started = false;
+
+ // /**
+ // * ChangesLog Buffer (used for saves before start).
+ // */
+ // private List<ItemStateChangesLog> changesLogBuffer = new ArrayList<ItemStateChangesLog>();
+
+ /**
+ * @param dataManager
+ * @throws RepositoryException
+ */
+ public JcrNodeTypeDataPersister(DataManager dataManager, boolean addACL) throws RepositoryException
+ {
+ super();
+ this.dataManager = dataManager;
+ this.addACL = addACL;
+
+ this.definitionAccessProvider = new NodeTypeDefinitionAccessProvider(dataManager);
+ }
+
+ /**
+ * @param dataManager
+ * @throws RepositoryException
+ */
+ public JcrNodeTypeDataPersister(DataManager dataManager, NodeData nodeTypeStorageRoot) throws RepositoryException
+ {
+ super();
+ this.dataManager = dataManager;
+ this.nodeTypeStorageRoot = nodeTypeStorageRoot;
+ this.definitionAccessProvider = new NodeTypeDefinitionAccessProvider(dataManager);
+ this.addACL = true;
+
+ }
+
+ /**
+ * @param dataManager
+ * @throws RepositoryException
+ */
+ public JcrNodeTypeDataPersister(DataManager dataManager, RepositoryEntry repConfig) throws RepositoryException
+ {
+ this(dataManager, !repConfig.getAccessControl().equals(AccessControlPolicy.DISABLE));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addNodeType(NodeTypeData nodeType) throws RepositoryException
+ {
+ if (!started)
+ {
+ log.warn("Unable save nodetype " + nodeType.getName().getAsString()
+ + " in to the storage. Storage not initialized");
+ return;
+ }
+
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+ definitionAccessProvider.write(changesLog, nodeTypeStorageRoot, nodeType);
+ dataManager.save(new TransactionChangesLog(changesLog));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean hasNodeType(InternalQName nodeTypeName) throws RepositoryException
+ {
+ if (!validatate())
+ {
+ return false;
+ }
+
+ NodeData nodeTypeData = (NodeData)dataManager.getItemData(nodeTypeStorageRoot, new QPathEntry(nodeTypeName, 1));
+
+ return nodeTypeData != null;
+ }
+
+ public NodeData initNodetypesRoot(NodeData nsSystem, boolean addACL) throws RepositoryException
+ {
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+
+ long start = System.currentTimeMillis();
+
+ TransientNodeData jcrNodetypes =
+ TransientNodeData.createNodeData(nsSystem, Constants.JCR_NODETYPES, Constants.NT_UNSTRUCTURED,
+ Constants.NODETYPESROOT_UUID);
+
+ TransientPropertyData primaryType =
+ TransientPropertyData.createPropertyData(jcrNodetypes, Constants.JCR_PRIMARYTYPE, PropertyType.NAME, false);
+ primaryType.setValue(new TransientValueData(jcrNodetypes.getPrimaryTypeName()));
+
+ changesLog.add(ItemState.createAddedState(jcrNodetypes)).add(ItemState.createAddedState(primaryType));
+
+ if (addACL)
+ {
+ AccessControlList acl = new AccessControlList();
+ InternalQName[] mixins = new InternalQName[]{Constants.EXO_OWNEABLE, Constants.EXO_PRIVILEGEABLE};
+ jcrNodetypes.setMixinTypeNames(mixins);
+
+ // jcr:mixinTypes
+ List<ValueData> mixValues = new ArrayList<ValueData>();
+ for (InternalQName mixin : mixins)
+ {
+ mixValues.add(new TransientValueData(mixin));
+ }
+ TransientPropertyData exoMixinTypes =
+ TransientPropertyData.createPropertyData(jcrNodetypes, Constants.JCR_MIXINTYPES, PropertyType.NAME, true,
+ mixValues);
+
+ TransientPropertyData exoOwner =
+ TransientPropertyData.createPropertyData(jcrNodetypes, Constants.EXO_OWNER, PropertyType.STRING, false,
+ new TransientValueData(acl.getOwner()));
+
+ List<ValueData> permsValues = new ArrayList<ValueData>();
+ for (int i = 0; i < acl.getPermissionEntries().size(); i++)
+ {
+ AccessControlEntry entry = acl.getPermissionEntries().get(i);
+ permsValues.add(new TransientValueData(entry));
+ }
+ TransientPropertyData exoPerms =
+ TransientPropertyData.createPropertyData(jcrNodetypes, Constants.EXO_PERMISSIONS,
+ ExtendedPropertyType.PERMISSION, true, permsValues);
+
+ changesLog.add(ItemState.createAddedState(exoMixinTypes)).add(ItemState.createAddedState(exoOwner)).add(
+ ItemState.createAddedState(exoPerms));
+ changesLog.add(new ItemState(jcrNodetypes, ItemState.MIXIN_CHANGED, false, null));
+ }
+
+ if (log.isDebugEnabled())
+ log.debug("/jcr:system/jcr:nodetypes is created, creation time: " + (System.currentTimeMillis() - start)
+ + " ms");
+
+ dataManager.save(new TransactionChangesLog(changesLog));
+
+ return jcrNodetypes;
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean isStorageFilled()
+ {
+ if (nodeTypeStorageRoot == null)
+ {
+ log.warn(" Storage not initialized");
+ return false;
+ }
+ try
+ {
+ List<NodeData> storageContent = dataManager.getChildNodesData(nodeTypeStorageRoot);
+ return storageContent.size() > 0;
+ }
+ catch (RepositoryException e)
+ {
+ log.error(e.getLocalizedMessage(), e);
+
+ }
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addNodeTypes(List<NodeTypeData> nodeTypes) throws RepositoryException
+ {
+ if (!validatate())
+ {
+ return;
+ }
+
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+ for (NodeTypeData nodeTypeData : nodeTypes)
+ {
+ definitionAccessProvider.write(changesLog, nodeTypeStorageRoot, nodeTypeData);
+ }
+
+ dataManager.save(new TransactionChangesLog(changesLog));
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void removeNodeType(NodeTypeData nodeType) throws RepositoryException
+ {
+ if (!validatate())
+ {
+ return;
+ }
+
+ validatate();
+ NodeData nodeTypeData =
+ (NodeData)dataManager.getItemData(nodeTypeStorageRoot, new QPathEntry(nodeType.getName(), 1));
+ ItemDataRemoveVisitor removeVisitor = new ItemDataRemoveVisitor(dataManager, nodeTypeStorageRoot.getQPath());
+ nodeTypeData.accept(removeVisitor);
+
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+ changesLog.addAll(removeVisitor.getRemovedStates());
+ dataManager.save(new TransactionChangesLog(changesLog));
+
+ }
+
+ public void start()
+ {
+ if (!started)
+ {
+ try
+ {
+ NodeData jcrSystem = (NodeData)dataManager.getItemData(Constants.SYSTEM_UUID);
+ if (jcrSystem != null)
+ {
+ NodeData jcrNodetypes =
+ (NodeData)dataManager.getItemData(jcrSystem, new QPathEntry(Constants.JCR_NODETYPES, 1));
+ if (jcrNodetypes == null)
+ this.nodeTypeStorageRoot = initNodetypesRoot(jcrSystem, addACL);
+ else
+ this.nodeTypeStorageRoot = jcrNodetypes;
+ }
+ else
+ {
+ throw new RuntimeException("Nodetypes storage (/jcr:systemnode) is not initialized.");
+ }
+ }
+ catch (RepositoryException e)
+ {
+ throw new RuntimeException(e.getLocalizedMessage(), e);
+ }
+ started = true;
+ }
+ }
+
+ public void stop()
+ {
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeDataPersister#unmarshall(org.exoplatform.services.jcr.datamodel.InternalQName, java.util.Set)
+ */
+ public NodeTypeData getNodeType(InternalQName nodeTypeName) throws RepositoryException, NoSuchNodeTypeException
+ {
+ if (nodeTypeStorageRoot == null)
+ {
+ log.warn(" Storage not initialized");
+ return null;
+ }
+ //Searching nodeType root
+ ItemData nodeType = dataManager.getItemData(nodeTypeStorageRoot, new QPathEntry(nodeTypeName, 1));
+ if (nodeType == null)
+ throw new NoSuchNodeTypeException("Node type definition " + nodeTypeName.getAsString() + "not found");
+ if (!nodeType.isNode())
+ throw new RepositoryException("Unexpected property found " + nodeType.getQPath().getAsString()
+ + ". Should be node.");
+
+ NodeData nodeTypeRoot = (NodeData)nodeType;
+
+ if (!Constants.NT_NODETYPE.equals(nodeTypeRoot.getPrimaryTypeName()))
+ throw new RepositoryException("Unexpected node type of NodeData found "
+ + nodeTypeRoot.getPrimaryTypeName().getAsString() + ". Should be " + Constants.NT_NODETYPE.getAsString());
+
+ return definitionAccessProvider.read(nodeTypeRoot);
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeDataPersister#getNodeType(java.util.Set)
+ */
+ public List<NodeTypeData> getAllNodeTypes() throws RepositoryException
+ {
+ if (!validatate())
+ {
+ return new ArrayList<NodeTypeData>();
+ }
+
+ validatate();
+ List<NodeData> nodeTypes = dataManager.getChildNodesData(nodeTypeStorageRoot);
+ List<NodeTypeData> result = new ArrayList<NodeTypeData>();
+ for (NodeData nodeData : nodeTypes)
+ {
+ if (Constants.NT_NODETYPE.equals(nodeData.getPrimaryTypeName()))
+ result.add(definitionAccessProvider.read(nodeData));
+ }
+ return result;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void update(List<NodeTypeData> nodeTypes, UpdateNodeTypeObserver observer) throws RepositoryException
+ {
+
+ PlainChangesLog changesLog = new PlainChangesLogImpl();
+
+ for (NodeTypeData nodeTypeData : nodeTypes)
+ {
+
+ if (observer != null)
+ {
+ if (observer.shouldSkip(nodeTypeData, changesLog))
+ continue;
+ observer.beforeUpdate(nodeTypeData, changesLog);
+
+ }
+ if (!validatate())
+ {
+ continue;
+ }
+ // remove first
+ NodeData removeNodeTypeData =
+ (NodeData)dataManager.getItemData(nodeTypeStorageRoot, new QPathEntry(nodeTypeData.getName(), 1));
+ if (removeNodeTypeData != null)
+ {
+ ItemDataRemoveVisitor removeVisitor =
+ new ItemDataRemoveVisitor(dataManager, nodeTypeStorageRoot.getQPath());
+ removeNodeTypeData.accept(removeVisitor);
+
+ changesLog.addAll(removeVisitor.getRemovedStates());
+ }
+ // add
+ definitionAccessProvider.write(changesLog, nodeTypeStorageRoot, nodeTypeData);
+ if (observer != null)
+ observer.afterUpdate(nodeTypeData, changesLog);
+ }
+
+ dataManager.save(new TransactionChangesLog(changesLog));
+
+ }
+
+ private boolean validatate()
+ {
+ if (this.nodeTypeStorageRoot == null)
+ {
+ if (log.isDebugEnabled())
+ log.debug(" Storage not initialized");
+ return false;
+ }
+ return true;
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/JcrNodeTypeDataPersister.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionAccessProvider.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionAccessProvider.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionAccessProvider.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.dataflow.DataManager;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+import org.exoplatform.services.jcr.datamodel.IllegalNameException;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.version.OnParentVersionAction;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class NodeDefinitionAccessProvider extends AbstractItemDefinitionAccessProvider
+{
+ /**
+ * @param dataManager
+ */
+ public NodeDefinitionAccessProvider(DataManager dataManager)
+ {
+ super(dataManager);
+
+ }
+
+ /**
+ * @param childDefinition
+ * @param name
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ * @throws IOException
+ * @throws IllegalNameException
+ * @throws RepositoryException
+ * @throws UnsupportedEncodingException
+ */
+ public NodeDefinitionData read(NodeData childDefinition, InternalQName declaringNodeType)
+ throws NodeTypeReadException, RepositoryException
+
+ {
+ // null if residual
+ InternalQName name = readName(childDefinition, Constants.JCR_NAME);
+
+ boolean autoCreated = readMandatoryBoolean(childDefinition, Constants.JCR_AUTOCREATED);
+
+ boolean mandatory = readMandatoryBoolean(childDefinition, Constants.JCR_MANDATORY);
+
+ int onParentVersion =
+ OnParentVersionAction.valueFromName(readMandatoryString(childDefinition, Constants.JCR_ONPARENTVERSION));
+
+ boolean protectedItem = readMandatoryBoolean(childDefinition, Constants.JCR_PROTECTED);
+
+ InternalQName[] requiredPrimaryTypes = readNames(childDefinition, Constants.JCR_REQUIREDPRIMARYTYPES);
+
+ InternalQName defaultPrimaryType = readName(childDefinition, Constants.JCR_DEFAULTPRIMNARYTYPE);
+
+ boolean allowsSameNameSiblings = readMandatoryBoolean(childDefinition, Constants.JCR_SAMENAMESIBLINGS);
+
+ return new NodeDefinitionData(name, declaringNodeType, autoCreated, mandatory, onParentVersion, protectedItem,
+ requiredPrimaryTypes, defaultPrimaryType, allowsSameNameSiblings);
+ }
+
+ public void write(PlainChangesLog changesLog, NodeData ntNode, NodeDefinitionData nodeDefinitionData, int index)
+ {
+
+ NodeData childNodesDefinition =
+ TransientNodeData.createNodeData(ntNode, Constants.JCR_CHILDNODEDEFINITION, Constants.NT_CHILDNODEDEFINITION,
+ index);
+
+ changesLog.add(ItemState.createAddedState(childNodesDefinition));
+
+ writeItemDefinition(changesLog, childNodesDefinition, nodeDefinitionData);
+
+ writeName(changesLog, childNodesDefinition, Constants.JCR_PRIMARYTYPE, childNodesDefinition.getPrimaryTypeName());
+
+ writeBoolean(changesLog, childNodesDefinition, Constants.JCR_SAMENAMESIBLINGS, nodeDefinitionData
+ .isAllowsSameNameSiblings());
+
+ if (nodeDefinitionData.getDefaultPrimaryType() != null)
+ { // Mandatory false
+
+ writeName(changesLog, childNodesDefinition, Constants.JCR_DEFAULTPRIMNARYTYPE, nodeDefinitionData
+ .getDefaultPrimaryType());
+ }
+
+ if (nodeDefinitionData.getRequiredPrimaryTypes() != null
+ && nodeDefinitionData.getRequiredPrimaryTypes().length != 0)
+ {
+ writeNames(changesLog, childNodesDefinition, Constants.JCR_REQUIREDPRIMARYTYPES, nodeDefinitionData
+ .getRequiredPrimaryTypes());
+ }
+ }
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionAccessProvider.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionComparator.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionComparator.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeDefinitionComparator.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -21,7 +21,7 @@
import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
-import org.exoplatform.services.jcr.dataflow.DataManager;
+import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
import org.exoplatform.services.jcr.datamodel.InternalQName;
@@ -29,13 +29,13 @@
import org.exoplatform.services.jcr.datamodel.NodeData;
import org.exoplatform.services.jcr.datamodel.QPathEntry;
import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.nodetype.ItemAutocreator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.Set;
import javax.jcr.RepositoryException;
import javax.jcr.nodetype.ConstraintViolationException;
@@ -54,13 +54,25 @@
*/
private static final Log LOG = ExoLogger.getLogger(NodeDefinitionComparator.class);
+ private final List<NodeData> affectedNodes;
+
+ private final NodeTypeDataManager nodeTypeDataManager;
+
+ private final ItemDataConsumer dataConsumer;
+
+ private final ItemAutocreator itemAutocreator;
+
/**
* @param nodeTypeDataManager
* @param persister
*/
- public NodeDefinitionComparator(NodeTypeDataManager nodeTypeDataManager, DataManager persister)
+ public NodeDefinitionComparator(NodeTypeDataManager nodeTypeDataManager, ItemDataConsumer dataConsumer,
+ ItemAutocreator itemAutocreator, List<NodeData> affectedNodes)
{
- super(nodeTypeDataManager, persister);
+ this.nodeTypeDataManager = nodeTypeDataManager;
+ this.dataConsumer = dataConsumer;
+ this.itemAutocreator = itemAutocreator;
+ this.affectedNodes = affectedNodes;
}
public PlainChangesLog compare(NodeTypeData registeredNodeType, NodeDefinitionData[] ancestorDefinition,
@@ -76,18 +88,16 @@
removedDefinitionData);
// create changes log
PlainChangesLog changesLog = new PlainChangesLogImpl();
+
// check removed
+ validateRemoved(registeredNodeType, removedDefinitionData, recipientDefinition, affectedNodes);
- validateRemoved(registeredNodeType, removedDefinitionData, recipientDefinition);
-
- Set<String> nodes = nodeTypeDataManager.getNodes(registeredNodeType.getName());
-
- validateAdded(registeredNodeType.getName(), newDefinitionData, nodes, recipientDefinition);
+ validateAdded(registeredNodeType.getName(), newDefinitionData, affectedNodes, recipientDefinition);
// changed
- validateChanged(registeredNodeType.getName(), changedDefinitionData, nodes, recipientDefinition);
+ validateChanged(registeredNodeType.getName(), changedDefinitionData, affectedNodes, recipientDefinition);
//
- doAdd(newDefinitionData, changesLog, nodes, registeredNodeType);
+ doAdd(newDefinitionData, changesLog, affectedNodes, registeredNodeType);
return changesLog;
@@ -99,13 +109,12 @@
* @throws RepositoryException
* @throws ConstraintViolationException
*/
- private void checkMandatoryItems(Set<String> nodes, NodeDefinitionData nodeDefinitionData)
+ private void checkMandatoryItems(List<NodeData> nodesData, NodeDefinitionData nodeDefinitionData)
throws RepositoryException, ConstraintViolationException
{
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
- ItemData child = persister.getItemData(nodeData, new QPathEntry(nodeDefinitionData.getName(), 0));
+ ItemData child = dataConsumer.getItemData(nodeData, new QPathEntry(nodeDefinitionData.getName(), 0));
if (child == null || !child.isNode())
{
throw new ConstraintViolationException("Fail to add mandatory and not auto-created "
@@ -125,19 +134,19 @@
* @param recipientDefinitionData
* @throws RepositoryException
*/
- private void checkRequiredPrimaryType(InternalQName registeredNodeType, Set<String> nodes,
+ private void checkRequiredPrimaryType(InternalQName registeredNodeType, List<NodeData> nodesData,
InternalQName[] ancestorRequiredPrimaryTypes, NodeDefinitionData recipientDefinitionData,
NodeDefinitionData[] allRecipientDefinition) throws RepositoryException
{
// Required type change
InternalQName[] requiredPrimaryTypes = recipientDefinitionData.getRequiredPrimaryTypes();
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
+
if (recipientDefinitionData.getName().equals(Constants.JCR_ANY_NAME))
{
- List<NodeData> childs = persister.getChildNodesData(nodeData);
+ List<NodeData> childs = dataConsumer.getChildNodesData(nodeData);
for (NodeData child : childs)
{
if (isResidualMatch(child.getQPath().getName(), allRecipientDefinition))
@@ -173,7 +182,7 @@
}
else
{
- List<NodeData> childs = persister.getChildNodesData(nodeData);
+ List<NodeData> childs = dataConsumer.getChildNodesData(nodeData);
for (NodeData child : childs)
{
if (child.getQPath().getName().equals(recipientDefinitionData.getName()))
@@ -217,23 +226,22 @@
* @param recipientDefinitionData
* @throws RepositoryException
*/
- private void checkSameNameSibling(InternalQName registeredNodeType, Set<String> nodes, InternalQName recipientName,
- NodeDefinitionData[] allRecipientDefinition) throws RepositoryException
+ private void checkSameNameSibling(InternalQName registeredNodeType, List<NodeData> nodesData,
+ InternalQName recipientName, NodeDefinitionData[] allRecipientDefinition) throws RepositoryException
{
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
if (recipientName.equals(Constants.JCR_ANY_NAME))
{
// child of node type
- List<NodeData> childs = persister.getChildNodesData(nodeData);
+ List<NodeData> childs = dataConsumer.getChildNodesData(nodeData);
for (NodeData child : childs)
{
if (isResidualMatch(child.getQPath().getName(), allRecipientDefinition))
{
- List<NodeData> childs2 = persister.getChildNodesData(child);
+ List<NodeData> childs2 = dataConsumer.getChildNodesData(child);
for (NodeData child2 : childs2)
{
@@ -259,12 +267,12 @@
{
// child of node type
- List<NodeData> childs = persister.getChildNodesData(nodeData);
+ List<NodeData> childs = dataConsumer.getChildNodesData(nodeData);
for (NodeData child : childs)
{
if (child.getQPath().getName().equals(recipientName))
{
- List<NodeData> childs2 = persister.getChildNodesData(child);
+ List<NodeData> childs2 = dataConsumer.getChildNodesData(child);
for (NodeData child2 : childs2)
{
@@ -299,21 +307,20 @@
* @param registeredNodeType
* @throws RepositoryException
*/
- private void doAdd(List<NodeDefinitionData> toAddList, PlainChangesLog changesLog, Set<String> nodes,
+ private void doAdd(List<NodeDefinitionData> toAddList, PlainChangesLog changesLog, List<NodeData> nodesData,
NodeTypeData registeredNodeType) throws RepositoryException
{
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
// added properties
for (NodeDefinitionData newNodeDefinitionData : toAddList)
{
if (!newNodeDefinitionData.getName().equals(Constants.JCR_ANY_NAME)
&& newNodeDefinitionData.isAutoCreated())
- changesLog.addAll(nodeTypeDataManager.makeAutoCreatedNodes(nodeData, registeredNodeType.getName(),
- new NodeDefinitionData[]{newNodeDefinitionData}, persister, nodeData.getACL().getOwner())
+ changesLog.addAll(itemAutocreator.makeAutoCreatedNodes(nodeData, registeredNodeType.getName(),
+ new NodeDefinitionData[]{newNodeDefinitionData}, dataConsumer, nodeData.getACL().getOwner())
.getAllStates());
}
}
@@ -327,7 +334,7 @@
* @throws RepositoryException
*/
private void validateAdded(InternalQName nodeTypeName, List<NodeDefinitionData> newDefinitionData,
- Set<String> nodes, NodeDefinitionData[] recipientDefinition) throws RepositoryException
+ List<NodeData> nodesData, NodeDefinitionData[] recipientDefinition) throws RepositoryException
{
for (NodeDefinitionData nodeDefinitionData : newDefinitionData)
@@ -336,22 +343,22 @@
if (nodeDefinitionData.getName().equals(Constants.JCR_ANY_NAME))
{
- checkRequiredPrimaryType(nodeTypeName, nodes, null, nodeDefinitionData, recipientDefinition);
+ checkRequiredPrimaryType(nodeTypeName, nodesData, null, nodeDefinitionData, recipientDefinition);
- checkSameNameSibling(nodeTypeName, nodes, nodeDefinitionData.getName(), recipientDefinition);
+ checkSameNameSibling(nodeTypeName, nodesData, nodeDefinitionData.getName(), recipientDefinition);
}
else
{
// check existed nodes for new constraint
- checkRequiredPrimaryType(nodeTypeName, nodes, null, nodeDefinitionData, recipientDefinition);
- checkSameNameSibling(nodeTypeName, nodes, nodeDefinitionData.getName(), recipientDefinition);
+ checkRequiredPrimaryType(nodeTypeName, nodesData, null, nodeDefinitionData, recipientDefinition);
+ checkSameNameSibling(nodeTypeName, nodesData, nodeDefinitionData.getName(), recipientDefinition);
// try to add mandatory or auto-created properties for
// for already addded nodes.
if (nodeDefinitionData.isMandatory() && !nodeDefinitionData.isAutoCreated())
{
- checkMandatoryItems(nodes, nodeDefinitionData);
+ checkMandatoryItems(nodesData, nodeDefinitionData);
}
}
}
@@ -366,7 +373,7 @@
* @throws RepositoryException
*/
private void validateChanged(InternalQName registeredNodeType,
- List<RelatedDefinition<NodeDefinitionData>> changedDefinitionData, Set<String> nodes,
+ List<RelatedDefinition<NodeDefinitionData>> changedDefinitionData, List<NodeData> nodesData,
NodeDefinitionData[] allRecipientDefinition) throws RepositoryException
{
for (RelatedDefinition<NodeDefinitionData> changedDefinitions : changedDefinitionData)
@@ -377,10 +384,11 @@
// TODO residual
if (!ancestorDefinitionData.isMandatory() && recipientDefinitionData.isMandatory())
{
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
- ItemData child = persister.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
+
+ ItemData child =
+ dataConsumer.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
if (child == null || !child.isNode())
{
String message =
@@ -389,7 +397,7 @@
+ " from mandatory=false to mandatory = true , because " + " node "
+ nodeData.getQPath().getAsString() + " doesn't have child node with name "
+ recipientDefinitionData.getName().getAsString();
- throw new RepositoryException(message);
+ throw new ConstraintViolationException(message);
}
}
}
@@ -398,32 +406,34 @@
if (!ancestorDefinitionData.isProtected() && recipientDefinitionData.isProtected())
{
// TODO residual
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
- ItemData child = persister.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
+
+ ItemData child =
+ dataConsumer.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
if (child == null || !child.isNode())
{
String message =
"Fail to change " + recipientDefinitionData.getName().getAsString() + " node definition for "
+ registeredNodeType.getAsString()
- + " node type from rotected=false to Protected = true , because " + " node "
+ + " node type from protected=false to Protected = true , because " + " node "
+ nodeData.getQPath().getAsString() + " doesn't have child node with name "
+ recipientDefinitionData.getName().getAsString();
- throw new RepositoryException(message);
+ throw new ConstraintViolationException(message);
}
}
}
if (!Arrays.deepEquals(ancestorDefinitionData.getRequiredPrimaryTypes(), recipientDefinitionData
.getRequiredPrimaryTypes()))
{
- checkRequiredPrimaryType(registeredNodeType, nodes, ancestorDefinitionData.getRequiredPrimaryTypes(),
+ checkRequiredPrimaryType(registeredNodeType, nodesData, ancestorDefinitionData.getRequiredPrimaryTypes(),
recipientDefinitionData, allRecipientDefinition);
}
// check sibling
if (ancestorDefinitionData.isAllowsSameNameSiblings() && !recipientDefinitionData.isAllowsSameNameSiblings())
{
- checkSameNameSibling(registeredNodeType, nodes, recipientDefinitionData.getName(), allRecipientDefinition);
+ checkSameNameSibling(registeredNodeType, nodesData, recipientDefinitionData.getName(),
+ allRecipientDefinition);
}
}
}
@@ -436,19 +446,17 @@
* @throws RepositoryException
*/
private void validateRemoved(NodeTypeData registeredNodeType, List<NodeDefinitionData> removedDefinitionData,
- NodeDefinitionData[] recipientDefinition) throws ConstraintViolationException, RepositoryException
+ NodeDefinitionData[] recipientDefinition, List<NodeData> nodesData) throws ConstraintViolationException,
+ RepositoryException
{
for (NodeDefinitionData removeNodeDefinitionData : removedDefinitionData)
{
- Set<String> nodes;
if (removeNodeDefinitionData.getName().equals(Constants.JCR_ANY_NAME))
{
- nodes = nodeTypeDataManager.getNodes(registeredNodeType.getName());
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
- List<NodeData> childs = persister.getChildNodesData(nodeData);
+ List<NodeData> childs = dataConsumer.getChildNodesData(nodeData);
// more then mixin and primary type
// TODO it could be possible, check add definitions
if (childs.size() > 0)
@@ -472,12 +480,10 @@
{
if (!isResidualMatch(removeNodeDefinitionData.getName(), recipientDefinition))
{
- nodes = nodeTypeDataManager.getNodes(registeredNodeType.getName());
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
ItemData child =
- persister.getItemData(nodeData, new QPathEntry(removeNodeDefinitionData.getName(), 0));
+ dataConsumer.getItemData(nodeData, new QPathEntry(removeNodeDefinitionData.getName(), 0));
if (child != null && child.isNode())
{
throw new ConstraintViolationException("Can't remove node definition "
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeConverter.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeConverter.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeConverter.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.access.AccessControlPolicy;
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionValue;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataImpl;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeValue;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionValue;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.impl.core.LocationFactory;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class NodeTypeConverter
+{
+ /**
+ * Class logger.
+ */
+ private final Log log = ExoLogger.getLogger(NodeTypeConverter.class);
+
+ private final LocationFactory locationFactory;
+
+ protected final String accessControlPolicy;
+
+ public NodeTypeConverter(LocationFactory locationFactory, String accessControlPolicy)
+ {
+ super();
+ this.locationFactory = locationFactory;
+ this.accessControlPolicy = accessControlPolicy;
+ }
+
+ public List<NodeTypeData> convertFromValueToData(List<NodeTypeValue> ntvalues) throws RepositoryException
+ {
+ List<NodeTypeData> nodeTypeDataList = new ArrayList<NodeTypeData>();
+ for (NodeTypeValue ntvalue : ntvalues)
+ {
+
+ if (accessControlPolicy.equals(AccessControlPolicy.DISABLE))
+ {
+ List<String> nsupertypes = ntvalue.getDeclaredSupertypeNames();
+ if (nsupertypes != null && nsupertypes.contains("exo:privilegeable")
+ || ntvalue.getName().equals("exo:privilegeable"))
+ {
+ // skip this node, so it's not necessary at this runtime
+ // + "' -- it's not necessary at this runtime";
+ log.warn("Node type " + ntvalue.getName() + " is not register due to DISABLE control policy");
+ break;
+ }
+ }
+
+ // We have to validate node value before registering it
+ ntvalue.validateNodeType();
+ // throw new RepositoryException("Invalid node type value");
+
+ // declaring NT name
+ InternalQName ntName = locationFactory.parseJCRName(ntvalue.getName()).getInternalName();
+
+ List<String> stlist = ntvalue.getDeclaredSupertypeNames();
+ InternalQName[] supertypes = new InternalQName[stlist.size()];
+ for (int i = 0; i < stlist.size(); i++)
+ {
+ supertypes[i] = locationFactory.parseJCRName(stlist.get(i)).getInternalName();
+ }
+
+ List<PropertyDefinitionValue> pdlist = ntvalue.getDeclaredPropertyDefinitionValues();
+ PropertyDefinitionData[] props = new PropertyDefinitionData[pdlist.size()];
+ for (int i = 0; i < pdlist.size(); i++)
+ {
+ PropertyDefinitionValue v = pdlist.get(i);
+
+ PropertyDefinitionData pd;
+ pd =
+ new PropertyDefinitionData(locationFactory.parseJCRName(v.getName()).getInternalName(), ntName, v
+ .isAutoCreate(), v.isMandatory(), v.getOnVersion(), v.isReadOnly(), v.getRequiredType(),
+ safeListToArray(v.getValueConstraints()), safeListToArray(v.getDefaultValueStrings()),
+ v.isMultiple());
+
+ props[i] = pd;
+ }
+
+ List<NodeDefinitionValue> ndlist = ntvalue.getDeclaredChildNodeDefinitionValues();
+ NodeDefinitionData[] nodes = new NodeDefinitionData[ndlist.size()];
+ for (int i = 0; i < ndlist.size(); i++)
+ {
+ NodeDefinitionValue v = ndlist.get(i);
+
+ List<String> rnts = v.getRequiredNodeTypeNames();
+ InternalQName[] requiredNTs = new InternalQName[rnts.size()];
+ for (int ri = 0; ri < rnts.size(); ri++)
+ {
+ requiredNTs[ri] = locationFactory.parseJCRName(rnts.get(ri)).getInternalName();
+ }
+ InternalQName defaultNodeName = null;
+ if (v.getDefaultNodeTypeName() != null)
+ {
+ defaultNodeName = locationFactory.parseJCRName(v.getDefaultNodeTypeName()).getInternalName();
+ }
+ NodeDefinitionData nd =
+ new NodeDefinitionData(locationFactory.parseJCRName(v.getName()).getInternalName(), ntName, v
+ .isAutoCreate(), v.isMandatory(), v.getOnVersion(), v.isReadOnly(), requiredNTs, defaultNodeName, v
+ .isSameNameSiblings());
+ nodes[i] = nd;
+ }
+
+ InternalQName primaryItemName = null;
+ if (ntvalue.getPrimaryItemName() != null)
+ primaryItemName = locationFactory.parseJCRName(ntvalue.getPrimaryItemName()).getInternalName();
+
+ NodeTypeData nodeTypeData =
+ new NodeTypeDataImpl(ntName, primaryItemName, ntvalue.isMixin(), ntvalue.isOrderableChild(), supertypes, props, nodes);
+
+ nodeTypeDataList.add(nodeTypeData);
+ }
+ return nodeTypeDataList;
+ }
+
+ public Map<InternalQName, NodeTypeData> convertToMap(List<NodeTypeData> ntvalues)
+ {
+ Map<InternalQName, NodeTypeData> result = new HashMap<InternalQName, NodeTypeData>();
+ for (NodeTypeData nodeTypeData : ntvalues)
+ {
+ result.put(nodeTypeData.getName(), nodeTypeData);
+ }
+ return result;
+ }
+
+ /**
+ * Convert list to array.
+ *
+ * @param v list of string
+ * @return array of string, empty array if list null.
+ */
+ private String[] safeListToArray(List<String> v)
+ {
+ return v != null ? v.toArray(new String[v.size()]) : new String[0];
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeConverter.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataBuilder.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataBuilder.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataBuilder.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,436 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataImpl;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.impl.Constants;
+
+
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.jcr.PropertyType;
+import javax.jcr.version.OnParentVersionAction;
+
+/**
+ * Created by The eXo Platform SAS. <br>
+ * This class is designed to build NodeTypeData instances 'bit by bit'. It
+ * serves as a container to store NodeType definition setting in the process of
+ * reading the stream. When instance of builder is created default parameters
+ * are assigned to internal fields. When method <b>build()</b> is invoked new
+ * NodeTypeData instance is created using parameters from internal fields. To
+ * define new child or new property method <b>
+ * newNodeDefinitionDataBuilder()</b> or <b> newPropertyDefinitionDataBuilder()
+ * </b> should be invoked. <b>Instances of returned Builders are automatically
+ * added to internal child or property lists.</b> If some builder is not used it
+ * should be removed from internal lists by using NodeTypeDataBuilder's method
+ * removeNodeDefinitionDataBuilder() or removePropertyDefinitionDataBuilder.
+ *
+ * @author <a href="mailto:nikolazius@gmail.com">Nikolay Zamosenchuk</a>
+ * @version $Id: $
+ */
+public class NodeTypeDataBuilder
+{
+
+ private InternalQName name;
+
+ private InternalQName[] supertypes;
+
+ private boolean isMixin;
+
+ private boolean isOrderable;
+
+ private InternalQName primaryItemName;
+
+ private PropertyDefinitionData[] propertyDefinitions;
+
+ private NodeDefinitionData[] childNodeDefinitions;
+
+ private boolean isAbstract;
+
+ private boolean isQueryable = true;
+
+ private List<NodeDefinitionDataBuilder> nodeDefinitionDataBuilders;
+
+ private List<PropertyDefinitionDataBuilder> propertyDefinitionDataBuilders;
+
+ /**
+ * This subclass represents child builder. To create instance of this class
+ * you should call NodeTypeDataBuilder's method
+ * <b>newNodeDefinitionDataBuilder()</b>.
+ */
+ public class NodeDefinitionDataBuilder
+ {
+
+ private InternalQName name;
+
+ private InternalQName declaringType;
+
+ private InternalQName defaultPrimaryType;
+
+ private InternalQName[] requiredPrimaryTypes;
+
+ private boolean isAutoCreated;
+
+ private int onParentVersion;
+
+ private boolean isProtected;
+
+ private boolean isMandatory;
+
+ private boolean allowsSameNameSiblings;
+
+ /**
+ * Constructor is private. Could to be invoked only by NodeTypeDataBuilder.
+ *
+ * @param declaringType
+ */
+ private NodeDefinitionDataBuilder(InternalQName declaringType)
+ {
+ this.declaringType = declaringType;
+ this.defaultPrimaryType = null;
+ this.requiredPrimaryTypes = new InternalQName[]{Constants.NT_BASE};
+ this.isAutoCreated = false;
+ this.onParentVersion = OnParentVersionAction.COPY;
+ this.isProtected = false;
+ this.isMandatory = false;
+ this.allowsSameNameSiblings = false;
+ }
+
+ /**
+ * This method returns new instance of NodeDefinitionData using parameters
+ * stored in current instance. This method is called by
+ * <b>NodeTypeDataBuilder.build()</b> before creating NodeTypeData instance.
+ *
+ * @return instance of NodeDefinitionData
+ */
+ private NodeDefinitionData build()
+ {
+ return new NodeDefinitionData(name, declaringType, isAutoCreated, isMandatory, onParentVersion, isProtected,
+ requiredPrimaryTypes, defaultPrimaryType, allowsSameNameSiblings);
+ }
+
+ public void setName(InternalQName name)
+ {
+ this.name = name;
+ }
+
+ public void setDefaultPrimaryType(InternalQName defaultPrimaryType)
+ {
+ this.defaultPrimaryType = defaultPrimaryType;
+ }
+
+ public void setRequiredPrimaryTypes(InternalQName[] requiredPrimaryTypes)
+ {
+ this.requiredPrimaryTypes = requiredPrimaryTypes;
+ }
+
+ public void setAutoCreated(boolean isAutoCreated)
+ {
+ this.isAutoCreated = isAutoCreated;
+ }
+
+ public void setOnParentVersion(int onParentVersion)
+ {
+ this.onParentVersion = onParentVersion;
+ }
+
+ public void setProtected(boolean isProtected)
+ {
+ this.isProtected = isProtected;
+ }
+
+ public void setMandatory(boolean isMandatory)
+ {
+ this.isMandatory = isMandatory;
+ }
+
+ public void setAllowsSameNameSiblings(boolean allowsSameNameSiblings)
+ {
+ this.allowsSameNameSiblings = allowsSameNameSiblings;
+ }
+ }
+
+ /**
+ * This subclass represents property builder. To create instance of this class
+ * you should call NodeTypeDataBuilder's method
+ * <b>newPropertyDefinitionDataBuilders()</b>.
+ */
+ public class PropertyDefinitionDataBuilder
+ {
+
+ private InternalQName name;
+
+ private int requiredType;
+
+ private String[] valueConstraints;
+
+ private String[] defaultValues;
+
+ private boolean isAutoCreated;
+
+ private boolean isProtected;
+
+ private boolean isMandatory;
+
+ private boolean isMultiple;
+
+ private boolean isFullTextSearchable;
+
+ private boolean isQueryOrderable;
+
+ private String[] queryOperators;
+
+ private int onParentVersion;
+
+ private InternalQName declaringType;
+
+ /**
+ * Constructor is private. Could to be invoked only by NodeTypeDataBuilder.
+ *
+ * @param declaringType
+ */
+ private PropertyDefinitionDataBuilder(InternalQName declaringType)
+ {
+ this.requiredType = PropertyType.STRING;
+ this.valueConstraints = null;
+ this.defaultValues = null;
+ this.isAutoCreated = false;
+ this.isProtected = false;
+ this.isMandatory = false;
+ this.isMultiple = false;
+// this.isFullTextSearchable = true;
+// this.isQueryOrderable = true;
+// this.queryOperators = Operator.getAllQueryOperators();
+ this.onParentVersion = OnParentVersionAction.COPY;
+ this.declaringType = declaringType;
+ }
+
+ /**
+ * This method returns new instance of NodeDefinitionData using parameters
+ * stored in current instance. This method is called by
+ * <b>NodeTypeDataBuilder.build()</b> before creating NodeTypeData instance.
+ *
+ * @return instance of PropertyDefinitionData
+ */
+ private PropertyDefinitionData build()
+ {
+ return new PropertyDefinitionData(name, declaringType, isAutoCreated, isMandatory, onParentVersion,
+ isProtected, requiredType, valueConstraints, defaultValues, isMultiple);
+ }
+
+ public void setName(InternalQName name)
+ {
+ this.name = name;
+ }
+
+ public void setRequiredType(int requiredType)
+ {
+ this.requiredType = requiredType;
+ }
+
+ public void setValueConstraints(String[] valueConstraints)
+ {
+ this.valueConstraints = valueConstraints;
+ }
+
+ public void setDefaultValues(String[] defaultValues)
+ {
+ this.defaultValues = defaultValues;
+ }
+
+ public void setAutoCreated(boolean isAutoCreated)
+ {
+ this.isAutoCreated = isAutoCreated;
+ }
+
+ public void setProtected(boolean isProtected)
+ {
+ this.isProtected = isProtected;
+ }
+
+ public void setMandatory(boolean isMandatory)
+ {
+ this.isMandatory = isMandatory;
+ }
+
+ public void setMultiple(boolean isMultiple)
+ {
+ this.isMultiple = isMultiple;
+ }
+
+ public void setFullTextSearchable(boolean fullTextSearchable)
+ {
+ this.isFullTextSearchable = fullTextSearchable;
+ }
+
+ public void setQueryOrderable(boolean isQueryOrderable)
+ {
+ this.isQueryOrderable = isQueryOrderable;
+ }
+
+ public void setQueryOperators(String[] queryOperators)
+ {
+ this.queryOperators = queryOperators;
+ }
+
+ public void setOnParentVersion(int onParentVersion)
+ {
+ this.onParentVersion = onParentVersion;
+ }
+ }
+
+ /**
+ * Creates new instance of NodeTypeData builder with default parameters.
+ */
+ public NodeTypeDataBuilder()
+ {
+ this.isMixin = false;
+ this.isOrderable = false;
+ this.isAbstract = false;
+ this.isQueryable = true;
+ this.primaryItemName = null;
+ this.supertypes = new InternalQName[]{Constants.NT_BASE};
+ this.propertyDefinitions = new PropertyDefinitionData[0];
+ this.childNodeDefinitions = new NodeDefinitionData[0];
+ this.nodeDefinitionDataBuilders = new LinkedList<NodeDefinitionDataBuilder>();
+ this.propertyDefinitionDataBuilders = new LinkedList<PropertyDefinitionDataBuilder>();
+ }
+
+ /**
+ * Creates child builder. This builder is automatically added to list of child
+ * builders in order to fill nodetType's child declaration array. If this
+ * instance is not used, it should be removed from internal list by calling
+ * NodeTypeData's method <b>removeNodeDefinitionDataBuilder()</b>.
+ *
+ * @return new NodeDefinitionBuilder
+ */
+ public NodeDefinitionDataBuilder newNodeDefinitionDataBuilder()
+ {
+ NodeDefinitionDataBuilder child = new NodeDefinitionDataBuilder(this.name);
+ this.nodeDefinitionDataBuilders.add(child);
+ return child;
+ }
+
+ /**
+ * Creates property builder. This builder is automatically added to list of
+ * property builders in order to fill nodetType's property declaration array.
+ * If this instance is not used, it should be removed from internal list by
+ * calling NodeTypeData's method <b>removePropertyDefinitionDataBuilder()</b>.
+ *
+ * @return new NodeDefinitionBuilder
+ */
+ public PropertyDefinitionDataBuilder newPropertyDefinitionDataBuilder()
+ {
+ PropertyDefinitionDataBuilder property = new PropertyDefinitionDataBuilder(this.name);
+ this.propertyDefinitionDataBuilders.add(property);
+ return property;
+ }
+
+ /**
+ * Removes given NodeDefinitionDataBuilder from internal list of NodeType's
+ * children.
+ *
+ * @param NodeDefinitionDataBuilder
+ * @return result flag
+ */
+ public boolean removeNodeDefinitionDataBuilder(NodeDefinitionDataBuilder childBuilder)
+ {
+ return nodeDefinitionDataBuilders.remove(childBuilder);
+ }
+
+ /**
+ * Removes given PropertyDefinitionDataBuilder from internal list of
+ * NodeType's properties.
+ *
+ * @param PropertyDefinitionDataBuilder
+ * @return result flag
+ */
+ public boolean removePropertyDefinitionDataBuilder(PropertyDefinitionDataBuilder propertyBuilder)
+ {
+ return propertyDefinitionDataBuilders.remove(propertyBuilder);
+ }
+
+ /**
+ * Creates instance of NodeTypeData using parameters stored in this object.
+ *
+ * @return NodeTypeData
+ */
+ public NodeTypeData build()
+ {
+ if (nodeDefinitionDataBuilders.size() > 0)
+ {
+ childNodeDefinitions = new NodeDefinitionData[nodeDefinitionDataBuilders.size()];
+ for (int i = 0; i < childNodeDefinitions.length; i++)
+ {
+ childNodeDefinitions[i] = nodeDefinitionDataBuilders.get(i).build();
+ }
+ }
+ if (propertyDefinitionDataBuilders.size() > 0)
+ {
+ propertyDefinitions = new PropertyDefinitionData[propertyDefinitionDataBuilders.size()];
+ for (int i = 0; i < propertyDefinitions.length; i++)
+ {
+ propertyDefinitions[i] = propertyDefinitionDataBuilders.get(i).build();
+ }
+ }
+ return new NodeTypeDataImpl(name, primaryItemName, isMixin, isOrderable, supertypes,
+ propertyDefinitions, childNodeDefinitions);
+ }
+
+ public void setName(InternalQName name)
+ {
+ this.name = name;
+ }
+
+ public void setSupertypes(InternalQName[] supertypes)
+ {
+ this.supertypes = supertypes;
+ }
+
+ public void setMixin(boolean isMixin)
+ {
+ this.isMixin = isMixin;
+ }
+
+ public void setOrderable(boolean isOrderable)
+ {
+ this.isOrderable = isOrderable;
+ }
+
+ public void setPrimaryItemName(InternalQName primaryItemName)
+ {
+ this.primaryItemName = primaryItemName;
+ }
+
+ public void setAbstract(boolean isAbstract)
+ {
+ this.isAbstract = isAbstract;
+ }
+
+ public void setQueryable(boolean isQueryable)
+ {
+ this.isQueryable = isQueryable;
+ }
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataBuilder.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataPersister.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataPersister.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataPersister.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.ComponentPersister;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.datamodel.IllegalNameException;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+
+import java.io.IOException;
+import java.util.List;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public interface NodeTypeDataPersister extends ComponentPersister
+{
+ /**
+ * Add new node type
+ *
+ * @param nodeType
+ * @return
+ * @throws RepositoryException
+ */
+ public void addNodeType(NodeTypeData nodeType) throws RepositoryException;
+
+ /**
+ * Check node type
+ *
+ * @param nodeTypeName
+ * @return
+ * @throws RepositoryException
+ */
+ public boolean hasNodeType(InternalQName nodeTypeName) throws RepositoryException;
+
+ /**
+ * Write node types to stream
+ *
+ * @param os output stream
+ * @param nodeTypes
+ * @throws IOException
+ * @throws RepositoryException
+ */
+ public void addNodeTypes(List<NodeTypeData> nodeTypes) throws RepositoryException;
+
+ /**
+ * Remove node type
+ *
+ * @param nodeType
+ * @return
+ * @throws RepositoryException
+ */
+ public void removeNodeType(NodeTypeData nodeType) throws RepositoryException;
+
+ /**
+ * Read node types.
+ *
+ * @param is input stream
+ * @return
+ * @throws RepositoryException
+ * @throws IllegalNameException
+ */
+ public List<NodeTypeData> getAllNodeTypes() throws RepositoryException;
+
+ /**
+ * Read node types.
+ *
+ * @param is input stream
+ * @return
+ * @throws RepositoryException
+ */
+ public NodeTypeData getNodeType(InternalQName nodeTypeName) throws RepositoryException;
+
+ /**
+ * Write node types to stream
+ *
+ * @param os output stream
+ * @param nodeTypes
+ * @throws IOException
+ * @throws RepositoryException
+ */
+ public void update(List<NodeTypeData> nodeTypes, UpdateNodeTypeObserver observer) throws RepositoryException;
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataPersister.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataValidator.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataValidator.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataValidator.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeRepository;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class NodeTypeDataValidator
+{
+ /**
+ * Class logger.
+ */
+ private final Log log = ExoLogger.getLogger(NodeTypeDataValidator.class);
+
+ protected final NodeTypeRepository hierarchy;
+
+ public NodeTypeDataValidator(NodeTypeRepository hierarchy)
+ {
+ super();
+ this.hierarchy = hierarchy;
+ }
+
+ public void validateNodeType(List<NodeTypeData> nodeTypeDataList) throws RepositoryException
+ {
+ for (NodeTypeData nodeTypeData : nodeTypeDataList)
+ {
+ validateNodeType(nodeTypeData);
+ }
+ checkCyclicDependencies(nodeTypeDataList);
+ }
+
+ private void checkCyclicDependencies(List<NodeTypeData> nodeTypeDataList) throws RepositoryException
+ {
+ Set<InternalQName> unresolvedDependecies = new HashSet<InternalQName>();
+ Set<InternalQName> resolvedDependecies = new HashSet<InternalQName>();
+ for (NodeTypeData nodeTypeData : nodeTypeDataList)
+ {
+ // / add itself
+ resolvedDependecies.add(nodeTypeData.getName());
+ // remove from unresolved
+ unresolvedDependecies.remove(nodeTypeData.getName());
+ // check suppers
+ for (int i = 0; i < nodeTypeData.getDeclaredSupertypeNames().length; i++)
+ {
+ InternalQName superName = nodeTypeData.getDeclaredSupertypeNames()[i];
+ if (hierarchy.getNodeType(superName) == null && !resolvedDependecies.contains(superName))
+ {
+ unresolvedDependecies.add(superName);
+ }
+ }
+ // check node definition
+ for (int i = 0; i < nodeTypeData.getDeclaredChildNodeDefinitions().length; i++)
+ {
+ NodeDefinitionData childnodeDefinitionData = nodeTypeData.getDeclaredChildNodeDefinitions()[i];
+ for (int j = 0; j < childnodeDefinitionData.getRequiredPrimaryTypes().length; j++)
+ {
+ InternalQName requiredPrimaryTypeName = childnodeDefinitionData.getRequiredPrimaryTypes()[j];
+ if (hierarchy.getNodeType(requiredPrimaryTypeName) == null
+ && !resolvedDependecies.contains(requiredPrimaryTypeName))
+ {
+ unresolvedDependecies.add(requiredPrimaryTypeName);
+ }
+ }
+ if (childnodeDefinitionData.getDefaultPrimaryType() != null)
+ {
+ if (hierarchy.getNodeType(childnodeDefinitionData.getDefaultPrimaryType()) == null
+ && !resolvedDependecies.contains(childnodeDefinitionData.getDefaultPrimaryType()))
+ {
+ unresolvedDependecies.add(childnodeDefinitionData.getDefaultPrimaryType());
+
+ }
+ }
+ }
+ }
+ if (unresolvedDependecies.size() > 0)
+ {
+ String msg = "Fail. Unresolved cyclic dependecy for :";
+ for (InternalQName internalQName : resolvedDependecies)
+ {
+ msg += " " + internalQName.getAsString();
+ }
+
+ msg +=" Unresolved ";
+ for (InternalQName internalQName : unresolvedDependecies)
+ {
+ msg += " " + internalQName.getAsString();
+ }
+
+ throw new RepositoryException(msg);
+ }
+ }
+
+ /**
+ * Check according the JSR-170
+ */
+ private void validateNodeType(NodeTypeData nodeType) throws RepositoryException
+ {
+ if (nodeType == null)
+ {
+ throw new RepositoryException("NodeType object " + nodeType + " is null");
+ }
+
+ for (int i = 0; i < nodeType.getDeclaredSupertypeNames().length; i++)
+ {
+ if (!nodeType.getName().equals(Constants.NT_BASE)
+ && nodeType.getName().equals(nodeType.getDeclaredSupertypeNames()[i]))
+ {
+ throw new RepositoryException("Invalid super type name"
+ + nodeType.getDeclaredSupertypeNames()[i].getAsString());
+ }
+ }
+ for (int i = 0; i < nodeType.getDeclaredPropertyDefinitions().length; i++)
+ {
+ if (!nodeType.getDeclaredPropertyDefinitions()[i].getDeclaringNodeType().equals(nodeType.getName()))
+ {
+ throw new RepositoryException("Invalid declared node type in property definitions with name "
+ + nodeType.getDeclaredPropertyDefinitions()[i].getName().getAsString() + " not registred");
+ }
+ }
+ for (int i = 0; i < nodeType.getDeclaredChildNodeDefinitions().length; i++)
+ {
+ if (!nodeType.getDeclaredChildNodeDefinitions()[i].getDeclaringNodeType().equals(nodeType.getName()))
+ {
+ throw new RepositoryException("Invalid declared node type in child node definitions with name "
+ + nodeType.getDeclaredChildNodeDefinitions()[i].getName().getAsString() + " not registred");
+ }
+ }
+
+ if (nodeType.getName() == null)
+ {
+ throw new RepositoryException("NodeType implementation class " + nodeType.getClass().getName()
+ + " is not supported in this method");
+ }
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDataValidator.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDefinitionAccessProvider.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDefinitionAccessProvider.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDefinitionAccessProvider.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,251 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataImpl;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
+import org.exoplatform.services.jcr.dataflow.DataManager;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+import org.exoplatform.services.jcr.datamodel.IllegalNameException;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class NodeTypeDefinitionAccessProvider extends AbstractItemDefinitionAccessProvider
+{
+
+ private PropertyDefinitionAccessProvider propertyDefinitionAccessProvider;
+
+ private NodeDefinitionAccessProvider nodeDefinitionAccessProvider;
+
+ /**
+ * @param dataManager
+ */
+ public NodeTypeDefinitionAccessProvider(DataManager dataManager)
+ {
+ super(dataManager);
+ this.propertyDefinitionAccessProvider = new PropertyDefinitionAccessProvider(dataManager);
+ this.nodeDefinitionAccessProvider = new NodeDefinitionAccessProvider(dataManager);
+ }
+
+ public NodeTypeData read(NodeData nodeData) throws RepositoryException
+
+ {
+
+ //return new LazyLoadNodeTypeData(nodeData, this);
+ return readNow(nodeData);
+ }
+
+ /**
+ * @param nodeData
+ * @return
+ * @throws IOException
+ * @throws IllegalNameException
+ * @throws RepositoryException
+ * @throws UnsupportedEncodingException
+ */
+ public NodeTypeData readNow(NodeData nodeData) throws RepositoryException
+
+ {
+
+ InternalQName name = readMandatoryName(nodeData, Constants.JCR_NODETYPENAME);
+
+ InternalQName primaryItemName = readName(nodeData, Constants.JCR_PRIMARYITEMNAME);
+
+ boolean mixin = readMandatoryBoolean(nodeData, Constants.JCR_ISMIXIN);
+
+ boolean hasOrderableChildNodes = readMandatoryBoolean(nodeData, Constants.JCR_HASORDERABLECHILDNODES);
+ // TODO fix to mandatory
+ // boolean isAbstract = readMandatoryBoolean(nodeData, Constants.JCR_ISABSTRACT);
+ //
+ // boolean isQueryable = readBoolean(nodeData, Constants.JCR_ISQUERYABLE);
+
+ InternalQName[] declaredSupertypeNames = readNames(nodeData, Constants.JCR_SUPERTYPES);
+
+ List<PropertyDefinitionData> propertyDefinitionDataList = new ArrayList<PropertyDefinitionData>();
+ List<NodeDefinitionData> nodeDefinitionDataList = new ArrayList<NodeDefinitionData>();
+
+ List<NodeData> childDefinitions = dataManager.getChildNodesData(nodeData);
+ for (NodeData childDefinition : childDefinitions)
+ {
+ if (Constants.NT_PROPERTYDEFINITION.equals(childDefinition.getPrimaryTypeName()))
+ {
+ propertyDefinitionDataList.add(propertyDefinitionAccessProvider.read(childDefinition, name));
+ }
+ else if (Constants.NT_CHILDNODEDEFINITION.equals(childDefinition.getPrimaryTypeName()))
+ {
+ nodeDefinitionDataList.add(nodeDefinitionAccessProvider.read(childDefinition, name));
+ }
+ }
+
+ return new NodeTypeDataImpl(name, primaryItemName, mixin, hasOrderableChildNodes, declaredSupertypeNames,
+ propertyDefinitionDataList.toArray(new PropertyDefinitionData[propertyDefinitionDataList.size()]),
+ nodeDefinitionDataList.toArray(new NodeDefinitionData[nodeDefinitionDataList.size()]));
+ }
+
+ /**
+ * Read node NodeDefinitionData[] of node type
+ * @param nodeData
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ * @throws UnsupportedEncodingException
+ * @throws RepositoryException
+ * @throws IllegalNameException
+ * @throws IOException
+ */
+ public NodeDefinitionData[] readNodeDefinitions(NodeData nodeData) throws NodeTypeReadException, RepositoryException
+ {
+ InternalQName name = null;
+ List<NodeDefinitionData> nodeDefinitionDataList;
+
+ List<NodeData> childDefinitions = dataManager.getChildNodesData(nodeData);
+
+ if (childDefinitions.size() > 0)
+ name = readMandatoryName(nodeData, Constants.JCR_NODETYPENAME);
+ else
+ return new NodeDefinitionData[0];
+
+ nodeDefinitionDataList = new ArrayList<NodeDefinitionData>();
+ for (NodeData childDefinition : childDefinitions)
+ {
+ if (Constants.NT_CHILDNODEDEFINITION.equals(childDefinition.getPrimaryTypeName()))
+ {
+ nodeDefinitionDataList.add(nodeDefinitionAccessProvider.read(childDefinition, name));
+ }
+ }
+
+ return nodeDefinitionDataList.toArray(new NodeDefinitionData[nodeDefinitionDataList.size()]);
+ }
+
+ /**
+ * Read PropertyDefinitionData of node type.
+ * @param nodeData
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ * @throws UnsupportedEncodingException
+ * @throws RepositoryException
+ * @throws IllegalNameException
+ * @throws IOException
+ */
+ public PropertyDefinitionData[] readPropertyDefinitions(NodeData nodeData) throws NodeTypeReadException,
+ RepositoryException
+ {
+
+ List<PropertyDefinitionData> propertyDefinitionDataList;
+
+ List<NodeData> childDefinitions = dataManager.getChildNodesData(nodeData);
+ InternalQName name = null;
+ if (childDefinitions.size() > 0)
+ name = readMandatoryName(nodeData, Constants.JCR_NODETYPENAME);
+ else
+ return new PropertyDefinitionData[0];
+ propertyDefinitionDataList = new ArrayList<PropertyDefinitionData>();
+
+ for (NodeData childDefinition : childDefinitions)
+ {
+ if (Constants.NT_PROPERTYDEFINITION.equals(childDefinition.getPrimaryTypeName()))
+ {
+ propertyDefinitionDataList.add(propertyDefinitionAccessProvider.read(childDefinition, name));
+ }
+ }
+
+ return propertyDefinitionDataList.toArray(new PropertyDefinitionData[propertyDefinitionDataList.size()]);
+ }
+
+ /**
+ * @param nodeData
+ * @param nodeTypeData
+ * @return
+ * @throws RepositoryException
+ * @throws NodeTypeReadException
+ */
+ public void write(PlainChangesLog changesLog, NodeData nodeTypeStorageRoot, NodeTypeData nodeType)
+ throws NodeTypeReadException, RepositoryException
+ {
+
+ NodeData ntNode =
+ TransientNodeData.createNodeData(nodeTypeStorageRoot, nodeType.getName(), Constants.NT_NODETYPE);
+
+ changesLog.add(ItemState.createAddedState(ntNode));
+
+ writeName(changesLog, ntNode, Constants.JCR_PRIMARYTYPE, ntNode.getPrimaryTypeName());
+
+ // jcr:nodeTypeName
+ writeName(changesLog, ntNode, Constants.JCR_NODETYPENAME, nodeType.getName());
+
+ // jcr:isMixin
+ writeBoolean(changesLog, ntNode, Constants.JCR_ISMIXIN, nodeType.isMixin());
+
+ // // jcr:isAbstract
+ // writeBoolean(changesLog, ntNode, Constants.JCR_ISABSTRACT, nodeType.isAbstract());
+ //
+ // // jcr:isQueryable
+ // writeBoolean(changesLog, ntNode, Constants.JCR_ISQUERYABLE, nodeType.isQueryable());
+
+ // jcr:hasOrderableChildNodes
+ writeBoolean(changesLog, ntNode, Constants.JCR_HASORDERABLECHILDNODES, nodeType.hasOrderableChildNodes());
+
+ if (nodeType.getPrimaryItemName() != null)
+ {
+ // jcr:primaryItemName
+ writeName(changesLog, ntNode, Constants.JCR_PRIMARYITEMNAME, nodeType.getPrimaryItemName());
+ }
+
+ if (nodeType.getDeclaredSupertypeNames() != null && nodeType.getDeclaredSupertypeNames().length > 0)
+ {
+ // jcr:supertypes
+ writeNames(changesLog, ntNode, Constants.JCR_SUPERTYPES, nodeType.getDeclaredSupertypeNames());
+ }
+
+ for (int i = 0; i < nodeType.getDeclaredPropertyDefinitions().length; i++)
+ {
+
+ propertyDefinitionAccessProvider
+ .write(changesLog, ntNode, nodeType.getDeclaredPropertyDefinitions()[i], i + 1);
+
+ }
+
+ for (int i = 0; i < nodeType.getDeclaredChildNodeDefinitions().length; i++)
+ {
+
+ nodeDefinitionAccessProvider.write(changesLog, ntNode, nodeType.getDeclaredChildNodeDefinitions()[i], i + 1);
+
+ }
+
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeDefinitionAccessProvider.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeReadException.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeReadException.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeReadException.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@exoplatform.org">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z ksm $
+ *
+ */
+public class NodeTypeReadException extends RepositoryException
+{
+
+ /**
+ *
+ */
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ public NodeTypeReadException()
+ {
+ super();
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @param message
+ * @param rootCause
+ */
+ public NodeTypeReadException(String message, Throwable rootCause)
+ {
+ super(message, rootCause);
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @param message
+ */
+ public NodeTypeReadException(String message)
+ {
+ super(message);
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @param rootCause
+ */
+ public NodeTypeReadException(Throwable rootCause)
+ {
+ super(rootCause);
+ // TODO Auto-generated constructor stub
+ }
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/NodeTypeReadException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionAccessProvider.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionAccessProvider.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionAccessProvider.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.ExtendedPropertyType;
+import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
+import org.exoplatform.services.jcr.dataflow.DataManager;
+import org.exoplatform.services.jcr.dataflow.ItemState;
+import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.version.OnParentVersionAction;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class PropertyDefinitionAccessProvider extends AbstractItemDefinitionAccessProvider
+{
+
+ public PropertyDefinitionAccessProvider(DataManager dataManager)
+ {
+ super(dataManager);
+
+ }
+
+ public PropertyDefinitionData read(NodeData nodeData, InternalQName declaringNodeType) throws NodeTypeReadException,
+ RepositoryException
+
+ {
+ if (Constants.NT_PROPERTYDEFINITION.equals(nodeData.getPrimaryTypeName()))
+ {
+
+ // null if residual;
+ InternalQName name = readName(nodeData, Constants.JCR_NAME);
+ boolean protectedItem = readMandatoryBoolean(nodeData, Constants.JCR_PROTECTED);
+ boolean autoCreated = readMandatoryBoolean(nodeData, Constants.JCR_AUTOCREATED);
+ boolean mandatory = readMandatoryBoolean(nodeData, Constants.JCR_MANDATORY);
+ int onParentVersion =
+ OnParentVersionAction.valueFromName(readMandatoryString(nodeData, Constants.JCR_ONPARENTVERSION));
+
+ int requiredType =
+ ExtendedPropertyType.valueFromName(readMandatoryString(nodeData, Constants.JCR_REQUIREDTYPE));
+
+ boolean multiple = readMandatoryBoolean(nodeData, Constants.JCR_MULTIPLE);
+
+ //3 Query atributes
+// boolean isQueryOrderable = readMandatoryBoolean(nodeData, Constants.JCR_QUERYORDERABLE);
+// String[] availableQueryOperators = readMandatoryStrings(nodeData, Constants.JCR_AVAILABLEQUERYOPERATORS);
+// boolean isFullTextSearchable = readMandatoryBoolean(nodeData, Constants.JCR_ISFULLTEXTSEARCHABLE);
+
+ String[] valueConstraints = readStrings(nodeData, Constants.JCR_VALUECONSTRAINTS);
+ String[] defaultValues = readStrings(nodeData, Constants.JCR_DEFAULTVALUES);
+
+ return new PropertyDefinitionData(name, declaringNodeType, autoCreated, mandatory, onParentVersion,
+ protectedItem, requiredType, valueConstraints, defaultValues, multiple);
+ }
+ return null;
+ }
+
+ public void write(PlainChangesLog changesLog, NodeData declaredNodeType,
+ PropertyDefinitionData propertyDefinitionData, int index)
+ {
+
+ NodeData propertyDefinition =
+ TransientNodeData.createNodeData(declaredNodeType, Constants.JCR_PROPERTYDEFINITION,
+ Constants.NT_PROPERTYDEFINITION, index);
+ changesLog.add(ItemState.createAddedState(propertyDefinition));
+
+ writeItemDefinition(changesLog, propertyDefinition, propertyDefinitionData);
+
+ writeName(changesLog, propertyDefinition, Constants.JCR_PRIMARYTYPE, propertyDefinition.getPrimaryTypeName());
+
+ writeString(changesLog, propertyDefinition, Constants.JCR_REQUIREDTYPE, ExtendedPropertyType
+ .nameFromValue(propertyDefinitionData.getRequiredType()));
+
+ writeBoolean(changesLog, propertyDefinition, Constants.JCR_MULTIPLE, propertyDefinitionData.isMultiple());
+
+ //3 Query atributes
+// writeBoolean(changesLog, propertyDefinition, Constants.JCR_QUERYORDERABLE, propertyDefinitionData
+// .isQueryOrderable());
+// writeStrings(changesLog, propertyDefinition, Constants.JCR_AVAILABLEQUERYOPERATORS, propertyDefinitionData
+// .getAvailableQueryOperators());
+// writeBoolean(changesLog, propertyDefinition, Constants.JCR_ISFULLTEXTSEARCHABLE, propertyDefinitionData
+// .isFullTextSearchable());
+
+ if (propertyDefinitionData.getValueConstraints() != null
+ && propertyDefinitionData.getValueConstraints().length != 0)
+ {
+
+ writeStrings(changesLog, propertyDefinition, Constants.JCR_VALUECONSTRAINTS, propertyDefinitionData
+ .getValueConstraints());
+ }
+
+ if (propertyDefinitionData.getDefaultValues() != null && propertyDefinitionData.getDefaultValues().length != 0)
+ {
+
+ writeStrings(changesLog, propertyDefinition, Constants.JCR_DEFAULTVALUES, propertyDefinitionData
+ .getDefaultValues());
+
+ }
+ }
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionAccessProvider.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionComparator.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionComparator.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/PropertyDefinitionComparator.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -22,7 +22,7 @@
import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
-import org.exoplatform.services.jcr.dataflow.DataManager;
+import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.dataflow.PlainChangesLogImpl;
import org.exoplatform.services.jcr.datamodel.InternalQName;
@@ -33,6 +33,7 @@
import org.exoplatform.services.jcr.datamodel.ValueData;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
+import org.exoplatform.services.jcr.impl.core.nodetype.ItemAutocreator;
import org.exoplatform.services.jcr.impl.core.value.ValueConstraintsMatcher;
import org.exoplatform.services.jcr.impl.dataflow.AbstractValueData;
import org.exoplatform.services.log.ExoLogger;
@@ -41,7 +42,6 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.Set;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
@@ -60,17 +60,28 @@
*/
private static final Log LOG = ExoLogger.getLogger(PropertyDefinitionComparator.class);
+ private final List<NodeData> affectedNodes;
+
private final LocationFactory locationFactory;
+ private final NodeTypeDataManager nodeTypeDataManager;
+
+ private final ItemDataConsumer dataConsumer;
+
+ private final ItemAutocreator itemAutocreator;
+
/**
* @param nodeTypeDataManager
* @param persister
* @param locationFactory
*/
- public PropertyDefinitionComparator(NodeTypeDataManager nodeTypeDataManager, DataManager persister,
- LocationFactory locationFactory)
+ public PropertyDefinitionComparator(NodeTypeDataManager nodeTypeDataManager, ItemDataConsumer dataConsumer,
+ ItemAutocreator itemAutocreator, List<NodeData> affectedNodes, LocationFactory locationFactory)
{
- super(nodeTypeDataManager, persister);
+ this.nodeTypeDataManager = nodeTypeDataManager;
+ this.dataConsumer = dataConsumer;
+ this.itemAutocreator = itemAutocreator;
+ this.affectedNodes = affectedNodes;
this.locationFactory = locationFactory;
}
@@ -90,19 +101,17 @@
// create changes log
PlainChangesLog changesLog = new PlainChangesLogImpl();
- // DataManager dm = persister.getDataManager();
// removing properties
- validateRemoved(registeredNodeType, removedDefinitionData, recipientDefinition);
+ validateRemoved(registeredNodeType, removedDefinitionData, recipientDefinition, affectedNodes);
// new property definition
- validateAdded(registeredNodeType, newDefinitionData, recipientDefinition);
+ validateAdded(registeredNodeType, newDefinitionData, recipientDefinition, affectedNodes);
- Set<String> nodes = nodeTypeDataManager.getNodes(registeredNodeType.getName());
// changed
- validateChanged(registeredNodeType, changedDefinitionData, nodes, recipientDefinition);
+ validateChanged(registeredNodeType, changedDefinitionData, affectedNodes, recipientDefinition);
//
- doAdd(newDefinitionData, changesLog, nodes, registeredNodeType);
+ doAdd(newDefinitionData, changesLog, affectedNodes, registeredNodeType);
return changesLog;
}
@@ -115,25 +124,24 @@
* @throws ConstraintViolationException
*/
private void checkIsMultiple(NodeTypeData registeredNodeType, PropertyDefinitionData recipientDefinitionData,
- PropertyDefinitionData[] allRecipientDefinition) throws RepositoryException, ConstraintViolationException
+ PropertyDefinitionData[] allRecipientDefinition, List<NodeData> nodesData) throws RepositoryException,
+ ConstraintViolationException
{
- Set<String> nodes2;
+ List<NodeData> checkIsMultipleNodes;
if (Constants.JCR_ANY_NAME.equals(recipientDefinitionData.getName()))
{
- nodes2 = nodeTypeDataManager.getNodes(registeredNodeType.getName());
+ checkIsMultipleNodes = nodesData;
}
else
{
- nodes2 =
- nodeTypeDataManager.getNodes(registeredNodeType.getName(), new InternalQName[]{recipientDefinitionData
- .getName()}, new InternalQName[]{});
+ checkIsMultipleNodes =
+ getNodes(nodesData, new InternalQName[]{recipientDefinitionData.getName()}, new InternalQName[]{});
}
- for (String uuid : nodes2)
+ for (NodeData nodeData : checkIsMultipleNodes)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
if (Constants.JCR_ANY_NAME.equals(recipientDefinitionData.getName()))
{
- List<PropertyData> propertyDatas = persister.getChildPropertiesData(nodeData);
+ List<PropertyData> propertyDatas = dataConsumer.getChildPropertiesData(nodeData);
for (PropertyData propertyData : propertyDatas)
{
// skip mixin and primary type
@@ -151,7 +159,7 @@
else
{
PropertyData propertyData =
- (PropertyData)persister.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
+ (PropertyData)dataConsumer.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
if (propertyData.getValues().size() > 1)
{
throw new ConstraintViolationException("Can't change property definition "
@@ -169,23 +177,22 @@
* @param recipientDefinitionData
* @throws RepositoryException
*/
- private void checkMandatory(NodeTypeData registeredNodeType, Set<String> nodes,
+ private void checkMandatory(NodeTypeData registeredNodeType, List<NodeData> nodesData,
PropertyDefinitionData recipientDefinitionData) throws RepositoryException
{
if (Constants.JCR_ANY_NAME.equals(recipientDefinitionData.getName()) && recipientDefinitionData.isMandatory())
throw new ConstraintViolationException("Invalid property definition " + recipientDefinitionData.getName()
+ ". Residual definition can't be mandatory");
- Set<String> nodes2 =
- nodeTypeDataManager.getNodes(registeredNodeType.getName(), new InternalQName[]{},
- new InternalQName[]{recipientDefinitionData.getName()});
- if (nodes2.size() > 0)
+ List<NodeData> mandatoryNodes =
+ getNodes(nodesData, new InternalQName[]{}, new InternalQName[]{recipientDefinitionData.getName()});
+ if (mandatoryNodes.size() > 0)
{
String message =
"Can not change " + recipientDefinitionData.getName().getAsString()
+ " property definition from mandatory=false to mandatory = true , because " + " the following nodes ";
- for (String uuids : nodes)
+ for (NodeData nodeData : mandatoryNodes)
{
- message += uuids + " ";
+ message += nodeData.getQPath().getAsString() + " ";
}
message += " doesn't have these properties ";
@@ -199,24 +206,23 @@
* @param recipientDefinitionData
* @throws RepositoryException
*/
- private void checkProtected(NodeTypeData registeredNodeType, Set<String> nodes,
+ private void checkProtected(NodeTypeData registeredNodeType, List<NodeData> nodesData,
PropertyDefinitionData recipientDefinitionData) throws RepositoryException
{
if (Constants.JCR_ANY_NAME.equals(recipientDefinitionData.getName()) && recipientDefinitionData.isMandatory())
throw new ConstraintViolationException("Invalid property definition " + recipientDefinitionData.getName()
+ ". Residual definition can't be protected");
- Set<String> nodes2 =
- nodeTypeDataManager.getNodes(registeredNodeType.getName(), new InternalQName[]{},
- new InternalQName[]{recipientDefinitionData.getName()});
- if (nodes2.size() > 0)
+ List<NodeData> protectedNodes =
+ getNodes(nodesData, new InternalQName[]{}, new InternalQName[]{recipientDefinitionData.getName()});
+ if (protectedNodes.size() > 0)
{
String message =
"Can not change " + recipientDefinitionData.getName().getAsString()
+ " property definition from Protected=false to Protected = true , because " + " the following nodes ";
- for (String uuids : nodes)
+ for (NodeData nodeData : protectedNodes)
{
- message += uuids + " ";
+ message += nodeData.getQPath().getAsString() + " ";
}
message += " doesn't have these properties ";
@@ -231,31 +237,30 @@
* @throws RepositoryException
*/
private void checkRequiredType(NodeTypeData registeredNodeType, PropertyDefinitionData recipientDefinitionData,
- PropertyDefinitionData[] allRecipientDefinition) throws RepositoryException
+ PropertyDefinitionData[] allRecipientDefinition, List<NodeData> nodesData) throws RepositoryException
{
- Set<String> nodes2;
+ List<NodeData> requiredTypeNodes;
if (Constants.JCR_ANY_NAME.equals(recipientDefinitionData.getName()))
{
- nodes2 = nodeTypeDataManager.getNodes(registeredNodeType.getName());
+ requiredTypeNodes = nodesData;
}
else
{
- nodes2 =
- nodeTypeDataManager.getNodes(registeredNodeType.getName(), new InternalQName[]{recipientDefinitionData
- .getName()}, new InternalQName[]{});
+ requiredTypeNodes =
+ getNodes(nodesData, new InternalQName[]{recipientDefinitionData.getName()}, new InternalQName[]{});
}
- for (String uuid : nodes2)
+ for (NodeData nodeData : requiredTypeNodes)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
if (Constants.JCR_ANY_NAME.equals(recipientDefinitionData.getName()))
{
- List<PropertyData> propertyDatas = persister.getChildPropertiesData(nodeData);
+ List<PropertyData> propertyDatas = dataConsumer.getChildPropertiesData(nodeData);
for (PropertyData propertyData : propertyDatas)
{
// skip mixin and primary type
if (isResidualMatch(propertyData.getQPath().getName(), allRecipientDefinition))
{
- if (propertyData.getType() != recipientDefinitionData.getRequiredType())
+ if (recipientDefinitionData.getRequiredType() != PropertyType.UNDEFINED
+ && propertyData.getType() != recipientDefinitionData.getRequiredType())
{
throw new ConstraintViolationException("Can not change requiredType to "
+ ExtendedPropertyType.nameFromValue(recipientDefinitionData.getRequiredType()) + " in "
@@ -271,8 +276,9 @@
else
{
PropertyData propertyData =
- (PropertyData)persister.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
- if (propertyData.getType() != recipientDefinitionData.getRequiredType())
+ (PropertyData)dataConsumer.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
+ if (recipientDefinitionData.getRequiredType() != PropertyType.UNDEFINED
+ && propertyData.getType() != recipientDefinitionData.getRequiredType())
{
throw new ConstraintViolationException("Can not change requiredType to "
+ ExtendedPropertyType.nameFromValue(recipientDefinitionData.getRequiredType()) + " in "
@@ -293,25 +299,25 @@
* @throws ConstraintViolationException
*/
private void checkValueConstraints(NodeTypeData registeredNodeType, PropertyDefinitionData recipientDefinitionData,
- PropertyDefinitionData[] allRecipientDefinition) throws RepositoryException, ConstraintViolationException
+ PropertyDefinitionData[] allRecipientDefinition, List<NodeData> nodesData) throws RepositoryException,
+ ConstraintViolationException
{
- Set<String> nodes2;
+ List<NodeData> checkValueConstraintsNodes;
if (Constants.JCR_ANY_NAME.equals(recipientDefinitionData.getName()))
{
- nodes2 = nodeTypeDataManager.getNodes(registeredNodeType.getName());
+ checkValueConstraintsNodes = nodesData;
}
else
{
- nodes2 =
- nodeTypeDataManager.getNodes(registeredNodeType.getName(), new InternalQName[]{recipientDefinitionData
- .getName()}, new InternalQName[]{});
+ checkValueConstraintsNodes =
+ getNodes(nodesData, new InternalQName[]{recipientDefinitionData.getName()}, new InternalQName[]{});
}
- for (String uuid : nodes2)
+ for (NodeData nodeData : checkValueConstraintsNodes)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
+
if (Constants.JCR_ANY_NAME.equals(recipientDefinitionData.getName()))
{
- List<PropertyData> propertyDatas = persister.getChildPropertiesData(nodeData);
+ List<PropertyData> propertyDatas = dataConsumer.getChildPropertiesData(nodeData);
for (PropertyData propertyData : propertyDatas)
{
// skip mixin and primary type
@@ -324,7 +330,7 @@
else
{
PropertyData propertyData =
- (PropertyData)persister.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
+ (PropertyData)dataConsumer.getItemData(nodeData, new QPathEntry(recipientDefinitionData.getName(), 0));
checkValueConstraints(recipientDefinitionData, propertyData);
}
}
@@ -335,7 +341,7 @@
{
ValueConstraintsMatcher constraints =
- new ValueConstraintsMatcher(def.getValueConstraints(), locationFactory, persister, nodeTypeDataManager);
+ new ValueConstraintsMatcher(def.getValueConstraints(), locationFactory, dataConsumer, nodeTypeDataManager);
for (ValueData value : propertyData.getValues())
{
@@ -371,12 +377,11 @@
* @param registeredNodeType
* @throws RepositoryException
*/
- private void doAdd(List<PropertyDefinitionData> toAddList, PlainChangesLog changesLog, Set<String> nodes,
+ private void doAdd(List<PropertyDefinitionData> toAddList, PlainChangesLog changesLog, List<NodeData> nodesData,
NodeTypeData registeredNodeType) throws RepositoryException
{
- for (String uuid : nodes)
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
// added properties
for (PropertyDefinitionData newPropertyDefinitionData : toAddList)
@@ -384,12 +389,13 @@
if (!newPropertyDefinitionData.getName().equals(Constants.JCR_ANY_NAME)
&& newPropertyDefinitionData.isAutoCreated())
{
- ItemData pdata = persister.getItemData(nodeData, new QPathEntry(newPropertyDefinitionData.getName(), 0));
+ ItemData pdata =
+ dataConsumer.getItemData(nodeData, new QPathEntry(newPropertyDefinitionData.getName(), 0));
if (pdata == null || (pdata != null && pdata.isNode()))
{
PlainChangesLog autoCreatedChanges =
- nodeTypeDataManager.makeAutoCreatedProperties(nodeData, registeredNodeType.getName(),
- new PropertyDefinitionData[]{newPropertyDefinitionData}, persister, nodeData.getACL()
+ itemAutocreator.makeAutoCreatedProperties(nodeData, registeredNodeType.getName(),
+ new PropertyDefinitionData[]{newPropertyDefinitionData}, dataConsumer, nodeData.getACL()
.getOwner());
if (autoCreatedChanges.getSize() == 0)
{
@@ -405,6 +411,58 @@
}
/**
+ * @param nodes
+ * @param includeProperties
+ * @param excludeProperties
+ * @return All nodes from list nodes, what include properties from
+ * includeProperties, and doesn't include properties from
+ * excludeProperties.
+ * @throws RepositoryException
+ */
+ private List<NodeData> getNodes(List<NodeData> nodes, InternalQName[] includeProperties,
+ InternalQName[] excludeProperties) throws RepositoryException
+ {
+ List<NodeData> result = new ArrayList<NodeData>();
+
+ for (NodeData nodeData : nodes)
+ {
+ // search all properties
+ List<PropertyData> childProperties = dataConsumer.listChildPropertiesData(nodeData);
+ boolean toAdd = includeProperties.length == 0;
+ // check included
+ for (int i = 0; i < includeProperties.length; i++)
+ {
+ for (PropertyData propertyData : childProperties)
+ {
+ if (propertyData.getQPath().getName().equals(includeProperties[i]))
+ {
+ toAdd = true;
+ break;
+ }
+ }
+ }
+ if (toAdd)
+ {
+ // check excluded
+ for (int i = 0; i < excludeProperties.length; i++)
+ {
+ for (PropertyData propertyData : childProperties)
+ {
+ if (propertyData.getQPath().getName().equals(excludeProperties[i]))
+ {
+ toAdd = false;
+ break;
+ }
+ }
+ }
+ if (toAdd)
+ result.add(nodeData);
+ }
+ }
+ return result;
+ }
+
+ /**
* @param registeredNodeType
* @param newDefinitionData
* @param removedDefinitionData
@@ -412,7 +470,7 @@
* @throws RepositoryException
*/
private void validateAdded(NodeTypeData registeredNodeType, List<PropertyDefinitionData> newDefinitionData,
- PropertyDefinitionData[] allRecipientDefinition) throws RepositoryException
+ PropertyDefinitionData[] allRecipientDefinition, List<NodeData> nodesData) throws RepositoryException
{
if (newDefinitionData.size() > 0)
{
@@ -421,11 +479,11 @@
if (propertyDefinitionData.getName().equals(Constants.JCR_ANY_NAME))
{
// Required type change
- checkRequiredType(registeredNodeType, propertyDefinitionData, allRecipientDefinition);
+ checkRequiredType(registeredNodeType, propertyDefinitionData, allRecipientDefinition, nodesData);
// ValueConstraints
- checkValueConstraints(registeredNodeType, propertyDefinitionData, allRecipientDefinition);
+ checkValueConstraints(registeredNodeType, propertyDefinitionData, allRecipientDefinition, nodesData);
// multiple change
- checkIsMultiple(registeredNodeType, propertyDefinitionData, allRecipientDefinition);
+ checkIsMultiple(registeredNodeType, propertyDefinitionData, allRecipientDefinition, nodesData);
}
}
}
@@ -439,7 +497,7 @@
* @throws RepositoryException
*/
private void validateChanged(NodeTypeData registeredNodeType,
- List<RelatedDefinition<PropertyDefinitionData>> changedDefinitionData, Set<String> nodes,
+ List<RelatedDefinition<PropertyDefinitionData>> changedDefinitionData, List<NodeData> nodesData,
PropertyDefinitionData[] allRecipientDefinition) throws RepositoryException
{
for (RelatedDefinition<PropertyDefinitionData> relatedDefinitions : changedDefinitionData)
@@ -449,30 +507,31 @@
// change from mandatory=false to mandatory = true
if (!ancestorDefinitionData.isMandatory() && recipientDefinitionData.isMandatory())
{
- checkMandatory(registeredNodeType, nodes, recipientDefinitionData);
+ checkMandatory(registeredNodeType, nodesData, recipientDefinitionData);
}
+ // No need to check protected
// change from Protected=false to Protected = true
- if (!ancestorDefinitionData.isProtected() && recipientDefinitionData.isProtected())
- {
- checkProtected(registeredNodeType, nodes, recipientDefinitionData);
- }
+ // if (!ancestorDefinitionData.isProtected() &&
+ // recipientDefinitionData.isProtected()) {
+ // checkProtected(registeredNodeType, nodesData, recipientDefinitionData);
+ // }
// Required type change
if (ancestorDefinitionData.getRequiredType() != recipientDefinitionData.getRequiredType()
&& recipientDefinitionData.getRequiredType() != PropertyType.UNDEFINED)
{
- checkRequiredType(registeredNodeType, recipientDefinitionData, allRecipientDefinition);
+ checkRequiredType(registeredNodeType, recipientDefinitionData, allRecipientDefinition, nodesData);
}
// ValueConstraints
if (!Arrays.deepEquals(ancestorDefinitionData.getValueConstraints(), recipientDefinitionData
.getValueConstraints()))
{
- checkValueConstraints(registeredNodeType, recipientDefinitionData, allRecipientDefinition);
+ checkValueConstraints(registeredNodeType, recipientDefinitionData, allRecipientDefinition, nodesData);
}
// multiple change
if (ancestorDefinitionData.isMultiple() && !recipientDefinitionData.isMultiple())
{
- checkIsMultiple(registeredNodeType, recipientDefinitionData, allRecipientDefinition);
+ checkIsMultiple(registeredNodeType, recipientDefinitionData, allRecipientDefinition, nodesData);
}
}
@@ -485,18 +544,16 @@
* @throws RepositoryException
*/
private void validateRemoved(NodeTypeData registeredNodeType, List<PropertyDefinitionData> removedDefinitionData,
- PropertyDefinitionData[] recipientDefinition) throws RepositoryException
+ PropertyDefinitionData[] recipientDefinition, List<NodeData> nodesData) throws RepositoryException
{
for (PropertyDefinitionData removePropertyDefinitionData : removedDefinitionData)
{
- Set<String> nodes;
if (removePropertyDefinitionData.getName().equals(Constants.JCR_ANY_NAME))
{
- nodes = nodeTypeDataManager.getNodes(registeredNodeType.getName());
- for (String uuid : nodes)
+
+ for (NodeData nodeData : nodesData)
{
- NodeData nodeData = (NodeData)persister.getItemData(uuid);
- List<PropertyData> childs = persister.getChildPropertiesData(nodeData);
+ List<PropertyData> childs = dataConsumer.getChildPropertiesData(nodeData);
// more then mixin and primary type
// TODO it could be possible, check add definitions
for (PropertyData propertyData : childs)
@@ -514,17 +571,16 @@
else if (!isResidualMatch(removePropertyDefinitionData.getName(), recipientDefinition))
{
// TODO more complex exception
- nodes =
- nodeTypeDataManager.getNodes(registeredNodeType.getName(),
- new InternalQName[]{removePropertyDefinitionData.getName()}, new InternalQName[]{});
+ List<NodeData> nodes =
+ getNodes(nodesData, new InternalQName[]{removePropertyDefinitionData.getName()}, new InternalQName[]{});
if (nodes.size() > 0)
{
String message =
"Can not remove " + removePropertyDefinitionData.getName().getAsString()
+ " PropertyDefinitionData, because the following nodes have these properties: ";
- for (String uuids : nodes)
+ for (NodeData nodeData : nodes)
{
- message += uuids + " ";
+ message += nodeData.getQPath().getAsString() + " ";
}
throw new ConstraintViolationException(message);
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/UpdateNodeTypeObserver.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/UpdateNodeTypeObserver.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/UpdateNodeTypeObserver.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS. Helps to add changes in content in
+ * repository in case of node type update.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public interface UpdateNodeTypeObserver
+{
+ /**
+ * Call after update.
+ *
+ * @param updatetNodetype
+ * @param context
+ */
+ void afterUpdate(NodeTypeData updatetNodetype, Object context) throws RepositoryException;
+
+ /**
+ * Call before update.
+ *
+ * @param updatetNodetype
+ * @param context
+ * @throws RepositoryException
+ */
+ void beforeUpdate(NodeTypeData updatetNodetype, Object context) throws RepositoryException;
+
+ /**
+ * Should the registration of node type be skipped.
+ * For example if ExtendedNodeTypeManager.IGNORE_IF_EXISTS flag is set.
+ *
+ * @param updatetNodetype
+ * @param context
+ * @throws RepositoryException
+ * @throws RepositoryException
+ */
+ boolean shouldSkip(NodeTypeData updatetNodetype, Object context) throws RepositoryException;
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/UpdateNodeTypeObserver.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/XmlNodeTypeDataPersister.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/XmlNodeTypeDataPersister.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/XmlNodeTypeDataPersister.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.nodetype.registration;
+
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeValuesList;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.jibx.runtime.BindingDirectory;
+import org.jibx.runtime.IBindingFactory;
+import org.jibx.runtime.IUnmarshallingContext;
+import org.jibx.runtime.JiBXException;
+
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class XmlNodeTypeDataPersister implements NodeTypeDataPersister
+{
+ /**
+ * Class logger.
+ */
+ private final Log log = ExoLogger.getLogger(XmlNodeTypeDataPersister.class);
+
+ private final NodeTypeConverter converter;
+
+ private final InputStream is;
+
+ private final OutputStream os;
+
+ public XmlNodeTypeDataPersister(NodeTypeConverter converter, InputStream is)
+ {
+ super();
+ this.converter = converter;
+ this.is = is;
+ this.os = null;
+ }
+
+ /**
+ * @param converter
+ * @param is
+ * @param os
+ */
+ public XmlNodeTypeDataPersister(NodeTypeConverter converter, InputStream is, OutputStream os)
+ {
+ super();
+ this.converter = converter;
+ this.is = is;
+ this.os = os;
+ }
+
+ public XmlNodeTypeDataPersister(NodeTypeConverter converter, OutputStream os)
+ {
+ super();
+ this.converter = converter;
+ this.os = os;
+ this.is = null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addNodeType(NodeTypeData nodeType) throws RepositoryException
+ {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public boolean hasNodeType(InternalQName nodeTypeName) throws RepositoryException
+ {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ public boolean isStorageFilled()
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void addNodeTypes(List<NodeTypeData> nodeTypes) throws RepositoryException
+ {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public void removeNodeType(NodeTypeData nodeType) throws RepositoryException
+ {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ public void start()
+ {
+ }
+
+ public void stop()
+ {
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public List<NodeTypeData> getAllNodeTypes() throws RepositoryException
+ {
+ try
+ {
+ IBindingFactory factory = BindingDirectory.getFactory(NodeTypeValuesList.class);
+ IUnmarshallingContext uctx = factory.createUnmarshallingContext();
+ NodeTypeValuesList nodeTypeValuesList = (NodeTypeValuesList)uctx.unmarshalDocument(is, null);
+ List ntvList = nodeTypeValuesList.getNodeTypeValuesList();
+ return converter.convertFromValueToData(ntvList);
+ }
+ catch (JiBXException e)
+ {
+ throw new RepositoryException(e);
+ }
+ }
+
+ public void update(List<NodeTypeData> nodeTypes, UpdateNodeTypeObserver observer) throws RepositoryException
+ {
+ throw new UnsupportedRepositoryOperationException();
+ }
+
+ /**
+ * @see org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeTypeDataPersister#getNodeType(org.exoplatform.services.jcr.datamodel.InternalQName)
+ */
+ public NodeTypeData getNodeType(InternalQName nodeTypeName) throws RepositoryException
+ {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/registration/XmlNodeTypeDataPersister.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/observation/ActionLauncher.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -219,7 +219,7 @@
for (int i = 0; i < criteria.getNodeTypeName().length; i++)
{
InternalQName name = locationFactory.parseJCRName(criteria.getNodeTypeName()[i]).getInternalName();
- NodeTypeData criteriaNT = ntManager.findNodeType(name);
+ NodeTypeData criteriaNT = ntManager.getNodeType(name);
InternalQName[] testQNames;
if (criteriaNT.isMixin())
{
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/PropertyTypeRegistry.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/PropertyTypeRegistry.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/PropertyTypeRegistry.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -95,7 +95,7 @@
public void nodeTypeRegistered(InternalQName ntName)
{
- NodeTypeData def = registry.findNodeType(ntName);
+ NodeTypeData def = registry.getNodeType(ntName);
if (def != null)
{
PropertyDefinitionData[] propDefs = def.getDeclaredPropertyDefinitions();
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -45,6 +45,7 @@
import org.exoplatform.services.jcr.impl.core.NodeImpl;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
+import org.exoplatform.services.jcr.impl.core.nodetype.ItemAutocreator;
import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
@@ -254,9 +255,13 @@
(NodeImpl)session.getTransientNodesManager().update(ItemState.createAddedState(queryData), false);
NodeTypeDataManager ntmanager = session.getWorkspace().getNodeTypesHolder();
+
+ ItemAutocreator itemAutocreator = new ItemAutocreator(ntmanager, session.getValueFactory(),session.getTransientNodesManager());
+
PlainChangesLog changes =
- ntmanager.makeAutoCreatedItems((NodeData)queryNode.getData(), Constants.NT_QUERY, session
+ itemAutocreator.makeAutoCreatedItems((NodeData)queryNode.getData(), Constants.NT_QUERY, session
.getTransientNodesManager(), session.getUserID());
+
for (ItemState autoCreatedState : changes.getAllStates())
{
session.getTransientNodesManager().update(autoCreatedState, false);
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -630,7 +630,10 @@
// name of the property
query.add(new WildcardQuery(new Term(FieldNames.PROPERTIES_SET,
prefix + ":*")), Occur.SHOULD);
+
+
+
result = getNodes(query);
// value of the property
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AggregateRuleImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AggregateRuleImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/AggregateRuleImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -374,7 +374,7 @@
{
// check name
InternalQName name = nodeState.getQPath().getName();
- if (elements[e].getName().equals(name))
+ if (elements[e].equals(name))
{
nodeState = parent;
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocOrderScoreNodeIterator.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocOrderScoreNodeIterator.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/DocOrderScoreNodeIterator.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -104,8 +104,17 @@
initOrderedIterator();
orderedNodes.skip(skipNum);
}
+ /**
+ * {@inheritDoc}
+ */
+ public void skipBack(long skipNum)
+ {
+ initOrderedIterator();
+ orderedNodes.skipBack(skipNum);
+
+ }
- /**
+ /**
* Returns the number of nodes in this iterator.
* </p>
* Note: The number returned by this method may differ from the number
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIteratorImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIteratorImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeIteratorImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -32,172 +32,204 @@
* Implements a {@link javax.jcr.NodeIterator} returned by
* {@link javax.jcr.query.QueryResult#getNodes()}.
*/
-class NodeIteratorImpl implements NodeIterator {
+class NodeIteratorImpl implements TwoWayRangeIterator, NodeIterator
+{
- /** Logger instance for this class */
- private static final Logger log = LoggerFactory.getLogger(NodeIteratorImpl.class);
+ /** Logger instance for this class */
+ private static final Logger log = LoggerFactory.getLogger(NodeIteratorImpl.class);
- /** The node ids of the nodes in the result set with their score value */
- protected final ScoreNodeIterator scoreNodes;
+ /** The node ids of the nodes in the result set with their score value */
+ protected final ScoreNodeIterator scoreNodes;
- /** The index for the default selector withing {@link #scoreNodes} */
- private final int selectorIndex;
+ /** The index for the default selector withing {@link #scoreNodes} */
+ private final int selectorIndex;
- /** ItemManager to turn UUIDs into Node instances */
- protected final SessionDataManager itemMgr;
+ /** ItemManager to turn UUIDs into Node instances */
+ protected final SessionDataManager itemMgr;
- /** Number of invalid nodes */
- protected int invalid = 0;
+ /** Number of invalid nodes */
+ protected int invalid = 0;
- /** Reference to the next node instance */
- private NodeImpl next;
+ /** Reference to the next node instance */
+ private NodeImpl next;
- /**
- * Whether this iterator had been initialized.
- */
- private boolean initialized;
+ /**
+ * Whether this iterator had been initialized.
+ */
+ private boolean initialized;
- /**
- * Creates a new <code>NodeIteratorImpl</code> instance.
- *
- * @param itemMgr the <code>ItemManager</code> to turn UUIDs into
- * <code>Node</code> instances.
- * @param scoreNodes iterator over score nodes.
- * @param selectorIndex the index for the default selector within
- * <code>scoreNodes</code>.
- */
- NodeIteratorImpl(SessionDataManager itemMgr,
- ScoreNodeIterator scoreNodes,
- int selectorIndex) {
- this.itemMgr = itemMgr;
- this.scoreNodes = scoreNodes;
- this.selectorIndex = selectorIndex;
- }
+ /**
+ * Creates a new <code>NodeIteratorImpl</code> instance.
+ *
+ * @param itemMgr the <code>ItemManager</code> to turn UUIDs into
+ * <code>Node</code> instances.
+ * @param scoreNodes iterator over score nodes.
+ * @param selectorIndex the index for the default selector within
+ * <code>scoreNodes</code>.
+ */
+ NodeIteratorImpl(SessionDataManager itemMgr, ScoreNodeIterator scoreNodes, int selectorIndex)
+ {
+ this.itemMgr = itemMgr;
+ this.scoreNodes = scoreNodes;
+ this.selectorIndex = selectorIndex;
+ }
- /**
- * Returns the next <code>Node</code> in the result set.
- * @return the next <code>Node</code> in the result set.
- * @throws NoSuchElementException if iteration has no more
- * <code>Node</code>s.
- */
- public Node nextNode() throws NoSuchElementException {
- initialize();
- if (next == null) {
- throw new NoSuchElementException();
- }
- NodeImpl n = next;
- fetchNext();
- return n;
- }
+ /**
+ * Returns the current position in this <code>NodeIterator</code>.
+ * @return the current position in this <code>NodeIterator</code>.
+ */
+ public long getPosition()
+ {
+ initialize();
+ long position = scoreNodes.getPosition() - invalid;
+ // scoreNode.getPosition() is one ahead
+ // if there is a prefetched node
+ if (next != null)
+ {
+ position--;
+ }
+ return position;
+ }
- /**
- * Returns the next <code>Node</code> in the result set.
- * @return the next <code>Node</code> in the result set.
- * @throws NoSuchElementException if iteration has no more
- * <code>Node</code>s.
- */
- public Object next() throws NoSuchElementException {
- initialize();
- return nextNode();
- }
+ /**
+ * Returns the number of nodes in this iterator.
+ * </p>
+ * Note: The number returned by this method may differ from the number
+ * of nodes actually returned by calls to hasNext() / getNextNode()! This
+ * is because this iterator works on a lazy instantiation basis and while
+ * iterating over the nodes some of them might have been deleted in the
+ * meantime. Those will not be returned by getNextNode(). As soon as an
+ * invalid node is detected, the size of this iterator is adjusted.
+ *
+ * @return the number of node in this iterator.
+ */
+ public long getSize()
+ {
+ long size = scoreNodes.getSize();
+ if (size == -1)
+ {
+ return size;
+ }
+ else
+ {
+ return size - invalid;
+ }
+ }
- /**
- * Skip a number of <code>Node</code>s in this iterator.
- * @param skipNum the non-negative number of <code>Node</code>s to skip
- * @throws NoSuchElementException
- * if skipped past the last <code>Node</code> in this iterator.
- */
- public void skip(long skipNum) throws NoSuchElementException {
- initialize();
- if (skipNum > 0) {
- scoreNodes.skip(skipNum - 1);
- fetchNext();
- }
- }
+ /**
+ * Returns <code>true</code> if there is another <code>Node</code>
+ * available; <code>false</code> otherwise.
+ * @return <code>true</code> if there is another <code>Node</code>
+ * available; <code>false</code> otherwise.
+ */
+ public boolean hasNext()
+ {
+ initialize();
+ return next != null;
+ }
- /**
- * Returns the number of nodes in this iterator.
- * </p>
- * Note: The number returned by this method may differ from the number
- * of nodes actually returned by calls to hasNext() / getNextNode()! This
- * is because this iterator works on a lazy instantiation basis and while
- * iterating over the nodes some of them might have been deleted in the
- * meantime. Those will not be returned by getNextNode(). As soon as an
- * invalid node is detected, the size of this iterator is adjusted.
- *
- * @return the number of node in this iterator.
- */
- public long getSize() {
- long size = scoreNodes.getSize();
- if (size == -1) {
- return size;
- } else {
- return size - invalid;
- }
- }
+ /**
+ * Returns the next <code>Node</code> in the result set.
+ * @return the next <code>Node</code> in the result set.
+ * @throws NoSuchElementException if iteration has no more
+ * <code>Node</code>s.
+ */
+ public Object next() throws NoSuchElementException
+ {
+ initialize();
+ return nextNode();
+ }
- /**
- * Returns the current position in this <code>NodeIterator</code>.
- * @return the current position in this <code>NodeIterator</code>.
- */
- public long getPosition() {
- initialize();
- long position = scoreNodes.getPosition() - invalid;
- // scoreNode.getPosition() is one ahead
- // if there is a prefetched node
- if (next != null) {
- position--;
- }
- return position;
- }
+ /**
+ * Returns the next <code>Node</code> in the result set.
+ * @return the next <code>Node</code> in the result set.
+ * @throws NoSuchElementException if iteration has no more
+ * <code>Node</code>s.
+ */
+ public Node nextNode() throws NoSuchElementException
+ {
+ initialize();
+ if (next == null)
+ {
+ throw new NoSuchElementException();
+ }
+ NodeImpl n = next;
+ fetchNext();
+ return n;
+ }
- /**
- * Returns <code>true</code> if there is another <code>Node</code>
- * available; <code>false</code> otherwise.
- * @return <code>true</code> if there is another <code>Node</code>
- * available; <code>false</code> otherwise.
- */
- public boolean hasNext() {
- initialize();
- return next != null;
- }
+ /**
+ * @throws UnsupportedOperationException always.
+ */
+ public void remove()
+ {
+ throw new UnsupportedOperationException("remove");
+ }
- /**
- * @throws UnsupportedOperationException always.
- */
- public void remove() {
- throw new UnsupportedOperationException("remove");
- }
+ /**
+ * Skip a number of <code>Node</code>s in this iterator.
+ * @param skipNum the non-negative number of <code>Node</code>s to skip
+ * @throws NoSuchElementException
+ * if skipped past the last <code>Node</code> in this iterator.
+ */
+ public void skip(long skipNum) throws NoSuchElementException
+ {
+ initialize();
+ if (skipNum > 0)
+ {
+ scoreNodes.skip(skipNum - 1);
+ fetchNext();
+ }
+ }
- /**
- * Clears {@link #next} and tries to fetch the next Node instance.
- * When this method returns {@link #next} refers to the next available
- * node instance in this iterator. If {@link #next} is null when this
- * method returns, then there are no more valid element in this iterator.
- */
- protected void fetchNext() {
- // reset
- next = null;
- while (next == null && scoreNodes.hasNext()) {
- ScoreNode[] sn = scoreNodes.nextScoreNodes();
- try {
- next = (NodeImpl) itemMgr.getItemByIdentifier(sn[selectorIndex].getNodeId(),true);
- if(next == null){
- invalid++;
- }
- } catch (RepositoryException e) {
- log.warn("Exception retrieving Node with UUID: "
- + sn[selectorIndex].getNodeId() + ": " + e.toString());
- // try next
- invalid++;
+ public void skipBack(long skipNum)
+ {
+ initialize();
+ if (skipNum < 0)
+ {
+ throw new IllegalArgumentException("skipNum must not be negative");
+ }
+ scoreNodes.skipBack(skipNum - 1);
+ fetchNext();
+
+ }
+
+ /**
+ * Clears {@link #next} and tries to fetch the next Node instance.
+ * When this method returns {@link #next} refers to the next available
+ * node instance in this iterator. If {@link #next} is null when this
+ * method returns, then there are no more valid element in this iterator.
+ */
+ protected void fetchNext()
+ {
+ // reset
+ next = null;
+ while (next == null && scoreNodes.hasNext())
+ {
+ ScoreNode[] sn = scoreNodes.nextScoreNodes();
+ try
+ {
+ next = (NodeImpl)itemMgr.getItemByIdentifier(sn[selectorIndex].getNodeId(), true);
+ if (next == null)
+ {
+ invalid++;
}
- }
- }
+ }
+ catch (RepositoryException e)
+ {
+ log.warn("Exception retrieving Node with UUID: " + sn[selectorIndex].getNodeId() + ": " + e.toString());
+ // try next
+ invalid++;
+ }
+ }
+ }
- protected void initialize() {
- if (!initialized) {
- fetchNext();
- initialized = true;
- }
- }
+ protected void initialize()
+ {
+ if (!initialized)
+ {
+ fetchNext();
+ initialized = true;
+ }
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -66,7 +66,7 @@
protected boolean isMixin(final InternalQName nodeTypeName)
throws RepositoryException {
final NodeTypeData nodeType = this.nodeTypeDataManager
- .findNodeType(nodeTypeName);
+ .getNodeType(nodeTypeName);
if (nodeType == null) {
throw new NoSuchNodeTypeException("Node type "
+ nodeTypeName.getAsString() + " not found");
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -178,7 +178,7 @@
ntName[0] = Constants.NT_BASE;
}
NodeTypeData nt = session.getWorkspace().getNodeTypesHolder()
- .findNodeType(ntName[0]);
+ .getNodeType(ntName[0]);
PropertyDefinitionData[] propDefs = nt
.getDeclaredPropertyDefinitions();
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryResultImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryResultImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryResultImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -505,6 +505,32 @@
}
}
}
+ /**
+ *
+ * @see org.exoplatform.services.jcr.impl.core.query.lucene.TwoWayRangeIterator#skipBack(long)
+ */
+ public void skipBack(long skipNum)
+ {
+ initialize();
+ if (skipNum < 0)
+ {
+ throw new IllegalArgumentException("skipNum must not be negative");
+ }
+ if ((position - skipNum) < 0)
+ {
+ throw new NoSuchElementException();
+ }
+ if (skipNum == 0)
+ {
+ // do nothing
+ }
+ else
+ {
+ position -= skipNum + 1;
+ fetchNext();
+ }
+
+ }
/**
* {@inheritDoc}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIterator.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIterator.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIterator.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -16,19 +16,19 @@
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
-import javax.jcr.RangeIterator;
/**
* A range iterator over {@link ScoreNode}[].
*/
-public interface ScoreNodeIterator extends RangeIterator {
+public interface ScoreNodeIterator extends TwoWayRangeIterator
+{
- /**
- * Returns the next score nodes.
- *
- * @return the next score nodes.
- * @throws java.util.NoSuchElementException
- * if there are no next score nodes.
- */
- ScoreNode[] nextScoreNodes();
+ /**
+ * Returns the next score nodes.
+ *
+ * @return the next score nodes.
+ * @throws java.util.NoSuchElementException
+ * if there are no next score nodes.
+ */
+ ScoreNode[] nextScoreNodes();
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIteratorImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIteratorImpl.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/ScoreNodeIteratorImpl.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -17,20 +17,21 @@
package org.exoplatform.services.jcr.impl.core.query.lucene;
import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
-import org.exoplatform.services.jcr.impl.util.EntityCollection;
+import javax.jcr.RangeIterator;
/**
* <code>ScoreNodeIteratorImpl</code> implements a {@link ScoreNodeIterator}
* over an array of {@link ScoreNode ScoreNode[]}.
*/
-public class ScoreNodeIteratorImpl extends EntityCollection implements ScoreNodeIterator
-{
+public class ScoreNodeIteratorImpl implements ScoreNodeIterator{
-
public ScoreNodeIteratorImpl(ScoreNode[][] scoreNodes)
{
- super(Arrays.asList(scoreNodes));
+ this(Arrays.asList(scoreNodes));
}
/**
@@ -40,4 +41,185 @@
{
return (ScoreNode[])next();
}
+
+ /**
+ * Static instance of an empty {@link RangeIterator}.
+ */
+ //public static final RangeIterator EMPTY = new RangeIteratorAdapter(Collections.EMPTY_LIST);
+
+ /**
+ * The adapted iterator instance.
+ */
+ private final Iterator iterator;
+
+ /**
+ * Number of elements in the adapted iterator, or -1 if unknown.
+ */
+ private long size;
+
+ /**
+ * Current position of the iterator.
+ */
+ private long position;
+
+ /**
+ * Creates an adapter for the given iterator of the given size.
+ *
+ * @param iterator adapted iterator
+ * @param size size of the iterator, or -1 if unknown
+ */
+ public ScoreNodeIteratorImpl(Iterator iterator, long size)
+ {
+ this.iterator = iterator;
+ this.size = size;
+ this.position = 0;
+ }
+
+ /**
+ * Creates an adapter for the given iterator of unknown size.
+ *
+ * @param iterator adapted iterator
+ */
+ public ScoreNodeIteratorImpl(Iterator iterator)
+ {
+ this(iterator, -1);
+ }
+
+ /**
+ * Creates a {@link RangeIterator} for the given collection.
+ *
+ * @param collection the collection to iterate
+ */
+ public ScoreNodeIteratorImpl(Collection collection)
+ {
+ this(collection.iterator(), collection.size());
+ }
+
+ //-------------------------------------------------------< RangeIterator >
+
+ /**
+ * Returns the current position of the iterator.
+ *
+ * @return iterator position
+ */
+ public long getPosition()
+ {
+ return position;
+ }
+
+ /**
+ * Returns the size of the iterator.
+ *
+ * @return iterator size, or -1 if unknown
+ */
+ public long getSize()
+ {
+ return size;
+ }
+
+ /**
+ * Skips the given number of elements.
+ *
+ * @param n number of elements to skip
+ * @throws IllegalArgumentException if n is negative
+ * @throws NoSuchElementException if skipped past the last element
+ */
+ public void skip(long n) throws IllegalArgumentException, NoSuchElementException
+ {
+ if (n < 0)
+ {
+ throw new IllegalArgumentException("skip(" + n + ")");
+ }
+ for (long i = 0; i < n; i++)
+ {
+ next();
+ }
+ }
+
+ //------------------------------------------------------------< Iterator >
+
+ /**
+ * Checks if this iterator has more elements. If there are no more
+ * elements and the size of the iterator is unknown, then the size is
+ * set to the current position.
+ *
+ * @return <code>true</code> if this iterator has more elements,
+ * <code>false</code> otherwise
+ */
+ public boolean hasNext()
+ {
+ if (iterator.hasNext())
+ {
+ return true;
+ }
+ else
+ {
+ if (size == -1)
+ {
+ size = position;
+ }
+ return false;
+ }
+ }
+
+ /**
+ * Returns the next element in this iterator and advances the iterator
+ * position. If there are no more elements and the size of the iterator
+ * is unknown, then the size is set to the current position.
+ *
+ * @return next element
+ * @throws NoSuchElementException if there are no more elements
+ */
+ public Object next() throws NoSuchElementException
+ {
+ try
+ {
+ Object next = iterator.next();
+ position++;
+ return next;
+ }
+ catch (NoSuchElementException e)
+ {
+ if (size == -1)
+ {
+ size = position;
+ }
+ throw e;
+ }
+ }
+
+ /**
+ * Removes the previously retrieved element. Decreases the current
+ * position and size of this iterator.
+ *
+ * @throws UnsupportedOperationException if removes are not permitted
+ * @throws IllegalStateException if there is no previous element to remove
+ */
+ public void remove() throws UnsupportedOperationException, IllegalStateException
+ {
+ iterator.remove();
+ position--;
+ if (size != -1)
+ {
+ size--;
+ }
+ }
+
+ public void skipBack(long skipNum)
+ {
+ if (skipNum < 0)
+ {
+ throw new IllegalArgumentException("skipNum must not be negative");
+ }
+ if ((position - skipNum) < 0)
+ {
+ throw new NoSuchElementException();
+ }
+ if (skipNum > 0)
+ {
+ position -= skipNum + 1;
+ next();
+ }
+
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/misc/Pattern.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/misc/Pattern.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/misc/Pattern.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -457,7 +457,7 @@
}
protected boolean matches(QPathEntry element) {
- return name.equals(element.getName());
+ return name.equals(element);
}
public String toString() {
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/FrozenNodeInitializer.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -132,7 +132,7 @@
NodeData parent = (NodeData)dataManager.getItemData(property.getParentIdentifier());
PropertyDefinitionData pdef =
- ntManager.findPropertyDefinitions(qname, parent.getPrimaryTypeName(), parent.getMixinTypeNames())
+ ntManager.getPropertyDefinitions(qname, parent.getPrimaryTypeName(), parent.getMixinTypeNames())
.getAnyDefinition();
int action = pdef.getOnParentVersion();
@@ -227,7 +227,7 @@
NodeData parent = (NodeData)dataManager.getItemData(node.getParentIdentifier());
NodeDefinitionData ndef =
- ntManager.findChildNodeDefinition(qname, parent.getPrimaryTypeName(), parent.getMixinTypeNames());
+ ntManager.getChildNodeDefinition(qname, parent.getPrimaryTypeName(), parent.getMixinTypeNames());
if (ndef == null)
{
throw new ConstraintViolationException("Definition not found for " + qname.getAsString());
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataCopyIgnoredVisitor.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataCopyIgnoredVisitor.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataCopyIgnoredVisitor.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -71,7 +71,7 @@
NodeData existedParent = (NodeData)dataManager.getItemData(property.getParentIdentifier());
PropertyDefinitionData pdef =
- ntManager.findPropertyDefinitions(property.getQPath().getName(), existedParent.getPrimaryTypeName(),
+ ntManager.getPropertyDefinitions(property.getQPath().getName(), existedParent.getPrimaryTypeName(),
existedParent.getMixinTypeNames()).getAnyDefinition();
if (pdef.getOnParentVersion() == OnParentVersionAction.IGNORE)
@@ -118,7 +118,7 @@
{
NodeData existedParent = (NodeData)dataManager.getItemData(node.getParentIdentifier());
NodeDefinitionData ndef =
- ntManager.findChildNodeDefinition(node.getQPath().getName(), existedParent.getPrimaryTypeName(),
+ ntManager.getChildNodeDefinition(node.getQPath().getName(), existedParent.getPrimaryTypeName(),
existedParent.getMixinTypeNames());
// the node can be stored as IGNOREd in restore set, check an action
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/version/ItemDataRestoreVisitor.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -486,7 +486,7 @@
// current C in the workspace will be left unchanged.
int action =
- nodeTypeDataManager.findChildNodeDefinition(qname, currentNode().getPrimaryTypeName(),
+ nodeTypeDataManager.getChildNodeDefinition(qname, currentNode().getPrimaryTypeName(),
currentNode().getMixinTypeNames()).getOnParentVersion();
if (log.isDebugEnabled())
@@ -635,7 +635,7 @@
}
int action =
- nodeTypeDataManager.findPropertyDefinitions(qname, currentNode().getPrimaryTypeName(),
+ nodeTypeDataManager.getPropertyDefinitions(qname, currentNode().getPrimaryTypeName(),
currentNode().getMixinTypeNames()).getAnyDefinition().getOnParentVersion();
if (log.isDebugEnabled())
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/BaseXmlImporter.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -223,7 +223,7 @@
int newIndex = 1;
NodeDefinitionData nodedef =
- nodeTypeDataManager.findChildNodeDefinition(name, parentData.getPrimaryTypeName(), parentData
+ nodeTypeDataManager.getChildNodeDefinition(name, parentData.getPrimaryTypeName(), parentData
.getMixinTypeNames());
ItemData sameNameNode = null;
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/DocumentViewImporter.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -525,16 +525,16 @@
NodeData parent = getParent();
NodeDefinitionData nodeNt =
- nodeTypeDataManager.findChildNodeDefinition(nodeName, parent.getPrimaryTypeName(), parent
+ nodeTypeDataManager.getChildNodeDefinition(nodeName, parent.getPrimaryTypeName(), parent
.getMixinTypeNames());
NodeTypeData nodeType;
if (nodeNt.getName().equals(Constants.JCR_ANY_NAME) && nodeNt.getDefaultPrimaryType() != null)
{
- nodeType = nodeTypeDataManager.findNodeType(nodeNt.getDefaultPrimaryType());
+ nodeType = nodeTypeDataManager.getNodeType(nodeNt.getDefaultPrimaryType());
}
else
{
- nodeType = nodeTypeDataManager.findNodeType(nodeNt.getName());
+ nodeType = nodeTypeDataManager.getNodeType(nodeNt.getName());
}
if (nodeType == null)
@@ -563,7 +563,7 @@
{
String primaryNodeType = StringConverter.denormalizeString(attValue);
InternalQName ntName = locationFactory.parseJCRName(primaryNodeType).getInternalName();
- NodeTypeData nodeType = nodeTypeDataManager.findNodeType(ntName);
+ NodeTypeData nodeType = nodeTypeDataManager.getNodeType(ntName);
if (nodeType == null)
throw new ConstraintViolationException("Can not find node type " + primaryNodeType);
nodeTypes.add(nodeType);
@@ -577,7 +577,7 @@
amTypes[mi] = StringConverter.denormalizeString(amTypes[mi]);
InternalQName name = locationFactory.parseJCRName(amTypes[mi]).getInternalName();
mixinNodeTypes.add(name);
- NodeTypeData nodeType = nodeTypeDataManager.findNodeType(name);
+ NodeTypeData nodeType = nodeTypeDataManager.getNodeType(name);
if (nodeType == null)
throw new ConstraintViolationException("Can not find node type " + amTypes[mi]);
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java 2009-10-02 15:41:14 UTC (rev 198)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/xml/importing/SystemViewImporter.java 2009-10-04 09:34:54 UTC (rev 199)
@@ -262,7 +262,7 @@
String value = propertyInfo.getValues().get(i).toString();
mixinNames[i] = locationFactory.parseJCRName(value).getInternalName();
- currentNodeInfo.addNodeType((nodeTypeDataManager.findNodeType(mixinNames[i])));
+ currentNodeInfo.addNodeType((nodeTypeDataManager.getNodeType(mixinNames[i])));
values.add(new TransientValueData(value.toString()));
}
@@ -325,7 +325,7 @@
}
}
//
- nodeData.addNodeType((nodeTypeDataManager.findNodeType(primaryTypeName)));
+ nodeData.addNodeType((nodeTypeDataManager.getNodeType(primaryTypeName)));
nodeData.setPrimaryTypeName(primaryTypeName);
propertyData =
@@ -385,7 +385,7 @@
boolean isMultivalue = true;
PropertyDefinitionDatas defs =
- nodeTypeDataManager.findPropertyDefinitions(propertyInfo.getName(), currentNodeInfo.getPrimaryTypeName(),
+ nodeTypeDataManager.getPropertyDefinitions(propertyInfo.getName(), currentNodeInfo.getPrimaryTypeName(),
currentNodeInfo.getMixinTypeNames());
if (defs == null)
14 years, 7 months
exo-jcr SVN: r198 - in jcr/trunk/component/core: src/main/java/org/exoplatform/services/jcr/config and 6 other directories.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-02 11:41:14 -0400 (Fri, 02 Oct 2009)
New Revision: 198
Added:
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexException.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/RepositoryIndexSearcherHolder.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneVirtualTableResolver.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VirtualTableResolver.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.1.dtd
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.2.dtd
Modified:
jcr/trunk/component/core/pom.xml
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/config/QueryHandlerEntryWrapper.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceRegistryImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/VolatileNodeTypeDataManager.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/ErrorLog.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandlerContext.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchIndexConfigurationHelper.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexingConfigurationEntityResolver.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexingConfigurationImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneQueryBuilder.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryImpl.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.0.dtd
Log:
EXOJCR-161 : indexer configuration update
Modified: jcr/trunk/component/core/pom.xml
===================================================================
--- jcr/trunk/component/core/pom.xml 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/pom.xml 2009-10-02 15:41:14 UTC (rev 198)
@@ -112,6 +112,12 @@
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
+ <exclusions>
+ <exclusion>
+ <groupId>xerces</groupId>
+ <artifactId>xercesImpl</artifactId>
+ </exclusion>
+ </exclusions>
</dependency>
<!-- JOTM comes from exo.kernel.component.common -->
@@ -129,7 +135,8 @@
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
- </dependency -->
+ </dependency
+-->
<dependency>
<groupId>javax.resource</groupId>
@@ -205,7 +212,8 @@
<artifactId>mysql-connector-java</artifactId>
<version>5.0.5</version>
<scope>test</scope>
- </dependency -->
+ </dependency
+-->
<!-- For PostgresSQL support -->
<!-- dependency>
@@ -213,7 +221,8 @@
<artifactId>postgresql</artifactId>
<version>8.2-504.jdbc3</version>
<scope>compile</scope>
- </dependency -->
+ </dependency
+-->
<!-- For Oracle 10g support (local-jcr repository) -->
<!-- dependency>
@@ -227,7 +236,8 @@
<artifactId>orai18n</artifactId>
<version>14</version>
<scope>compile</scope>
- </dependency -->
+ </dependency
+-->
<!-- For IBM DB2 support (local-jcr repository) -->
<!-- dependency>
@@ -241,7 +251,8 @@
<artifactId>db2jcc_license_cu</artifactId>
<version>9.1</version>
<scope>compile</scope>
- </dependency -->
+ </dependency
+-->
<!-- For MS SQL 7/2000/2005 and Sybase ASE/Anywhere support (jTDS driver) -->
<!-- dependency>
@@ -249,7 +260,8 @@
<artifactId>jtds</artifactId>
<version>1.2</version>
<scope>compile</scope>
- </dependency -->
+ </dependency
+-->
<!-- For MS SQL 2005 support (Microsoft JDBC driver) (local-jcr repository) -->
<!-- dependency>
@@ -257,7 +269,8 @@
<artifactId>sqljdbc</artifactId>
<version>9.0</version>
<scope>compile</scope>
- </dependency -->
+ </dependency
+-->
<!-- For Sybase ASE/Anywhere support (jConnect driver) (local-jcr repository) -->
<!-- dependency>
@@ -265,7 +278,8 @@
<artifactId>jconn3</artifactId>
<version>6.05</version>
<scope>compile</scope>
- </dependency -->
+ </dependency
+-->
<!-- For Apache Derby support (aka JavaDB) -->
<!-- dependency>
@@ -273,7 +287,8 @@
<artifactId>derby</artifactId>
<version>10.2.2.0</version>
<scope>compile</scope>
- </dependency -->
+ </dependency
+-->
<!-- Ingres Database (local repository) -->
<!-- dependency>
@@ -281,7 +296,8 @@
<artifactId>iijdbc</artifactId>
<version>9.2</version>
<scope>test</scope>
- </dependency -->
+ </dependency
+-->
<!-- H2 Database -->
<!--dependency>
@@ -289,7 +305,8 @@
<artifactId>h2</artifactId>
<version>1.0.74</version>
<scope>compile</scope>
- </dependency -->
+ </dependency
+-->
<!-- ======================================================================= -->
</dependencies>
@@ -428,8 +445,14 @@
<exclude>**/TestAggregateRules.java</exclude>
<exclude>**/IndexingAggregateTest.java</exclude>
<exclude>**/IndexingRuleTest.java</exclude>
+ <exclude>**/TestExcelFileSearch.java</exclude>
+ <exclude>**/TestRewriteNode.java</exclude>
+ <exclude>**/TestArabicSearch.java</exclude>
+ <exclude>**/TestDateSearch.java</exclude>
+ <exclude>**/TestBinarySearch.java</exclude>
+
<exclude>**/TestImport.java</exclude>
<exclude>**/TestRollbackBigFiles.java</exclude>
<exclude>**/TestErrorMultithreading.java</exclude>
@@ -486,7 +509,8 @@
<include>org/exoplatform/services/jcr/integration/PrepareTestRepository.java</include>
</includes>
</configuration>
- </execution -->
+ </execution
+-->
<execution>
<id>execution4 - pause 10 sec</id>
<phase>test</phase>
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/config/QueryHandlerEntryWrapper.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/config/QueryHandlerEntryWrapper.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/config/QueryHandlerEntryWrapper.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -22,7 +22,6 @@
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.services.jcr.datamodel.IllegalNameException;
import org.exoplatform.services.jcr.impl.Constants;
-import org.exoplatform.services.jcr.impl.core.query.ErrorLog;
import org.exoplatform.services.jcr.impl.core.query.QueryHandler;
import org.exoplatform.services.jcr.impl.core.query.QueryHandlerContext;
import org.exoplatform.services.jcr.impl.core.query.QueryImpl;
@@ -58,641 +57,624 @@
* @version $Id: QueryHandlerEntry.java 14931 2008-05-29 15:02:08Z ksm $
*/
-public class QueryHandlerEntryWrapper implements QueryHandlerParams
-{
+public class QueryHandlerEntryWrapper implements QueryHandlerParams {
- /**
- * The default value for property {@link #extractorBackLog}.
- */
- public static final int DEFAULT_EXTRACTOR_BACKLOG = 100;
+ /**
+ * The default value for property {@link #extractorBackLog}.
+ */
+ public static final int DEFAULT_EXTRACTOR_BACKLOG = 100;
- /**
- * The default value for property {@link #extractorPoolSize}.
- */
- public static final int DEFAULT_EXTRACTOR_POOLSIZE = 0;
+ /**
+ * The default value for property {@link #extractorPoolSize}.
+ */
+ public static final int DEFAULT_EXTRACTOR_POOLSIZE = 0;
- /**
- * The default timeout in milliseconds which is granted to the text extraction process until
- * fulltext indexing is deferred to a background thread.
- */
- public static final int DEFAULT_EXTRACTOR_TIMEOUT = 100;
+ /**
+ * The default timeout in milliseconds which is granted to the text
+ * extraction process until fulltext indexing is deferred to a background
+ * thread.
+ */
+ public static final int DEFAULT_EXTRACTOR_TIMEOUT = 100;
- /**
- * the default value for property {@link #maxFieldLength}.
- */
- public static final int DEFAULT_MAX_FIELD_LENGTH = 10000;
+ /**
+ * the default value for property {@link #maxFieldLength}.
+ */
+ public static final int DEFAULT_MAX_FIELD_LENGTH = 10000;
- /**
- * The default value for property {@link #maxMergeDocs}.
- */
- public static final int DEFAULT_MAX_MERGE_DOCS = Integer.MAX_VALUE;
+ /**
+ * The default value for property {@link #maxMergeDocs}.
+ */
+ public static final int DEFAULT_MAX_MERGE_DOCS = Integer.MAX_VALUE;
- /**
- * the default value for property {@link #mergeFactor}.
- */
- public static final int DEFAULT_MERGE_FACTOR = 10;
+ /**
+ * the default value for property {@link #mergeFactor}.
+ */
+ public static final int DEFAULT_MERGE_FACTOR = 10;
- /**
- * The default value for property {@link #minMergeDocs}.
- */
- public static final int DEFAULT_MIN_MERGE_DOCS = 100;
+ /**
+ * The default value for property {@link #minMergeDocs}.
+ */
+ public static final int DEFAULT_MIN_MERGE_DOCS = 100;
- /**
- * Name of the file to persist search internal namespace mappings.
- */
- public static final String NS_MAPPING_FILE = "ns_mappings.properties"; // TODO
+ /**
+ * Name of the file to persist search internal namespace mappings.
+ */
+ public static final String NS_MAPPING_FILE = "ns_mappings.properties"; // TODO
- /**
- * The excerpt provider class. Implements {@link ExcerptProvider}.
- */
- private static final String DEDAULT_EXCERPTPROVIDER_CLASS = DefaultHTMLExcerpt.class.getName();
+ /**
+ * The excerpt provider class. Implements {@link ExcerptProvider}.
+ */
+ private static final String DEDAULT_EXCERPTPROVIDER_CLASS = DefaultHTMLExcerpt.class
+ .getName();
- private static final String DEDAULT_INDEXINGCONFIGURATIONCLASS = IndexingConfigurationImpl.class.getName();
+ private static final String DEDAULT_INDEXINGCONFIGURATIONCLASS = IndexingConfigurationImpl.class
+ .getName();
- private static final boolean DEFAULT_AUTOREPAIR = true;
+ private static final boolean DEFAULT_AUTOREPAIR = true;
- private static final int DEFAULT_BUFFER_SIZE = 10;
+ private static final int DEFAULT_BUFFER_SIZE = 10;
- private static final int DEFAULT_CACHE_SIZE = 1000;
+ private static final int DEFAULT_CACHE_SIZE = 1000;
- private final static boolean DEFAULT_CONSISTENCYCHECKENABLED = false;
+ private final static boolean DEFAULT_CONSISTENCYCHECKENABLED = false;
- private final static boolean DEFAULT_DOCUMENTORDER = true;
+ private final static boolean DEFAULT_DOCUMENTORDER = true;
- private final static boolean DEFAULT_FORCECONSISTENCYCHECK = false;
+ private final static boolean DEFAULT_FORCECONSISTENCYCHECK = false;
- /**
- * Name of the default query implementation class.
- */
- private static final String DEFAULT_QUERY_HANDLER_CLASS = SearchIndex.class.getName();
+ /**
+ * Name of the default query implementation class.
+ */
+ private static final String DEFAULT_QUERY_HANDLER_CLASS = SearchIndex.class
+ .getName();
- /**
- * Name of the default query implementation class.
- */
- private static final String DEFAULT_QUERY_IMPL_CLASS = QueryImpl.class.getName();
+ /**
+ * Name of the default query implementation class.
+ */
+ private static final String DEFAULT_QUERY_IMPL_CLASS = QueryImpl.class
+ .getName();
- /**
- * The number of documents that are pre fetched when a query is executed. <p/> Default value is:
- * {@link Integer#MAX_VALUE}.
- */
- private final static int DEFAULT_RESULTFETCHSIZE = Integer.MAX_VALUE;
+ /**
+ * The number of documents that are pre fetched when a query is executed.
+ * <p/>
+ * Default value is: {@link Integer#MAX_VALUE}.
+ */
+ private final static int DEFAULT_RESULTFETCHSIZE = Integer.MAX_VALUE;
- private final static boolean DEFAULT_SUPPORTHIGHLIGHTING = false;
+ private final static boolean DEFAULT_SUPPORTHIGHLIGHTING = false;
- private final static boolean DEFAULT_USECOMPOUNDFILE = false;
+ private final static boolean DEFAULT_USECOMPOUNDFILE = false;
- private final static int DEFAULT_VOLATILEIDLETIME = 3;
+ private final static int DEFAULT_VOLATILEIDLETIME = 3;
- //since https://jira.jboss.org/jira/browse/EXOJCR-17
+ // since https://jira.jboss.org/jira/browse/EXOJCR-17
- public static final boolean DEFAULT_UPGRADE_INDEX = false;
+ public static final boolean DEFAULT_UPGRADE_INDEX = false;
- private QueryHandlerEntry queryHandlerEntry;
+ private QueryHandlerEntry queryHandlerEntry;
- public QueryHandlerEntry getQueryHandlerEntry()
- {
- return queryHandlerEntry;
- }
+ public QueryHandlerEntry getQueryHandlerEntry() {
+ return queryHandlerEntry;
+ }
- private static void initDefaults(QueryHandlerEntry entry)
- {
- entry.putBooleanParameter(PARAM_AUTO_REPAIR, DEFAULT_AUTOREPAIR);
- entry.putIntegerParameter(PARAM_BUFFER_SIZE, DEFAULT_BUFFER_SIZE);
- entry.putIntegerParameter(PARAM_CACHE_SIZE, DEFAULT_CACHE_SIZE);
- entry.putBooleanParameter(PARAM_DOCUMENT_ORDER, DEFAULT_DOCUMENTORDER);
- entry.putParameterValue(PARAM_EXCERPTPROVIDER_CLASS, DEDAULT_EXCERPTPROVIDER_CLASS);
- entry.putParameterValue(PARAM_EXCLUDED_NODE_IDENTIFERS, null);
- entry.putIntegerParameter(PARAM_EXTRACTOR_BACKLOG, DEFAULT_EXTRACTOR_BACKLOG);
- entry.putIntegerParameter(PARAM_EXTRACTOR_POOLSIZE, DEFAULT_EXTRACTOR_POOLSIZE);
- entry.putIntegerParameter(PARAM_EXTRACTOR_TIMEOUT, DEFAULT_EXTRACTOR_TIMEOUT);
- }
+ private static void initDefaults(QueryHandlerEntry entry) {
+ entry.putBooleanParameter(PARAM_AUTO_REPAIR, DEFAULT_AUTOREPAIR);
+ entry.putIntegerParameter(PARAM_BUFFER_SIZE, DEFAULT_BUFFER_SIZE);
+ entry.putIntegerParameter(PARAM_CACHE_SIZE, DEFAULT_CACHE_SIZE);
+ entry.putBooleanParameter(PARAM_DOCUMENT_ORDER, DEFAULT_DOCUMENTORDER);
+ entry.putParameterValue(PARAM_EXCERPTPROVIDER_CLASS,
+ DEDAULT_EXCERPTPROVIDER_CLASS);
+ entry.putParameterValue(PARAM_EXCLUDED_NODE_IDENTIFERS, null);
+ entry.putIntegerParameter(PARAM_EXTRACTOR_BACKLOG,
+ DEFAULT_EXTRACTOR_BACKLOG);
+ entry.putIntegerParameter(PARAM_EXTRACTOR_POOLSIZE,
+ DEFAULT_EXTRACTOR_POOLSIZE);
+ entry.putIntegerParameter(PARAM_EXTRACTOR_TIMEOUT,
+ DEFAULT_EXTRACTOR_TIMEOUT);
+ }
- public String getType()
- {
- return queryHandlerEntry.getType();
- }
+ public String getType() {
+ return queryHandlerEntry.getType();
+ }
- public static QueryHandlerEntry queryHandlerEntryFactory()
- {
- QueryHandlerEntry entry = new QueryHandlerEntry();
- initDefaults(entry);
- return entry;
- }
+ public static QueryHandlerEntry queryHandlerEntryFactory() {
+ QueryHandlerEntry entry = new QueryHandlerEntry();
+ initDefaults(entry);
+ return entry;
+ }
- /** The logger instance for this class */
- private static final Log log = ExoLogger.getLogger(QueryHandlerEntry.class);
+ /** The logger instance for this class */
+ private static final Log log = ExoLogger.getLogger(QueryHandlerEntry.class);
- //public QueryHandlerEntry queryHandler;
+ // public QueryHandlerEntry queryHandler;
- public Integer volatileIdleTime;
+ public Integer volatileIdleTime;
- /**
- * The analyzer we use for indexing.
- */
- private JcrStandartAnalyzer analyzer;
+ /**
+ * The analyzer we use for indexing.
+ */
+ private JcrStandartAnalyzer analyzer;
- private String queryHandlerClass = DEFAULT_QUERY_HANDLER_CLASS;
+ private String queryHandlerClass = DEFAULT_QUERY_HANDLER_CLASS;
- public QueryHandlerEntryWrapper(QueryHandlerEntry queryHandlerEntry)
- {
- this.queryHandlerEntry = queryHandlerEntry;
- this.analyzer = new JcrStandartAnalyzer();
- initDefaults(queryHandlerEntry);
- }
+ public QueryHandlerEntryWrapper(QueryHandlerEntry queryHandlerEntry) {
+ this.queryHandlerEntry = queryHandlerEntry;
+ this.analyzer = new JcrStandartAnalyzer();
+ initDefaults(queryHandlerEntry);
+ }
- public QueryHandlerEntryWrapper(String type, List params, QueryHandlerEntry queryHandlerEntry)
- {
- this.queryHandlerEntry = queryHandlerEntry;
- queryHandlerEntry.setType(type);
- queryHandlerEntry.setParameters(params);
- this.analyzer = new JcrStandartAnalyzer();
- initDefaults(queryHandlerEntry);
- }
+ public QueryHandlerEntryWrapper(String type, List params,
+ QueryHandlerEntry queryHandlerEntry) {
+ this.queryHandlerEntry = queryHandlerEntry;
+ queryHandlerEntry.setType(type);
+ queryHandlerEntry.setParameters(params);
+ this.analyzer = new JcrStandartAnalyzer();
+ initDefaults(queryHandlerEntry);
+ }
- /**
- * Creates an excerpt provider for the given <code>query</code>.
- *
- * @param query the query.
- * @return an excerpt provider for the given <code>query</code>.
- * @throws IOException if the provider cannot be created.
- */
- public ExcerptProvider createExcerptProvider(Query query) throws IOException
- {
- ExcerptProvider ep;
- try
- {
- Class excerptProviderClass = Class.forName(getExcerptProviderClass(), true, this.getClass().getClassLoader());
- ep = (ExcerptProvider)excerptProviderClass.newInstance();
- }
- catch (Exception e)
- {
- IOException ex = new IOException();
- ex.initCause(e);
- throw ex;
- }
+ /**
+ * Creates an excerpt provider for the given <code>query</code>.
+ *
+ * @param query
+ * the query.
+ * @return an excerpt provider for the given <code>query</code>.
+ * @throws IOException
+ * if the provider cannot be created.
+ */
+ public ExcerptProvider createExcerptProvider(Query query)
+ throws IOException {
+ ExcerptProvider ep;
+ try {
+ Class excerptProviderClass = Class.forName(
+ getExcerptProviderClass(), true, this.getClass()
+ .getClassLoader());
+ ep = (ExcerptProvider) excerptProviderClass.newInstance();
+ } catch (Exception e) {
+ IOException ex = new IOException();
+ ex.initCause(e);
+ throw ex;
+ }
- return ep;
- }
+ return ep;
+ }
- /**
- * @param namespaceMappings The namespace mappings
- * @return the fulltext indexing configuration or <code>null</code> if there is no configuration.
- */
- public IndexingConfiguration createIndexingConfiguration(NamespaceMappings namespaceMappings,
- QueryHandlerContext context, ConfigurationManager cfm) throws IOException, RepositoryConfigurationException
- {
- Element docElement = getIndexingConfigurationDOM(cfm);
- if (docElement == null)
- {
- return null;
- }
- IndexingConfiguration idxCfg = null;
- try
- {
- Class indexingConfigurationClass =
- Class.forName(getIndexingConfigurationClass(), true, this.getClass().getClassLoader());
- idxCfg = (IndexingConfiguration)indexingConfigurationClass.newInstance();
- idxCfg.init(docElement, context, namespaceMappings);
- }
- catch (InstantiationException e)
- {
- log.warn("Exception initializing indexing configuration from: " + getIndexingConfigurationPath(), e);
- }
- catch (IllegalAccessException e)
- {
- log.warn("Exception initializing indexing configuration from: " + getIndexingConfigurationPath(), e);
- }
- catch (RepositoryException e)
- {
- log.warn("Exception initializing indexing configuration from: " + getIndexingConfigurationPath(), e);
- }
- catch (IllegalNameException e)
- {
- log.warn("Exception initializing indexing configuration from: " + getIndexingConfigurationPath(), e);
- }
- catch (Exception e)
- {
- log.warn("Exception initializing indexing configuration from: " + getIndexingConfigurationPath(), e);
- }
- return idxCfg;
- }
+ /**
+ * @param namespaceMappings
+ * The namespace mappings
+ * @return the fulltext indexing configuration or <code>null</code> if there
+ * is no configuration.
+ */
+ public IndexingConfiguration createIndexingConfiguration(
+ NamespaceMappings namespaceMappings, QueryHandlerContext context,
+ ConfigurationManager cfm) throws IOException,
+ RepositoryConfigurationException {
+ Element docElement = getIndexingConfigurationDOM(cfm);
+ if (docElement == null) {
+ return null;
+ }
+ IndexingConfiguration idxCfg = null;
+ try {
+ Class indexingConfigurationClass = Class.forName(
+ getIndexingConfigurationClass(), true, this.getClass()
+ .getClassLoader());
+ idxCfg = (IndexingConfiguration) indexingConfigurationClass
+ .newInstance();
+ idxCfg.init(docElement, context, namespaceMappings);
+ } catch (InstantiationException e) {
+ log.warn("Exception initializing indexing configuration from: "
+ + getIndexingConfigurationPath(), e);
+ } catch (IllegalAccessException e) {
+ log.warn("Exception initializing indexing configuration from: "
+ + getIndexingConfigurationPath(), e);
+ } catch (RepositoryException e) {
+ log.warn("Exception initializing indexing configuration from: "
+ + getIndexingConfigurationPath(), e);
+ } catch (IllegalNameException e) {
+ log.warn("Exception initializing indexing configuration from: "
+ + getIndexingConfigurationPath(), e);
+ } catch (Exception e) {
+ log.warn("Exception initializing indexing configuration from: "
+ + getIndexingConfigurationPath(), e);
+ }
+ return idxCfg;
+ }
- /**
- * Creates a spell checker for this query handler.
- *
- * @return the spell checker or <code>null</code> if none is configured or an error occurs.
- */
- public SpellChecker createSpellChecker(QueryHandler handler)
- {
- SpellChecker spCheck = null;
- if (getSpellCheckerClass() != null)
- {
- try
- {
- Class spellCheckerClass = Class.forName(getSpellCheckerClass(), true, this.getClass().getClassLoader());
- spCheck = (SpellChecker)spellCheckerClass.newInstance();
- spCheck.init(handler);
- }
- catch (Exception e)
- {
- log.warn("Exception initializing spell checker: " + getSpellCheckerClass(), e);
- }
- }
- return spCheck;
- }
+ /**
+ * Creates a spell checker for this query handler.
+ *
+ * @return the spell checker or <code>null</code> if none is configured or
+ * an error occurs.
+ */
+ public SpellChecker createSpellChecker(QueryHandler handler) {
+ SpellChecker spCheck = null;
+ if (getSpellCheckerClass() != null) {
+ try {
+ Class spellCheckerClass = Class.forName(getSpellCheckerClass(),
+ true, this.getClass().getClassLoader());
+ spCheck = (SpellChecker) spellCheckerClass.newInstance();
+ spCheck.init(handler);
+ } catch (Exception e) {
+ log.warn("Exception initializing spell checker: "
+ + getSpellCheckerClass(), e);
+ }
+ }
+ return spCheck;
+ }
- /**
- * @param cfm
- * @return the configured synonym provider or <code>null</code> if none is configured or an error
- * occurs.
- */
- public SynonymProvider createSynonymProvider(ConfigurationManager cfm)
- {
- SynonymProvider sp = null;
- if (getSynonymProviderClass() != null)
- {
- try
- {
- Class synonymProviderClass =
- Class.forName(getSynonymProviderClass(), true, this.getClass().getClassLoader());
- sp = (SynonymProvider)synonymProviderClass.newInstance();
+ /**
+ * @param cfm
+ * @return the configured synonym provider or <code>null</code> if none is
+ * configured or an error occurs.
+ */
+ public SynonymProvider createSynonymProvider(ConfigurationManager cfm) {
+ SynonymProvider sp = null;
+ if (getSynonymProviderClass() != null) {
+ try {
+ Class synonymProviderClass = Class.forName(
+ getSynonymProviderClass(), true, this.getClass()
+ .getClassLoader());
+ sp = (SynonymProvider) synonymProviderClass.newInstance();
- sp.initialize(createSynonymProviderConfigResource(cfm));
- }
- catch (Exception e)
- {
- log.warn("Exception initializing synonym provider: " + getSynonymProviderClass(), e);
- sp = null;
- }
- }
- return sp;
- }
+ sp.initialize(createSynonymProviderConfigResource(cfm));
+ } catch (Exception e) {
+ log.warn("Exception initializing synonym provider: "
+ + getSynonymProviderClass(), e);
+ sp = null;
+ }
+ }
+ return sp;
+ }
- public JcrStandartAnalyzer getAnalyzer()
- {
- return analyzer;
- }
+ public JcrStandartAnalyzer getAnalyzer() {
+ return analyzer;
+ }
- private String getParameterString(String name)
- {
- return queryHandlerEntry.getParameterValue(name, null);
- }
+ private String getParameterString(String name) {
+ return queryHandlerEntry.getParameterValue(name, null);
+ }
- private Integer getParameterIntegerInitialized(String name)
- {
- String value = queryHandlerEntry.getParameterValue(name, null);
- return StringNumberParser.parseInt(value);
- }
+ private Integer getParameterIntegerInitialized(String name) {
+ String value = queryHandlerEntry.getParameterValue(name, null);
+ return StringNumberParser.parseInt(value);
+ }
- private Boolean getParameterBooleanInitialized(String name)
- {
- String value = queryHandlerEntry.getParameterValue(name, "false");
- return Boolean.parseBoolean(value);
- }
+ private Boolean getParameterBooleanInitialized(String name) {
+ String value = queryHandlerEntry.getParameterValue(name, "false");
+ return Boolean.parseBoolean(value);
+ }
- /**
- * If set <code>true</code> errors detected by the consistency check are repaired. If
- * <code>false</code> the errors are only reported in the log. <p/> Default value is:
- * <code>true</code>.
- * @throws RepositoryConfigurationException
- */
- public boolean getAutoRepair() throws RepositoryConfigurationException
- {
- return getParameterBooleanInitialized(PARAM_AUTO_REPAIR);
- }
+ /**
+ * If set <code>true</code> errors detected by the consistency check are
+ * repaired. If <code>false</code> the errors are only reported in the log.
+ * <p/>
+ * Default value is: <code>true</code>.
+ *
+ * @throws RepositoryConfigurationException
+ */
+ public boolean getAutoRepair() throws RepositoryConfigurationException {
+ return getParameterBooleanInitialized(PARAM_AUTO_REPAIR);
+ }
- /**
- * Number of documents that are buffered before they are added to the index.
- * @throws RepositoryConfigurationException
- */
- public int getBufferSize()
- {
- return getParameterIntegerInitialized(PARAM_BUFFER_SIZE);
- }
+ /**
+ * Number of documents that are buffered before they are added to the index.
+ *
+ * @throws RepositoryConfigurationException
+ */
+ public int getBufferSize() {
+ return getParameterIntegerInitialized(PARAM_BUFFER_SIZE);
+ }
- public int getCacheSize()
- {
- return getParameterIntegerInitialized(PARAM_CACHE_SIZE);
- }
+ public int getCacheSize() {
+ return getParameterIntegerInitialized(PARAM_CACHE_SIZE);
+ }
- /**
- * Flag indicating whether document order is enable as the default ordering.
- */
- public boolean getDocumentOrder()
- {
- return getParameterBooleanInitialized(PARAM_DOCUMENT_ORDER);
- }
+ /**
+ * Flag indicating whether document order is enable as the default ordering.
+ */
+ public boolean getDocumentOrder() {
+ return getParameterBooleanInitialized(PARAM_DOCUMENT_ORDER);
+ }
- /**
- * @return the class name of the excerpt provider implementation.
- */
- public String getExcerptProviderClass()
- {
- return getParameterString(PARAM_EXCERPTPROVIDER_CLASS);
- }
+ /**
+ * @return the class name of the excerpt provider implementation.
+ */
+ public String getExcerptProviderClass() {
+ return getParameterString(PARAM_EXCERPTPROVIDER_CLASS);
+ }
- public String getExcludedNodeIdentifers()
- {
- return getParameterString(PARAM_EXCLUDED_NODE_IDENTIFERS);
- }
+ public String getExcludedNodeIdentifers() {
+ return getParameterString(PARAM_EXCLUDED_NODE_IDENTIFERS);
+ }
- /**
- * @return the size of the extractor queue back log.
- */
- public int getExtractorBackLogSize()
- {
- return getParameterIntegerInitialized(PARAM_EXTRACTOR_BACKLOG);
- }
+ /**
+ * @return the size of the extractor queue back log.
+ */
+ public int getExtractorBackLogSize() {
+ return getParameterIntegerInitialized(PARAM_EXTRACTOR_BACKLOG);
+ }
- /**
- * @return the size of the thread pool which is used to run the text extractors when binary
- * content is indexed.
- */
- public int getExtractorPoolSize()
- {
- return getParameterIntegerInitialized(PARAM_EXTRACTOR_POOLSIZE);
- }
+ /**
+ * @return the size of the thread pool which is used to run the text
+ * extractors when binary content is indexed.
+ */
+ public int getExtractorPoolSize() {
+ return getParameterIntegerInitialized(PARAM_EXTRACTOR_POOLSIZE);
+ }
- /**
- * @return the extractor timeout in milliseconds.
- */
- public long getExtractorTimeout()
- {
- return getParameterIntegerInitialized(PARAM_EXTRACTOR_TIMEOUT);
- }
+ /**
+ * @return the extractor timeout in milliseconds.
+ */
+ public long getExtractorTimeout() {
+ return getParameterIntegerInitialized(PARAM_EXTRACTOR_TIMEOUT);
+ }
- /**
- * Returns the location of the search index. Returns <code>null</code> if not set.
- *
- * @return the location of the search index.
- * @throws RepositoryConfigurationException
- */
- public String getIndexDir() throws RepositoryConfigurationException
- {
+ /**
+ * Returns the location of the search index. Returns <code>null</code> if
+ * not set.
+ *
+ * @return the location of the search index.
+ * @throws RepositoryConfigurationException
+ */
+ public String getIndexDir() throws RepositoryConfigurationException {
- String indexDir;
- try
- {
- indexDir = queryHandlerEntry.getParameterValue(PARAM_INDEX_DIR);
- }
- catch (RepositoryConfigurationException e)
- {
- indexDir = queryHandlerEntry.getParameterValue(OLD_PARAM_INDEX_DIR);
- }
+ String indexDir;
+ try {
+ indexDir = queryHandlerEntry.getParameterValue(PARAM_INDEX_DIR);
+ } catch (RepositoryConfigurationException e) {
+ indexDir = queryHandlerEntry.getParameterValue(OLD_PARAM_INDEX_DIR);
+ }
- indexDir = indexDir.replace("${java.io.tmpdir}", System.getProperty("java.io.tmpdir"));
+ indexDir = indexDir.replace("${java.io.tmpdir}", System
+ .getProperty("java.io.tmpdir"));
- return indexDir;
- }
+ return indexDir;
+ }
- /**
- * @return the class name of the indexing configuration implementation.
- */
- public String getIndexingConfigurationClass()
- {
- return queryHandlerEntry
- .getParameterValue(PARAM_INDEXING_CONFIGURATION_CLASS, DEDAULT_INDEXINGCONFIGURATIONCLASS);
- }
+ /**
+ * @return the class name of the indexing configuration implementation.
+ */
+ public String getIndexingConfigurationClass() {
+ return queryHandlerEntry.getParameterValue(
+ PARAM_INDEXING_CONFIGURATION_CLASS,
+ DEDAULT_INDEXINGCONFIGURATIONCLASS);
+ }
- /**
- * @return the path to the indexing configuration file.
- */
- public String getIndexingConfigurationPath()
- {
- return queryHandlerEntry.getParameterValue(PARAM_INDEXING_CONFIGURATION_PATH, null);
- }
+ /**
+ * @return the path to the indexing configuration file.
+ */
+ public String getIndexingConfigurationPath() {
+ return queryHandlerEntry.getParameterValue(
+ PARAM_INDEXING_CONFIGURATION_PATH, null);
+ }
- public int getMaxFieldLength()
- {
- return queryHandlerEntry.getParameterInteger(PARAM_MAX_FIELD_LENGTH, DEFAULT_MAX_FIELD_LENGTH);
- }
+ public int getMaxFieldLength() {
+ return queryHandlerEntry.getParameterInteger(PARAM_MAX_FIELD_LENGTH,
+ DEFAULT_MAX_FIELD_LENGTH);
+ }
- /**
- * Returns the current value for maxMergeDocs.
- *
- * @return the current value for maxMergeDocs.
- */
- public int getMaxMergeDocs()
- {
- return queryHandlerEntry.getParameterInteger(PARAM_MAX_MERGE_DOCS, DEFAULT_MAX_MERGE_DOCS);
- }
+ /**
+ * Returns the current value for maxMergeDocs.
+ *
+ * @return the current value for maxMergeDocs.
+ */
+ public int getMaxMergeDocs() {
+ return queryHandlerEntry.getParameterInteger(PARAM_MAX_MERGE_DOCS,
+ DEFAULT_MAX_MERGE_DOCS);
+ }
- /**
- * Returns the current value for the merge factor.
- *
- * @return the current value for the merge factor.
- */
- public int getMergeFactor()
- {
- return queryHandlerEntry.getParameterInteger(PARAM_MERGE_FACTOR, DEFAULT_MERGE_FACTOR);
- }
+ /**
+ * Returns the current value for the merge factor.
+ *
+ * @return the current value for the merge factor.
+ */
+ public int getMergeFactor() {
+ return queryHandlerEntry.getParameterInteger(PARAM_MERGE_FACTOR,
+ DEFAULT_MERGE_FACTOR);
+ }
- /**
- * Returns the current value for minMergeDocs.
- *
- * @return the current value for minMergeDocs.
- */
- public int getMinMergeDocs()
- {
- return queryHandlerEntry.getParameterInteger(PARAM_MIN_MERGE_DOCS, DEFAULT_MIN_MERGE_DOCS);
- }
+ /**
+ * Returns the current value for minMergeDocs.
+ *
+ * @return the current value for minMergeDocs.
+ */
+ public int getMinMergeDocs() {
+ return queryHandlerEntry.getParameterInteger(PARAM_MIN_MERGE_DOCS,
+ DEFAULT_MIN_MERGE_DOCS);
+ }
- public String getQueryClass()
- {
- return queryHandlerEntry.getParameterValue(PARAM_QUERY_CLASS, DEFAULT_QUERY_IMPL_CLASS);
- }
+ public String getQueryClass() {
+ return queryHandlerEntry.getParameterValue(PARAM_QUERY_CLASS,
+ DEFAULT_QUERY_IMPL_CLASS);
+ }
- /**
- * @return the number of results the query handler will fetch initially when a query is executed.
- */
- public int getResultFetchSize()
- {
- return queryHandlerEntry.getParameterInteger(PARAM_RESULT_FETCH_SIZE, DEFAULT_RESULTFETCHSIZE);
- }
+ /**
+ * @return the number of results the query handler will fetch initially when
+ * a query is executed.
+ */
+ public int getResultFetchSize() {
+ return queryHandlerEntry.getParameterInteger(PARAM_RESULT_FETCH_SIZE,
+ DEFAULT_RESULTFETCHSIZE);
+ }
- public String getRootNodeIdentifer()
- {
- return queryHandlerEntry.getParameterValue(PARAM_ROOT_NODE_ID, Constants.ROOT_UUID);
- }
+ public String getRootNodeIdentifer() {
+ return queryHandlerEntry.getParameterValue(PARAM_ROOT_NODE_ID,
+ Constants.ROOT_UUID);
+ }
- /**
- * Get spell checker class.
- *
- * @return the class name of the spell checker implementation or <code>null</code> if none is set.
- */
- public String getSpellCheckerClass()
- {
- return queryHandlerEntry.getParameterValue(PARAM_SPELLCHECKER_CLASS, null);
- }
+ /**
+ * Get spell checker class.
+ *
+ * @return the class name of the spell checker implementation or
+ * <code>null</code> if none is set.
+ */
+ public String getSpellCheckerClass() {
+ return queryHandlerEntry.getParameterValue(PARAM_SPELLCHECKER_CLASS,
+ null);
+ }
- /**
- * Get support highlighting.
- *
- * @return <code>true</code> if highlighting support is enabled.
- */
- public boolean getSupportHighlighting()
- {
- return queryHandlerEntry.getParameterBoolean(PARAM_SUPPORT_HIGHLIGHTING, DEFAULT_SUPPORTHIGHLIGHTING);
- }
+ /**
+ * Get support highlighting.
+ *
+ * @return <code>true</code> if highlighting support is enabled.
+ */
+ public boolean getSupportHighlighting() {
+ return queryHandlerEntry.getParameterBoolean(
+ PARAM_SUPPORT_HIGHLIGHTING, DEFAULT_SUPPORTHIGHLIGHTING);
+ }
- /**
- * Get synonym provider class.
- *
- * @return the class name of the synonym provider implementation or <code>null</code> if none is
- * set.
- */
- public String getSynonymProviderClass()
- {
- return queryHandlerEntry.getParameterValue(PARAM_SYNONYMPROVIDER_CLASS, null);
- }
+ /**
+ * Get synonym provider class.
+ *
+ * @return the class name of the synonym provider implementation or
+ * <code>null</code> if none is set.
+ */
+ public String getSynonymProviderClass() {
+ return queryHandlerEntry.getParameterValue(PARAM_SYNONYMPROVIDER_CLASS,
+ null);
+ }
- /**
- * Get synonym provider configuration path.
- *
- * @return the configuration path for the synonym provider. If none is set this method returns
- * <code>null</code>.
- */
- public String getSynonymProviderConfigPath()
- {
- return queryHandlerEntry.getParameterValue(PARAM_SYNONYMPROVIDER_CONFIG_PATH, null);
- }
+ /**
+ * Get synonym provider configuration path.
+ *
+ * @return the configuration path for the synonym provider. If none is set
+ * this method returns <code>null</code>.
+ */
+ public String getSynonymProviderConfigPath() {
+ return queryHandlerEntry.getParameterValue(
+ PARAM_SYNONYMPROVIDER_CONFIG_PATH, null);
+ }
- /**
- * Returns the current value for useCompoundFile.
- *
- * @return the current value for useCompoundFile.
- */
- public boolean getUseCompoundFile()
- {
- return queryHandlerEntry.getParameterBoolean(PARAM_USE_COMPOUNDFILE, DEFAULT_USECOMPOUNDFILE);
- }
+ /**
+ * Returns the current value for useCompoundFile.
+ *
+ * @return the current value for useCompoundFile.
+ */
+ public boolean getUseCompoundFile() {
+ return queryHandlerEntry.getParameterBoolean(PARAM_USE_COMPOUNDFILE,
+ DEFAULT_USECOMPOUNDFILE);
+ }
- /**
- * Returns the current value for volatileIdleTime.
- *
- * @return the current value for volatileIdleTime.
- */
- public int getVolatileIdleTime()
- {
- if (volatileIdleTime == null)
- volatileIdleTime = queryHandlerEntry.getParameterInteger(PARAM_VOLATILE_IDLE_TIME, DEFAULT_VOLATILEIDLETIME);
+ /**
+ * Returns the current value for volatileIdleTime.
+ *
+ * @return the current value for volatileIdleTime.
+ */
+ public int getVolatileIdleTime() {
+ if (volatileIdleTime == null)
+ volatileIdleTime = queryHandlerEntry.getParameterInteger(
+ PARAM_VOLATILE_IDLE_TIME, DEFAULT_VOLATILEIDLETIME);
- return volatileIdleTime;
- }
+ return volatileIdleTime;
+ }
- /**
- * If set <code>true</code> the index is checked for consistency depending on the
- * {@link #forceConsistencyCheck} parameter. If set to <code>false</code>, no consistency check is
- * performed, even if the redo log had been applied on startup. <p/> Default value is:
- * <code>false</code>.
- *
- * @return boolean
- */
- public boolean isConsistencyCheckEnabled()
- {
- return queryHandlerEntry.getParameterBoolean(PARAM_CONSISTENCY_CHECK_ENABLED, DEFAULT_CONSISTENCYCHECKENABLED);
- }
+ /**
+ * If set <code>true</code> the index is checked for consistency depending
+ * on the {@link #forceConsistencyCheck} parameter. If set to
+ * <code>false</code>, no consistency check is performed, even if the redo
+ * log had been applied on startup.
+ * <p/>
+ * Default value is: <code>false</code>.
+ *
+ * @return boolean
+ */
+ public boolean isConsistencyCheckEnabled() {
+ return queryHandlerEntry.getParameterBoolean(
+ PARAM_CONSISTENCY_CHECK_ENABLED,
+ DEFAULT_CONSISTENCYCHECKENABLED);
+ }
- public boolean isForceConsistencyCheck()
- {
- return queryHandlerEntry.getParameterBoolean(PARAM_FORCE_CONSISTENCYCHECK, DEFAULT_FORCECONSISTENCYCHECK);
- }
+ public boolean isForceConsistencyCheck() {
+ return queryHandlerEntry.getParameterBoolean(
+ PARAM_FORCE_CONSISTENCYCHECK, DEFAULT_FORCECONSISTENCYCHECK);
+ }
- /**
- *
- * @return true if index upgrade allowed.
- */
- public boolean isUpgradeIndex()
- {
- Boolean updateIndex = queryHandlerEntry.getParameterBoolean(PARAM_UPGRADE_INDEX, null);
- if (updateIndex == null || !updateIndex)
- {
- updateIndex = Boolean.valueOf(System.getProperty(PARAM_UPGRADE_INDEX));
- }
- return updateIndex;
- }
+ /**
+ *
+ * @return true if index upgrade allowed.
+ */
+ public boolean isUpgradeIndex() {
+ Boolean updateIndex = queryHandlerEntry.getParameterBoolean(
+ PARAM_UPGRADE_INDEX, null);
+ if (updateIndex == null || !updateIndex) {
+ updateIndex = Boolean.valueOf(System
+ .getProperty(PARAM_UPGRADE_INDEX));
+ }
+ return updateIndex;
+ }
- /**
- * Creates a file system resource to the synonym provider configuration.
- *
- * @param cfm
- * @return a file system resource or <code>null</code> if no path was configured.
- * @throws Exception
- */
- protected InputStream createSynonymProviderConfigResource(ConfigurationManager cfm) throws Exception
- {
- if (getSynonymProviderConfigPath() != null)
- {
- return cfm.getInputStream(getSynonymProviderConfigPath());
- }
- return null;
- }
+ /**
+ * Creates a file system resource to the synonym provider configuration.
+ *
+ * @param cfm
+ * @return a file system resource or <code>null</code> if no path was
+ * configured.
+ * @throws Exception
+ */
+ protected InputStream createSynonymProviderConfigResource(
+ ConfigurationManager cfm) throws Exception {
+ if (getSynonymProviderConfigPath() != null) {
+ return cfm.getInputStream(getSynonymProviderConfigPath());
+ }
+ return null;
+ }
- /**
- * Returns the document element of the indexing configuration or <code>null</code> if there is no
- * indexing configuration.
- *
- * @return the indexing configuration or <code>null</code> if there is none.
- * @throws IOException
- * @throws RepositoryConfigurationException
- */
- protected Element getIndexingConfigurationDOM(ConfigurationManager cfm) throws IOException,
- RepositoryConfigurationException
- {
- String indexingConfigPath = getIndexingConfigurationPath();
- Element indexingConfiguration = null;
- if (indexingConfigPath != null)
- {
+ /**
+ * Returns the document element of the indexing configuration or
+ * <code>null</code> if there is no indexing configuration.
+ *
+ * @return the indexing configuration or <code>null</code> if there is none.
+ * @throws IOException
+ * @throws RepositoryConfigurationException
+ */
+ protected Element getIndexingConfigurationDOM(ConfigurationManager cfm)
+ throws IOException, RepositoryConfigurationException {
+ String indexingConfigPath = getIndexingConfigurationPath();
+ Element indexingConfiguration = null;
+ if (indexingConfigPath != null) {
- InputStream is;
- try
- {
- is = cfm.getInputStream(indexingConfigPath);
- }
- catch (Exception e1)
- {
- throw new IOException(e1.getLocalizedMessage());
- }
+ InputStream is;
+ try {
+ is = cfm.getInputStream(indexingConfigPath);
+ } catch (Exception e1) {
+ throw new IOException(e1.getLocalizedMessage());
+ }
- if (is == null)
- throw new IOException("Resource does not exist: " + indexingConfigPath);
+ if (is == null)
+ throw new IOException("Resource does not exist: "
+ + indexingConfigPath);
- DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- try
- {
- DocumentBuilder builder = factory.newDocumentBuilder();
- builder.setEntityResolver(new IndexingConfigurationEntityResolver());
- indexingConfiguration = builder.parse(is).getDocumentElement();
- }
- catch (ParserConfigurationException e)
- {
- throw new RepositoryConfigurationException(e.getLocalizedMessage(), e);
- }
- catch (SAXException e)
- {
- throw new RepositoryConfigurationException(e.getLocalizedMessage(), e);
- }
- }
+ DocumentBuilderFactory factory = DocumentBuilderFactory
+ .newInstance();
+ try {
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ builder
+ .setEntityResolver(new IndexingConfigurationEntityResolver());
+ indexingConfiguration = builder.parse(is).getDocumentElement();
+ } catch (ParserConfigurationException e) {
+ throw new RepositoryConfigurationException(e
+ .getLocalizedMessage(), e);
+ } catch (SAXException e) {
+ throw new RepositoryConfigurationException(e
+ .getLocalizedMessage(), e);
+ }
+ }
- return indexingConfiguration;
- }
+ return indexingConfiguration;
+ }
- /**
- * Return ErrorLog file size in Kb String representation.
- *
- * @return int size in Kb
- */
- public int getErrorLogSize()
- {
- String size = queryHandlerEntry.getParameterValue(PARAM_ERRORLOG_SIZE, null);
- if ((size == null) || (size.equals("")))
- {
- return ErrorLog.DEFAULT_FILE_SIZE;
- }
- else
- {
- return new Integer(size);
- }
- }
+ /**
+ * Return ErrorLog file size in Kb String representation.
+ *
+ * @return int size in Kb
+ */
+ public int getErrorLogSize() {
+ String size = queryHandlerEntry.getParameterValue(PARAM_ERRORLOG_SIZE,
+ null);
+ if ((size == null) || (size.equals(""))) {
+ return SearchIndex.DEFAULT_ERRORLOG_FILE_SIZE;
+ } else {
+ return new Integer(size);
+ }
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/core/nodetype/NodeTypeDataManager.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -23,7 +23,6 @@
import org.exoplatform.services.jcr.dataflow.PlainChangesLog;
import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.NodeData;
-import org.exoplatform.services.jcr.impl.core.query.QueryHandler;
import java.io.InputStream;
import java.util.List;
@@ -51,7 +50,7 @@
*/
public Set<InternalQName> getSupertypes(final InternalQName nodeTypeName);
- void addQueryHandler(QueryHandler queryHandler);
+ //void addQueryHandler(QueryHandler queryHandler);
/**
* @param nodeName
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -31,7 +31,6 @@
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
-import org.exoplatform.services.jcr.core.ManageableRepository;
import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
@@ -49,6 +48,7 @@
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
import org.exoplatform.services.jcr.impl.core.observation.ObservationManagerRegistry;
import org.exoplatform.services.jcr.impl.core.query.QueryManagerFactory;
+import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder;
import org.exoplatform.services.jcr.impl.core.query.SearchManager;
import org.exoplatform.services.jcr.impl.core.query.SystemSearchManager;
import org.exoplatform.services.jcr.impl.core.query.SystemSearchManagerHolder;
@@ -449,28 +449,28 @@
WorkspaceContainer workspaceContainer = getWorkspaceContainer(ws.getName());
SearchManager searchManager =
(SearchManager)workspaceContainer.getComponentInstanceOfType(SearchManager.class);
- if (searchManager != null)
- {
- typeManager.addQueryHandler(searchManager.getHandler());
- namespaceRegistry.addQueryHandler(searchManager.getHandler());
- }
- else
- {
- log.warn("Search manager not configured for " + ws.getName());
- }
+ // if (searchManager != null)
+ // {
+ // typeManager.addQueryHandler(searchManager.getHandler());
+ // namespaceRegistry.addQueryHandler(searchManager.getHandler());
+ // }
+ // else
+ // {
+ // log.warn("Search manager not configured for " + ws.getName());
+ // }
}
SystemSearchManagerHolder searchManager =
(SystemSearchManagerHolder)this.getComponentInstanceOfType(SystemSearchManagerHolder.class);
- if (searchManager != null)
- {
- typeManager.addQueryHandler(searchManager.get().getHandler());
- namespaceRegistry.addQueryHandler(searchManager.get().getHandler());
- }
- else
- {
- log.warn("System search manager not configured ");
- }
+ // if (searchManager != null)
+ // {
+ // typeManager.addQueryHandler(searchManager.get().getHandler());
+ // namespaceRegistry.addQueryHandler(searchManager.get().getHandler());
+ // }
+ // else
+ // {
+ // log.warn("System search manager not configured ");
+ // }
}
@@ -603,6 +603,8 @@
registerComponentImplementation(IdGenerator.class);
+ registerComponentImplementation(RepositoryIndexSearcherHolder.class);
+
registerComponentImplementation(NamespaceDataPersister.class);
registerComponentImplementation(NamespaceRegistryImpl.class);
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceRegistryImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceRegistryImpl.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/NamespaceRegistryImpl.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -18,42 +18,21 @@
*/
package org.exoplatform.services.jcr.impl.core;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.search.WildcardQuery;
-import org.apache.lucene.search.BooleanClause.Occur;
import org.exoplatform.services.jcr.dataflow.DataManager;
-import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.ItemData;
-import org.exoplatform.services.jcr.datamodel.NodeData;
-import org.exoplatform.services.jcr.datamodel.PropertyData;
-import org.exoplatform.services.jcr.datamodel.QPath;
-import org.exoplatform.services.jcr.datamodel.ValueData;
-import org.exoplatform.services.jcr.impl.core.query.QueryHandler;
-import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
-import org.exoplatform.services.jcr.impl.core.query.lucene.QueryHits;
-import org.exoplatform.services.jcr.impl.core.query.lucene.ScoreNode;
-import org.exoplatform.services.jcr.impl.core.value.NameValue;
-import org.exoplatform.services.jcr.impl.core.value.PathValue;
-import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
-import org.exoplatform.services.jcr.impl.dataflow.AbstractValueData;
+import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.io.IOException;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jcr.NamespaceException;
import javax.jcr.PathNotFoundException;
-import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
-import javax.jcr.Value;
/**
* Created by The eXo Platform SAS.
@@ -115,8 +94,10 @@
private Map<String, String> prefixes;
- private HashSet<QueryHandler> queryHandlers;
+ // private HashSet<QueryHandler> queryHandlers;
+ private final RepositoryIndexSearcherHolder indexSearcherHolder;
+
// private final NodeTypeDataManager nodeTypeDataManager;
/**
@@ -126,18 +107,20 @@
{
this.namespaces = DEF_NAMESPACES;
this.prefixes = DEF_PREFIXES;
- this.queryHandlers = new HashSet<QueryHandler>();
+ this.indexSearcherHolder = new RepositoryIndexSearcherHolder();
+ // this.queryHandlers = new HashSet<QueryHandler>();
// this.nodeTypeDataManager = null;
}
- public NamespaceRegistryImpl(NamespaceDataPersister persister)
+ public NamespaceRegistryImpl(NamespaceDataPersister persister, RepositoryIndexSearcherHolder indexSearcherHolder)
{
+ this.indexSearcherHolder = indexSearcherHolder;
// this.nodeTypeDataManager = nodeTypeDataManager;
this.namespaces = new HashMap<String, String>(DEF_NAMESPACES);
this.prefixes = new HashMap<String, String>(DEF_PREFIXES);
this.persister = persister;
- this.queryHandlers = new HashSet<QueryHandler>();
+ // this.queryHandlers = new HashSet<QueryHandler>();
}
/**
@@ -340,10 +323,10 @@
}
}
- public void addQueryHandler(QueryHandler queryHandler)
- {
- queryHandlers.add(queryHandler);
- }
+ // public void addQueryHandler(QueryHandler queryHandler)
+ // {
+ // queryHandlers.add(queryHandler);
+ // }
/**
* Return
@@ -356,118 +339,118 @@
public Set<String> getNodes(String prefix) throws RepositoryException
{
- LocationFactory locationFactory = new LocationFactory(this);
- ValueFactoryImpl valueFactory = new ValueFactoryImpl(locationFactory);
+ // LocationFactory locationFactory = new LocationFactory(this);
+ // ValueFactoryImpl valueFactory = new ValueFactoryImpl(locationFactory);
+ //
+ // BooleanQuery query = new BooleanQuery();
+ // // query.add(new MatchAllDocsQuery(), Occur.MUST);
+ // // name of the node
+ // query.add(new WildcardQuery(new Term(FieldNames.LABEL, prefix + ":*")), Occur.SHOULD);
+ // // name of the property
+ // query.add(new WildcardQuery(new Term(FieldNames.PROPERTIES_SET, prefix + ":*")), Occur.SHOULD);
+ //
+ // Set<String> result = getNodes(query);
+ //
+ // // value of the property
+ // Set<String> propSet = getNodes(new WildcardQuery(new Term(FieldNames.PROPERTIES, "*" + prefix + ":*")));
+ // // Manually check property values;
+ // for (String uuid : propSet)
+ // {
+ // if (isPrefixMatch(valueFactory, uuid, prefix))
+ // result.add(uuid);
+ // }
- BooleanQuery query = new BooleanQuery();
- // query.add(new MatchAllDocsQuery(), Occur.MUST);
- // name of the node
- query.add(new WildcardQuery(new Term(FieldNames.LABEL, prefix + ":*")), Occur.SHOULD);
- // name of the property
- query.add(new WildcardQuery(new Term(FieldNames.PROPERTIES_SET, prefix + ":*")), Occur.SHOULD);
-
- Set<String> result = getNodes(query);
-
- // value of the property
- Set<String> propSet = getNodes(new WildcardQuery(new Term(FieldNames.PROPERTIES, "*" + prefix + ":*")));
- // Manually check property values;
- for (String uuid : propSet)
- {
- if (isPrefixMatch(valueFactory, uuid, prefix))
- result.add(uuid);
- }
-
- return result;
+ return indexSearcherHolder.getNodesByUri(prefix);
}
- /**
- * @param valueFactory
- * @param dm
- * @param uuid
- * @param prefix
- * @throws RepositoryException
- */
- private boolean isPrefixMatch(ValueFactoryImpl valueFactory, String uuid, String prefix) throws RepositoryException
- {
- DataManager dm = persister.getDataManager();
- ItemData node = dm.getItemData(uuid);
- if (node != null && node.isNode())
- {
- List<PropertyData> props = dm.getChildPropertiesData((NodeData)node);
- for (PropertyData propertyData : props)
- {
- if (propertyData.getType() == PropertyType.PATH || propertyData.getType() == PropertyType.NAME)
- {
- for (ValueData vdata : propertyData.getValues())
- {
- Value val =
- valueFactory.loadValue(((AbstractValueData)vdata).createTransientCopy(), propertyData.getType());
- if (propertyData.getType() == PropertyType.PATH)
- {
- if (isPrefixMatch(((PathValue)val).getQPath(), prefix))
- return true;
- }
- else if (propertyData.getType() == PropertyType.NAME)
- {
- if (isPrefixMatch(((NameValue)val).getQName(), prefix))
- return true;
- }
- }
- }
- }
- }
- return false;
- }
+ // /**
+ // * @param valueFactory
+ // * @param dm
+ // * @param uuid
+ // * @param prefix
+ // * @throws RepositoryException
+ // */
+ // private boolean isPrefixMatch(ValueFactoryImpl valueFactory, String uuid, String prefix) throws RepositoryException
+ // {
+ // DataManager dm = persister.getDataManager();
+ // ItemData node = dm.getItemData(uuid);
+ // if (node != null && node.isNode())
+ // {
+ // List<PropertyData> props = dm.getChildPropertiesData((NodeData)node);
+ // for (PropertyData propertyData : props)
+ // {
+ // if (propertyData.getType() == PropertyType.PATH || propertyData.getType() == PropertyType.NAME)
+ // {
+ // for (ValueData vdata : propertyData.getValues())
+ // {
+ // Value val =
+ // valueFactory.loadValue(((AbstractValueData)vdata).createTransientCopy(), propertyData.getType());
+ // if (propertyData.getType() == PropertyType.PATH)
+ // {
+ // if (isPrefixMatch(((PathValue)val).getQPath(), prefix))
+ // return true;
+ // }
+ // else if (propertyData.getType() == PropertyType.NAME)
+ // {
+ // if (isPrefixMatch(((NameValue)val).getQName(), prefix))
+ // return true;
+ // }
+ // }
+ // }
+ // }
+ // }
+ // return false;
+ // }
+ //
+ // private boolean isPrefixMatch(QPath value, String prefix) throws NamespaceException
+ // {
+ // for (int i = 0; i < value.getEntries().length; i++)
+ // {
+ // if (isPrefixMatch(value.getEntries()[i], prefix))
+ // return true;
+ // }
+ // return false;
+ // }
+ //
+ // private boolean isPrefixMatch(InternalQName value, String prefix) throws NamespaceException
+ // {
+ // return (value.getNamespace().equals(getURI(prefix)));
+ // }
- private boolean isPrefixMatch(QPath value, String prefix) throws NamespaceException
- {
- for (int i = 0; i < value.getEntries().length; i++)
- {
- if (isPrefixMatch(value.getEntries()[i], prefix))
- return true;
- }
- return false;
- }
+ // /**
+ // * @param query
+ // * @return
+ // * @throws RepositoryException
+ // */
+ // private Set<String> getNodes(Query query) throws RepositoryException
+ // {
+ // Set<String> result = new HashSet<String>();
+ //
+ // Iterator<QueryHandler> it = queryHandlers.iterator();
+ // try
+ // {
+ // while (it.hasNext())
+ // {
+ // QueryHandler queryHandler = it.next();
+ // QueryHits hits = queryHandler.executeQuery(query);
+ //
+ // ScoreNode sn;
+ //
+ // while ((sn = hits.nextScoreNode()) != null)
+ // {
+ // result.add(sn.getNodeId());
+ // }
+ // // for (int i = 0; i < hits.getSize(); i++)
+ // // {
+ // // result.add(hits.getFieldContent(i, FieldNames.UUID));
+ // // }
+ // }
+ // }
+ // catch (IOException e)
+ // {
+ // throw new RepositoryException(e.getLocalizedMessage(), e);
+ // }
+ // return result;
+ // }
- private boolean isPrefixMatch(InternalQName value, String prefix) throws NamespaceException
- {
- return (value.getNamespace().equals(getURI(prefix)));
- }
-
- /**
- * @param query
- * @return
- * @throws RepositoryException
- */
- private Set<String> getNodes(Query query) throws RepositoryException
- {
- Set<String> result = new HashSet<String>();
-
- Iterator<QueryHandler> it = queryHandlers.iterator();
- try
- {
- while (it.hasNext())
- {
- QueryHandler queryHandler = it.next();
- QueryHits hits = queryHandler.executeQuery(query);
-
- ScoreNode sn;
-
- while ((sn = hits.nextScoreNode()) != null)
- {
- result.add(sn.getNodeId());
- }
- // for (int i = 0; i < hits.getSize(); i++)
- // {
- // result.add(hits.getFieldContent(i, FieldNames.UUID));
- // }
- }
- }
- catch (IOException e)
- {
- throw new RepositoryException(e.getLocalizedMessage(), e);
- }
- return result;
- }
-
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/NodeTypeDataManagerImpl.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -51,10 +51,8 @@
import org.exoplatform.services.jcr.impl.core.LocationFactory;
import org.exoplatform.services.jcr.impl.core.nodetype.registration.NodeDefinitionComparator;
import org.exoplatform.services.jcr.impl.core.nodetype.registration.PropertyDefinitionComparator;
-import org.exoplatform.services.jcr.impl.core.query.QueryHandler;
+import org.exoplatform.services.jcr.impl.core.query.RepositoryIndexSearcherHolder;
import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
-import org.exoplatform.services.jcr.impl.core.query.lucene.QueryHits;
-import org.exoplatform.services.jcr.impl.core.query.lucene.ScoreNode;
import org.exoplatform.services.jcr.impl.core.value.BaseValue;
import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
import org.exoplatform.services.jcr.impl.dataflow.TransientNodeData;
@@ -78,7 +76,6 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -129,12 +126,15 @@
*/
private final Map<NodeTypeManagerListener, NodeTypeManagerListener> listeners;
- protected HashSet<QueryHandler> queryHandlers;
+ // protected HashSet<QueryHandler> queryHandlers;
private final ValueFactoryImpl valueFactory;
+ protected final RepositoryIndexSearcherHolder indexSearcherHolder;
+
public NodeTypeDataManagerImpl(RepositoryEntry config, LocationFactory locationFactory,
- NamespaceRegistry namespaceRegistry, NodeTypeDataPersister persister) throws RepositoryException
+ NamespaceRegistry namespaceRegistry, NodeTypeDataPersister persister,
+ RepositoryIndexSearcherHolder indexSearcherHolder) throws RepositoryException
{
this.namespaceRegistry = namespaceRegistry;
@@ -142,6 +142,7 @@
this.persister = persister;
this.locationFactory = locationFactory;
+ this.indexSearcherHolder = indexSearcherHolder;
this.valueFactory = new ValueFactoryImpl(locationFactory);
this.accessControlPolicy = config.getAccessControl();
@@ -151,7 +152,7 @@
this.listeners = Collections.synchronizedMap(new WeakHashMap<NodeTypeManagerListener, NodeTypeManagerListener>());
this.buildInNodeTypesNames = new HashSet<InternalQName>();
initDefault();
- this.queryHandlers = new HashSet<QueryHandler>();
+ //this.queryHandlers = new HashSet<QueryHandler>();
}
/**
@@ -162,7 +163,8 @@
* @throws RepositoryException
*/
public NodeTypeDataManagerImpl(String accessControlPolicy, LocationFactory locationFactory,
- NamespaceRegistry namespaceRegistry, NodeTypeDataPersister persister) throws RepositoryException
+ NamespaceRegistry namespaceRegistry, NodeTypeDataPersister persister,
+ RepositoryIndexSearcherHolder indexSearcherHolder) throws RepositoryException
{
this.namespaceRegistry = namespaceRegistry;
@@ -170,6 +172,7 @@
this.persister = persister;
this.locationFactory = locationFactory;
+ this.indexSearcherHolder = indexSearcherHolder;
this.valueFactory = new ValueFactoryImpl(locationFactory);
this.accessControlPolicy = accessControlPolicy;
@@ -178,7 +181,7 @@
this.defsHolder = new ItemDefinitionDataHolder();
this.listeners = Collections.synchronizedMap(new WeakHashMap<NodeTypeManagerListener, NodeTypeManagerListener>());
this.buildInNodeTypesNames = new HashSet<InternalQName>();
- this.queryHandlers = new HashSet<QueryHandler>();
+ //this.queryHandlers = new HashSet<QueryHandler>();
}
/**
@@ -195,10 +198,11 @@
}
}
- public void addQueryHandler(QueryHandler queryHandler)
- {
- queryHandlers.add(queryHandler);
- }
+ //
+ // public void addQueryHandler(QueryHandler queryHandler)
+ // {
+ // queryHandlers.add(queryHandler);
+ // }
/**
* {@inheritDoc}
@@ -393,7 +397,7 @@
*/
public Set<String> getNodes(InternalQName nodeType) throws RepositoryException
{
- return getNodes(nodeType, new InternalQName[0], new InternalQName[0]);
+ return indexSearcherHolder.getNodesByNodeType(nodeType);
}
/**
@@ -407,56 +411,47 @@
public Set<String> getNodes(InternalQName nodeType, InternalQName[] includeProperties,
InternalQName[] excludeProperties) throws RepositoryException
{
- Query query = getQuery(nodeType);
- if (includeProperties.length > 0)
- {
- BooleanQuery tmp = new BooleanQuery();
- for (int i = 0; i < includeProperties.length; i++)
- {
+ return new HashSet<String>();
- String field = locationFactory.createJCRName(includeProperties[i]).getAsString();
- tmp.add(new TermQuery(new Term(FieldNames.PROPERTIES_SET, field)), Occur.MUST);
- }
- tmp.add(query, Occur.MUST);
- query = tmp;
- }
-
- if (excludeProperties.length > 0)
- {
- BooleanQuery tmp = new BooleanQuery();
- for (int i = 0; i < excludeProperties.length; i++)
- {
-
- String field = locationFactory.createJCRName(excludeProperties[i]).getAsString();
- tmp.add(new TermQuery(new Term(FieldNames.PROPERTIES_SET, field)), Occur.MUST_NOT);
- }
- tmp.add(query, Occur.MUST);
- query = tmp;
- }
-
- Iterator<QueryHandler> it = queryHandlers.iterator();
- Set<String> result = new HashSet<String>();
-
- try
- {
- while (it.hasNext())
- {
- QueryHandler queryHandler = it.next();
- QueryHits hits = queryHandler.executeQuery(query);
-
- ScoreNode sn;
-
- while ((sn = hits.nextScoreNode()) != null)
- {
- result.add(sn.getNodeId());
- }
- }
- }
- catch (IOException e)
- {
- throw new RepositoryException(e.getLocalizedMessage(), e);
- }
- return result;
+ // Query query = getQuery(nodeType);
+ // if (includeProperties.length > 0)
+ // {
+ // BooleanQuery tmp = new BooleanQuery();
+ // for (int i = 0; i < includeProperties.length; i++)
+ // {
+ //
+ // String field = locationFactory.createJCRName(includeProperties[i]).getAsString();
+ // tmp.add(new TermQuery(new Term(FieldNames.PROPERTIES_SET, field)), Occur.MUST);
+ // }
+ // tmp.add(query, Occur.MUST);
+ // query = tmp;
+ // }
+ //
+ // if (excludeProperties.length > 0)
+ // {
+ // BooleanQuery tmp = new BooleanQuery();
+ // for (int i = 0; i < excludeProperties.length; i++)
+ // {
+ //
+ // String field = locationFactory.createJCRName(excludeProperties[i]).getAsString();
+ // tmp.add(new TermQuery(new Term(FieldNames.PROPERTIES_SET, field)), Occur.MUST_NOT);
+ // }
+ // tmp.add(query, Occur.MUST);
+ // query = tmp;
+ // }
+ //
+ // Iterator<QueryHandler> it = queryHandlers.iterator();
+ // Set<String> result = new HashSet<String>();
+ //
+ // try
+ // {
+ // indexSearcherHolder.getNodesByNodeType()
+ // }
+ // catch (IOException e)
+ // {
+ // throw new RepositoryException(e.getLocalizedMessage(), e);
+ // }
+ // return result;
}
/**
@@ -486,11 +481,11 @@
return propertyDefinitions;
}
- // TODO make me private
- public Set<QueryHandler> getQueryHandlers()
- {
- return queryHandlers;
- }
+ // // TODO make me private
+ // public Set<QueryHandler> getQueryHandlers()
+ // {
+ // return queryHandlers;
+ // }
/**
* @param nodeTypeName
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/VolatileNodeTypeDataManager.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/VolatileNodeTypeDataManager.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/nodetype/VolatileNodeTypeDataManager.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -20,13 +20,11 @@
import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
import org.exoplatform.services.jcr.datamodel.InternalQName;
-import org.exoplatform.services.jcr.impl.core.query.QueryHandler;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.Map;
import javax.jcr.RepositoryException;
@@ -43,9 +41,10 @@
public VolatileNodeTypeDataManager(NodeTypeDataManagerImpl nodeTypeDataManagerImpl) throws RepositoryException
{
super(nodeTypeDataManagerImpl.accessControlPolicy, nodeTypeDataManagerImpl.locationFactory,
- nodeTypeDataManagerImpl.namespaceRegistry, nodeTypeDataManagerImpl.persister);
+ nodeTypeDataManagerImpl.namespaceRegistry, nodeTypeDataManagerImpl.persister,
+ nodeTypeDataManagerImpl.indexSearcherHolder);
this.superNodeTypeDataManager = nodeTypeDataManagerImpl;
- this.queryHandlers = new HashSet<QueryHandler>(nodeTypeDataManagerImpl.queryHandlers);
+ //this.queryHandlers = new HashSet<QueryHandler>(nodeTypeDataManagerImpl.queryHandlers);
registerVolatileNodeTypes(superNodeTypeDataManager.getAllNodeTypes());
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/ErrorLog.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/ErrorLog.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/ErrorLog.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -17,6 +17,9 @@
package org.exoplatform.services.jcr.impl.core.query;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
@@ -31,253 +34,204 @@
import java.util.List;
import java.util.Set;
-import org.exoplatform.services.log.Log;
-
-import org.exoplatform.services.log.ExoLogger;
-
/**
- * All changes that must be in index but interrupted by IOException are here. Created by The eXo
- * Platform SAS Author : Sergey Karpenko <sergey.karpenko(a)exoplatform.com.ua>
+ * All changes that must be in index but interrupted by IOException are here.
+ * Created by The eXo Platform SAS Author : Sergey Karpenko
+ * <sergey.karpenko(a)exoplatform.com.ua>
*
* @version $Id: $
*/
-public class ErrorLog
-{
- public static final int DEFAULT_FILE_SIZE = 50; // Kb
+public class ErrorLog {
- /**
- * Logger instance for this class
- */
- private static final Log LOG = ExoLogger.getLogger(ErrorLog.class);
+ /**
+ * Logger instance for this class
+ */
+ private static final Log LOG = ExoLogger.getLogger(ErrorLog.class);
- /**
- * REMOVE term.
- */
- public static final String REMOVE = "rem";
+ /**
+ * REMOVE term.
+ */
+ public static final String REMOVE = "rem";
- /**
- * ADD term.
- */
- public static final String ADD = "add";
+ /**
+ * ADD term.
+ */
+ public static final String ADD = "add";
- /**
- * The log file
- */
- private final File logFile;
+ /**
+ * The log file
+ */
+ private final File logFile;
- /**
- * Writer to the log file
- */
- private FileChannel out;
+ /**
+ * Writer to the log file
+ */
+ private FileChannel out;
- /**
- * File size in Kb. Used on create and clear(truncate) methods.
- */
- private int fileSize = DEFAULT_FILE_SIZE; // Kb
+ /**
+ * File size in Kb. Used on create and clear(truncate) methods.
+ */
+ private int fileSize = 0; // Kb
- /**
- * ErrorLog constructor.
- *
- * @param file
- * @throws IOException
- */
- public ErrorLog(File file) throws IOException
- {
- logFile = file;
- openFile(file);
- }
+ /**
+ * ErrorLog constructor.
+ *
+ * @param file
+ * @param errorLogSize
+ * @throws IOException
+ */
+ public ErrorLog(File file, int errorLogSize) throws IOException {
+ fileSize = errorLogSize;
+ logFile = file;
+ openFile(file);
+ }
- /**
- * ErrorLog constructor.
- *
- * @param file
- * @param errorLogSize
- * @throws IOException
- */
- public ErrorLog(File file, int errorLogSize) throws IOException
- {
- fileSize = errorLogSize;
- logFile = file;
- openFile(file);
- }
+ /**
+ * openFile.
+ *
+ * @param log
+ * @throws IOException
+ */
+ private void openFile(File log) throws IOException {
+ // set file size;
+ if (!log.exists()) {
+ log.getParentFile().mkdirs();
+ log.createNewFile();
- /**
- * openFile.
- *
- * @param log
- * @throws IOException
- */
- private void openFile(File log) throws IOException
- {
- // set file size;
- if (!log.exists())
- {
- log.getParentFile().mkdirs();
- log.createNewFile();
+ out = new FileOutputStream(log).getChannel();
+ out.position(1024 * fileSize - 1);
+ out.write(ByteBuffer.wrap(new byte[] { 0 }));
+ out.position(0);
+ out.force(false);
+ } else {
+ out = new FileOutputStream(log, true).getChannel();
+ }
+ }
- out = new FileOutputStream(log).getChannel();
- out.position(1024 * fileSize - 1);
- out.write(ByteBuffer.wrap(new byte[]{0}));
- out.position(0);
- out.force(false);
- }
- else
- {
- out = new FileOutputStream(log, true).getChannel();
- }
- }
+ /**
+ * Appends an action to the log.
+ *
+ * @param action
+ * the action to append.
+ * @throws IOException
+ * if the node cannot be written to the redo log.
+ */
+ public void append(String action, String uuid) throws IOException {
+ initOut();
+ out.write(ByteBuffer.wrap((action + " " + uuid + "\n").getBytes()));
+ }
- /**
- * Appends an action to the log.
- *
- * @param action
- * the action to append.
- * @throws IOException
- * if the node cannot be written to the redo log.
- */
- public void append(String action, String uuid) throws IOException
- {
- initOut();
- out.write(ByteBuffer.wrap((action + " " + uuid + "\n").getBytes()));
- }
+ /**
+ * Flushes all pending writes to the underlying file.
+ *
+ * @throws IOException
+ * if an error occurs while writing.
+ */
+ public void flush() throws IOException {
+ if (out != null) {
+ out.force(false);
+ }
+ }
- /**
- * Flushes all pending writes to the underlying file.
- *
- * @throws IOException
- * if an error occurs while writing.
- */
- public void flush() throws IOException
- {
- if (out != null)
- {
- out.force(false);
- }
- }
+ /**
+ * Clears the redo log.
+ *
+ * @throws IOException
+ * if the redo log cannot be cleared.
+ */
+ public void clear() throws IOException {
+ if (out != null) {
+ out.truncate(0);
+ out.close();
+ out = new FileOutputStream(logFile).getChannel();
+ out.position(1024 * fileSize - 1);
+ out.write(ByteBuffer.wrap(new byte[] { 0 }));
+ out.position(0);
+ out.force(false);
+ }
+ }
- /**
- * Clears the redo log.
- *
- * @throws IOException
- * if the redo log cannot be cleared.
- */
- public void clear() throws IOException
- {
- if (out != null)
- {
- out.truncate(0);
- out.close();
- out = new FileOutputStream(logFile).getChannel();
- out.position(1024 * fileSize - 1);
- out.write(ByteBuffer.wrap(new byte[]{0}));
- out.position(0);
- out.force(false);
- }
- }
+ /**
+ * Initializes the {@link #out} stream if it is not yet set.
+ *
+ * @throws IOException
+ * if an error occurs while creating the output stream.
+ */
+ private void initOut() throws IOException {
+ if (out == null) {
+ FileOutputStream os = new FileOutputStream(logFile, false);
+ out = os.getChannel();
+ }
+ }
- /**
- * Initializes the {@link #out} stream if it is not yet set.
- *
- * @throws IOException
- * if an error occurs while creating the output stream.
- */
- private void initOut() throws IOException
- {
- if (out == null)
- {
- FileOutputStream os = new FileOutputStream(logFile, false);
- out = os.getChannel();
- }
- }
+ /**
+ * Reads the log file .
+ *
+ * @throws IOException
+ * if an error occurs while reading from the log file.
+ */
+ public List<String> readList() throws IOException {
+ InputStream in = new FileInputStream(logFile);
+ try {
+ List<String> list = new ArrayList<String>();
+ BufferedReader reader = new BufferedReader(
+ new InputStreamReader(in));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (!line.matches("\\x00++")) {
+ list.add(line);
+ }
+ }
+ return list;
- /**
- * Reads the log file .
- *
- * @throws IOException
- * if an error occurs while reading from the log file.
- */
- public List<String> readList() throws IOException
- {
- InputStream in = new FileInputStream(logFile);
- try
- {
- List<String> list = new ArrayList<String>();
- BufferedReader reader = new BufferedReader(new InputStreamReader(in));
- String line;
- while ((line = reader.readLine()) != null)
- {
- if (!line.matches("\\x00++"))
- {
- list.add(line);
- }
- }
- return list;
+ } finally {
+ if (in != null) {
+ try {
+ in.close();
+ } catch (IOException e) {
+ LOG.warn("Exception while closing error log: "
+ + e.toString());
+ }
+ }
+ }
+ }
- }
- finally
- {
- if (in != null)
- {
- try
- {
- in.close();
- }
- catch (IOException e)
- {
- LOG.warn("Exception while closing error log: " + e.toString());
- }
- }
- }
- }
+ public void readChanges(Set<String> rem, Set<String> add)
+ throws IOException {
+ List<String> list = readList();
- public void readChanges(Set<String> rem, Set<String> add) throws IOException
- {
- List<String> list = readList();
+ Iterator<String> it = list.iterator();
+ while (it.hasNext()) {
+ String[] str = it.next().split(" ");
+ if (str.length == 2) {
+ if (str[0].equals(ADD)) {
+ add.add(str[1]);
+ } else if (str[0].equals(REMOVE)) {
+ rem.add(str[1]);
+ }
+ }
+ }
+ }
- Iterator<String> it = list.iterator();
- while (it.hasNext())
- {
- String[] str = it.next().split(" ");
- if (str.length == 2)
- {
- if (str[0].equals(ADD))
- {
- add.add(str[1]);
- }
- else if (str[0].equals(REMOVE))
- {
- rem.add(str[1]);
- }
- }
- }
- }
+ public void writeChanges(Set<String> removed, Set<String> added)
+ throws IOException {
+ try {
+ if (!removed.isEmpty()) {
+ Iterator<String> rem = removed.iterator();
+ while (rem.hasNext()) {
+ append(ErrorLog.REMOVE, rem.next());
+ }
+ }
+ if (!added.isEmpty()) {
+ Iterator<String> add = added.iterator();
+ while (add.hasNext()) {
+ append(ErrorLog.ADD, add.next());
+ }
+ }
+ } finally {
+ flush();
+ }
+ }
- public void writeChanges(Set<String> removed, Set<String> added) throws IOException
- {
- try
- {
- if (!removed.isEmpty())
- {
- Iterator<String> rem = removed.iterator();
- while (rem.hasNext())
- {
- append(ErrorLog.REMOVE, rem.next());
- }
- }
- if (!added.isEmpty())
- {
- Iterator<String> add = added.iterator();
- while (add.hasNext())
- {
- append(ErrorLog.ADD, add.next());
- }
- }
- }
- finally
- {
- flush();
- }
- }
-
}
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexException.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexException.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexException.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query;
+
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class IndexException extends RepositoryException
+{
+ /**
+ *
+ */
+ private static final long serialVersionUID = 2247843831064852072L;
+
+ /**
+ * Class logger.
+ */
+ private static final Log LOG = ExoLogger.getLogger(IndexException.class);
+
+ /**
+ *
+ */
+ public IndexException()
+ {
+ super();
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public IndexException(String message, Throwable cause)
+ {
+ super(message, cause);
+ }
+
+ /**
+ * @param message
+ */
+ public IndexException(String message)
+ {
+ super(message);
+ }
+
+ /**
+ * @param cause
+ */
+ public IndexException(Throwable cause)
+ {
+ super(cause);
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/IndexException.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandlerContext.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandlerContext.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/QueryHandlerContext.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -21,6 +21,7 @@
import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
import org.exoplatform.services.jcr.impl.core.NamespaceRegistryImpl;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeDataManagerImpl;
+import org.exoplatform.services.jcr.impl.core.query.lucene.LuceneVirtualTableResolver;
/**
* Acts as an argument for the {@link QueryHandler} to keep the interface
@@ -68,6 +69,8 @@
private final boolean createInitialIndex;
+ private final LuceneVirtualTableResolver virtualTableResolver;
+
/**
* Creates a new context instance.
*
@@ -86,6 +89,7 @@
* @param parentHandler
* the parent query handler or <code>null</code> it there is no
* parent handler.
+ * @param virtualTableResolver
* @param excludedNodeId
* id of the node that should be excluded from indexing. Any
* descendant of that node is also excluded from indexing.
@@ -94,7 +98,8 @@
IndexingTree indexingTree, NodeTypeDataManager nodeTypeDataManager,
NamespaceRegistryImpl nsRegistry, QueryHandler parentHandler,
String indexDirectory, DocumentReaderService extractor,
- boolean createInitialIndex) {
+ boolean createInitialIndex,
+ LuceneVirtualTableResolver virtualTableResolver) {
this.stateMgr = stateMgr;
this.indexingTree = indexingTree;
this.nodeTypeDataManager = nodeTypeDataManager;
@@ -102,6 +107,7 @@
this.indexDirectory = indexDirectory;
this.extractor = extractor;
this.createInitialIndex = createInitialIndex;
+ this.virtualTableResolver = virtualTableResolver;
this.propRegistry = new PropertyTypeRegistry(nodeTypeDataManager);
this.parentHandler = parentHandler;
((NodeTypeDataManagerImpl) this.nodeTypeDataManager)
@@ -109,6 +115,13 @@
}
/**
+ * @return the virtualTableResolver
+ */
+ public LuceneVirtualTableResolver getVirtualTableResolver() {
+ return virtualTableResolver;
+ }
+
+ /**
* @return the createInitialIndex
*/
public boolean isCreateInitialIndex() {
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/RepositoryIndexSearcherHolder.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/RepositoryIndexSearcherHolder.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/RepositoryIndexSearcherHolder.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -0,0 +1,115 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query;
+
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+import org.picocontainer.Startable;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+
+/**
+ * Created by The eXo Platform SAS.
+ *
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: $
+ */
+public class RepositoryIndexSearcherHolder implements Startable {
+ private final List<SearchManager> indexSearchers;
+
+ /**
+ * Class logger.
+ */
+ private final Log log = ExoLogger
+ .getLogger(RepositoryIndexSearcherHolder.class);
+
+ /**
+ * @param indexSearchers
+ */
+ public RepositoryIndexSearcherHolder() {
+ super();
+ this.indexSearchers = new ArrayList<SearchManager>();
+ }
+
+ /**
+ * @return the indexSearchers
+ */
+ public void addIndexSearcher(final SearchManager indexSearcher) {
+ this.indexSearchers.add(indexSearcher);
+ }
+
+ /**
+ * @return
+ * @throws IndexException
+ */
+ public Set<String> getFieldNames() throws IndexException {
+ final Set<String> fildsSet = new HashSet<String>();
+
+ for (final SearchManager queryHandler : this.indexSearchers) {
+
+ fildsSet.addAll(queryHandler.getFieldNames());
+ }
+ return fildsSet;
+ }
+
+ public Set<String> getNodesByNodeType(final InternalQName nodeType)
+ throws RepositoryException {
+ final Set<String> result = new HashSet<String>();
+ for (final SearchManager indexingService : this.indexSearchers) {
+ result.addAll(indexingService.getNodesByNodeType(nodeType));
+ }
+
+ return result;
+ }
+
+ /**
+ * @param uri
+ * @return
+ * @throws RepositoryException
+ */
+ public Set<String> getNodesByUri(final String uri)
+ throws RepositoryException {
+ final Set<String> result = new HashSet<String>();
+ for (final SearchManager indexingService : this.indexSearchers) {
+ result.addAll(indexingService.getNodesByUri(uri));
+ }
+
+ return result;
+ }
+
+ /**
+ * @return the indexSearchers
+ */
+ public void removeIndexSearcher(final SearchManager indexSearcher) {
+ this.indexSearchers.remove(indexSearcher);
+ }
+
+ public void start() {
+ }
+
+ public void stop() {
+ this.indexSearchers.clear();
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/RepositoryIndexSearcherHolder.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchIndexConfigurationHelper.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchIndexConfigurationHelper.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchIndexConfigurationHelper.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -19,7 +19,9 @@
package org.exoplatform.services.jcr.impl.core.query;
import org.exoplatform.services.jcr.config.QueryHandlerEntry;
+import org.exoplatform.services.jcr.config.QueryHandlerParams;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
+import org.exoplatform.services.jcr.config.SimpleParameterEntry;
import org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex;
import java.io.IOException;
@@ -42,9 +44,93 @@
this.searchIndex = searchIndex;
}
+ /**
+ * Initialize parameters
+ *
+ * @param queryHandlerEntry
+ * @throws IOException
+ * @throws RepositoryConfigurationException
+ */
public void init(QueryHandlerEntry queryHandlerEntry) throws IOException,
RepositoryConfigurationException {
// Path will be set using queryHandelContext
+ for (SimpleParameterEntry parameter : queryHandlerEntry.getParameters()) {
+ setParam(parameter.getName(), parameter.getValue());
+ }
+
}
+
+ /**
+ * @param name
+ * @param value
+ */
+ private void setParam(String name, String value) {
+
+ if (QueryHandlerParams.PARAM_AUTO_REPAIR.equals(name))
+ searchIndex.setAutoRepair(Boolean.parseBoolean(value));
+ else if (QueryHandlerParams.PARAM_BUFFER_SIZE.equals(name))
+ searchIndex.setBufferSize(Integer.parseInt(value));
+ else if (QueryHandlerParams.PARAM_CACHE_SIZE.equals(name))
+ searchIndex.setCacheSize(Integer.parseInt(value));
+ else if (QueryHandlerParams.PARAM_CONSISTENCY_CHECK_ENABLED
+ .equals(name))
+ searchIndex.setEnableConsistencyCheck(Boolean.parseBoolean(value));
+ else if (QueryHandlerParams.PARAM_DOCUMENT_ORDER.equals(name))
+ searchIndex.setRespectDocumentOrder(Boolean.parseBoolean(value));
+ else if (QueryHandlerParams.PARAM_EXCERPTPROVIDER_CLASS.equals(name))
+ searchIndex.setExcerptProviderClass(value);
+ // else if
+ // (QueryHandlerParams.PARAM_EXCLUDED_NODE_IDENTIFERS.equals(name))
+ // searchIndex.setE
+ else if (QueryHandlerParams.PARAM_EXTRACTOR_BACKLOG.equals(name))
+ searchIndex.setExtractorBackLogSize(Integer.parseInt(value));
+ else if (QueryHandlerParams.PARAM_EXTRACTOR_POOLSIZE.equals(name))
+ searchIndex.setExtractorPoolSize(Integer.parseInt(value));
+ else if (QueryHandlerParams.PARAM_EXTRACTOR_TIMEOUT.equals(name))
+ searchIndex.setExtractorTimeout(Long.parseLong(value));
+ else if (QueryHandlerParams.PARAM_FORCE_CONSISTENCYCHECK.equals(name))
+ searchIndex.setForceConsistencyCheck(Boolean.parseBoolean(value));
+ else if (QueryHandlerParams.PARAM_ERRORLOG_SIZE.equals(name))
+ searchIndex.setErrorLogfileSize(Integer.parseInt(value));
+ // else if (QueryHandlerParams.PARAM_INDEX_DIR.equals(name))
+ // searchIndex.setBufferSize(0);
+ // else if (OLD_PARAM_INDEX_DIR
+ else if (QueryHandlerParams.PARAM_INDEXING_CONFIGURATION_PATH
+ .equals(name))
+ searchIndex.setIndexingConfiguration(value);
+ else if (QueryHandlerParams.PARAM_INDEXING_CONFIGURATION_CLASS
+ .equals(name))
+ searchIndex.setIndexingConfigurationClass(value);
+ else if (QueryHandlerParams.PARAM_MAX_FIELD_LENGTH.equals(name))
+ searchIndex.setMaxFieldLength(Integer.parseInt(value));
+ else if (QueryHandlerParams.PARAM_MAX_MERGE_DOCS.equals(name))
+ searchIndex.setMaxMergeDocs(Integer.parseInt(value));
+ else if (QueryHandlerParams.PARAM_MERGE_FACTOR.equals(name))
+ searchIndex.setMergeFactor(Integer.parseInt(value));
+ else if (QueryHandlerParams.PARAM_MIN_MERGE_DOCS.equals(name))
+ searchIndex.setMinMergeDocs(Integer.parseInt(value));
+ else if (QueryHandlerParams.PARAM_QUERY_CLASS.equals(name))
+ searchIndex.setQueryClass(value);
+ else if (QueryHandlerParams.PARAM_RESULT_FETCH_SIZE.equals(name))
+ searchIndex.setResultFetchSize(Integer.parseInt(value));
+ // else if (QueryHandlerParams.PARAM_ROOT_NODE_ID.equals(name))
+ // searchIndex.setBufferSize(0);
+ else if (QueryHandlerParams.PARAM_SPELLCHECKER_CLASS.equals(name))
+ searchIndex.setSpellCheckerClass(value);
+ else if (QueryHandlerParams.PARAM_SUPPORT_HIGHLIGHTING.equals(name))
+ searchIndex.setSupportHighlighting(Boolean.parseBoolean(value));
+ else if (QueryHandlerParams.PARAM_SYNONYMPROVIDER_CLASS.equals(name))
+ searchIndex.setSynonymProviderClass(value);
+ else if (QueryHandlerParams.PARAM_SYNONYMPROVIDER_CONFIG_PATH
+ .equals(name))
+ searchIndex.setSynonymProviderConfigPath(value);
+ else if (QueryHandlerParams.PARAM_USE_COMPOUNDFILE.equals(name))
+ searchIndex.setUseCompoundFile(Boolean.parseBoolean(value));
+ else if (QueryHandlerParams.PARAM_VOLATILE_IDLE_TIME.equals(name))
+ searchIndex.setVolatileIdleTime(Integer.parseInt(value));
+ // else if (QueryHandlerParams.PARAM_UPGRADE_INDEX.equals(name))
+ // searchIndex.i
+
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SearchManager.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -16,6 +16,11 @@
*/
package org.exoplatform.services.jcr.impl.core.query;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.WildcardQuery;
+import org.apache.lucene.search.BooleanClause.Occur;
import org.exoplatform.container.configuration.ConfigurationManager;
import org.exoplatform.services.document.DocumentReaderService;
import org.exoplatform.services.jcr.config.QueryHandlerEntry;
@@ -26,13 +31,26 @@
import org.exoplatform.services.jcr.dataflow.ItemState;
import org.exoplatform.services.jcr.dataflow.ItemStateChangesLog;
import org.exoplatform.services.jcr.dataflow.persistent.MandatoryItemsPersistenceListener;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
import org.exoplatform.services.jcr.datamodel.ItemData;
import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.datamodel.QPath;
+import org.exoplatform.services.jcr.datamodel.ValueData;
import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.LocationFactory;
import org.exoplatform.services.jcr.impl.core.NamespaceRegistryImpl;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
+import org.exoplatform.services.jcr.impl.core.query.lucene.FieldNames;
+import org.exoplatform.services.jcr.impl.core.query.lucene.LuceneVirtualTableResolver;
+import org.exoplatform.services.jcr.impl.core.query.lucene.QueryHits;
+import org.exoplatform.services.jcr.impl.core.query.lucene.ScoreNode;
+import org.exoplatform.services.jcr.impl.core.query.lucene.SearchIndex;
+import org.exoplatform.services.jcr.impl.core.value.NameValue;
+import org.exoplatform.services.jcr.impl.core.value.PathValue;
+import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
+import org.exoplatform.services.jcr.impl.dataflow.AbstractValueData;
import org.exoplatform.services.jcr.impl.dataflow.persistent.WorkspacePersistentDataManager;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
@@ -42,6 +60,7 @@
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
@@ -52,7 +71,9 @@
import java.util.StringTokenizer;
import javax.jcr.Node;
+import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
+import javax.jcr.Value;
import javax.jcr.query.InvalidQueryException;
import javax.jcr.query.Query;
@@ -108,6 +129,8 @@
private final ConfigurationManager cfm;
+ protected LuceneVirtualTableResolver virtualTableResolver;
+
/**
* Creates a new <code>SearchManager</code>.
*
@@ -134,17 +157,19 @@
public SearchManager(QueryHandlerEntry config, NamespaceRegistryImpl nsReg,
NodeTypeDataManager ntReg, WorkspacePersistentDataManager itemMgr,
SystemSearchManagerHolder parentSearchManager,
- DocumentReaderService extractor, ConfigurationManager cfm)
+ DocumentReaderService extractor, ConfigurationManager cfm,
+ final RepositoryIndexSearcherHolder indexSearcherHolder)
throws RepositoryException, RepositoryConfigurationException {
this.extractor = extractor;
-
+ indexSearcherHolder.addIndexSearcher(this);
this.config = new QueryHandlerEntryWrapper(config);
this.nodeTypeDataManager = ntReg;
this.nsReg = nsReg;
this.itemMgr = itemMgr;
this.cfm = cfm;
-
+ this.virtualTableResolver = new LuceneVirtualTableResolver(
+ nodeTypeDataManager, nsReg);
this.parentSearchManager = parentSearchManager != null ? parentSearchManager
.get()
: null;
@@ -465,7 +490,7 @@
QueryHandlerContext context = new QueryHandlerContext(itemMgr,
indexingTree, nodeTypeDataManager, nsReg, parentHandler, config
- .getIndexDir(), extractor, true);
+ .getIndexDir(), extractor, true, virtualTableResolver);
return context;
}
@@ -543,4 +568,178 @@
}
}
+ /**
+ * {@inheritDoc}
+ */
+ public Set<String> getFieldNames() throws IndexException {
+ final Set<String> fildsSet = new HashSet<String>();
+ if (handler instanceof SearchIndex) {
+ IndexReader reader = null;
+ try {
+ reader = ((SearchIndex) handler).getIndexReader();
+ final Collection fields = reader
+ .getFieldNames(IndexReader.FieldOption.ALL);
+ for (final Object field : fields) {
+ fildsSet.add((String) field);
+ }
+ } catch (IOException e) {
+ throw new IndexException(e.getLocalizedMessage(), e);
+ } finally {
+ try {
+ if (reader != null)
+ reader.close();
+ } catch (IOException e) {
+ throw new IndexException(e.getLocalizedMessage(), e);
+ }
+ }
+
+ }
+ return fildsSet;
+ }
+
+ public Set<String> getNodesByNodeType(final InternalQName nodeType)
+ throws RepositoryException {
+
+ return getNodes(virtualTableResolver.resolve(nodeType, true));
+ }
+
+ /**
+ * Return set of uuid of nodes. Contains in names prefixes maped to the
+ * given uri
+ *
+ * @param prefix
+ * @return
+ * @throws RepositoryException
+ */
+ public Set<String> getNodesByUri(final String uri)
+ throws RepositoryException {
+ Set<String> result;
+ final int defaultClauseCount = BooleanQuery.getMaxClauseCount();
+ try {
+
+ // final LocationFactory locationFactory = new
+ // LocationFactory(this);
+ final ValueFactoryImpl valueFactory = new ValueFactoryImpl(
+ new LocationFactory(nsReg));
+ BooleanQuery.setMaxClauseCount(Integer.MAX_VALUE);
+ BooleanQuery query = new BooleanQuery();
+
+ final String prefix = nsReg.getNamespacePrefixByURI(uri);
+ query.add(new WildcardQuery(new Term(FieldNames.LABEL, prefix
+ + ":*")), Occur.SHOULD);
+ // name of the property
+ query.add(new WildcardQuery(new Term(FieldNames.PROPERTIES_SET,
+ prefix + ":*")), Occur.SHOULD);
+
+ result = getNodes(query);
+
+ // value of the property
+
+ try {
+ final Set<String> props = getFieldNames();
+
+ query = new BooleanQuery();
+ for (final String fieldName : props) {
+ if (!FieldNames.PROPERTIES_SET.equals(fieldName)) {
+ query.add(new WildcardQuery(new Term(fieldName, "*"
+ + prefix + ":*")), Occur.SHOULD);
+ }
+ }
+ } catch (final IndexException e) {
+ throw new RepositoryException(e.getLocalizedMessage(), e);
+ }
+
+ final Set<String> propSet = getNodes(query);
+ // Manually check property values;
+ for (final String uuid : propSet) {
+ if (isPrefixMatch(valueFactory, uuid, prefix)) {
+ result.add(uuid);
+ }
+ }
+ } finally {
+ BooleanQuery.setMaxClauseCount(defaultClauseCount);
+ }
+
+ return result;
+ }
+
+ private boolean isPrefixMatch(final InternalQName value, final String prefix)
+ throws RepositoryException {
+ return value.getNamespace().equals(
+ nsReg.getNamespaceURIByPrefix(prefix));
+ }
+
+ private boolean isPrefixMatch(final QPath value, final String prefix)
+ throws RepositoryException {
+ for (int i = 0; i < value.getEntries().length; i++) {
+ if (isPrefixMatch(value.getEntries()[i], prefix)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param valueFactory
+ * @param dm
+ * @param uuid
+ * @param prefix
+ * @throws RepositoryException
+ */
+ private boolean isPrefixMatch(final ValueFactoryImpl valueFactory,
+ final String uuid, final String prefix) throws RepositoryException {
+
+ final ItemData node = itemMgr.getItemData(uuid);
+ if (node != null && node.isNode()) {
+ final List<PropertyData> props = itemMgr
+ .getChildPropertiesData((NodeData) node);
+ for (final PropertyData propertyData : props) {
+ if (propertyData.getType() == PropertyType.PATH
+ || propertyData.getType() == PropertyType.NAME) {
+ for (final ValueData vdata : propertyData.getValues()) {
+ final Value val = valueFactory.loadValue(
+ ((AbstractValueData) vdata)
+ .createTransientCopy(), propertyData
+ .getType());
+ if (propertyData.getType() == PropertyType.PATH) {
+ if (isPrefixMatch(((PathValue) val).getQPath(),
+ prefix)) {
+ return true;
+ }
+ } else if (propertyData.getType() == PropertyType.NAME) {
+ if (isPrefixMatch(((NameValue) val).getQName(),
+ prefix)) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * @param query
+ * @return
+ * @throws RepositoryException
+ */
+ private Set<String> getNodes(final org.apache.lucene.search.Query query)
+ throws RepositoryException {
+ Set<String> result = new HashSet<String>();
+ try {
+ QueryHits hits = handler.executeQuery(query);
+
+ ScoreNode sn;
+
+ while ((sn = hits.nextScoreNode()) != null) {
+ // Node node = session.getNodeById(sn.getNodeId());
+ result.add(sn.getNodeId());
+ }
+ } catch (IOException e) {
+ throw new RepositoryException(e.getLocalizedMessage(), e);
+ }
+ return result;
+ }
+
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/SystemSearchManager.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -64,9 +64,11 @@
public SystemSearchManager(QueryHandlerEntry config,
NamespaceRegistryImpl nsReg, NodeTypeDataManager ntReg,
WorkspacePersistentDataManager itemMgr,
- DocumentReaderService service, ConfigurationManager cfm)
+ DocumentReaderService service, ConfigurationManager cfm,
+ RepositoryIndexSearcherHolder indexSearcherHolder)
throws RepositoryException, RepositoryConfigurationException {
- super(config, nsReg, ntReg, itemMgr, null, service, cfm);
+ super(config, nsReg, ntReg, itemMgr, null, service, cfm,
+ indexSearcherHolder);
}
@Override
@@ -124,7 +126,7 @@
.getIndexDir()
+ "_" + INDEX_DIR_SUFFIX, extractor, changesLogBuffer
.size() > 0
- && !isStarted);
+ && !isStarted, virtualTableResolver);
return context;
}
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexingConfigurationEntityResolver.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexingConfigurationEntityResolver.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexingConfigurationEntityResolver.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -16,16 +16,16 @@
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
/**
* <code>IndexingConfigurationEntityResolver</code> implements an entity
* resolver for the indexing configuration DTD.
@@ -35,34 +35,37 @@
/**
* Maps system ids to DTD resource names.
*/
- private static final Map SYSTEM_IDS;
+ private static final Map<String, String> SYSTEM_IDS;
static {
- Map systemIds = new HashMap();
- systemIds.put(
- "http://jackrabbit.apache.org/dtd/indexing-configuration-1.0.dtd",
- "indexing-configuration-1.0.dtd");
- systemIds.put(
- "http://jackrabbit.apache.org/dtd/indexing-configuration-1.1.dtd",
- "indexing-configuration-1.1.dtd");
- systemIds.put(
- "http://jackrabbit.apache.org/dtd/indexing-configuration-1.2.dtd",
- "indexing-configuration-1.2.dtd");
- SYSTEM_IDS = Collections.unmodifiableMap(systemIds);
+ Map<String, String> systemIds = new HashMap<String, String>();
+ systemIds
+ .put(
+ "http://www.exoplatform.org/dtd/indexing-configuration-1.0.dtd",
+ "indexing-configuration-1.0.dtd");
+ systemIds
+ .put(
+ "http://www.exoplatform.org/dtd/indexing-configuration-1.1.dtd",
+ "indexing-configuration-1.1.dtd");
+ systemIds
+ .put(
+ "http://www.exoplatform.org/dtd/indexing-configuration-1.2.dtd",
+ "indexing-configuration-1.2.dtd");
+ SYSTEM_IDS = Collections.unmodifiableMap(systemIds);
}
/**
* {@inheritDoc}
*/
public InputSource resolveEntity(String publicId, String systemId)
- throws SAXException, IOException {
- String resourceName = (String) SYSTEM_IDS.get(systemId);
- if (resourceName != null) {
- InputStream in = getClass().getResourceAsStream(resourceName);
- if (in != null) {
- return new InputSource(in);
- }
- }
- return null;
+ throws SAXException, IOException {
+ String resourceName = SYSTEM_IDS.get(systemId);
+ if (resourceName != null) {
+ InputStream in = getClass().getResourceAsStream(resourceName);
+ if (in != null) {
+ return new InputSource(in);
+ }
+ }
+ return null;
}
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexingConfigurationImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexingConfigurationImpl.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/IndexingConfigurationImpl.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -16,22 +16,6 @@
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Properties;
-
-import javax.jcr.NamespaceException;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-
-import org.apache.commons.collections.iterators.AbstractIteratorDecorator;
import org.apache.lucene.analysis.Analyzer;
import org.exoplatform.services.jcr.core.NamespaceAccessor;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
@@ -49,7 +33,6 @@
import org.exoplatform.services.jcr.impl.core.query.AdditionalNamespaceResolver;
import org.exoplatform.services.jcr.impl.core.query.QueryHandlerContext;
import org.exoplatform.services.jcr.impl.core.query.misc.Pattern;
-
import org.exoplatform.services.jcr.impl.util.ISO9075;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -60,1088 +43,1038 @@
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+
/**
* <code>IndexingConfigurationImpl</code> implements a concrete indexing
* configuration.
*/
-public class IndexingConfigurationImpl implements IndexingConfiguration
-{
+public class IndexingConfigurationImpl implements IndexingConfiguration {
- /**
- * The logger instance for this class
- */
- private static final Logger log = LoggerFactory.getLogger(IndexingConfigurationImpl.class);
+ /**
+ * The logger instance for this class
+ */
+ private static final Logger log = LoggerFactory
+ .getLogger(IndexingConfigurationImpl.class);
- /**
- * The path factory instance.
- */
- //private static final PathFactory PATH_FACTORY = PathFactoryImpl.getInstance();
- /**
- * A namespace resolver for parsing QNames in the configuration.
- */
- private LocationFactory resolver;
+ /**
+ * The path factory instance.
+ */
+ // private static final PathFactory PATH_FACTORY =
+ // PathFactoryImpl.getInstance();
+ /**
+ * A namespace resolver for parsing QNames in the configuration.
+ */
+ private LocationFactory resolver;
- /**
- * The item state manager to retrieve additional item states.
- */
- private ItemDataConsumer ism;
+ /**
+ * The item state manager to retrieve additional item states.
+ */
+ private ItemDataConsumer ism;
- /**
- * A hierarchy resolver for the item state manager.
- */
- // private HierarchyManager hmgr;
- /**
- * The {@link IndexingRule}s inside this configuration.
- */
- private Map configElements = new HashMap();
+ /**
+ * A hierarchy resolver for the item state manager.
+ */
+ // private HierarchyManager hmgr;
+ /**
+ * The {@link IndexingRule}s inside this configuration.
+ */
+ private Map<InternalQName, List<IndexingRule>> configElements = new HashMap<InternalQName, List<IndexingRule>>();
- /**
- * The indexing aggregates inside this configuration.
- */
- private AggregateRule[] aggregateRules;
+ /**
+ * The indexing aggregates inside this configuration.
+ */
+ private AggregateRule[] aggregateRules;
- /**
- * The configured analyzers for indexing properties.
- */
- private Map analyzers = new HashMap();
+ /**
+ * The configured analyzers for indexing properties.
+ */
+ private Map<String, Analyzer> analyzers = new HashMap<String, Analyzer>();
- /**
- * {@inheritDoc}
- */
- public void init(Element config, QueryHandlerContext context, NamespaceMappings nsMappings) throws Exception
- {
- ism = context.getItemStateManager();
+ /**
+ * {@inheritDoc}
+ */
+ public void init(Element config, QueryHandlerContext context,
+ NamespaceMappings nsMappings) throws Exception {
+ ism = context.getItemStateManager();
- NamespaceAccessor nsResolver = new AdditionalNamespaceResolver(getNamespaces(config));
- resolver = new LocationFactory(nsResolver);//new ParsingNameResolver(NameFactoryImpl.getInstance(), nsResolver);
+ NamespaceAccessor nsResolver = new AdditionalNamespaceResolver(
+ getNamespaces(config));
+ resolver = new LocationFactory(nsResolver);// new
+ // ParsingNameResolver(NameFactoryImpl.getInstance(),
+ // nsResolver);
- NodeTypeDataManager ntReg = context.getNodeTypeDataManager();
- List<NodeTypeData> ntNames = ntReg.getAllNodeTypes();
- List idxAggregates = new ArrayList();
- NodeList indexingConfigs = config.getChildNodes();
- for (int i = 0; i < indexingConfigs.getLength(); i++)
- {
- Node configNode = indexingConfigs.item(i);
- if (configNode.getNodeName().equals("index-rule"))
- {
- IndexingRule element = new IndexingRule(configNode);
- // register under node type and all its sub types
- log.debug("Found rule '{}' for NodeType '{}'", element, element.getNodeTypeName());
- for (NodeTypeData nodeTypeData : ntNames)
- {
+ NodeTypeDataManager ntReg = context.getNodeTypeDataManager();
+ List<NodeTypeData> ntNames = ntReg.getAllNodeTypes();
+ List<AggregateRuleImpl> idxAggregates = new ArrayList<AggregateRuleImpl>();
+ NodeList indexingConfigs = config.getChildNodes();
+ for (int i = 0; i < indexingConfigs.getLength(); i++) {
+ Node configNode = indexingConfigs.item(i);
+ if (configNode.getNodeName().equals("index-rule")) {
+ IndexingRule element = new IndexingRule(configNode);
+ // register under node type and all its sub types
+ log.debug("Found rule '{}' for NodeType '{}'", element, element
+ .getNodeTypeName());
+ for (NodeTypeData nodeTypeData : ntNames) {
- if (ntReg.isNodeType(element.getNodeTypeName(), nodeTypeData.getName()))
- {
- List perNtConfig = (List)configElements.get(nodeTypeData);
- if (perNtConfig == null)
- {
- perNtConfig = new ArrayList();
- configElements.put(nodeTypeData, perNtConfig);
- }
- log.debug("Registering it for name '{}'", nodeTypeData);
- perNtConfig.add(new IndexingRule(element, nodeTypeData.getName()));
- }
- }
- }
- else if (configNode.getNodeName().equals("aggregate"))
- {
- idxAggregates.add(new AggregateRuleImpl(configNode, resolver, ism));
- }
- else if (configNode.getNodeName().equals("analyzers"))
- {
- NodeList childNodes = configNode.getChildNodes();
- for (int j = 0; j < childNodes.getLength(); j++)
- {
- Node analyzerNode = childNodes.item(j);
- if (analyzerNode.getNodeName().equals("analyzer"))
- {
- String analyzerClassName = analyzerNode.getAttributes().getNamedItem("class").getNodeValue();
- try
- {
- Class clazz = Class.forName(analyzerClassName);
- if (clazz == JcrStandartAnalyzer.class)
- {
- log.warn("Not allowed to configure " + JcrStandartAnalyzer.class.getName()
- + " for a property. " + "Using default analyzer for that property.");
- }
- else if (Analyzer.class.isAssignableFrom(clazz))
- {
- Analyzer analyzer = (Analyzer)clazz.newInstance();
- NodeList propertyChildNodes = analyzerNode.getChildNodes();
- for (int k = 0; k < propertyChildNodes.getLength(); k++)
- {
- Node propertyNode = propertyChildNodes.item(k);
- if (propertyNode.getNodeName().equals("property"))
- {
- // get property name
- InternalQName propName =
- resolver.parseJCRName(getTextContent(propertyNode)).getInternalName();
- String fieldName = nsMappings.translateName(propName);
- // set analyzer for the fulltext property fieldname
- int idx = fieldName.indexOf(':');
- fieldName =
- fieldName.substring(0, idx + 1) + FieldNames.FULLTEXT_PREFIX
- + fieldName.substring(idx + 1);
- Object prevAnalyzer = analyzers.put(fieldName, analyzer);
- if (prevAnalyzer != null)
- {
- log.warn("Property " + propName.getName()
- + " has been configured for multiple analyzers. "
- + " Last configured analyzer is used");
- }
- }
- }
- }
- else
- {
- log.warn("org.apache.lucene.analysis.Analyzer is not a superclass of " + analyzerClassName
- + ". Ignoring this configure analyzer");
- }
- }
- catch (ClassNotFoundException e)
- {
- log.warn("Analyzer class not found: " + analyzerClassName, e);
- }
- }
- }
- }
+ if (ntReg.isNodeType(element.getNodeTypeName(),
+ nodeTypeData.getName())) {
+ List<IndexingRule> perNtConfig = configElements
+ .get(nodeTypeData);
+ if (perNtConfig == null) {
+ perNtConfig = new ArrayList<IndexingRule>();
+ configElements.put(nodeTypeData.getName(),
+ perNtConfig);
+ }
+ log.debug("Registering it for name '{}'", nodeTypeData);
+ perNtConfig.add(new IndexingRule(element, nodeTypeData
+ .getName()));
+ }
+ }
+ } else if (configNode.getNodeName().equals("aggregate")) {
+ idxAggregates.add(new AggregateRuleImpl(configNode, resolver,
+ ism));
+ } else if (configNode.getNodeName().equals("analyzers")) {
+ NodeList childNodes = configNode.getChildNodes();
+ for (int j = 0; j < childNodes.getLength(); j++) {
+ Node analyzerNode = childNodes.item(j);
+ if (analyzerNode.getNodeName().equals("analyzer")) {
+ String analyzerClassName = analyzerNode.getAttributes()
+ .getNamedItem("class").getNodeValue();
+ try {
+ Class clazz = Class.forName(analyzerClassName);
+ if (clazz == JcrStandartAnalyzer.class) {
+ log
+ .warn("Not allowed to configure "
+ + JcrStandartAnalyzer.class
+ .getName()
+ + " for a property. "
+ + "Using default analyzer for that property.");
+ } else if (Analyzer.class.isAssignableFrom(clazz)) {
+ Analyzer analyzer = (Analyzer) clazz
+ .newInstance();
+ NodeList propertyChildNodes = analyzerNode
+ .getChildNodes();
+ for (int k = 0; k < propertyChildNodes
+ .getLength(); k++) {
+ Node propertyNode = propertyChildNodes
+ .item(k);
+ if (propertyNode.getNodeName().equals(
+ "property")) {
+ // get property name
+ InternalQName propName = resolver
+ .parseJCRName(
+ getTextContent(propertyNode))
+ .getInternalName();
+ String fieldName = nsMappings
+ .translateName(propName);
+ // set analyzer for the fulltext
+ // property fieldname
+ int idx = fieldName.indexOf(':');
+ fieldName = fieldName.substring(0,
+ idx + 1)
+ + FieldNames.FULLTEXT_PREFIX
+ + fieldName.substring(idx + 1);
+ Object prevAnalyzer = analyzers.put(
+ fieldName, analyzer);
+ if (prevAnalyzer != null) {
+ log
+ .warn("Property "
+ + propName
+ .getName()
+ + " has been configured for multiple analyzers. "
+ + " Last configured analyzer is used");
+ }
+ }
+ }
+ } else {
+ log
+ .warn("org.apache.lucene.analysis.Analyzer is not a superclass of "
+ + analyzerClassName
+ + ". Ignoring this configure analyzer");
+ }
+ } catch (ClassNotFoundException e) {
+ log.warn("Analyzer class not found: "
+ + analyzerClassName, e);
+ }
+ }
+ }
+ }
- }
- aggregateRules = (AggregateRule[])idxAggregates.toArray(new AggregateRule[idxAggregates.size()]);
- }
+ }
+ aggregateRules = idxAggregates.toArray(new AggregateRule[idxAggregates
+ .size()]);
+ }
- /**
- * Returns the configured indexing aggregate rules or <code>null</code> if
- * none exist.
- *
- * @return the configured rules or <code>null</code> if none exist.
- */
- public AggregateRule[] getAggregateRules()
- {
- return aggregateRules;
- }
+ /**
+ * Returns the configured indexing aggregate rules or <code>null</code> if
+ * none exist.
+ *
+ * @return the configured rules or <code>null</code> if none exist.
+ */
+ public AggregateRule[] getAggregateRules() {
+ return aggregateRules;
+ }
- /**
- * Returns <code>true</code> if the property with the given name is fulltext
- * indexed according to this configuration.
- *
- * @param state the node state.
- * @param propertyName the name of a property.
- * @return <code>true</code> if the property is fulltext indexed;
- * <code>false</code> otherwise.
- */
- public boolean isIndexed(NodeData state, InternalQName propertyName)
- {
- IndexingRule rule = getApplicableIndexingRule(state);
- if (rule != null)
- {
- return rule.isIndexed(propertyName);
- }
- // none of the configs matches -> index property
- return true;
- }
+ /**
+ * Returns <code>true</code> if the property with the given name is fulltext
+ * indexed according to this configuration.
+ *
+ * @param state
+ * the node state.
+ * @param propertyName
+ * the name of a property.
+ * @return <code>true</code> if the property is fulltext indexed;
+ * <code>false</code> otherwise.
+ */
+ public boolean isIndexed(NodeData state, InternalQName propertyName) {
+ IndexingRule rule = getApplicableIndexingRule(state);
+ if (rule != null) {
+ return rule.isIndexed(propertyName);
+ }
+ // none of the configs matches -> index property
+ return true;
+ }
- /**
- * Returns the boost value for the given property name. If there is no
- * configuration entry for the property name the {@link #DEFAULT_BOOST} is
- * returned.
- *
- * @param state the node state.
- * @param propertyName the name of a property.
- * @return the boost value for the property.
- */
- public float getPropertyBoost(NodeData state, InternalQName propertyName)
- {
- IndexingRule rule = getApplicableIndexingRule(state);
- if (rule != null)
- {
- return rule.getBoost(propertyName);
- }
- return DEFAULT_BOOST;
- }
+ /**
+ * Returns the boost value for the given property name. If there is no
+ * configuration entry for the property name the {@link #DEFAULT_BOOST} is
+ * returned.
+ *
+ * @param state
+ * the node state.
+ * @param propertyName
+ * the name of a property.
+ * @return the boost value for the property.
+ */
+ public float getPropertyBoost(NodeData state, InternalQName propertyName) {
+ IndexingRule rule = getApplicableIndexingRule(state);
+ if (rule != null) {
+ return rule.getBoost(propertyName);
+ }
+ return DEFAULT_BOOST;
+ }
- /**
- * Returns the boost for the node scope fulltext index field.
- *
- * @param state the node state.
- * @return the boost for the node scope fulltext index field.
- */
- public float getNodeBoost(NodeData state)
- {
- IndexingRule rule = getApplicableIndexingRule(state);
- if (rule != null)
- {
- return rule.getNodeBoost();
- }
- return DEFAULT_BOOST;
- }
+ /**
+ * Returns the boost for the node scope fulltext index field.
+ *
+ * @param state
+ * the node state.
+ * @return the boost for the node scope fulltext index field.
+ */
+ public float getNodeBoost(NodeData state) {
+ IndexingRule rule = getApplicableIndexingRule(state);
+ if (rule != null) {
+ return rule.getNodeBoost();
+ }
+ return DEFAULT_BOOST;
+ }
- /**
- * Returns <code>true</code> if the property with the given name should be
- * included in the node scope fulltext index. If there is not configuration
- * entry for that propery <code>false</code> is returned.
- *
- * @param state the node state.
- * @param propertyName the name of a property.
- * @return <code>true</code> if the property should be included in the node
- * scope fulltext index.
- */
- public boolean isIncludedInNodeScopeIndex(NodeData state, InternalQName propertyName)
- {
- IndexingRule rule = getApplicableIndexingRule(state);
- if (rule != null)
- {
- return rule.isIncludedInNodeScopeIndex(propertyName);
- }
- // none of the config elements matched -> default is to include
- return true;
- }
+ /**
+ * Returns <code>true</code> if the property with the given name should be
+ * included in the node scope fulltext index. If there is not configuration
+ * entry for that propery <code>false</code> is returned.
+ *
+ * @param state
+ * the node state.
+ * @param propertyName
+ * the name of a property.
+ * @return <code>true</code> if the property should be included in the node
+ * scope fulltext index.
+ */
+ public boolean isIncludedInNodeScopeIndex(NodeData state,
+ InternalQName propertyName) {
+ IndexingRule rule = getApplicableIndexingRule(state);
+ if (rule != null) {
+ return rule.isIncludedInNodeScopeIndex(propertyName);
+ }
+ // none of the config elements matched -> default is to include
+ return true;
+ }
- /**
- * Returns <code>true</code> if the content of the property with the given
- * name should show up in an excerpt. If there is no configuration entry for
- * that property <code>true</code> is returned.
- *
- * @param state the node state.
- * @param propertyName the name of a property.
- * @return <code>true</code> if the content of the property should be
- * included in an excerpt; <code>false</code> otherwise.
- */
- public boolean useInExcerpt(NodeData state, InternalQName propertyName)
- {
- IndexingRule rule = getApplicableIndexingRule(state);
- if (rule != null)
- {
- return rule.useInExcerpt(propertyName);
- }
- // none of the config elements matched -> default is to include
- return true;
- }
+ /**
+ * Returns <code>true</code> if the content of the property with the given
+ * name should show up in an excerpt. If there is no configuration entry for
+ * that property <code>true</code> is returned.
+ *
+ * @param state
+ * the node state.
+ * @param propertyName
+ * the name of a property.
+ * @return <code>true</code> if the content of the property should be
+ * included in an excerpt; <code>false</code> otherwise.
+ */
+ public boolean useInExcerpt(NodeData state, InternalQName propertyName) {
+ IndexingRule rule = getApplicableIndexingRule(state);
+ if (rule != null) {
+ return rule.useInExcerpt(propertyName);
+ }
+ // none of the config elements matched -> default is to include
+ return true;
+ }
- /**
- * Returns the analyzer configured for the property with this fieldName
- * (the string representation ,JCR-style name, of the given <code>InternalQName</code>
- * prefixed with <code>FieldNames.FULLTEXT_PREFIX</code>)),
- * and <code>null</code> if none is configured, or the configured analyzer
- * cannot be found. If <code>null</code> is returned, the default Analyzer
- * is used.
- *
- * @param fieldName the string representation ,JCR-style name, of the given <code>InternalQName</code>
- * prefixed with <code>FieldNames.FULLTEXT_PREFIX</code>))
- * @return the <code>analyzer</code> to use for indexing this property
- */
- public Analyzer getPropertyAnalyzer(String fieldName)
- {
- if (analyzers.containsKey(fieldName))
- {
- return (Analyzer)analyzers.get(fieldName);
- }
- return null;
- }
+ /**
+ * Returns the analyzer configured for the property with this fieldName (the
+ * string representation ,JCR-style name, of the given
+ * <code>InternalQName</code> prefixed with
+ * <code>FieldNames.FULLTEXT_PREFIX</code>)), and <code>null</code> if none
+ * is configured, or the configured analyzer cannot be found. If
+ * <code>null</code> is returned, the default Analyzer is used.
+ *
+ * @param fieldName
+ * the string representation ,JCR-style name, of the given
+ * <code>InternalQName</code> prefixed with
+ * <code>FieldNames.FULLTEXT_PREFIX</code>))
+ * @return the <code>analyzer</code> to use for indexing this property
+ */
+ public Analyzer getPropertyAnalyzer(String fieldName) {
+ if (analyzers.containsKey(fieldName)) {
+ return analyzers.get(fieldName);
+ }
+ return null;
+ }
- //---------------------------------< internal >-----------------------------
+ // ---------------------------------< internal
+ // >-----------------------------
- /**
- * Returns the first indexing rule that applies to the given node
- * <code>state</code>.
- *
- * @param state a node state.
- * @return the indexing rule or <code>null</code> if none applies.
- */
- private IndexingRule getApplicableIndexingRule(NodeData state)
- {
- List rules = null;
- List r = (List)configElements.get(state.getPrimaryTypeName());
- if (r != null)
- {
- rules = new ArrayList();
- rules.addAll(r);
- }
+ /**
+ * Returns the first indexing rule that applies to the given node
+ * <code>state</code>.
+ *
+ * @param state
+ * a node state.
+ * @return the indexing rule or <code>null</code> if none applies.
+ */
+ private IndexingRule getApplicableIndexingRule(NodeData state) {
+ List<IndexingRule> rules = null;
+ List<IndexingRule> r = configElements.get(state.getPrimaryTypeName());
+ if (r != null) {
+ rules = new ArrayList<IndexingRule>();
+ rules.addAll(r);
+ }
- Iterator it = Arrays.asList(state.getMixinTypeNames()).iterator();
- while (it.hasNext())
- {
- r = (List)configElements.get(it.next());
- if (r != null)
- {
- if (rules == null)
- {
- rules = new ArrayList();
- }
- rules.addAll(r);
- }
- }
+ InternalQName[] mixTypes = state.getMixinTypeNames();
+ for (InternalQName mixType : mixTypes) {
+ r = configElements.get(mixType);
+ if (r != null) {
+ if (rules == null) {
+ rules = new ArrayList<IndexingRule>();
+ }
+ rules.addAll(r);
+ }
+ }
- if (rules != null)
- {
- it = rules.iterator();
- while (it.hasNext())
- {
- IndexingRule ir = (IndexingRule)it.next();
- if (ir.appliesTo(state))
- {
- return ir;
- }
- }
- }
+ if (rules != null) {
+ for (IndexingRule ir : rules) {
+ if (ir.appliesTo(state)) {
+ return ir;
+ }
+ }
+ }
- // no applicable rule
- return null;
- }
+ // no applicable rule
+ return null;
+ }
- /**
- * Returns the namespaces declared on the <code>node</code>.
- *
- * @param node a DOM node.
- * @return the namespaces
- */
- private Properties getNamespaces(Node node)
- {
- Properties namespaces = new Properties();
- NamedNodeMap attributes = node.getAttributes();
- for (int i = 0; i < attributes.getLength(); i++)
- {
- Attr attribute = (Attr)attributes.item(i);
- if (attribute.getName().startsWith("xmlns:"))
- {
- namespaces.setProperty(attribute.getName().substring(6), attribute.getValue());
- }
- }
- return namespaces;
- }
+ /**
+ * Returns the namespaces declared on the <code>node</code>.
+ *
+ * @param node
+ * a DOM node.
+ * @return the namespaces
+ */
+ private Properties getNamespaces(Node node) {
+ Properties namespaces = new Properties();
+ NamedNodeMap attributes = node.getAttributes();
+ for (int i = 0; i < attributes.getLength(); i++) {
+ Attr attribute = (Attr) attributes.item(i);
+ if (attribute.getName().startsWith("xmlns:")) {
+ namespaces.setProperty(attribute.getName().substring(6),
+ attribute.getValue());
+ }
+ }
+ return namespaces;
+ }
- /**
- * Creates property configurations defined in the <code>config</code>.
- *
- * @param config the fulltext indexing configuration.
- * @param propConfigs will be filled with exact <code>InternalQName</code> to
- * <code>PropertyConfig</code> mappings.
- * @param namePatterns will be filled with <code>NamePattern</code>s.
- * @throws IllegalNameException if the node type name contains illegal
- * characters.
- * @throws RepositoryException
- */
- private void createPropertyConfigs(Node config, Map propConfigs, List namePatterns) throws IllegalNameException,
- RepositoryException
- {
- NodeList childNodes = config.getChildNodes();
- for (int i = 0; i < childNodes.getLength(); i++)
- {
- Node n = childNodes.item(i);
- if (n.getNodeName().equals("property"))
- {
- NamedNodeMap attributes = n.getAttributes();
- // get boost value
- float boost = 1.0f;
- Node boostAttr = attributes.getNamedItem("boost");
- if (boostAttr != null)
- {
- try
- {
- boost = Float.parseFloat(boostAttr.getNodeValue());
- }
- catch (NumberFormatException e)
- {
- // use default
- }
- }
+ /**
+ * Creates property configurations defined in the <code>config</code>.
+ *
+ * @param config
+ * the fulltext indexing configuration.
+ * @param propConfigs
+ * will be filled with exact <code>InternalQName</code> to
+ * <code>PropertyConfig</code> mappings.
+ * @param namePatterns
+ * will be filled with <code>NamePattern</code>s.
+ * @throws IllegalNameException
+ * if the node type name contains illegal characters.
+ * @throws RepositoryException
+ */
+ private void createPropertyConfigs(Node config,
+ Map<InternalQName, PropertyConfig> propConfigs,
+ List<NamePattern> namePatterns) throws IllegalNameException,
+ RepositoryException {
+ NodeList childNodes = config.getChildNodes();
+ for (int i = 0; i < childNodes.getLength(); i++) {
+ Node n = childNodes.item(i);
+ if (n.getNodeName().equals("property")) {
+ NamedNodeMap attributes = n.getAttributes();
+ // get boost value
+ float boost = 1.0f;
+ Node boostAttr = attributes.getNamedItem("boost");
+ if (boostAttr != null) {
+ try {
+ boost = Float.parseFloat(boostAttr.getNodeValue());
+ } catch (NumberFormatException e) {
+ // use default
+ }
+ }
- // get nodeScopeIndex flag
- boolean nodeScopeIndex = true;
- Node nsIndex = attributes.getNamedItem("nodeScopeIndex");
- if (nsIndex != null)
- {
- nodeScopeIndex = Boolean.valueOf(nsIndex.getNodeValue()).booleanValue();
- }
+ // get nodeScopeIndex flag
+ boolean nodeScopeIndex = true;
+ Node nsIndex = attributes.getNamedItem("nodeScopeIndex");
+ if (nsIndex != null) {
+ nodeScopeIndex = Boolean.valueOf(nsIndex.getNodeValue())
+ .booleanValue();
+ }
- // get isRegexp flag
- boolean isRegexp = false;
- Node regexp = attributes.getNamedItem("isRegexp");
- if (regexp != null)
- {
- isRegexp = Boolean.valueOf(regexp.getNodeValue()).booleanValue();
- }
+ // get isRegexp flag
+ boolean isRegexp = false;
+ Node regexp = attributes.getNamedItem("isRegexp");
+ if (regexp != null) {
+ isRegexp = Boolean.valueOf(regexp.getNodeValue())
+ .booleanValue();
+ }
- // get useInExcerpt flag
- boolean useInExcerpt = true;
- Node excerpt = attributes.getNamedItem("useInExcerpt");
- if (excerpt != null)
- {
- useInExcerpt = Boolean.valueOf(excerpt.getNodeValue()).booleanValue();
- }
+ // get useInExcerpt flag
+ boolean useInExcerpt = true;
+ Node excerpt = attributes.getNamedItem("useInExcerpt");
+ if (excerpt != null) {
+ useInExcerpt = Boolean.valueOf(excerpt.getNodeValue())
+ .booleanValue();
+ }
- PropertyConfig pc = new PropertyConfig(boost, nodeScopeIndex, useInExcerpt);
+ PropertyConfig pc = new PropertyConfig(boost, nodeScopeIndex,
+ useInExcerpt);
- if (isRegexp)
- {
- namePatterns.add(new NamePattern(getTextContent(n), pc, resolver));
- }
- else
- {
- InternalQName propName = resolver.parseJCRName(getTextContent(n)).getInternalName();
- propConfigs.put(propName, pc);
- }
- }
- }
- }
+ if (isRegexp) {
+ namePatterns.add(new NamePattern(getTextContent(n), pc,
+ resolver));
+ } else {
+ InternalQName propName = resolver.parseJCRName(
+ getTextContent(n)).getInternalName();
+ propConfigs.put(propName, pc);
+ }
+ }
+ }
+ }
- /**
- * Gets the condition expression from the configuration.
- *
- * @param config the config node.
- * @return the condition expression or <code>null</code> if there is no
- * condition set on the <code>config</code>.
- * @throws MalformedPathException if the condition string is malformed.
- * @throws IllegalNameException if a name contains illegal characters.
- * @throws RepositoryException
- */
- private PathExpression getCondition(Node config) throws IllegalNameException, RepositoryException
- {
- Node conditionAttr = config.getAttributes().getNamedItem("condition");
- if (conditionAttr == null)
- {
- return null;
- }
- String conditionString = conditionAttr.getNodeValue();
- int idx;
- int axis;
- InternalQName elementTest = null;
- InternalQName nameTest = null;
- InternalQName propertyName;
- String propertyValue;
+ /**
+ * Gets the condition expression from the configuration.
+ *
+ * @param config
+ * the config node.
+ * @return the condition expression or <code>null</code> if there is no
+ * condition set on the <code>config</code>.
+ * @throws MalformedPathException
+ * if the condition string is malformed.
+ * @throws IllegalNameException
+ * if a name contains illegal characters.
+ * @throws RepositoryException
+ */
+ private PathExpression getCondition(Node config)
+ throws IllegalNameException, RepositoryException {
+ Node conditionAttr = config.getAttributes().getNamedItem("condition");
+ if (conditionAttr == null) {
+ return null;
+ }
+ String conditionString = conditionAttr.getNodeValue();
+ int idx;
+ int axis;
+ InternalQName elementTest = null;
+ InternalQName nameTest = null;
+ InternalQName propertyName;
+ String propertyValue;
- // parse axis
- if (conditionString.startsWith("ancestor::"))
- {
- axis = PathExpression.ANCESTOR;
- idx = "ancestor::".length();
- }
- else if (conditionString.startsWith("parent::"))
- {
- axis = PathExpression.PARENT;
- idx = "parent::".length();
- }
- else if (conditionString.startsWith("@"))
- {
- axis = PathExpression.SELF;
- idx = "@".length();
- }
- else
- {
- axis = PathExpression.CHILD;
- idx = 0;
- }
+ // parse axis
+ if (conditionString.startsWith("ancestor::")) {
+ axis = PathExpression.ANCESTOR;
+ idx = "ancestor::".length();
+ } else if (conditionString.startsWith("parent::")) {
+ axis = PathExpression.PARENT;
+ idx = "parent::".length();
+ } else if (conditionString.startsWith("@")) {
+ axis = PathExpression.SELF;
+ idx = "@".length();
+ } else {
+ axis = PathExpression.CHILD;
+ idx = 0;
+ }
- try
- {
- if (conditionString.startsWith("element(", idx))
- {
- int colon = conditionString.indexOf(',', idx + "element(".length());
- String name = conditionString.substring(idx + "element(".length(), colon).trim();
- if (!name.equals("*"))
- {
- nameTest = resolver.parseJCRName(ISO9075.decode(name)).getInternalName();
- }
- idx = conditionString.indexOf(")/@", colon);
- String type = conditionString.substring(colon + 1, idx).trim();
- elementTest = resolver.parseJCRName(ISO9075.decode(type)).getInternalName();
- idx += ")/@".length();
- }
- else
- {
- if (axis == PathExpression.ANCESTOR || axis == PathExpression.CHILD || axis == PathExpression.PARENT)
- {
- // simple name test
- String name = conditionString.substring(idx, conditionString.indexOf('/', idx));
- if (!name.equals("*"))
- {
- nameTest = resolver.parseJCRName(ISO9075.decode(name)).getInternalName();
- }
- idx += name.length() + "/@".length();
- }
- }
+ try {
+ if (conditionString.startsWith("element(", idx)) {
+ int colon = conditionString.indexOf(',', idx
+ + "element(".length());
+ String name = conditionString.substring(
+ idx + "element(".length(), colon).trim();
+ if (!name.equals("*")) {
+ nameTest = resolver.parseJCRName(ISO9075.decode(name))
+ .getInternalName();
+ }
+ idx = conditionString.indexOf(")/@", colon);
+ String type = conditionString.substring(colon + 1, idx).trim();
+ elementTest = resolver.parseJCRName(ISO9075.decode(type))
+ .getInternalName();
+ idx += ")/@".length();
+ } else {
+ if (axis == PathExpression.ANCESTOR
+ || axis == PathExpression.CHILD
+ || axis == PathExpression.PARENT) {
+ // simple name test
+ String name = conditionString.substring(idx,
+ conditionString.indexOf('/', idx));
+ if (!name.equals("*")) {
+ nameTest = resolver.parseJCRName(ISO9075.decode(name))
+ .getInternalName();
+ }
+ idx += name.length() + "/@".length();
+ }
+ }
- // parse property name
- int eq = conditionString.indexOf('=', idx);
- String name = conditionString.substring(idx, eq).trim();
- propertyName = resolver.parseJCRName(ISO9075.decode(name)).getInternalName();
+ // parse property name
+ int eq = conditionString.indexOf('=', idx);
+ String name = conditionString.substring(idx, eq).trim();
+ propertyName = resolver.parseJCRName(ISO9075.decode(name))
+ .getInternalName();
- // parse string value
- int quote = conditionString.indexOf('\'', eq) + 1;
- propertyValue = conditionString.substring(quote, conditionString.indexOf('\'', quote));
- }
- catch (IndexOutOfBoundsException e)
- {
- throw new RepositoryException(conditionString);
- }
+ // parse string value
+ int quote = conditionString.indexOf('\'', eq) + 1;
+ propertyValue = conditionString.substring(quote, conditionString
+ .indexOf('\'', quote));
+ } catch (IndexOutOfBoundsException e) {
+ throw new RepositoryException(conditionString);
+ }
- return new PathExpression(axis, elementTest, nameTest, propertyName, propertyValue);
- }
+ return new PathExpression(axis, elementTest, nameTest, propertyName,
+ propertyValue);
+ }
- /**
- * @param node a node.
- * @return the text content of the <code>node</code>.
- */
- private static String getTextContent(Node node)
- {
- StringBuffer content = new StringBuffer();
- NodeList nodes = node.getChildNodes();
- for (int i = 0; i < nodes.getLength(); i++)
- {
- Node n = nodes.item(i);
- if (n.getNodeType() == Node.TEXT_NODE)
- {
- content.append(((CharacterData)n).getData());
- }
- }
- return content.toString();
- }
+ /**
+ * @param node
+ * a node.
+ * @return the text content of the <code>node</code>.
+ */
+ private static String getTextContent(Node node) {
+ StringBuffer content = new StringBuffer();
+ NodeList nodes = node.getChildNodes();
+ for (int i = 0; i < nodes.getLength(); i++) {
+ Node n = nodes.item(i);
+ if (n.getNodeType() == Node.TEXT_NODE) {
+ content.append(((CharacterData) n).getData());
+ }
+ }
+ return content.toString();
+ }
- /**
- * A property name pattern.
- */
- private static final class NamePattern
- {
+ /**
+ * A property name pattern.
+ */
+ private static final class NamePattern {
- /**
- * The pattern to match.
- */
- private final Pattern pattern;
+ /**
+ * The pattern to match.
+ */
+ private final Pattern pattern;
- /**
- * The associated configuration.
- */
- private final PropertyConfig config;
+ /**
+ * The associated configuration.
+ */
+ private final PropertyConfig config;
- /**
- * Creates a new name pattern.
- *
- * @param pattern the pattern as read from the configuration file.
- * @param config the associated configuration.
- * @param resolver a namespace resolver for parsing name from the
- * configuration.
- * @throws IllegalNameException if the prefix of the name pattern is
- * illegal.
- * @throws RepositoryException
- */
- private NamePattern(String pattern, PropertyConfig config, LocationFactory resolver) throws IllegalNameException,
- RepositoryException
- {
- String uri = Constants.NS_DEFAULT_URI;
- String localPattern = pattern;
- int idx = pattern.indexOf(':');
- if (idx != -1)
- {
- // use a dummy local name to get namespace uri
- uri = resolver.parseJCRName(pattern.substring(0, idx) + ":a").getNamespace();
- localPattern = pattern.substring(idx + 1);
- }
- this.pattern = Pattern.name(uri, localPattern);
- this.config = config;
- }
+ /**
+ * Creates a new name pattern.
+ *
+ * @param pattern
+ * the pattern as read from the configuration file.
+ * @param config
+ * the associated configuration.
+ * @param resolver
+ * a namespace resolver for parsing name from the
+ * configuration.
+ * @throws IllegalNameException
+ * if the prefix of the name pattern is illegal.
+ * @throws RepositoryException
+ */
+ private NamePattern(String pattern, PropertyConfig config,
+ LocationFactory resolver) throws IllegalNameException,
+ RepositoryException {
+ String uri = Constants.NS_DEFAULT_URI;
+ String localPattern = pattern;
+ int idx = pattern.indexOf(':');
+ if (idx != -1) {
+ // use a dummy local name to get namespace uri
+ uri = resolver.parseJCRName(pattern.substring(0, idx) + ":a")
+ .getNamespace();
+ localPattern = pattern.substring(idx + 1);
+ }
+ this.pattern = Pattern.name(uri, localPattern);
+ this.config = config;
+ }
- /**
- * @param path the path to match.
- * @return <code>true</code> if <code>path</code> matches this name
- * pattern; <code>false</code> otherwise.
- */
- boolean matches(QPath path)
- {
- return pattern.match(path).isFullMatch();
- }
+ /**
+ * @param path
+ * the path to match.
+ * @return <code>true</code> if <code>path</code> matches this name
+ * pattern; <code>false</code> otherwise.
+ */
+ boolean matches(QPath path) {
+ return pattern.match(path).isFullMatch();
+ }
- /**
- * @return the property configuration for this name pattern.
- */
- PropertyConfig getConfig()
- {
- return config;
- }
- }
+ /**
+ * @return the property configuration for this name pattern.
+ */
+ PropertyConfig getConfig() {
+ return config;
+ }
+ }
- private class IndexingRule
- {
+ private class IndexingRule {
- /**
- * The node type of this fulltext indexing rule.
- */
- private final InternalQName nodeTypeName;
+ /**
+ * The node type of this fulltext indexing rule.
+ */
+ private final InternalQName nodeTypeName;
- /**
- * Map of {@link PropertyConfig}. Key=InternalQName of property.
- */
- private final Map propConfigs;
+ /**
+ * Map of {@link PropertyConfig}. Key=InternalQName of property.
+ */
+ private final Map<InternalQName, PropertyConfig> propConfigs;
- /**
- * List of {@link NamePattern}s.
- */
- private final List namePatterns;
+ /**
+ * List of {@link NamePattern}s.
+ */
+ private final List<NamePattern> namePatterns;
- /**
- * An expression based on a relative path.
- */
- private final PathExpression condition;
+ /**
+ * An expression based on a relative path.
+ */
+ private final PathExpression condition;
- /**
- * The boost value for this config element.
- */
- private final float boost;
+ /**
+ * The boost value for this config element.
+ */
+ private final float boost;
- /**
- * Creates a new indexing rule base on an existing one, but for a
- * different node type name.
- *
- * @param original the existing rule.
- * @param nodeTypeName the node type name for the rule.
- */
- IndexingRule(IndexingRule original, InternalQName nodeTypeName)
- {
- this.nodeTypeName = nodeTypeName;
- this.propConfigs = original.propConfigs;
- this.namePatterns = original.namePatterns;
- this.condition = original.condition;
- this.boost = original.boost;
- }
+ /**
+ * Creates a new indexing rule base on an existing one, but for a
+ * different node type name.
+ *
+ * @param original
+ * the existing rule.
+ * @param nodeTypeName
+ * the node type name for the rule.
+ */
+ IndexingRule(IndexingRule original, InternalQName nodeTypeName) {
+ this.nodeTypeName = nodeTypeName;
+ this.propConfigs = original.propConfigs;
+ this.namePatterns = original.namePatterns;
+ this.condition = original.condition;
+ this.boost = original.boost;
+ }
- /**
- *
- * @param config the configuration for this rule.
- * @throws MalformedPathException if the condition expression is malformed.
- * @throws IllegalNameException if a name contains illegal characters.
- * @throws RepositoryException
- */
- IndexingRule(Node config) throws IllegalNameException, RepositoryException
- {
- this.nodeTypeName = getNodeTypeName(config);
- this.condition = getCondition(config);
- this.boost = getNodeBoost(config);
- this.propConfigs = new HashMap();
- this.namePatterns = new ArrayList();
- createPropertyConfigs(config, propConfigs, namePatterns);
- }
+ /**
+ *
+ * @param config
+ * the configuration for this rule.
+ * @throws MalformedPathException
+ * if the condition expression is malformed.
+ * @throws IllegalNameException
+ * if a name contains illegal characters.
+ * @throws RepositoryException
+ */
+ IndexingRule(Node config) throws IllegalNameException,
+ RepositoryException {
+ this.nodeTypeName = getNodeTypeName(config);
+ this.condition = getCondition(config);
+ this.boost = getNodeBoost(config);
+ this.propConfigs = new HashMap<InternalQName, PropertyConfig>();
+ this.namePatterns = new ArrayList<NamePattern>();
+ createPropertyConfigs(config, propConfigs, namePatterns);
+ }
- /**
- * Returns the name of the node type where this rule applies to.
- *
- * @return name of the node type.
- */
- public InternalQName getNodeTypeName()
- {
- return nodeTypeName;
- }
+ /**
+ * Returns the name of the node type where this rule applies to.
+ *
+ * @return name of the node type.
+ */
+ public InternalQName getNodeTypeName() {
+ return nodeTypeName;
+ }
- /**
- * @return the value for the node boost.
- */
- public float getNodeBoost()
- {
- return boost;
- }
+ /**
+ * @return the value for the node boost.
+ */
+ public float getNodeBoost() {
+ return boost;
+ }
- /**
- * Returns <code>true</code> if the property with the given name is
- * indexed according to this rule.
- *
- * @param propertyName the name of a property.
- * @return <code>true</code> if the property is indexed;
- * <code>false</code> otherwise.
- */
- public boolean isIndexed(InternalQName propertyName)
- {
- return getConfig(propertyName) != null;
- }
+ /**
+ * Returns <code>true</code> if the property with the given name is
+ * indexed according to this rule.
+ *
+ * @param propertyName
+ * the name of a property.
+ * @return <code>true</code> if the property is indexed;
+ * <code>false</code> otherwise.
+ */
+ public boolean isIndexed(InternalQName propertyName) {
+ return getConfig(propertyName) != null;
+ }
- /**
- * Returns the boost value for the given property name. If there is no
- * configuration entry for the property name the default boost value is
- * returned.
- *
- * @param propertyName the name of a property.
- * @return the boost value for the property.
- */
- public float getBoost(InternalQName propertyName)
- {
- PropertyConfig config = getConfig(propertyName);
- if (config != null)
- {
- return config.boost;
- }
- else
- {
- return DEFAULT_BOOST;
- }
- }
+ /**
+ * Returns the boost value for the given property name. If there is no
+ * configuration entry for the property name the default boost value is
+ * returned.
+ *
+ * @param propertyName
+ * the name of a property.
+ * @return the boost value for the property.
+ */
+ public float getBoost(InternalQName propertyName) {
+ PropertyConfig config = getConfig(propertyName);
+ if (config != null) {
+ return config.boost;
+ } else {
+ return DEFAULT_BOOST;
+ }
+ }
- /**
- * Returns <code>true</code> if the property with the given name should
- * be included in the node scope fulltext index. If there is no
- * configuration entry for that propery <code>false</code> is returned.
- *
- * @param propertyName the name of a property.
- * @return <code>true</code> if the property should be included in the
- * node scope fulltext index.
- */
- public boolean isIncludedInNodeScopeIndex(InternalQName propertyName)
- {
- PropertyConfig config = getConfig(propertyName);
- if (config != null)
- {
- return config.nodeScopeIndex;
- }
- else
- {
- return false;
- }
- }
+ /**
+ * Returns <code>true</code> if the property with the given name should
+ * be included in the node scope fulltext index. If there is no
+ * configuration entry for that propery <code>false</code> is returned.
+ *
+ * @param propertyName
+ * the name of a property.
+ * @return <code>true</code> if the property should be included in the
+ * node scope fulltext index.
+ */
+ public boolean isIncludedInNodeScopeIndex(InternalQName propertyName) {
+ PropertyConfig config = getConfig(propertyName);
+ if (config != null) {
+ return config.nodeScopeIndex;
+ } else {
+ return false;
+ }
+ }
- /**
- * Returns <code>true</code> if the content of the property with the
- * given name should show up in an excerpt. If there is no configuration
- * entry for that property <code>true</code> is returned.
- *
- * @param propertyName the name of a property.
- * @return <code>true</code> if the content of the property should be
- * included in an excerpt; <code>false</code> otherwise.
- */
- public boolean useInExcerpt(InternalQName propertyName)
- {
- PropertyConfig config = getConfig(propertyName);
- if (config != null)
- {
- return config.useInExcerpt;
- }
- else
- {
- return true;
- }
- }
+ /**
+ * Returns <code>true</code> if the content of the property with the
+ * given name should show up in an excerpt. If there is no configuration
+ * entry for that property <code>true</code> is returned.
+ *
+ * @param propertyName
+ * the name of a property.
+ * @return <code>true</code> if the content of the property should be
+ * included in an excerpt; <code>false</code> otherwise.
+ */
+ public boolean useInExcerpt(InternalQName propertyName) {
+ PropertyConfig config = getConfig(propertyName);
+ if (config != null) {
+ return config.useInExcerpt;
+ } else {
+ return true;
+ }
+ }
- /**
- * Returns <code>true</code> if this rule applies to the given node
- * <code>state</code>.
- *
- * @param state the state to check.
- * @return <code>true</code> the rule applies to the given node;
- * <code>false</code> otherwise.
- */
- public boolean appliesTo(NodeData state)
- {
- if (!nodeTypeName.equals(state.getPrimaryTypeName()))
- {
- return false;
- }
- if (condition == null)
- {
- return true;
- }
- else
- {
- return condition.evaluate(state);
- }
- }
+ /**
+ * Returns <code>true</code> if this rule applies to the given node
+ * <code>state</code>.
+ *
+ * @param state
+ * the state to check.
+ * @return <code>true</code> the rule applies to the given node;
+ * <code>false</code> otherwise.
+ */
+ public boolean appliesTo(NodeData state) {
+ if (!nodeTypeName.equals(state.getPrimaryTypeName())) {
+ return false;
+ }
+ if (condition == null) {
+ return true;
+ } else {
+ return condition.evaluate(state);
+ }
+ }
- //-------------------------< internal >---------------------------------
+ // -------------------------< internal
+ // >---------------------------------
- /**
- * @param propertyName name of a property.
- * @return the property configuration or <code>null</code> if this
- * indexing rule does not contain a configuration for the given
- * property.
- */
- private PropertyConfig getConfig(InternalQName propertyName)
- {
- PropertyConfig config = (PropertyConfig)propConfigs.get(propertyName);
- if (config != null)
- {
- return config;
- }
- else if (namePatterns.size() > 0)
- {
- QPath path = new QPath(new QPathEntry[]{new QPathEntry(propertyName, 1)});
- // check patterns
- for (Iterator it = namePatterns.iterator(); it.hasNext();)
- {
- NamePattern np = (NamePattern)it.next();
- if (np.matches(path))
- {
- return np.getConfig();
- }
- }
- }
- return null;
- }
+ /**
+ * @param propertyName
+ * name of a property.
+ * @return the property configuration or <code>null</code> if this
+ * indexing rule does not contain a configuration for the given
+ * property.
+ */
+ private PropertyConfig getConfig(InternalQName propertyName) {
+ PropertyConfig config = propConfigs.get(propertyName);
+ if (config != null) {
+ return config;
+ } else if (namePatterns.size() > 0) {
+ QPath path = new QPath(new QPathEntry[] { new QPathEntry(
+ propertyName, 1) });
+ // check patterns
+ for (Iterator<NamePattern> it = namePatterns.iterator(); it
+ .hasNext();) {
+ NamePattern np = it.next();
+ if (np.matches(path)) {
+ return np.getConfig();
+ }
+ }
+ }
+ return null;
+ }
- /**
- * Reads the node type of the root node of the indexing rule.
- *
- * @param config the configuration.
- * @return the name of the node type.
- * @throws IllegalNameException if the node type name contains illegal
- * characters.
- * @throws RepositoryException
- */
- private InternalQName getNodeTypeName(Node config) throws IllegalNameException, RepositoryException
- {
- String ntString = config.getAttributes().getNamedItem("nodeType").getNodeValue();
- return resolver.parseJCRName(ntString).getInternalName();
- }
+ /**
+ * Reads the node type of the root node of the indexing rule.
+ *
+ * @param config
+ * the configuration.
+ * @return the name of the node type.
+ * @throws IllegalNameException
+ * if the node type name contains illegal characters.
+ * @throws RepositoryException
+ */
+ private InternalQName getNodeTypeName(Node config)
+ throws IllegalNameException, RepositoryException {
+ String ntString = config.getAttributes().getNamedItem("nodeType")
+ .getNodeValue();
+ return resolver.parseJCRName(ntString).getInternalName();
+ }
- /**
- * Returns the node boost from the <code>config</code>.
- *
- * @param config the configuration.
- * @return the configured node boost or the default boost if none is
- * configured.
- */
- private float getNodeBoost(Node config)
- {
- Node boost = config.getAttributes().getNamedItem("boost");
- if (boost != null)
- {
- try
- {
- return Float.parseFloat(boost.getNodeValue());
- }
- catch (NumberFormatException e)
- {
- // return default boost
- }
- }
- return DEFAULT_BOOST;
- }
- }
+ /**
+ * Returns the node boost from the <code>config</code>.
+ *
+ * @param config
+ * the configuration.
+ * @return the configured node boost or the default boost if none is
+ * configured.
+ */
+ private float getNodeBoost(Node config) {
+ Node boost = config.getAttributes().getNamedItem("boost");
+ if (boost != null) {
+ try {
+ return Float.parseFloat(boost.getNodeValue());
+ } catch (NumberFormatException e) {
+ // return default boost
+ }
+ }
+ return DEFAULT_BOOST;
+ }
+ }
- /**
- * Simple class that holds boost and nodeScopeIndex flag.
- */
- private class PropertyConfig
- {
+ /**
+ * Simple class that holds boost and nodeScopeIndex flag.
+ */
+ private class PropertyConfig {
- /**
- * The boost value for a property.
- */
- final float boost;
+ /**
+ * The boost value for a property.
+ */
+ final float boost;
- /**
- * Flag that indicates whether a property is included in the node
- * scope fulltext index of its parent.
- */
- final boolean nodeScopeIndex;
+ /**
+ * Flag that indicates whether a property is included in the node scope
+ * fulltext index of its parent.
+ */
+ final boolean nodeScopeIndex;
- /**
- * Flag that indicates whether the content of a property should be used
- * to create an excerpt.
- */
- final boolean useInExcerpt;
+ /**
+ * Flag that indicates whether the content of a property should be used
+ * to create an excerpt.
+ */
+ final boolean useInExcerpt;
- PropertyConfig(float boost, boolean nodeScopeIndex, boolean useInExcerpt)
- {
- this.boost = boost;
- this.nodeScopeIndex = nodeScopeIndex;
- this.useInExcerpt = useInExcerpt;
- }
- }
+ PropertyConfig(float boost, boolean nodeScopeIndex, boolean useInExcerpt) {
+ this.boost = boost;
+ this.nodeScopeIndex = nodeScopeIndex;
+ this.useInExcerpt = useInExcerpt;
+ }
+ }
- private class PathExpression
- {
+ private class PathExpression {
- static final int SELF = 0;
+ static final int SELF = 0;
- static final int CHILD = 1;
+ static final int CHILD = 1;
- static final int ANCESTOR = 2;
+ static final int ANCESTOR = 2;
- static final int PARENT = 3;
+ static final int PARENT = 3;
- private final int axis;
+ private final int axis;
- private final InternalQName elementTest;
+ private final InternalQName elementTest;
- private final InternalQName nameTest;
+ private final InternalQName nameTest;
- private final InternalQName propertyName;
+ private final InternalQName propertyName;
- private final String propertyValue;
+ private final String propertyValue;
- PathExpression(int axis, InternalQName elementTest, InternalQName nameTest, InternalQName propertyName,
- String propertyValue)
- {
- this.axis = axis;
- this.elementTest = elementTest;
- this.nameTest = nameTest;
- this.propertyName = propertyName;
- this.propertyValue = propertyValue;
- }
+ PathExpression(int axis, InternalQName elementTest,
+ InternalQName nameTest, InternalQName propertyName,
+ String propertyValue) {
+ this.axis = axis;
+ this.elementTest = elementTest;
+ this.nameTest = nameTest;
+ this.propertyName = propertyName;
+ this.propertyValue = propertyValue;
+ }
- /**
- * Evaluates this expression and returns <code>true</code> if the
- * condition matches using <code>state</code> as the context node
- * state.
- *
- * @param context the context from where the expression should be
- * evaluated.
- * @return expression result.
- */
- boolean evaluate(final NodeData context)
- {
- // get iterator along specified axis
- Iterator nodeStates;
- if (axis == SELF)
- {
- nodeStates = Collections.singletonList(context).iterator();
- }
- else if (axis == CHILD)
- {
- List<NodeData> childs;
- try
- {
- childs = ism.getChildNodesData(context);
- nodeStates = childs.iterator();
- }
- catch (RepositoryException e)
- {
- nodeStates = Collections.<NodeData> emptyList().iterator();
- }
- }
- else if (axis == ANCESTOR)
- {
- try
- {
- nodeStates = new Iterator()
- {
+ /**
+ * Evaluates this expression and returns <code>true</code> if the
+ * condition matches using <code>state</code> as the context node state.
+ *
+ * @param context
+ * the context from where the expression should be evaluated.
+ * @return expression result.
+ */
+ boolean evaluate(final NodeData context) {
+ // get iterator along specified axis
+ Iterator nodeStates;
+ if (axis == SELF) {
+ nodeStates = Collections.singletonList(context).iterator();
+ } else if (axis == CHILD) {
+ List<NodeData> childs;
+ try {
+ childs = ism.getChildNodesData(context);
+ nodeStates = childs.iterator();
+ } catch (RepositoryException e) {
+ nodeStates = Collections.<NodeData> emptyList().iterator();
+ }
+ } else if (axis == ANCESTOR) {
+ try {
+ nodeStates = new Iterator() {
- private NodeData next = (NodeData)ism.getItemData(context.getParentIdentifier());
+ private NodeData next = (NodeData) ism
+ .getItemData(context.getParentIdentifier());
- public void remove()
- {
- throw new UnsupportedOperationException();
- }
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
- public boolean hasNext()
- {
- return next != null;
- }
+ public boolean hasNext() {
+ return next != null;
+ }
- public Object next()
- {
- NodeData tmp = next;
- try
- {
- if (next.getParentIdentifier() != null)
- {
- next = (NodeData)ism.getItemData(next.getParentIdentifier());
- }
- else
- {
- next = null;
- }
- }
- catch (RepositoryException e)
- {
- next = null;
- }
- return tmp;
- }
- };
- }
- catch (RepositoryException e)
- {
- nodeStates = Collections.EMPTY_LIST.iterator();
- }
- }
- else if (axis == PARENT)
- {
- try
- {
- if (context.getParentIdentifier() != null)
- {
- NodeData state = (NodeData)ism.getItemData(context.getParentIdentifier());
- nodeStates = Collections.singletonList(state).iterator();
- }
- else
- {
- nodeStates = Collections.EMPTY_LIST.iterator();
- }
- }
- catch (RepositoryException e)
- {
- nodeStates = Collections.EMPTY_LIST.iterator();
- }
- }
- else
- {
- // unsupported axis
- nodeStates = Collections.EMPTY_LIST.iterator();
- }
+ public Object next() {
+ NodeData tmp = next;
+ try {
+ if (next.getParentIdentifier() != null) {
+ next = (NodeData) ism.getItemData(next
+ .getParentIdentifier());
+ } else {
+ next = null;
+ }
+ } catch (RepositoryException e) {
+ next = null;
+ }
+ return tmp;
+ }
+ };
+ } catch (RepositoryException e) {
+ nodeStates = Collections.EMPTY_LIST.iterator();
+ }
+ } else if (axis == PARENT) {
+ try {
+ if (context.getParentIdentifier() != null) {
+ NodeData state = (NodeData) ism.getItemData(context
+ .getParentIdentifier());
+ nodeStates = Collections.singletonList(state)
+ .iterator();
+ } else {
+ nodeStates = Collections.EMPTY_LIST.iterator();
+ }
+ } catch (RepositoryException e) {
+ nodeStates = Collections.EMPTY_LIST.iterator();
+ }
+ } else {
+ // unsupported axis
+ nodeStates = Collections.EMPTY_LIST.iterator();
+ }
- // check node type, name and property value for each
- while (nodeStates.hasNext())
- {
- try
- {
- NodeData current = (NodeData)nodeStates.next();
- if ((elementTest != null) && !current.getPrimaryTypeName().equals(elementTest))
- {
- continue;
- }
- if ((nameTest != null) && !current.getQPath().getName().equals(nameTest))
- {
- continue;
- }
+ // check node type, name and property value for each
+ while (nodeStates.hasNext()) {
+ try {
+ NodeData current = (NodeData) nodeStates.next();
+ if ((elementTest != null)
+ && !current.getPrimaryTypeName()
+ .equals(elementTest)) {
+ continue;
+ }
+ if ((nameTest != null)
+ && !current.getQPath().getName().equals(nameTest)) {
+ continue;
+ }
- List<PropertyData> childProps = ism.getChildPropertiesData(current);
+ List<PropertyData> childProps = ism
+ .getChildPropertiesData(current);
- PropertyData propState = null;
- for (PropertyData propertyData : childProps)
- {
- if (propertyData.getQPath().getName().equals(propertyName))
- {
- propState = propertyData;
- break;
- }
+ PropertyData propState = null;
+ for (PropertyData propertyData : childProps) {
+ if (propertyData.getQPath().getName().equals(
+ propertyName)) {
+ propState = propertyData;
+ break;
+ }
- }
- if (propState == null)
- {
- continue;
- }
+ }
+ if (propState == null) {
+ continue;
+ }
- List<ValueData> values = propState.getValues();
+ List<ValueData> values = propState.getValues();
- // if (values.get(i).toString().equals(propertyValue)) {
- // return true;
- // }
+ // if (values.get(i).toString().equals(propertyValue)) {
+ // return true;
+ // }
- if (propState.getType() == PropertyType.BINARY)
- {
- // skip binary values
- continue;
- }
+ if (propState.getType() == PropertyType.BINARY) {
+ // skip binary values
+ continue;
+ }
- try
- {
- for (int i = 0; i < values.size(); i++)
- {
- byte[] bytes = values.get(i).getAsByteArray();
- String val = new String(bytes, Constants.DEFAULT_ENCODING);
- if (val.equals(propertyValue))
- {
- return true;
- }
- }
- }
- catch (IOException e)
- {
- log.error(e.getLocalizedMessage());
- }
+ try {
+ for (int i = 0; i < values.size(); i++) {
+ byte[] bytes = values.get(i).getAsByteArray();
+ String val = new String(bytes,
+ Constants.DEFAULT_ENCODING);
+ if (val.equals(propertyValue)) {
+ return true;
+ }
+ }
+ } catch (IOException e) {
+ log.error(e.getLocalizedMessage());
+ }
- }
- catch (RepositoryException e)
- {
- log.error(e.getLocalizedMessage());
- }
- }
- return false;
- }
- }
+ } catch (RepositoryException e) {
+ log.error(e.getLocalizedMessage());
+ }
+ }
+ return false;
+ }
+ }
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneQueryBuilder.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneQueryBuilder.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneQueryBuilder.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -16,21 +16,6 @@
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.jcr.NamespaceException;
-import javax.jcr.PropertyType;
-import javax.jcr.RepositoryException;
-import javax.jcr.nodetype.NodeType;
-import javax.jcr.nodetype.NodeTypeIterator;
-import javax.jcr.nodetype.NodeTypeManager;
-import javax.jcr.query.InvalidQueryException;
-
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
@@ -39,7 +24,6 @@
import org.apache.lucene.search.Query;
import org.apache.lucene.search.BooleanClause.Occur;
import org.exoplatform.commons.utils.ISO8601;
-import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
import org.exoplatform.services.jcr.dataflow.ItemDataConsumer;
import org.exoplatform.services.jcr.datamodel.IllegalNameException;
@@ -51,7 +35,6 @@
import org.exoplatform.services.jcr.datamodel.QPathEntry;
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.LocationFactory;
-import org.exoplatform.services.jcr.impl.core.RepositoryImpl;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
import org.exoplatform.services.jcr.impl.core.query.AndQueryNode;
import org.exoplatform.services.jcr.impl.core.query.DefaultQueryNodeVisitor;
@@ -70,1221 +53,1151 @@
import org.exoplatform.services.jcr.impl.core.query.QueryNodeVisitor;
import org.exoplatform.services.jcr.impl.core.query.QueryRootNode;
import org.exoplatform.services.jcr.impl.core.query.RelationQueryNode;
-import org.exoplatform.services.jcr.impl.core.query.SearchManager;
import org.exoplatform.services.jcr.impl.core.query.TextsearchQueryNode;
-
import org.exoplatform.services.jcr.impl.util.ISO9075;
import org.exoplatform.services.jcr.impl.xml.XMLChar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Iterator;
+import java.util.List;
+
+import javax.jcr.NamespaceException;
+import javax.jcr.PropertyType;
+import javax.jcr.RepositoryException;
+import javax.jcr.query.InvalidQueryException;
+
/**
- * Implements a query builder that takes an abstract query tree and creates
- * a lucene {@link org.apache.lucene.search.Query} tree that can be executed
- * on an index.
- * todo introduce a node type hierarchy for efficient translation of NodeTypeQueryNode
+ * Implements a query builder that takes an abstract query tree and creates a
+ * lucene {@link org.apache.lucene.search.Query} tree that can be executed on an
+ * index. todo introduce a node type hierarchy for efficient translation of
+ * NodeTypeQueryNode
*/
-public class LuceneQueryBuilder implements QueryNodeVisitor
-{
- /**
- * Namespace URI for xpath functions
- */
- private static final String NS_FN_PREFIX = "fn";
+public class LuceneQueryBuilder implements QueryNodeVisitor {
+ /**
+ * Namespace URI for xpath functions
+ */
+ private static final String NS_FN_PREFIX = "fn";
- public static final String NS_FN_URI = "http://www.w3.org/2005/xpath-functions";
+ public static final String NS_FN_URI = "http://www.w3.org/2005/xpath-functions";
- /**
- * Deprecated namespace URI for xpath functions
- */
- private static final String NS_FN_OLD_PREFIX = "fn_old";
+ /**
+ * Deprecated namespace URI for xpath functions
+ */
+ private static final String NS_FN_OLD_PREFIX = "fn_old";
- public static final String NS_FN_OLD_URI = "http://www.w3.org/2004/10/xpath-functions";
+ public static final String NS_FN_OLD_URI = "http://www.w3.org/2004/10/xpath-functions";
- /**
- * Namespace URI for XML schema
- */
- private static final String NS_XS_PREFIX = "xs";
+ /**
+ * Namespace URI for XML schema
+ */
+ private static final String NS_XS_PREFIX = "xs";
- public static final String NS_XS_URI = "http://www.w3.org/2001/XMLSchema";
+ public static final String NS_XS_URI = "http://www.w3.org/2001/XMLSchema";
- /**
- * Logger for this class
- */
- private static final Logger log = LoggerFactory.getLogger(LuceneQueryBuilder.class);
+ /**
+ * Logger for this class
+ */
+ private static final Logger log = LoggerFactory
+ .getLogger(LuceneQueryBuilder.class);
- /**
- * Root node of the abstract query tree
- */
- private final QueryRootNode root;
+ /**
+ * Root node of the abstract query tree
+ */
+ private final QueryRootNode root;
- /**
- * Session of the user executing this query
- */
- private final SessionImpl session;
+ /**
+ * Session of the user executing this query
+ */
+ private final SessionImpl session;
- /**
- * The shared item state manager of the workspace.
- */
- private final ItemDataConsumer sharedItemMgr;
+ /**
+ * The shared item state manager of the workspace.
+ */
+ private final ItemDataConsumer sharedItemMgr;
- // /**
- // * A hierarchy manager based on {@link #sharedItemMgr} to resolve paths.
- // */
- // private final HierarchyManager hmgr;
+ // /**
+ // * A hierarchy manager based on {@link #sharedItemMgr} to resolve paths.
+ // */
+ // private final HierarchyManager hmgr;
- /**
- * Namespace mappings to internal prefixes
- */
- private final NamespaceMappings nsMappings;
+ /**
+ * Namespace mappings to internal prefixes
+ */
+ private final NamespaceMappings nsMappings;
- /**
- * Name and Path resolver
- */
- private final LocationFactory resolver;
+ /**
+ * Name and Path resolver
+ */
+ private final LocationFactory resolver;
- /**
- * The analyzer instance to use for contains function query parsing
- */
- private final Analyzer analyzer;
+ /**
+ * The analyzer instance to use for contains function query parsing
+ */
+ private final Analyzer analyzer;
- /**
- * The property type registry.
- */
- private final PropertyTypeRegistry propRegistry;
+ /**
+ * The property type registry.
+ */
+ private final PropertyTypeRegistry propRegistry;
- /**
- * The synonym provider or <code>null</code> if none is configured.
- */
- private final SynonymProvider synonymProvider;
+ /**
+ * The synonym provider or <code>null</code> if none is configured.
+ */
+ private final SynonymProvider synonymProvider;
- /**
- * Wether the index format is new or old.
- */
- private final IndexFormatVersion indexFormatVersion;
+ /**
+ * Wether the index format is new or old.
+ */
+ private final IndexFormatVersion indexFormatVersion;
- /**
- * Exceptions thrown during tree translation
- */
- private final List exceptions = new ArrayList();
+ /**
+ * Exceptions thrown during tree translation
+ */
+ private final List exceptions = new ArrayList();
- private final NodeTypeDataManager nodeTypeDataManager;
+ private final NodeTypeDataManager nodeTypeDataManager;
- /**
- * Creates a new <code>LuceneQueryBuilder</code> instance.
- *
- * @param root the root node of the abstract query tree.
- * @param session of the user executing this query.
- * @param sharedItemMgr the shared item state manager of the
- * workspace.
- * @param hmgr a hierarchy manager based on sharedItemMgr.
- * @param nsMappings namespace resolver for internal prefixes.
- * @param analyzer for parsing the query statement of the contains
- * function.
- * @param propReg the property type registry.
- * @param synonymProvider the synonym provider or <code>null</code> if
- * node is configured.
- * @param indexFormatVersion the index format version for the lucene query.
- * @throws RepositoryException
- */
- private LuceneQueryBuilder(QueryRootNode root, SessionImpl session, ItemDataConsumer sharedItemMgr,
- //HierarchyManager hmgr,
- NamespaceMappings nsMappings, Analyzer analyzer, PropertyTypeRegistry propReg, SynonymProvider synonymProvider,
- IndexFormatVersion indexFormatVersion) throws RepositoryException
- {
- this.root = root;
- this.session = session;
- this.sharedItemMgr = sharedItemMgr;
- //this.hmgr = hmgr;
- this.nsMappings = nsMappings;
- this.analyzer = analyzer;
- this.propRegistry = propReg;
- this.synonymProvider = synonymProvider;
- this.indexFormatVersion = indexFormatVersion;
- this.nodeTypeDataManager = session.getWorkspace().getNodeTypesHolder();
- this.resolver = new LocationFactory(nsMappings);
- }
+ private final VirtualTableResolver<Query> virtualTableResolver;
- /**
- * Creates a lucene {@link org.apache.lucene.search.Query} tree from an
- * abstract query tree.
- *
- * @param root the root node of the abstract query tree.
- * @param session of the user executing the query.
- * @param sharedItemMgr the shared item state manager of the workspace.
- * @param nsMappings namespace resolver for internal prefixes.
- * @param analyzer for parsing the query statement of the contains
- * function.
- * @param propReg the property type registry to lookup type
- * information.
- * @param synonymProvider the synonym provider or <code>null</code> if node
- * is configured.
- * @param indexFormatVersion the index format version to be used
- * @return the lucene query tree.
- * @throws RepositoryException if an error occurs during the translation.
- */
- public static Query createQuery(QueryRootNode root, SessionImpl session, ItemDataConsumer sharedItemMgr,
- NamespaceMappings nsMappings, Analyzer analyzer, PropertyTypeRegistry propReg, SynonymProvider synonymProvider,
- IndexFormatVersion indexFormatVersion) throws RepositoryException
- {
+ /**
+ * Creates a new <code>LuceneQueryBuilder</code> instance.
+ *
+ * @param root
+ * the root node of the abstract query tree.
+ * @param session
+ * of the user executing this query.
+ * @param sharedItemMgr
+ * the shared item state manager of the workspace.
+ * @param hmgr
+ * a hierarchy manager based on sharedItemMgr.
+ * @param nsMappings
+ * namespace resolver for internal prefixes.
+ * @param analyzer
+ * for parsing the query statement of the contains function.
+ * @param propReg
+ * the property type registry.
+ * @param synonymProvider
+ * the synonym provider or <code>null</code> if node is
+ * configured.
+ * @param indexFormatVersion
+ * the index format version for the lucene query.
+ * @param virtualTableResolver
+ * @throws RepositoryException
+ */
+ private LuceneQueryBuilder(
+ QueryRootNode root,
+ SessionImpl session,
+ ItemDataConsumer sharedItemMgr,
+ // HierarchyManager hmgr,
+ NamespaceMappings nsMappings, Analyzer analyzer,
+ PropertyTypeRegistry propReg, SynonymProvider synonymProvider,
+ IndexFormatVersion indexFormatVersion,
+ VirtualTableResolver<Query> virtualTableResolver)
+ throws RepositoryException {
+ this.root = root;
+ this.session = session;
+ this.sharedItemMgr = sharedItemMgr;
+ // this.hmgr = hmgr;
+ this.nsMappings = nsMappings;
+ this.analyzer = analyzer;
+ this.propRegistry = propReg;
+ this.synonymProvider = synonymProvider;
+ this.indexFormatVersion = indexFormatVersion;
+ this.virtualTableResolver = virtualTableResolver;
+ this.nodeTypeDataManager = session.getWorkspace().getNodeTypesHolder();
+ this.resolver = new LocationFactory(nsMappings);
+ }
- LuceneQueryBuilder builder =
- new LuceneQueryBuilder(root, session, sharedItemMgr, nsMappings, analyzer, propReg, synonymProvider,
- indexFormatVersion);
+ /**
+ * Creates a lucene {@link org.apache.lucene.search.Query} tree from an
+ * abstract query tree.
+ *
+ * @param root
+ * the root node of the abstract query tree.
+ * @param session
+ * of the user executing the query.
+ * @param sharedItemMgr
+ * the shared item state manager of the workspace.
+ * @param nsMappings
+ * namespace resolver for internal prefixes.
+ * @param analyzer
+ * for parsing the query statement of the contains function.
+ * @param propReg
+ * the property type registry to lookup type information.
+ * @param synonymProvider
+ * the synonym provider or <code>null</code> if node is
+ * configured.
+ * @param indexFormatVersion
+ * the index format version to be used
+ * @return the lucene query tree.
+ * @throws RepositoryException
+ * if an error occurs during the translation.
+ */
+ public static Query createQuery(QueryRootNode root, SessionImpl session,
+ ItemDataConsumer sharedItemMgr, NamespaceMappings nsMappings,
+ Analyzer analyzer, PropertyTypeRegistry propReg,
+ SynonymProvider synonymProvider,
+ IndexFormatVersion indexFormatVersion,
+ VirtualTableResolver<Query> virtualTableResolver)
+ throws RepositoryException {
- Query q = builder.createLuceneQuery();
- if (builder.exceptions.size() > 0)
- {
- StringBuffer msg = new StringBuffer();
- for (Iterator it = builder.exceptions.iterator(); it.hasNext();)
- {
- msg.append(it.next().toString()).append('\n');
- }
- throw new RepositoryException("Exception building query: " + msg.toString());
- }
- return q;
- }
+ LuceneQueryBuilder builder = new LuceneQueryBuilder(root, session,
+ sharedItemMgr, nsMappings, analyzer, propReg, synonymProvider,
+ indexFormatVersion, virtualTableResolver);
- /**
- * Starts the tree traversal and returns the lucene
- * {@link org.apache.lucene.search.Query}.
- *
- * @return the lucene <code>Query</code>.
- * @throws RepositoryException
- */
- private Query createLuceneQuery() throws RepositoryException
- {
- return (Query)root.accept(this, null);
- }
+ Query q = builder.createLuceneQuery();
+ if (builder.exceptions.size() > 0) {
+ StringBuffer msg = new StringBuffer();
+ for (Iterator it = builder.exceptions.iterator(); it.hasNext();) {
+ msg.append(it.next().toString()).append('\n');
+ }
+ throw new RepositoryException("Exception building query: "
+ + msg.toString());
+ }
+ return q;
+ }
- //---------------------< QueryNodeVisitor interface >-----------------------
+ /**
+ * Starts the tree traversal and returns the lucene
+ * {@link org.apache.lucene.search.Query}.
+ *
+ * @return the lucene <code>Query</code>.
+ * @throws RepositoryException
+ */
+ private Query createLuceneQuery() throws RepositoryException {
+ return (Query) root.accept(this, null);
+ }
- public Object visit(QueryRootNode node, Object data) throws RepositoryException
- {
- BooleanQuery root = new BooleanQuery();
+ // ---------------------< QueryNodeVisitor interface
+ // >-----------------------
- Query wrapped = root;
- if (node.getLocationNode() != null)
- {
- wrapped = (Query)node.getLocationNode().accept(this, root);
- }
+ public Object visit(QueryRootNode node, Object data)
+ throws RepositoryException {
+ BooleanQuery root = new BooleanQuery();
- return wrapped;
- }
+ Query wrapped = root;
+ if (node.getLocationNode() != null) {
+ wrapped = (Query) node.getLocationNode().accept(this, root);
+ }
- public Object visit(OrQueryNode node, Object data) throws RepositoryException
- {
- BooleanQuery orQuery = new BooleanQuery();
- Object[] result = node.acceptOperands(this, null);
- for (int i = 0; i < result.length; i++)
- {
- Query operand = (Query)result[i];
- orQuery.add(operand, Occur.SHOULD);
- }
- return orQuery;
- }
+ return wrapped;
+ }
- public Object visit(AndQueryNode node, Object data) throws RepositoryException
- {
- Object[] result = node.acceptOperands(this, null);
- if (result.length == 0)
- {
- return null;
- }
- BooleanQuery andQuery = new BooleanQuery();
- for (int i = 0; i < result.length; i++)
- {
- Query operand = (Query)result[i];
- andQuery.add(operand, Occur.MUST);
- }
- return andQuery;
- }
+ public Object visit(OrQueryNode node, Object data)
+ throws RepositoryException {
+ BooleanQuery orQuery = new BooleanQuery();
+ Object[] result = node.acceptOperands(this, null);
+ for (int i = 0; i < result.length; i++) {
+ Query operand = (Query) result[i];
+ orQuery.add(operand, Occur.SHOULD);
+ }
+ return orQuery;
+ }
- public Object visit(NotQueryNode node, Object data) throws RepositoryException
- {
- Object[] result = node.acceptOperands(this, null);
- if (result.length == 0)
- {
- return data;
- }
- // join the results
- BooleanQuery b = new BooleanQuery();
- for (int i = 0; i < result.length; i++)
- {
- b.add((Query)result[i], Occur.SHOULD);
- }
- // negate
- return new NotQuery(b);
- }
+ public Object visit(AndQueryNode node, Object data)
+ throws RepositoryException {
+ Object[] result = node.acceptOperands(this, null);
+ if (result.length == 0) {
+ return null;
+ }
+ BooleanQuery andQuery = new BooleanQuery();
+ for (int i = 0; i < result.length; i++) {
+ Query operand = (Query) result[i];
+ andQuery.add(operand, Occur.MUST);
+ }
+ return andQuery;
+ }
- public Object visit(ExactQueryNode node, Object data)
- {
- String field = "";
- String value = "";
- try
- {
- field = resolver.createJCRName(node.getPropertyName()).getAsString();
- value = resolver.createJCRName(node.getValue()).getAsString();
- }
- catch (RepositoryException e)
- {
- // will never happen, prefixes are created when unknown
- }
- return new JackrabbitTermQuery(new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, value)));
- }
+ public Object visit(NotQueryNode node, Object data)
+ throws RepositoryException {
+ Object[] result = node.acceptOperands(this, null);
+ if (result.length == 0) {
+ return data;
+ }
+ // join the results
+ BooleanQuery b = new BooleanQuery();
+ for (int i = 0; i < result.length; i++) {
+ b.add((Query) result[i], Occur.SHOULD);
+ }
+ // negate
+ return new NotQuery(b);
+ }
- public Object visit(NodeTypeQueryNode node, Object data)
- {
+ public Object visit(ExactQueryNode node, Object data) {
+ String field = "";
+ String value = "";
+ try {
+ field = resolver.createJCRName(node.getPropertyName())
+ .getAsString();
+ value = resolver.createJCRName(node.getValue()).getAsString();
+ } catch (RepositoryException e) {
+ // will never happen, prefixes are created when unknown
+ }
+ return new JackrabbitTermQuery(new Term(FieldNames.PROPERTIES,
+ FieldNames.createNamedValue(field, value)));
+ }
- List terms = new ArrayList();
- try
- {
- String mixinTypesField = resolver.createJCRName(Constants.JCR_MIXINTYPES).getAsString();
- String primaryTypeField = resolver.createJCRName(Constants.JCR_PRIMARYTYPE).getAsString();
+ public Object visit(NodeTypeQueryNode node, Object data) {
- NodeTypeData base = nodeTypeDataManager.findNodeType(node.getValue());
+ try {
+ return virtualTableResolver.resolve(node.getValue(), true);
+ } catch (InvalidQueryException e1) {
+ exceptions.add(e1);
+ } catch (RepositoryException e1) {
+ exceptions.add(e1);
+ }
+ return new BooleanQuery();
+ // // (result)
+ // List terms = new ArrayList();
+ // try {
+ // String mixinTypesField = resolver.createJCRName(
+ // Constants.JCR_MIXINTYPES).getAsString();
+ // String primaryTypeField = resolver.createJCRName(
+ // Constants.JCR_PRIMARYTYPE).getAsString();
+ //
+ // NodeTypeData base = nodeTypeDataManager.findNodeType(node
+ // .getValue());
+ //
+ // if (base.isMixin()) {
+ // // search for nodes where jcr:mixinTypes is set to this mixin
+ // Term t = new Term(FieldNames.PROPERTIES, FieldNames
+ // .createNamedValue(mixinTypesField, resolver
+ // .createJCRName(node.getValue()).getAsString()));
+ // terms.add(t);
+ // } else {
+ // // search for nodes where jcr:primaryType is set to this type
+ // Term t = new Term(FieldNames.PROPERTIES, FieldNames
+ // .createNamedValue(primaryTypeField, resolver
+ // .createJCRName(node.getValue()).getAsString()));
+ // terms.add(t);
+ // }
+ //
+ // // now search for all node types that are derived from base
+ // Collection<NodeTypeData> allTypes = nodeTypeDataManager
+ // .getAllNodeTypes();
+ // for (NodeTypeData nodeTypeData : allTypes) {
+ // InternalQName[] superTypes = nodeTypeData
+ // .getDeclaredSupertypeNames();
+ // if (Arrays.asList(superTypes).contains(base.getName())) {
+ // String ntName = nsMappings.translateName(nodeTypeData
+ // .getName());
+ // Term t;
+ // if (nodeTypeData.isMixin()) {
+ // // search on jcr:mixinTypes
+ // t = new Term(FieldNames.PROPERTIES, FieldNames
+ // .createNamedValue(mixinTypesField, ntName));
+ // } else {
+ // // search on jcr:primaryType
+ // t = new Term(FieldNames.PROPERTIES, FieldNames
+ // .createNamedValue(primaryTypeField, ntName));
+ // }
+ // terms.add(t);
+ // }
+ // }
+ // } catch (IllegalNameException e) {
+ // exceptions.add(e);
+ // } catch (RepositoryException e) {
+ // exceptions.add(e);
+ // }
+ // if (terms.size() == 0) {
+ // // exception occured
+ // return new BooleanQuery();
+ // } else if (terms.size() == 1) {
+ // return new JackrabbitTermQuery((Term) terms.get(0));
+ // } else {
+ // BooleanQuery b = new BooleanQuery();
+ // for (Iterator it = terms.iterator(); it.hasNext();) {
+ // b.add(new JackrabbitTermQuery((Term) it.next()), Occur.SHOULD);
+ // }
+ // return b;
+ // }
+ }
- if (base.isMixin())
- {
- // search for nodes where jcr:mixinTypes is set to this mixin
- Term t =
- new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(mixinTypesField, resolver.createJCRName(
- node.getValue()).getAsString()));
- terms.add(t);
- }
- else
- {
- // search for nodes where jcr:primaryType is set to this type
- Term t =
- new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(primaryTypeField, resolver.createJCRName(
- node.getValue()).getAsString()));
- terms.add(t);
- }
+ public Object visit(TextsearchQueryNode node, Object data) {
+ try {
+ QPath relPath = node.getRelativePath();
+ String fieldname;
+ if (relPath == null || !node.getReferencesProperty()) {
+ // fulltext on node
+ fieldname = FieldNames.FULLTEXT;
+ } else {
+ // final path element is a property name
- // now search for all node types that are derived from base
- Collection<NodeTypeData> allTypes = nodeTypeDataManager.getAllNodeTypes();
- for (NodeTypeData nodeTypeData : allTypes)
- {
- InternalQName[] superTypes = nodeTypeData.getDeclaredSupertypeNames();
- if (Arrays.asList(superTypes).contains(base.getName()))
- {
- String ntName = nsMappings.translateName(nodeTypeData.getName());
- Term t;
- if (nodeTypeData.isMixin())
- {
- // search on jcr:mixinTypes
- t = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(mixinTypesField, ntName));
- }
- else
- {
- // search on jcr:primaryType
- t = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(primaryTypeField, ntName));
- }
- terms.add(t);
- }
- }
- }
- catch (IllegalNameException e)
- {
- exceptions.add(e);
- }
- catch (RepositoryException e)
- {
- exceptions.add(e);
- }
- if (terms.size() == 0)
- {
- // exception occured
- return new BooleanQuery();
- }
- else if (terms.size() == 1)
- {
- return new JackrabbitTermQuery((Term)terms.get(0));
- }
- else
- {
- BooleanQuery b = new BooleanQuery();
- for (Iterator it = terms.iterator(); it.hasNext();)
- {
- b.add(new JackrabbitTermQuery((Term)it.next()), Occur.SHOULD);
- }
- return b;
- }
- }
+ fieldname = resolver.createJCRName(relPath.getName())
+ .getAsString();
+ int idx = fieldname.indexOf(':');
+ fieldname = fieldname.substring(0, idx + 1)
+ + FieldNames.FULLTEXT_PREFIX
+ + fieldname.substring(idx + 1);
- public Object visit(TextsearchQueryNode node, Object data)
- {
- try
- {
- QPath relPath = node.getRelativePath();
- String fieldname;
- if (relPath == null || !node.getReferencesProperty())
- {
- // fulltext on node
- fieldname = FieldNames.FULLTEXT;
- }
- else
- {
- // final path element is a property name
+ }
+ QueryParser parser = new JackrabbitQueryParser(fieldname, analyzer,
+ synonymProvider);
+ Query context = parser.parse(node.getQuery());
+ if (relPath != null
+ && (!node.getReferencesProperty() || relPath.getEntries().length > 1)) {
+ // text search on some child axis
+ QPathEntry[] elements = relPath.getEntries();
+ for (int i = elements.length - 1; i >= 0; i--) {
+ QPathEntry name = null;
+ if (!elements[i].equals(RelationQueryNode.STAR_NAME_TEST)) {
+ name = elements[i];
+ }
+ // join text search with name test
+ // if path references property that's elements.length - 2
+ // if path references node that's elements.length - 1
+ if (name != null
+ && ((node.getReferencesProperty() && i == elements.length - 2) || (!node
+ .getReferencesProperty() && i == elements.length - 1))) {
+ Query q = new NameQuery(name, indexFormatVersion,
+ nsMappings);
+ BooleanQuery and = new BooleanQuery();
+ and.add(q, Occur.MUST);
+ and.add(context, Occur.MUST);
+ context = and;
+ } else if ((node.getReferencesProperty() && i < elements.length - 2)
+ || (!node.getReferencesProperty() && i < elements.length - 1)) {
+ // otherwise do a parent axis step
+ context = new ParentAxisQuery(context, name,
+ indexFormatVersion, nsMappings);
+ }
+ }
+ // finally select parent
+ context = new ParentAxisQuery(context, null,
+ indexFormatVersion, nsMappings);
+ }
+ return context;
+ } catch (NamespaceException e) {
+ exceptions.add(e);
+ } catch (ParseException e) {
+ exceptions.add(e);
+ } catch (RepositoryException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
- fieldname = resolver.createJCRName(relPath.getName()).getAsString();
- int idx = fieldname.indexOf(':');
- fieldname = fieldname.substring(0, idx + 1)
- + FieldNames.FULLTEXT_PREFIX + fieldname.substring(idx + 1);
-
- }
- QueryParser parser = new JackrabbitQueryParser(fieldname, analyzer, synonymProvider);
- Query context = parser.parse(node.getQuery());
- if (relPath != null && (!node.getReferencesProperty() || relPath.getEntries().length > 1))
- {
- // text search on some child axis
- QPathEntry[] elements = relPath.getEntries();
- for (int i = elements.length - 1; i >= 0; i--)
- {
- QPathEntry name = null;
- if (!elements[i].equals(RelationQueryNode.STAR_NAME_TEST))
- {
- name = elements[i];
- }
- // join text search with name test
- // if path references property that's elements.length - 2
- // if path references node that's elements.length - 1
- if (name != null
- && ((node.getReferencesProperty() && i == elements.length - 2) || (!node.getReferencesProperty() && i == elements.length - 1)))
- {
- Query q = new NameQuery(name, indexFormatVersion, nsMappings);
- BooleanQuery and = new BooleanQuery();
- and.add(q, Occur.MUST);
- and.add(context, Occur.MUST);
- context = and;
- }
- else if ((node.getReferencesProperty() && i < elements.length - 2)
- || (!node.getReferencesProperty() && i < elements.length - 1))
- {
- // otherwise do a parent axis step
- context = new ParentAxisQuery(context, name, indexFormatVersion, nsMappings);
- }
- }
- // finally select parent
- context = new ParentAxisQuery(context, null, indexFormatVersion, nsMappings);
- }
- return context;
- }
- catch (NamespaceException e)
- {
- exceptions.add(e);
- }
- catch (ParseException e)
- {
- exceptions.add(e);
- }
- catch (RepositoryException e)
- {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return null;
- }
+ public Object visit(PathQueryNode node, Object data)
+ throws RepositoryException {
+ Query context = null;
+ LocationStepQueryNode[] steps = node.getPathSteps();
+ if (steps.length > 0) {
+ if (node.isAbsolute() && !steps[0].getIncludeDescendants()) {
+ // eat up first step
+ InternalQName nameTest = steps[0].getNameTest();
+ if (nameTest == null) {
+ // this is equivalent to the root node
+ context = new JackrabbitTermQuery(new Term(FieldNames.UUID,
+ Constants.ROOT_UUID));
+ } else if (nameTest.getName().length() == 0) {
+ // root node
+ context = new JackrabbitTermQuery(new Term(FieldNames.UUID,
+ Constants.ROOT_UUID));
+ } else {
+ // then this is a node != the root node
+ // will never match anything!
+ BooleanQuery and = new BooleanQuery();
+ and.add(new JackrabbitTermQuery(new Term(FieldNames.UUID,
+ Constants.ROOT_UUID)), Occur.MUST);
+ and.add(new NameQuery(nameTest, indexFormatVersion,
+ nsMappings), Occur.MUST);
+ context = and;
+ }
+ LocationStepQueryNode[] tmp = new LocationStepQueryNode[steps.length - 1];
+ System.arraycopy(steps, 1, tmp, 0, steps.length - 1);
+ steps = tmp;
+ } else {
+ // path is 1) relative or 2) descendant-or-self
+ // use root node as context
+ context = new JackrabbitTermQuery(new Term(FieldNames.UUID,
+ Constants.ROOT_UUID));
+ }
+ } else {
+ exceptions.add(new InvalidQueryException(
+ "Number of location steps must be > 0"));
+ }
+ // loop over steps
+ for (int i = 0; i < steps.length; i++) {
+ context = (Query) steps[i].accept(this, context);
+ }
+ if (data instanceof BooleanQuery) {
+ BooleanQuery constraint = (BooleanQuery) data;
+ if (constraint.getClauses().length > 0) {
+ constraint.add(context, Occur.MUST);
+ context = constraint;
+ }
+ }
+ return context;
+ }
- public Object visit(PathQueryNode node, Object data) throws RepositoryException
- {
- Query context = null;
- LocationStepQueryNode[] steps = node.getPathSteps();
- if (steps.length > 0)
- {
- if (node.isAbsolute() && !steps[0].getIncludeDescendants())
- {
- // eat up first step
- InternalQName nameTest = steps[0].getNameTest();
- if (nameTest == null)
- {
- // this is equivalent to the root node
- context = new JackrabbitTermQuery(new Term(FieldNames.UUID, Constants.ROOT_UUID));
- }
- else if (nameTest.getName().length() == 0)
- {
- // root node
- context = new JackrabbitTermQuery(new Term(FieldNames.UUID, Constants.ROOT_UUID));
- }
- else
- {
- // then this is a node != the root node
- // will never match anything!
- BooleanQuery and = new BooleanQuery();
- and.add(new JackrabbitTermQuery(new Term(FieldNames.UUID, Constants.ROOT_UUID)), Occur.MUST);
- and.add(new NameQuery(nameTest, indexFormatVersion, nsMappings), Occur.MUST);
- context = and;
- }
- LocationStepQueryNode[] tmp = new LocationStepQueryNode[steps.length - 1];
- System.arraycopy(steps, 1, tmp, 0, steps.length - 1);
- steps = tmp;
- }
- else
- {
- // path is 1) relative or 2) descendant-or-self
- // use root node as context
- context = new JackrabbitTermQuery(new Term(FieldNames.UUID, Constants.ROOT_UUID));
- }
- }
- else
- {
- exceptions.add(new InvalidQueryException("Number of location steps must be > 0"));
- }
- // loop over steps
- for (int i = 0; i < steps.length; i++)
- {
- context = (Query)steps[i].accept(this, context);
- }
- if (data instanceof BooleanQuery)
- {
- BooleanQuery constraint = (BooleanQuery)data;
- if (constraint.getClauses().length > 0)
- {
- constraint.add(context, Occur.MUST);
- context = constraint;
- }
- }
- return context;
- }
+ public Object visit(LocationStepQueryNode node, Object data)
+ throws RepositoryException {
+ Query context = (Query) data;
+ BooleanQuery andQuery = new BooleanQuery();
- public Object visit(LocationStepQueryNode node, Object data) throws RepositoryException
- {
- Query context = (Query)data;
- BooleanQuery andQuery = new BooleanQuery();
+ if (context == null) {
+ exceptions.add(new IllegalArgumentException("Unsupported query"));
+ }
- if (context == null)
- {
- exceptions.add(new IllegalArgumentException("Unsupported query"));
- }
+ // predicate on step?
+ Object[] predicates = node.acceptOperands(this, data);
+ for (int i = 0; i < predicates.length; i++) {
+ andQuery.add((Query) predicates[i], Occur.MUST);
+ }
- // predicate on step?
- Object[] predicates = node.acceptOperands(this, data);
- for (int i = 0; i < predicates.length; i++)
- {
- andQuery.add((Query)predicates[i], Occur.MUST);
- }
+ // check for position predicate
+ QueryNode[] pred = node.getPredicates();
+ for (int i = 0; i < pred.length; i++) {
+ if (pred[i].getType() == QueryNode.TYPE_RELATION) {
+ RelationQueryNode pos = (RelationQueryNode) pred[i];
+ if (pos.getValueType() == QueryConstants.TYPE_POSITION) {
+ node.setIndex(pos.getPositionValue());
+ }
+ }
+ }
- // check for position predicate
- QueryNode[] pred = node.getPredicates();
- for (int i = 0; i < pred.length; i++)
- {
- if (pred[i].getType() == QueryNode.TYPE_RELATION)
- {
- RelationQueryNode pos = (RelationQueryNode)pred[i];
- if (pos.getValueType() == QueryConstants.TYPE_POSITION)
- {
- node.setIndex(pos.getPositionValue());
- }
- }
- }
+ NameQuery nameTest = null;
+ if (node.getNameTest() != null) {
+ nameTest = new NameQuery(node.getNameTest(), indexFormatVersion,
+ nsMappings);
+ }
- NameQuery nameTest = null;
- if (node.getNameTest() != null)
- {
- nameTest = new NameQuery(node.getNameTest(), indexFormatVersion, nsMappings);
- }
+ if (node.getIncludeDescendants()) {
+ if (nameTest != null) {
+ andQuery.add(new DescendantSelfAxisQuery(context, nameTest,
+ false), Occur.MUST);
+ } else {
+ // descendant-or-self with nametest=*
+ if (predicates.length > 0) {
+ // if we have a predicate attached, the condition acts as
+ // the sub query.
- if (node.getIncludeDescendants())
- {
- if (nameTest != null)
- {
- andQuery.add(new DescendantSelfAxisQuery(context, nameTest, false), Occur.MUST);
- }
- else
- {
- // descendant-or-self with nametest=*
- if (predicates.length > 0)
- {
- // if we have a predicate attached, the condition acts as
- // the sub query.
+ // only use descendant axis if path is not //*
+ // otherwise the query for the predicate can be used itself
+ PathQueryNode pathNode = (PathQueryNode) node.getParent();
+ if (pathNode.getPathSteps()[0] != node) {
+ Query subQuery = new DescendantSelfAxisQuery(context,
+ andQuery, false);
+ andQuery = new BooleanQuery();
+ andQuery.add(subQuery, Occur.MUST);
+ }
+ } else {
+ // todo this will traverse the whole index, optimize!
+ // only use descendant axis if path is not //*
+ PathQueryNode pathNode = (PathQueryNode) node.getParent();
+ if (pathNode.getPathSteps()[0] != node) {
+ if (node.getIndex() == LocationStepQueryNode.NONE) {
+ context = new DescendantSelfAxisQuery(context,
+ false);
+ andQuery.add(context, Occur.MUST);
+ } else {
+ context = new DescendantSelfAxisQuery(context, true);
+ andQuery
+ .add(new ChildAxisQuery(sharedItemMgr,
+ context, null, node.getIndex(),
+ indexFormatVersion, nsMappings),
+ Occur.MUST);
+ }
+ } else {
+ andQuery.add(new MatchAllDocsQuery(), Occur.MUST);
+ }
+ }
+ }
+ } else {
+ // name test
+ if (nameTest != null) {
+ andQuery.add(new ChildAxisQuery(sharedItemMgr, context,
+ nameTest.getName(), node.getIndex(),
+ indexFormatVersion, nsMappings), Occur.MUST);
+ } else {
+ // select child nodes
+ andQuery.add(new ChildAxisQuery(sharedItemMgr, context, null,
+ node.getIndex(), indexFormatVersion, nsMappings),
+ Occur.MUST);
+ }
+ }
- // only use descendant axis if path is not //*
- // otherwise the query for the predicate can be used itself
- PathQueryNode pathNode = (PathQueryNode)node.getParent();
- if (pathNode.getPathSteps()[0] != node)
- {
- Query subQuery = new DescendantSelfAxisQuery(context, andQuery, false);
- andQuery = new BooleanQuery();
- andQuery.add(subQuery, Occur.MUST);
- }
- }
- else
- {
- // todo this will traverse the whole index, optimize!
- // only use descendant axis if path is not //*
- PathQueryNode pathNode = (PathQueryNode)node.getParent();
- if (pathNode.getPathSteps()[0] != node)
- {
- if (node.getIndex() == LocationStepQueryNode.NONE)
- {
- context = new DescendantSelfAxisQuery(context, false);
- andQuery.add(context, Occur.MUST);
- }
- else
- {
- context = new DescendantSelfAxisQuery(context, true);
- andQuery.add(new ChildAxisQuery(sharedItemMgr, context, null, node.getIndex(), indexFormatVersion,
- nsMappings), Occur.MUST);
- }
- }
- else
- {
- andQuery.add(new MatchAllDocsQuery(), Occur.MUST);
- }
- }
- }
- }
- else
- {
- // name test
- if (nameTest != null)
- {
- andQuery.add(new ChildAxisQuery(sharedItemMgr, context, nameTest.getName(), node.getIndex(),
- indexFormatVersion, nsMappings), Occur.MUST);
- }
- else
- {
- // select child nodes
- andQuery.add(new ChildAxisQuery(sharedItemMgr, context, null, node.getIndex(), indexFormatVersion,
- nsMappings), Occur.MUST);
- }
- }
+ return andQuery;
+ }
- return andQuery;
- }
+ public Object visit(DerefQueryNode node, Object data)
+ throws RepositoryException {
+ Query context = (Query) data;
+ if (context == null) {
+ exceptions.add(new IllegalArgumentException("Unsupported query"));
+ }
- public Object visit(DerefQueryNode node, Object data) throws RepositoryException
- {
- Query context = (Query)data;
- if (context == null)
- {
- exceptions.add(new IllegalArgumentException("Unsupported query"));
- }
+ try {
+ String refProperty = resolver.createJCRName(node.getRefProperty())
+ .getAsString();
- try
- {
- String refProperty = resolver.createJCRName(node.getRefProperty()).getAsString();
+ if (node.getIncludeDescendants()) {
+ Query refPropQuery = Util.createMatchAllQuery(refProperty,
+ indexFormatVersion);
+ context = new DescendantSelfAxisQuery(context, refPropQuery,
+ false);
+ }
- if (node.getIncludeDescendants())
- {
- Query refPropQuery = Util.createMatchAllQuery(refProperty, indexFormatVersion);
- context = new DescendantSelfAxisQuery(context, refPropQuery, false);
- }
+ context = new DerefQuery(context, refProperty, node.getNameTest(),
+ indexFormatVersion, nsMappings);
- context = new DerefQuery(context, refProperty, node.getNameTest(), indexFormatVersion, nsMappings);
+ // attach predicates
+ Object[] predicates = node.acceptOperands(this, data);
+ if (predicates.length > 0) {
+ BooleanQuery andQuery = new BooleanQuery();
+ for (int i = 0; i < predicates.length; i++) {
+ andQuery.add((Query) predicates[i], Occur.MUST);
+ }
+ andQuery.add(context, Occur.MUST);
+ context = andQuery;
+ }
- // attach predicates
- Object[] predicates = node.acceptOperands(this, data);
- if (predicates.length > 0)
- {
- BooleanQuery andQuery = new BooleanQuery();
- for (int i = 0; i < predicates.length; i++)
- {
- andQuery.add((Query)predicates[i], Occur.MUST);
- }
- andQuery.add(context, Occur.MUST);
- context = andQuery;
- }
+ } catch (NamespaceException e) {
+ // should never happen
+ exceptions.add(e);
+ }
- }
- catch (NamespaceException e)
- {
- // should never happen
- exceptions.add(e);
- }
+ return context;
+ }
- return context;
- }
+ public Object visit(RelationQueryNode node, Object data)
+ throws RepositoryException {
+ Query query;
+ String[] stringValues = new String[1];
+ switch (node.getValueType()) {
+ case 0:
+ // not set: either IS NULL or IS NOT NULL
+ break;
+ case QueryConstants.TYPE_DATE:
+ stringValues[0] = DateField.dateToString(node.getDateValue());
+ break;
+ case QueryConstants.TYPE_DOUBLE:
+ stringValues[0] = DoubleField.doubleToString(node.getDoubleValue());
+ break;
+ case QueryConstants.TYPE_LONG:
+ stringValues[0] = LongField.longToString(node.getLongValue());
+ break;
+ case QueryConstants.TYPE_STRING:
+ if (node.getOperation() == QueryConstants.OPERATION_EQ_GENERAL
+ || node.getOperation() == QueryConstants.OPERATION_EQ_VALUE
+ || node.getOperation() == QueryConstants.OPERATION_NE_GENERAL
+ || node.getOperation() == QueryConstants.OPERATION_NE_VALUE) {
+ // only use coercing on non-range operations
+ InternalQName propertyName = node.getRelativePath().getName();
+ stringValues = getStringValues(propertyName, node
+ .getStringValue());
+ } else {
+ stringValues[0] = node.getStringValue();
+ }
+ break;
+ case QueryConstants.TYPE_POSITION:
+ // ignore position. is handled in the location step
+ return null;
+ default:
+ throw new IllegalArgumentException("Unknown relation type: "
+ + node.getValueType());
+ }
- public Object visit(RelationQueryNode node, Object data) throws RepositoryException
- {
- Query query;
- String[] stringValues = new String[1];
- switch (node.getValueType())
- {
- case 0 :
- // not set: either IS NULL or IS NOT NULL
- break;
- case QueryConstants.TYPE_DATE :
- stringValues[0] = DateField.dateToString(node.getDateValue());
- break;
- case QueryConstants.TYPE_DOUBLE :
- stringValues[0] = DoubleField.doubleToString(node.getDoubleValue());
- break;
- case QueryConstants.TYPE_LONG :
- stringValues[0] = LongField.longToString(node.getLongValue());
- break;
- case QueryConstants.TYPE_STRING :
- if (node.getOperation() == QueryConstants.OPERATION_EQ_GENERAL
- || node.getOperation() == QueryConstants.OPERATION_EQ_VALUE
- || node.getOperation() == QueryConstants.OPERATION_NE_GENERAL
- || node.getOperation() == QueryConstants.OPERATION_NE_VALUE)
- {
- // only use coercing on non-range operations
- InternalQName propertyName = node.getRelativePath().getName();
- stringValues = getStringValues(propertyName, node.getStringValue());
- }
- else
- {
- stringValues[0] = node.getStringValue();
- }
- break;
- case QueryConstants.TYPE_POSITION :
- // ignore position. is handled in the location step
- return null;
- default :
- throw new IllegalArgumentException("Unknown relation type: " + node.getValueType());
- }
+ if (node.getRelativePath() == null
+ && node.getOperation() != QueryConstants.OPERATION_SIMILAR
+ && node.getOperation() != QueryConstants.OPERATION_SPELLCHECK) {
+ exceptions.add(new InvalidQueryException(
+ "@* not supported in predicate"));
+ return data;
+ }
- if (node.getRelativePath() == null && node.getOperation() != QueryConstants.OPERATION_SIMILAR
- && node.getOperation() != QueryConstants.OPERATION_SPELLCHECK)
- {
- exceptions.add(new InvalidQueryException("@* not supported in predicate"));
- return data;
- }
+ // get property transformation
+ final int[] transform = new int[] { TransformConstants.TRANSFORM_NONE };
+ node.acceptOperands(new DefaultQueryNodeVisitor() {
+ public Object visit(PropertyFunctionQueryNode node, Object data) {
+ if (node.getFunctionName().equals(
+ PropertyFunctionQueryNode.LOWER_CASE)) {
+ transform[0] = TransformConstants.TRANSFORM_LOWER_CASE;
+ } else if (node.getFunctionName().equals(
+ PropertyFunctionQueryNode.UPPER_CASE)) {
+ transform[0] = TransformConstants.TRANSFORM_UPPER_CASE;
+ }
+ return data;
+ }
+ }, null);
- // get property transformation
- final int[] transform = new int[]{TransformConstants.TRANSFORM_NONE};
- node.acceptOperands(new DefaultQueryNodeVisitor()
- {
- public Object visit(PropertyFunctionQueryNode node, Object data)
- {
- if (node.getFunctionName().equals(PropertyFunctionQueryNode.LOWER_CASE))
- {
- transform[0] = TransformConstants.TRANSFORM_LOWER_CASE;
- }
- else if (node.getFunctionName().equals(PropertyFunctionQueryNode.UPPER_CASE))
- {
- transform[0] = TransformConstants.TRANSFORM_UPPER_CASE;
- }
- return data;
- }
- }, null);
+ QPath relPath = node.getRelativePath();
+ if (node.getOperation() == QueryConstants.OPERATION_SIMILAR) {
+ // this is a bit ugly:
+ // add the name of a dummy property because relPath actually
+ // references a property. whereas the relPath of the similar
+ // operation references a node
+ relPath = QPath.makeChildPath(relPath, Constants.JCR_PRIMARYTYPE);
+ }
+ String field = "";
+ try {
+ field = resolver.createJCRName(relPath.getName()).getAsString();
+ } catch (NamespaceException e) {
+ // should never happen
+ exceptions.add(e);
+ }
- QPath relPath = node.getRelativePath();
- if (node.getOperation() == QueryConstants.OPERATION_SIMILAR)
- {
- // this is a bit ugly:
- // add the name of a dummy property because relPath actually
- // references a property. whereas the relPath of the similar
- // operation references a node
- relPath = QPath.makeChildPath(relPath, Constants.JCR_PRIMARYTYPE);
- }
- String field = "";
- try
- {
- field = resolver.createJCRName(relPath.getName()).getAsString();
- }
- catch (NamespaceException e)
- {
- // should never happen
- exceptions.add(e);
- }
+ // support for fn:name()
+ InternalQName propName = relPath.getName();
+ if (propName.getNamespace().equals(NS_FN_URI)
+ && propName.getName().equals("name()")) {
+ if (node.getValueType() != QueryConstants.TYPE_STRING) {
+ exceptions.add(new InvalidQueryException("Name function can "
+ + "only be used in conjunction with a string literal"));
+ return data;
+ }
+ if (node.getOperation() != QueryConstants.OPERATION_EQ_VALUE
+ && node.getOperation() != QueryConstants.OPERATION_EQ_GENERAL) {
+ exceptions
+ .add(new InvalidQueryException(
+ "Name function can "
+ + "only be used in conjunction with an equals operator"));
+ return data;
+ }
+ // check if string literal is a valid XML Name
+ if (XMLChar.isValidName(node.getStringValue())) {
+ // parse string literal as JCR Name
+ try {
+ InternalQName n = session
+ .getLocationFactory()
+ .parseJCRName(ISO9075.decode(node.getStringValue()))
+ .getInternalName();
+ query = new NameQuery(n, indexFormatVersion, nsMappings);
+ } catch (RepositoryException e) {
+ exceptions.add(e);
+ return data;
+ }
+ } else {
+ // will never match -> create dummy query
+ query = new BooleanQuery();
+ }
+ } else {
+ switch (node.getOperation()) {
+ case QueryConstants.OPERATION_EQ_VALUE: // =
+ case QueryConstants.OPERATION_EQ_GENERAL:
+ BooleanQuery or = new BooleanQuery();
+ for (int i = 0; i < stringValues.length; i++) {
+ Term t = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, stringValues[i]));
+ Query q;
+ if (transform[0] == TransformConstants.TRANSFORM_UPPER_CASE) {
+ q = new CaseTermQuery.Upper(t);
+ } else if (transform[0] == TransformConstants.TRANSFORM_LOWER_CASE) {
+ q = new CaseTermQuery.Lower(t);
+ } else {
+ q = new JackrabbitTermQuery(t);
+ }
+ or.add(q, Occur.SHOULD);
+ }
+ query = or;
+ if (node.getOperation() == QueryConstants.OPERATION_EQ_VALUE) {
+ query = createSingleValueConstraint(or, field);
+ }
+ break;
+ case QueryConstants.OPERATION_GE_VALUE: // >=
+ case QueryConstants.OPERATION_GE_GENERAL:
+ or = new BooleanQuery();
+ for (int i = 0; i < stringValues.length; i++) {
+ Term lower = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, stringValues[i]));
+ Term upper = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, "\uFFFF"));
+ or.add(new RangeQuery(lower, upper, true, transform[0]),
+ Occur.SHOULD);
+ }
+ query = or;
+ if (node.getOperation() == QueryConstants.OPERATION_GE_VALUE) {
+ query = createSingleValueConstraint(or, field);
+ }
+ break;
+ case QueryConstants.OPERATION_GT_VALUE: // >
+ case QueryConstants.OPERATION_GT_GENERAL:
+ or = new BooleanQuery();
+ for (int i = 0; i < stringValues.length; i++) {
+ Term lower = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, stringValues[i]));
+ Term upper = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, "\uFFFF"));
+ or.add(new RangeQuery(lower, upper, false, transform[0]),
+ Occur.SHOULD);
+ }
+ query = or;
+ if (node.getOperation() == QueryConstants.OPERATION_GT_VALUE) {
+ query = createSingleValueConstraint(or, field);
+ }
+ break;
+ case QueryConstants.OPERATION_LE_VALUE: // <=
+ case QueryConstants.OPERATION_LE_GENERAL: // <=
+ or = new BooleanQuery();
+ for (int i = 0; i < stringValues.length; i++) {
+ Term lower = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, ""));
+ Term upper = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, stringValues[i]));
+ or.add(new RangeQuery(lower, upper, true, transform[0]),
+ Occur.SHOULD);
+ }
+ query = or;
+ if (node.getOperation() == QueryConstants.OPERATION_LE_VALUE) {
+ query = createSingleValueConstraint(query, field);
+ }
+ break;
+ case QueryConstants.OPERATION_LIKE: // LIKE
+ // the like operation always has one string value.
+ // no coercing, see above
+ if (stringValues[0].equals("%")) {
+ query = Util.createMatchAllQuery(field, indexFormatVersion);
+ } else {
+ query = new WildcardQuery(FieldNames.PROPERTIES, field,
+ stringValues[0], transform[0]);
+ }
+ break;
+ case QueryConstants.OPERATION_LT_VALUE: // <
+ case QueryConstants.OPERATION_LT_GENERAL:
+ or = new BooleanQuery();
+ for (int i = 0; i < stringValues.length; i++) {
+ Term lower = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, ""));
+ Term upper = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, stringValues[i]));
+ or.add(new RangeQuery(lower, upper, false, transform[0]),
+ Occur.SHOULD);
+ }
+ query = or;
+ if (node.getOperation() == QueryConstants.OPERATION_LT_VALUE) {
+ query = createSingleValueConstraint(or, field);
+ }
+ break;
+ case QueryConstants.OPERATION_NE_VALUE: // !=
+ // match nodes with property 'field' that includes svp and mvp
+ BooleanQuery notQuery = new BooleanQuery();
+ notQuery.add(Util
+ .createMatchAllQuery(field, indexFormatVersion),
+ Occur.SHOULD);
+ // exclude all nodes where 'field' has the term in question
+ for (int i = 0; i < stringValues.length; i++) {
+ Term t = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, stringValues[i]));
+ Query q;
+ if (transform[0] == TransformConstants.TRANSFORM_UPPER_CASE) {
+ q = new CaseTermQuery.Upper(t);
+ } else if (transform[0] == TransformConstants.TRANSFORM_LOWER_CASE) {
+ q = new CaseTermQuery.Lower(t);
+ } else {
+ q = new JackrabbitTermQuery(t);
+ }
+ notQuery.add(q, Occur.MUST_NOT);
+ }
+ // and exclude all nodes where 'field' is multi valued
+ notQuery.add(new JackrabbitTermQuery(new Term(FieldNames.MVP,
+ field)), Occur.MUST_NOT);
+ query = notQuery;
+ break;
+ case QueryConstants.OPERATION_NE_GENERAL: // !=
+ // that's:
+ // all nodes with property 'field'
+ // minus the nodes that have a single property 'field' that is
+ // not equal to term in question
+ // minus the nodes that have a multi-valued property 'field' and
+ // all values are equal to term in question
+ notQuery = new BooleanQuery();
+ notQuery.add(Util
+ .createMatchAllQuery(field, indexFormatVersion),
+ Occur.SHOULD);
+ for (int i = 0; i < stringValues.length; i++) {
+ // exclude the nodes that have the term and are single
+ // valued
+ Term t = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(field, stringValues[i]));
+ Query svp = new NotQuery(new JackrabbitTermQuery(new Term(
+ FieldNames.MVP, field)));
+ BooleanQuery and = new BooleanQuery();
+ Query q;
+ if (transform[0] == TransformConstants.TRANSFORM_UPPER_CASE) {
+ q = new CaseTermQuery.Upper(t);
+ } else if (transform[0] == TransformConstants.TRANSFORM_LOWER_CASE) {
+ q = new CaseTermQuery.Lower(t);
+ } else {
+ q = new JackrabbitTermQuery(t);
+ }
+ and.add(q, Occur.MUST);
+ and.add(svp, Occur.MUST);
+ notQuery.add(and, Occur.MUST_NOT);
+ }
+ // todo above also excludes multi-valued properties that contain
+ // multiple instances of only stringValues. e.g. text={foo, foo}
+ query = notQuery;
+ break;
+ case QueryConstants.OPERATION_NULL:
+ query = new NotQuery(Util.createMatchAllQuery(field,
+ indexFormatVersion));
+ break;
+ case QueryConstants.OPERATION_SIMILAR:
+ String uuid = "x";
+ try {
+ // throw new UnsupportedOperationException();
+ QPath path = resolver.parseJCRPath(node.getStringValue())
+ .getInternalPath();
+ NodeData parent = (NodeData) sharedItemMgr
+ .getItemData(Constants.ROOT_UUID);
- // support for fn:name()
- InternalQName propName = relPath.getName();
- if (propName.getNamespace().equals(NS_FN_URI) && propName.getName().equals("name()"))
- {
- if (node.getValueType() != QueryConstants.TYPE_STRING)
- {
- exceptions.add(new InvalidQueryException("Name function can "
- + "only be used in conjunction with a string literal"));
- return data;
- }
- if (node.getOperation() != QueryConstants.OPERATION_EQ_VALUE
- && node.getOperation() != QueryConstants.OPERATION_EQ_GENERAL)
- {
- exceptions.add(new InvalidQueryException("Name function can "
- + "only be used in conjunction with an equals operator"));
- return data;
- }
- // check if string literal is a valid XML Name
- if (XMLChar.isValidName(node.getStringValue()))
- {
- // parse string literal as JCR Name
- try
- {
- InternalQName n =
- session.getLocationFactory().parseJCRName(ISO9075.decode(node.getStringValue())).getInternalName();
- query = new NameQuery(n, indexFormatVersion, nsMappings);
- }
- catch (RepositoryException e)
- {
- exceptions.add(e);
- return data;
- }
- }
- else
- {
- // will never match -> create dummy query
- query = new BooleanQuery();
- }
- }
- else
- {
- switch (node.getOperation())
- {
- case QueryConstants.OPERATION_EQ_VALUE : // =
- case QueryConstants.OPERATION_EQ_GENERAL :
- BooleanQuery or = new BooleanQuery();
- for (int i = 0; i < stringValues.length; i++)
- {
- Term t = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, stringValues[i]));
- Query q;
- if (transform[0] == TransformConstants.TRANSFORM_UPPER_CASE)
- {
- q = new CaseTermQuery.Upper(t);
- }
- else if (transform[0] == TransformConstants.TRANSFORM_LOWER_CASE)
- {
- q = new CaseTermQuery.Lower(t);
- }
- else
- {
- q = new JackrabbitTermQuery(t);
- }
- or.add(q, Occur.SHOULD);
- }
- query = or;
- if (node.getOperation() == QueryConstants.OPERATION_EQ_VALUE)
- {
- query = createSingleValueConstraint(or, field);
- }
- break;
- case QueryConstants.OPERATION_GE_VALUE : // >=
- case QueryConstants.OPERATION_GE_GENERAL :
- or = new BooleanQuery();
- for (int i = 0; i < stringValues.length; i++)
- {
- Term lower = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, stringValues[i]));
- Term upper = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, "\uFFFF"));
- or.add(new RangeQuery(lower, upper, true, transform[0]), Occur.SHOULD);
- }
- query = or;
- if (node.getOperation() == QueryConstants.OPERATION_GE_VALUE)
- {
- query = createSingleValueConstraint(or, field);
- }
- break;
- case QueryConstants.OPERATION_GT_VALUE : // >
- case QueryConstants.OPERATION_GT_GENERAL :
- or = new BooleanQuery();
- for (int i = 0; i < stringValues.length; i++)
- {
- Term lower = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, stringValues[i]));
- Term upper = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, "\uFFFF"));
- or.add(new RangeQuery(lower, upper, false, transform[0]), Occur.SHOULD);
- }
- query = or;
- if (node.getOperation() == QueryConstants.OPERATION_GT_VALUE)
- {
- query = createSingleValueConstraint(or, field);
- }
- break;
- case QueryConstants.OPERATION_LE_VALUE : // <=
- case QueryConstants.OPERATION_LE_GENERAL : // <=
- or = new BooleanQuery();
- for (int i = 0; i < stringValues.length; i++)
- {
- Term lower = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, ""));
- Term upper = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, stringValues[i]));
- or.add(new RangeQuery(lower, upper, true, transform[0]), Occur.SHOULD);
- }
- query = or;
- if (node.getOperation() == QueryConstants.OPERATION_LE_VALUE)
- {
- query = createSingleValueConstraint(query, field);
- }
- break;
- case QueryConstants.OPERATION_LIKE : // LIKE
- // the like operation always has one string value.
- // no coercing, see above
- if (stringValues[0].equals("%"))
- {
- query = Util.createMatchAllQuery(field, indexFormatVersion);
- }
- else
- {
- query = new WildcardQuery(FieldNames.PROPERTIES, field, stringValues[0], transform[0]);
- }
- break;
- case QueryConstants.OPERATION_LT_VALUE : // <
- case QueryConstants.OPERATION_LT_GENERAL :
- or = new BooleanQuery();
- for (int i = 0; i < stringValues.length; i++)
- {
- Term lower = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, ""));
- Term upper = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, stringValues[i]));
- or.add(new RangeQuery(lower, upper, false, transform[0]), Occur.SHOULD);
- }
- query = or;
- if (node.getOperation() == QueryConstants.OPERATION_LT_VALUE)
- {
- query = createSingleValueConstraint(or, field);
- }
- break;
- case QueryConstants.OPERATION_NE_VALUE : // !=
- // match nodes with property 'field' that includes svp and mvp
- BooleanQuery notQuery = new BooleanQuery();
- notQuery.add(Util.createMatchAllQuery(field, indexFormatVersion), Occur.SHOULD);
- // exclude all nodes where 'field' has the term in question
- for (int i = 0; i < stringValues.length; i++)
- {
- Term t = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, stringValues[i]));
- Query q;
- if (transform[0] == TransformConstants.TRANSFORM_UPPER_CASE)
- {
- q = new CaseTermQuery.Upper(t);
- }
- else if (transform[0] == TransformConstants.TRANSFORM_LOWER_CASE)
- {
- q = new CaseTermQuery.Lower(t);
- }
- else
- {
- q = new JackrabbitTermQuery(t);
- }
- notQuery.add(q, Occur.MUST_NOT);
- }
- // and exclude all nodes where 'field' is multi valued
- notQuery.add(new JackrabbitTermQuery(new Term(FieldNames.MVP, field)), Occur.MUST_NOT);
- query = notQuery;
- break;
- case QueryConstants.OPERATION_NE_GENERAL : // !=
- // that's:
- // all nodes with property 'field'
- // minus the nodes that have a single property 'field' that is
- // not equal to term in question
- // minus the nodes that have a multi-valued property 'field' and
- // all values are equal to term in question
- notQuery = new BooleanQuery();
- notQuery.add(Util.createMatchAllQuery(field, indexFormatVersion), Occur.SHOULD);
- for (int i = 0; i < stringValues.length; i++)
- {
- // exclude the nodes that have the term and are single valued
- Term t = new Term(FieldNames.PROPERTIES, FieldNames.createNamedValue(field, stringValues[i]));
- Query svp = new NotQuery(new JackrabbitTermQuery(new Term(FieldNames.MVP, field)));
- BooleanQuery and = new BooleanQuery();
- Query q;
- if (transform[0] == TransformConstants.TRANSFORM_UPPER_CASE)
- {
- q = new CaseTermQuery.Upper(t);
- }
- else if (transform[0] == TransformConstants.TRANSFORM_LOWER_CASE)
- {
- q = new CaseTermQuery.Lower(t);
- }
- else
- {
- q = new JackrabbitTermQuery(t);
- }
- and.add(q, Occur.MUST);
- and.add(svp, Occur.MUST);
- notQuery.add(and, Occur.MUST_NOT);
- }
- // todo above also excludes multi-valued properties that contain
- // multiple instances of only stringValues. e.g. text={foo, foo}
- query = notQuery;
- break;
- case QueryConstants.OPERATION_NULL :
- query = new NotQuery(Util.createMatchAllQuery(field, indexFormatVersion));
- break;
- case QueryConstants.OPERATION_SIMILAR :
- String uuid = "x";
- try
- {
- // throw new UnsupportedOperationException();
- QPath path = resolver.parseJCRPath(node.getStringValue()).getInternalPath();
- NodeData parent = (NodeData)sharedItemMgr.getItemData(Constants.ROOT_UUID);
+ if (path.equals(Constants.ROOT_PATH)) {
+ uuid = Constants.ROOT_UUID;
+ } else {
+ QPathEntry[] relPathEntries = path.getRelPath(path
+ .getDepth());
+ ItemData item = parent;
+ for (int i = 0; i < relPathEntries.length; i++) {
+ item = sharedItemMgr.getItemData(parent,
+ relPathEntries[i]);
- if (path.equals(Constants.ROOT_PATH))
- {
- uuid = Constants.ROOT_UUID;
- }
- else
- {
- QPathEntry[] relPathEntries = path.getRelPath(path.getDepth());
- ItemData item = parent;
- for (int i = 0; i < relPathEntries.length; i++)
- {
- item = sharedItemMgr.getItemData(parent, relPathEntries[i]);
+ if (item == null)
+ break;
- if (item == null)
- break;
+ if (item.isNode())
+ parent = (NodeData) item;
+ else if (i < relPathEntries.length - 1)
+ throw new IllegalPathException(
+ "Path can not contains a property as the intermediate element");
+ }
+ uuid = item.getIdentifier();
+ }
- if (item.isNode())
- parent = (NodeData)item;
- else if (i < relPathEntries.length - 1)
- throw new IllegalPathException(
- "Path can not contains a property as the intermediate element");
- }
- uuid = item.getIdentifier();
- }
+ } catch (RepositoryException e) {
+ exceptions.add(e);
+ }
+ query = new SimilarityQuery(uuid, analyzer);
+ break;
+ case QueryConstants.OPERATION_NOT_NULL:
+ query = Util.createMatchAllQuery(field, indexFormatVersion);
+ break;
+ case QueryConstants.OPERATION_SPELLCHECK:
+ query = Util.createMatchAllQuery(field, indexFormatVersion);
+ break;
+ default:
+ throw new IllegalArgumentException(
+ "Unknown relation operation: " + node.getOperation());
+ }
+ }
- }
- catch (RepositoryException e)
- {
- exceptions.add(e);
- }
- query = new SimilarityQuery(uuid, analyzer);
- break;
- case QueryConstants.OPERATION_NOT_NULL :
- query = Util.createMatchAllQuery(field, indexFormatVersion);
- break;
- case QueryConstants.OPERATION_SPELLCHECK :
- query = Util.createMatchAllQuery(field, indexFormatVersion);
- break;
- default :
- throw new IllegalArgumentException("Unknown relation operation: " + node.getOperation());
- }
- }
+ if (relPath.getEntries().length > 1) {
+ // child axis in relation
+ QPathEntry[] elements = relPath.getEntries();
+ // elements.length - 1 = property name
+ // elements.length - 2 = last child axis name test
+ for (int i = elements.length - 2; i >= 0; i--) {
+ QPathEntry name = null;
+ if (!elements[i].equals(RelationQueryNode.STAR_NAME_TEST)) {
+ name = elements[i];
+ }
+ if (i == elements.length - 2) {
+ // join name test with property query if there is one
+ if (name != null) {
+ Query nameTest = new NameQuery(name,
+ indexFormatVersion, nsMappings);
+ BooleanQuery and = new BooleanQuery();
+ and.add(query, Occur.MUST);
+ and.add(nameTest, Occur.MUST);
+ query = and;
+ } else {
+ // otherwise the query can be used as is
+ }
+ } else {
+ query = new ParentAxisQuery(query, name,
+ indexFormatVersion, nsMappings);
+ }
+ }
+ // finally select the parent of the selected nodes
+ query = new ParentAxisQuery(query, null, indexFormatVersion,
+ nsMappings);
+ }
- if (relPath.getEntries().length > 1)
- {
- // child axis in relation
- QPathEntry[] elements = relPath.getEntries();
- // elements.length - 1 = property name
- // elements.length - 2 = last child axis name test
- for (int i = elements.length - 2; i >= 0; i--)
- {
- QPathEntry name = null;
- if (!elements[i].equals(RelationQueryNode.STAR_NAME_TEST))
- {
- name = elements[i];
- }
- if (i == elements.length - 2)
- {
- // join name test with property query if there is one
- if (name != null)
- {
- Query nameTest = new NameQuery(name, indexFormatVersion, nsMappings);
- BooleanQuery and = new BooleanQuery();
- and.add(query, Occur.MUST);
- and.add(nameTest, Occur.MUST);
- query = and;
- }
- else
- {
- // otherwise the query can be used as is
- }
- }
- else
- {
- query = new ParentAxisQuery(query, name, indexFormatVersion, nsMappings);
- }
- }
- // finally select the parent of the selected nodes
- query = new ParentAxisQuery(query, null, indexFormatVersion, nsMappings);
- }
+ return query;
+ }
- return query;
- }
+ public Object visit(OrderQueryNode node, Object data) {
+ return data;
+ }
- public Object visit(OrderQueryNode node, Object data)
- {
- return data;
- }
+ public Object visit(PropertyFunctionQueryNode node, Object data) {
+ return data;
+ }
- public Object visit(PropertyFunctionQueryNode node, Object data)
- {
- return data;
- }
+ // ---------------------------< internal
+ // >-----------------------------------
- //---------------------------< internal >-----------------------------------
+ /**
+ * Wraps a constraint query around <code>q</code> that limits the nodes to
+ * those where <code>propName</code> is the name of a single value property
+ * on the node instance.
+ *
+ * @param q
+ * the query to wrap.
+ * @param propName
+ * the name of a property that only has one value.
+ * @return the wrapped query <code>q</code>.
+ */
+ private Query createSingleValueConstraint(Query q, String propName) {
+ // get nodes with multi-values in propName
+ Query mvp = new JackrabbitTermQuery(new Term(FieldNames.MVP, propName));
+ // now negate, that gives the nodes that have propName as single
+ // values but also all others
+ Query svp = new NotQuery(mvp);
+ // now join the two, which will result in those nodes where propName
+ // only contains a single value. This works because q already restricts
+ // the result to those nodes that have a property propName
+ BooleanQuery and = new BooleanQuery();
+ and.add(q, Occur.MUST);
+ and.add(svp, Occur.MUST);
+ return and;
+ }
- /**
- * Wraps a constraint query around <code>q</code> that limits the nodes to
- * those where <code>propName</code> is the name of a single value property
- * on the node instance.
- *
- * @param q the query to wrap.
- * @param propName the name of a property that only has one value.
- * @return the wrapped query <code>q</code>.
- */
- private Query createSingleValueConstraint(Query q, String propName)
- {
- // get nodes with multi-values in propName
- Query mvp = new JackrabbitTermQuery(new Term(FieldNames.MVP, propName));
- // now negate, that gives the nodes that have propName as single
- // values but also all others
- Query svp = new NotQuery(mvp);
- // now join the two, which will result in those nodes where propName
- // only contains a single value. This works because q already restricts
- // the result to those nodes that have a property propName
- BooleanQuery and = new BooleanQuery();
- and.add(q, Occur.MUST);
- and.add(svp, Occur.MUST);
- return and;
- }
+ /**
+ * Returns an array of String values to be used as a term to lookup the
+ * search index for a String <code>literal</code> of a certain property
+ * name. This method will lookup the <code>propertyName</code> in the node
+ * type registry trying to find out the {@link javax.jcr.PropertyType}s. If
+ * no property type is found looking up node type information, this method
+ * will guess the property type.
+ *
+ * @param propertyName
+ * the name of the property in the relation.
+ * @param literal
+ * the String literal in the relation.
+ * @return the String values to use as term for the query.
+ */
+ private String[] getStringValues(InternalQName propertyName, String literal) {
+ PropertyTypeRegistry.TypeMapping[] types = propRegistry
+ .getPropertyTypes(propertyName);
+ List<String> values = new ArrayList<String>();
+ for (int i = 0; i < types.length; i++) {
+ switch (types[i].type) {
+ case PropertyType.NAME:
+ // try to translate name
+ try {
+ InternalQName n = session.getLocationFactory()
+ .parseJCRName(literal).getInternalName();
+ values.add(nsMappings.translateName(n));
+ log.debug("Coerced " + literal + " into NAME.");
+ } catch (RepositoryException e) {
+ log.warn("Unable to coerce '" + literal + "' into a NAME: "
+ + e.toString());
+ } catch (IllegalNameException e) {
+ log.warn("Unable to coerce '" + literal + "' into a NAME: "
+ + e.toString());
+ }
+ break;
+ case PropertyType.PATH:
+ // try to translate path
+ try {
+ QPath p = session.getLocationFactory()
+ .parseJCRPath(literal).getInternalPath();
+ values.add(resolver.createJCRPath(p).getAsString(true));
+ log.debug("Coerced " + literal + " into PATH.");
+ } catch (RepositoryException e) {
+ log.warn("Unable to coerce '" + literal + "' into a PATH: "
+ + e.toString());
+ }
+ break;
+ case PropertyType.DATE:
+ // try to parse date
+ Calendar c = ISO8601.parse(literal);
+ if (c != null) {
+ values.add(DateField.timeToString(c.getTimeInMillis()));
+ log.debug("Coerced " + literal + " into DATE.");
+ } else {
+ log.warn("Unable to coerce '" + literal + "' into a DATE.");
+ }
+ break;
+ case PropertyType.DOUBLE:
+ // try to parse double
+ try {
+ double d = Double.parseDouble(literal);
+ values.add(DoubleField.doubleToString(d));
+ log.debug("Coerced " + literal + " into DOUBLE.");
+ } catch (NumberFormatException e) {
+ log.warn("Unable to coerce '" + literal
+ + "' into a DOUBLE: " + e.toString());
+ }
+ break;
+ case PropertyType.LONG:
+ // try to parse long
+ try {
+ long l = Long.parseLong(literal);
+ values.add(LongField.longToString(l));
+ log.debug("Coerced " + literal + " into LONG.");
+ } catch (NumberFormatException e) {
+ log.warn("Unable to coerce '" + literal + "' into a LONG: "
+ + e.toString());
+ }
+ break;
+ case PropertyType.STRING:
+ values.add(literal);
+ log.debug("Using literal " + literal + " as is.");
+ break;
+ }
+ }
+ if (values.size() == 0) {
+ // use literal as is then try to guess other types
+ values.add(literal);
- /**
- * Returns an array of String values to be used as a term to lookup the search index
- * for a String <code>literal</code> of a certain property name. This method
- * will lookup the <code>propertyName</code> in the node type registry
- * trying to find out the {@link javax.jcr.PropertyType}s.
- * If no property type is found looking up node type information, this
- * method will guess the property type.
- *
- * @param propertyName the name of the property in the relation.
- * @param literal the String literal in the relation.
- * @return the String values to use as term for the query.
- */
- private String[] getStringValues(InternalQName propertyName, String literal)
- {
- PropertyTypeRegistry.TypeMapping[] types = propRegistry.getPropertyTypes(propertyName);
- List<String> values = new ArrayList<String>();
- for (int i = 0; i < types.length; i++)
- {
- switch (types[i].type)
- {
- case PropertyType.NAME :
- // try to translate name
- try
- {
- InternalQName n = session.getLocationFactory().parseJCRName(literal).getInternalName();
- values.add(nsMappings.translateName(n));
- log.debug("Coerced " + literal + " into NAME.");
- }
- catch (RepositoryException e)
- {
- log.warn("Unable to coerce '" + literal + "' into a NAME: " + e.toString());
- }
- catch (IllegalNameException e)
- {
- log.warn("Unable to coerce '" + literal + "' into a NAME: " + e.toString());
- }
- break;
- case PropertyType.PATH :
- // try to translate path
- try
- {
- QPath p = session.getLocationFactory().parseJCRPath(literal).getInternalPath();
- values.add(resolver.createJCRPath(p).getAsString(true));
- log.debug("Coerced " + literal + " into PATH.");
- }
- catch (RepositoryException e)
- {
- log.warn("Unable to coerce '" + literal + "' into a PATH: " + e.toString());
- }
- break;
- case PropertyType.DATE :
- // try to parse date
- Calendar c = ISO8601.parse(literal);
- if (c != null)
- {
- values.add(DateField.timeToString(c.getTimeInMillis()));
- log.debug("Coerced " + literal + " into DATE.");
- }
- else
- {
- log.warn("Unable to coerce '" + literal + "' into a DATE.");
- }
- break;
- case PropertyType.DOUBLE :
- // try to parse double
- try
- {
- double d = Double.parseDouble(literal);
- values.add(DoubleField.doubleToString(d));
- log.debug("Coerced " + literal + " into DOUBLE.");
- }
- catch (NumberFormatException e)
- {
- log.warn("Unable to coerce '" + literal + "' into a DOUBLE: " + e.toString());
- }
- break;
- case PropertyType.LONG :
- // try to parse long
- try
- {
- long l = Long.parseLong(literal);
- values.add(LongField.longToString(l));
- log.debug("Coerced " + literal + " into LONG.");
- }
- catch (NumberFormatException e)
- {
- log.warn("Unable to coerce '" + literal + "' into a LONG: " + e.toString());
- }
- break;
- case PropertyType.STRING :
- values.add(literal);
- log.debug("Using literal " + literal + " as is.");
- break;
- }
- }
- if (values.size() == 0)
- {
- // use literal as is then try to guess other types
- values.add(literal);
-
- // try to guess property type
- if (literal.indexOf('/') > -1)
- {
- // might be a path
- try
- {
- QPath p = session.getLocationFactory().parseJCRPath(literal).getInternalPath();
- values.add(resolver.createJCRPath(p).getAsString(true));
- log.debug("Coerced " + literal + " into PATH.");
- }
- catch (Exception e)
- {
- // not a path
- }
- }
- if (XMLChar.isValidName(literal))
- {
- // might be a name
- try
- {
- InternalQName n = session.getLocationFactory().parseJCRName(literal).getInternalName();
- values.add(nsMappings.translateName(n));
- log.debug("Coerced " + literal + " into NAME.");
- }
- catch (Exception e)
- {
- // not a name
- }
- }
- if (literal.indexOf(':') > -1)
- {
- // is it a date?
- Calendar c = ISO8601.parse(literal);
- if (c != null)
- {
- values.add(DateField.timeToString(c.getTimeInMillis()));
- log.debug("Coerced " + literal + " into DATE.");
- }
- }
- else
- {
- // long or double are possible at this point
- try
- {
- values.add(LongField.longToString(Long.parseLong(literal)));
- log.debug("Coerced " + literal + " into LONG.");
- }
- catch (NumberFormatException e)
- {
- // not a long
- // try double
- try
- {
- values.add(DoubleField.doubleToString(Double.parseDouble(literal)));
- log.debug("Coerced " + literal + " into DOUBLE.");
- }
- catch (NumberFormatException e1)
- {
- // not a double
- }
- }
- }
- }
- // if still no values use literal as is
- if (values.size() == 0)
- {
- values.add(literal);
- log.debug("Using literal " + literal + " as is.");
- }
- return (String[])values.toArray(new String[values.size()]);
- }
+ // try to guess property type
+ if (literal.indexOf('/') > -1) {
+ // might be a path
+ try {
+ QPath p = session.getLocationFactory()
+ .parseJCRPath(literal).getInternalPath();
+ values.add(resolver.createJCRPath(p).getAsString(true));
+ log.debug("Coerced " + literal + " into PATH.");
+ } catch (Exception e) {
+ // not a path
+ }
+ }
+ if (XMLChar.isValidName(literal)) {
+ // might be a name
+ try {
+ InternalQName n = session.getLocationFactory()
+ .parseJCRName(literal).getInternalName();
+ values.add(nsMappings.translateName(n));
+ log.debug("Coerced " + literal + " into NAME.");
+ } catch (Exception e) {
+ // not a name
+ }
+ }
+ if (literal.indexOf(':') > -1) {
+ // is it a date?
+ Calendar c = ISO8601.parse(literal);
+ if (c != null) {
+ values.add(DateField.timeToString(c.getTimeInMillis()));
+ log.debug("Coerced " + literal + " into DATE.");
+ }
+ } else {
+ // long or double are possible at this point
+ try {
+ values.add(LongField.longToString(Long.parseLong(literal)));
+ log.debug("Coerced " + literal + " into LONG.");
+ } catch (NumberFormatException e) {
+ // not a long
+ // try double
+ try {
+ values.add(DoubleField.doubleToString(Double
+ .parseDouble(literal)));
+ log.debug("Coerced " + literal + " into DOUBLE.");
+ } catch (NumberFormatException e1) {
+ // not a double
+ }
+ }
+ }
+ }
+ // if still no values use literal as is
+ if (values.size() == 0) {
+ values.add(literal);
+ log.debug("Using literal " + literal + " as is.");
+ }
+ return (String[]) values.toArray(new String[values.size()]);
+ }
}
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneVirtualTableResolver.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneVirtualTableResolver.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneVirtualTableResolver.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query.lucene;
+
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.search.BooleanClause.Occur;
+import org.exoplatform.services.jcr.core.NamespaceAccessor;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.core.LocationFactory;
+import org.exoplatform.services.log.ExoLogger;
+import org.exoplatform.services.log.Log;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+import javax.jcr.query.InvalidQueryException;
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34027 2009-07-15 23:26:43Z
+ * aheritier $
+ */
+public class LuceneVirtualTableResolver extends
+ NodeTypeVirtualTableResolver<Query> {
+
+ private final LocationFactory locationFactory;
+
+ /**
+ * Class logger.
+ */
+ private final Log log = ExoLogger
+ .getLogger(LuceneVirtualTableResolver.class);
+
+ private final String mixinTypesField;
+
+ private final String primaryTypeField;
+
+ /**
+ * @param nodeTypeDataManager
+ * @throws RepositoryException
+ */
+ public LuceneVirtualTableResolver(
+ final NodeTypeDataManager nodeTypeDataManager,
+ final NamespaceAccessor namespaceAccessor)
+ throws RepositoryException {
+ super(nodeTypeDataManager);
+
+ locationFactory = new LocationFactory(namespaceAccessor);
+ mixinTypesField = locationFactory.createJCRName(
+ Constants.JCR_MIXINTYPES).getAsString();
+ primaryTypeField = locationFactory.createJCRName(
+ Constants.JCR_PRIMARYTYPE).getAsString();
+
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Query resolve(final InternalQName tableName,
+ final boolean includeInheritedTables) throws InvalidQueryException,
+ RepositoryException {
+
+ final List<Term> terms = new ArrayList<Term>();
+
+ Query query = null;
+ try {
+ final String nodeTypeStringName = locationFactory.createJCRName(
+ tableName).getAsString();
+
+ if (isMixin(tableName)) {
+ // search for nodes where jcr:mixinTypes is set to this mixin
+ Term t = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(mixinTypesField, nodeTypeStringName));
+ terms.add(t);
+
+ } else {
+ // search for nodes where jcr:primaryType is set to this type
+
+ Term t = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(primaryTypeField, nodeTypeStringName));
+ terms.add(t);
+ }
+ if (includeInheritedTables) {
+ // now search for all node types that are derived from base
+ final Set<InternalQName> allTypes = getSubTypes(tableName);
+ for (final InternalQName descendantNt : allTypes) {
+ final String ntName = locationFactory.createJCRName(
+ descendantNt).getAsString();
+
+ Term t;
+ if (isMixin(descendantNt)) {
+ // search on jcr:mixinTypes
+ t = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(mixinTypesField, ntName));
+ } else {
+ // search on jcr:primaryType
+ t = new Term(FieldNames.PROPERTIES, FieldNames
+ .createNamedValue(primaryTypeField, ntName));
+ }
+ terms.add(t);
+ }
+ }
+ } catch (final NoSuchNodeTypeException e) {
+ throw new InvalidQueryException(e.getMessage(), e);
+ }
+
+ if (terms.size() == 0) {
+ // exception occured
+ query = new BooleanQuery();
+
+ } else if (terms.size() == 1) {
+ query = new JackrabbitTermQuery(terms.get(0));
+
+ } else {
+ final BooleanQuery b = new BooleanQuery();
+ for (final Object element : terms) {
+ // b.add(new TermQuery((Term) element), Occur.SHOULD);
+ b.add(new JackrabbitTermQuery((Term) element), Occur.SHOULD);
+ }
+ query = b;
+ }
+
+ return query;
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/LuceneVirtualTableResolver.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query.lucene;
+
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
+import org.exoplatform.services.jcr.core.nodetype.NodeTypeDataManager;
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+
+import java.util.Set;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34027 2009-07-15 23:26:43Z
+ * aheritier $
+ */
+public abstract class NodeTypeVirtualTableResolver<Q> implements
+ VirtualTableResolver<Q> {
+ private final NodeTypeDataManager nodeTypeDataManager;
+
+ /**
+ * @param nodeTypeDataManager
+ */
+ public NodeTypeVirtualTableResolver(
+ final NodeTypeDataManager nodeTypeDataManager) {
+ super();
+ this.nodeTypeDataManager = nodeTypeDataManager;
+ }
+
+ /**
+ * @param nodeTypeName
+ * name.
+ * @return Returns all subtypes of node type <code>nodeTypeName</code> in
+ * the node type inheritance hierarchy.
+ * @throws RepositoryException
+ */
+ protected Set<InternalQName> getSubTypes(final InternalQName nodeTypeName)
+ throws RepositoryException {
+ return this.nodeTypeDataManager.getSubtypes(nodeTypeName);
+ }
+
+ /**
+ * @param nodeTypeName
+ * name.
+ * @return true if node type with name <code>nodeTypeName</code> is mixin.
+ * @throws RepositoryException
+ */
+ protected boolean isMixin(final InternalQName nodeTypeName)
+ throws RepositoryException {
+ final NodeTypeData nodeType = this.nodeTypeDataManager
+ .findNodeType(nodeTypeName);
+ if (nodeType == null) {
+ throw new NoSuchNodeTypeException("Node type "
+ + nodeTypeName.getAsString() + " not found");
+ }
+ return nodeType.isMixin();
+ }
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/NodeTypeVirtualTableResolver.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryImpl.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryImpl.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/QueryImpl.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -16,15 +16,6 @@
*/
package org.exoplatform.services.jcr.impl.core.query.lucene;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import javax.jcr.RepositoryException;
-import javax.jcr.nodetype.PropertyDefinition;
-import javax.jcr.query.InvalidQueryException;
-import javax.jcr.query.QueryResult;
-
import org.apache.lucene.search.Query;
import org.exoplatform.services.jcr.core.nodetype.NodeTypeData;
import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionData;
@@ -33,8 +24,6 @@
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
import org.exoplatform.services.jcr.impl.core.SessionImpl;
-import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeImpl;
-import org.exoplatform.services.jcr.impl.core.nodetype.PropertyDefinitionImpl;
import org.exoplatform.services.jcr.impl.core.query.AndQueryNode;
import org.exoplatform.services.jcr.impl.core.query.DefaultQueryNodeVisitor;
import org.exoplatform.services.jcr.impl.core.query.LocationStepQueryNode;
@@ -44,10 +33,17 @@
import org.exoplatform.services.jcr.impl.core.query.QueryNodeFactory;
import org.exoplatform.services.jcr.impl.core.query.QueryParser;
import org.exoplatform.services.jcr.impl.core.query.QueryRootNode;
-
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.query.InvalidQueryException;
+import javax.jcr.query.QueryResult;
+
/**
* Implements the {@link org.apache.jackrabbit.core.query.ExecutableQuery}
* interface.
@@ -62,7 +58,8 @@
/**
* The default selector name 's'.
*/
- public static final InternalQName DEFAULT_SELECTOR_NAME = new InternalQName(Constants.NS_DEFAULT_URI,"s");
+ public static final InternalQName DEFAULT_SELECTOR_NAME = new InternalQName(
+ Constants.NS_DEFAULT_URI, "s");
/**
* The root node of the query tree
@@ -71,135 +68,149 @@
/**
* Creates a new query instance from a query string.
- *
- * @param session the session of the user executing this query.
- * @param itemMgr the item manager of the session executing this query.
- * @param index the search index.
- * @param propReg the property type registry.
- * @param statement the query statement.
- * @param language the syntax of the query statement.
- * @param factory the query node factory.
- * @throws InvalidQueryException if the query statement is invalid according
- * to the specified <code>language</code>.
+ *
+ * @param session
+ * the session of the user executing this query.
+ * @param itemMgr
+ * the item manager of the session executing this query.
+ * @param index
+ * the search index.
+ * @param propReg
+ * the property type registry.
+ * @param statement
+ * the query statement.
+ * @param language
+ * the syntax of the query statement.
+ * @param factory
+ * the query node factory.
+ * @throws InvalidQueryException
+ * if the query statement is invalid according to the specified
+ * <code>language</code>.
*/
- public QueryImpl(SessionImpl session,
- SessionDataManager itemMgr,
- SearchIndex index,
- PropertyTypeRegistry propReg,
- String statement,
- String language,
- QueryNodeFactory factory) throws InvalidQueryException {
- super(session, itemMgr, index, propReg);
- // parse query according to language
- // build query tree using the passed factory
- //this.root = QueryParser.parse(statement, language, session, factory);
- this.root = QueryParser.parse(statement, language, session.getLocationFactory(), factory);
+ public QueryImpl(SessionImpl session, SessionDataManager itemMgr,
+ SearchIndex index, PropertyTypeRegistry propReg, String statement,
+ String language, QueryNodeFactory factory)
+ throws InvalidQueryException {
+ super(session, itemMgr, index, propReg);
+ // parse query according to language
+ // build query tree using the passed factory
+ // this.root = QueryParser.parse(statement, language, session, factory);
+ this.root = QueryParser.parse(statement, language, session
+ .getLocationFactory(), factory);
}
/**
* Executes this query and returns a <code>{@link QueryResult}</code>.
- *
- * @param offset the offset in the total result set
- * @param limit the maximum result size
+ *
+ * @param offset
+ * the offset in the total result set
+ * @param limit
+ * the maximum result size
* @return a <code>QueryResult</code>
- * @throws RepositoryException if an error occurs
+ * @throws RepositoryException
+ * if an error occurs
*/
- public QueryResult execute(long offset, long limit) throws RepositoryException {
- if (log.isDebugEnabled()) {
- log.debug("Executing query: \n" + root.dump());
- }
+ public QueryResult execute(long offset, long limit)
+ throws RepositoryException {
+ if (log.isDebugEnabled()) {
+ log.debug("Executing query: \n" + root.dump());
+ }
- // build lucene query
- Query query = LuceneQueryBuilder.createQuery(root, session,
- index.getContext().getItemStateManager(),
- index.getNamespaceMappings(), index.getTextAnalyzer(),
- propReg, index.getSynonymProvider(),
- index.getIndexFormatVersion());
+ // build lucene query
+ Query query = LuceneQueryBuilder.createQuery(root, session, index
+ .getContext().getItemStateManager(), index
+ .getNamespaceMappings(), index.getTextAnalyzer(), propReg,
+ index.getSynonymProvider(), index.getIndexFormatVersion(),
+ index.getContext().getVirtualTableResolver());
- OrderQueryNode orderNode = root.getOrderNode();
+ OrderQueryNode orderNode = root.getOrderNode();
- OrderQueryNode.OrderSpec[] orderSpecs;
- if (orderNode != null) {
- orderSpecs = orderNode.getOrderSpecs();
- } else {
- orderSpecs = new OrderQueryNode.OrderSpec[0];
- }
- QPath[] orderProperties = new QPath[orderSpecs.length];
- boolean[] ascSpecs = new boolean[orderSpecs.length];
- for (int i = 0; i < orderSpecs.length; i++) {
- orderProperties[i] = orderSpecs[i].getPropertyPath();
- ascSpecs[i] = orderSpecs[i].isAscending();
- }
+ OrderQueryNode.OrderSpec[] orderSpecs;
+ if (orderNode != null) {
+ orderSpecs = orderNode.getOrderSpecs();
+ } else {
+ orderSpecs = new OrderQueryNode.OrderSpec[0];
+ }
+ QPath[] orderProperties = new QPath[orderSpecs.length];
+ boolean[] ascSpecs = new boolean[orderSpecs.length];
+ for (int i = 0; i < orderSpecs.length; i++) {
+ orderProperties[i] = orderSpecs[i].getPropertyPath();
+ ascSpecs[i] = orderSpecs[i].isAscending();
+ }
- return new SingleColumnQueryResult(index, itemMgr,
- session, session.getAccessManager(),
- this, query, new SpellSuggestion(index.getSpellChecker(), root),
- getSelectProperties(), orderProperties, ascSpecs,
- getRespectDocumentOrder(), offset, limit);
+ return new SingleColumnQueryResult(index, itemMgr, session, session
+ .getAccessManager(), this, query, new SpellSuggestion(index
+ .getSpellChecker(), root), getSelectProperties(),
+ orderProperties, ascSpecs, getRespectDocumentOrder(), offset,
+ limit);
}
/**
* Returns the select properties for this query.
- *
+ *
* @return array of select property names.
- * @throws RepositoryException if an error occurs.
+ * @throws RepositoryException
+ * if an error occurs.
*/
protected InternalQName[] getSelectProperties() throws RepositoryException {
- // get select properties
- List selectProps = new ArrayList();
- selectProps.addAll(Arrays.asList(root.getSelectProperties()));
- if (selectProps.size() == 0) {
- // use node type constraint
- LocationStepQueryNode[] steps = root.getLocationNode().getPathSteps();
- final InternalQName[] ntName = new InternalQName[1];
- steps[steps.length - 1].acceptOperands(new DefaultQueryNodeVisitor() {
+ // get select properties
+ List selectProps = new ArrayList();
+ selectProps.addAll(Arrays.asList(root.getSelectProperties()));
+ if (selectProps.size() == 0) {
+ // use node type constraint
+ LocationStepQueryNode[] steps = root.getLocationNode()
+ .getPathSteps();
+ final InternalQName[] ntName = new InternalQName[1];
+ steps[steps.length - 1].acceptOperands(
+ new DefaultQueryNodeVisitor() {
- public Object visit(AndQueryNode node, Object data) throws RepositoryException {
- return node.acceptOperands(this, data);
- }
+ public Object visit(AndQueryNode node, Object data)
+ throws RepositoryException {
+ return node.acceptOperands(this, data);
+ }
- public Object visit(NodeTypeQueryNode node, Object data) {
- ntName[0] = node.getValue();
- return data;
- }
- }, null);
- if (ntName[0] == null) {
- ntName[0] = Constants.NT_BASE;
- }
- NodeTypeData nt = session.getWorkspace().getNodeTypesHolder().findNodeType(ntName[0]);
- PropertyDefinitionData[] propDefs = nt.getDeclaredPropertyDefinitions();
-
- for (int i = 0; i < propDefs.length; i++) {
- PropertyDefinitionData propDef = propDefs[i];
- if (!propDef.isResidualSet() && !propDef.isMultiple())
- {
- selectProps.add(propDef.getName());
- }
- }
- }
+ public Object visit(NodeTypeQueryNode node, Object data) {
+ ntName[0] = node.getValue();
+ return data;
+ }
+ }, null);
+ if (ntName[0] == null) {
+ ntName[0] = Constants.NT_BASE;
+ }
+ NodeTypeData nt = session.getWorkspace().getNodeTypesHolder()
+ .findNodeType(ntName[0]);
+ PropertyDefinitionData[] propDefs = nt
+ .getDeclaredPropertyDefinitions();
- // add jcr:path and jcr:score if not selected already
- if (!selectProps.contains(Constants.JCR_PATH))
- {
- selectProps.add(Constants.JCR_PATH);
- }
- if (!selectProps.contains(Constants.JCR_SCORE))
- {
- selectProps.add(Constants.JCR_SCORE);
- }
+ for (int i = 0; i < propDefs.length; i++) {
+ PropertyDefinitionData propDef = propDefs[i];
+ if (!propDef.isResidualSet() && !propDef.isMultiple()) {
+ selectProps.add(propDef.getName());
+ }
+ }
+ }
- return (InternalQName[])selectProps.toArray(new InternalQName[selectProps.size()]);
+ // add jcr:path and jcr:score if not selected already
+ if (!selectProps.contains(Constants.JCR_PATH)) {
+ selectProps.add(Constants.JCR_PATH);
+ }
+ if (!selectProps.contains(Constants.JCR_SCORE)) {
+ selectProps.add(Constants.JCR_SCORE);
+ }
+
+ return (InternalQName[]) selectProps
+ .toArray(new InternalQName[selectProps.size()]);
}
/**
* Returns <code>true</code> if this query node needs items under
* /jcr:system to be queried.
- *
+ *
* @return <code>true</code> if this query node needs content under
* /jcr:system to be queried; <code>false</code> otherwise.
*/
public boolean needsSystemTree() {
- return this.root.needsSystemTree();
+ return this.root.needsSystemTree();
}
}
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/SearchIndex.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -87,24 +87,6 @@
*/
public class SearchIndex extends AbstractQueryHandler {
- // public static final List VALID_SYSTEM_INDEX_NODE_TYPE_NAMES
- // = Collections.unmodifiableList(Arrays.asList(new Name[]{
- // NameConstants.NT_CHILDNODEDEFINITION,
- // NameConstants.NT_FROZENNODE,
- // NameConstants.NT_NODETYPE,
- // NameConstants.NT_PROPERTYDEFINITION,
- // NameConstants.NT_VERSION,
- // NameConstants.NT_VERSIONEDCHILD,
- // NameConstants.NT_VERSIONHISTORY,
- // NameConstants.NT_VERSIONLABELS,
- // NameConstants.REP_NODETYPES,
- // NameConstants.REP_SYSTEM,
- // NameConstants.REP_VERSIONSTORAGE,
- // // Supertypes
- // NameConstants.NT_BASE,
- // NameConstants.MIX_REFERENCEABLE
- // }));
-
private static final DefaultQueryNodeFactory DEFAULT_QUERY_NODE_FACTORY = new DefaultQueryNodeFactory();
/** The logger instance for this class */
@@ -162,32 +144,10 @@
*/
public static final int DEFAULT_TERM_INFOS_INDEX_DIVISOR = 1;
- // /**
- // * The path factory.
- // */
- // protected static final PathFactory PATH_FACTORY =
- // PathFactoryImpl.getInstance();
- //
- // /**
- // * The path of the root node.
- // */
- // private static final Path ROOT_PATH;
- //
- // /**
- // * The path <code>/jcr:system</code>.
- // */
- // private static final Path JCR_SYSTEM_PATH;
- //
- // static {
- // ROOT_PATH = PATH_FACTORY.create(NameConstants.ROOT);
- // try {
- // JCR_SYSTEM_PATH = PATH_FACTORY.create(ROOT_PATH,
- // NameConstants.JCR_SYSTEM, false);
- // } catch (RepositoryException e) {
- // // should never happen, path is always valid
- // throw new InternalError(e.getMessage());
- // }
- // }
+ /**
+ * Default name of the error log file
+ */
+ private static final String ERROR_LOG = "error.log";
/**
* The actual index
@@ -199,19 +159,6 @@
*/
private JcrStandartAnalyzer analyzer;
- // /**
- // * List of text extractor and text filter class names. The configured
- // * classes will be instantiated and used to extract text content from
- // * binary properties.
- // */
- // private String textFilterClasses =
- // DefaultTextExtractor.class.getName();
- //
- // /**
- // * Text extractor for extracting text content of binary properties.
- // */
- // private TextExtractor extractor;
-
/**
* The namespace mappings used internally.
*/
@@ -380,8 +327,6 @@
*/
private SynonymProvider synProvider;
- // private File indexDirectory;
-
/**
* The configuration path for the synonym provider.
*/
@@ -451,15 +396,14 @@
*/
private boolean closed = false;
- // private QueryHandlerContext context;
-
/**
* Text extractor for extracting text content of binary properties.
*/
private DocumentReaderService extractor;
- // private final QueryHandlerEntryWrapper queryHandlerConfig;
+ public static final int DEFAULT_ERRORLOG_FILE_SIZE = 50; // Kb
+ private int errorLogfileSize = DEFAULT_ERRORLOG_FILE_SIZE;
/**
* The ErrorLog of this <code>MultiIndex</code>. All changes that must be in
* index but interrupted by IOException are here.
@@ -601,9 +545,30 @@
+ "storage for optimal performance.", new Integer(
getIndexFormatVersion().getVersion()));
}
+
+ File file = new File(indexDirectory, ERROR_LOG);
+ errorLog = new ErrorLog(file, errorLogfileSize);
+ // reprocess any notfinished notifies;
+ recoverErrorLog(errorLog);
+
}
/**
+ * @return the errorLogfileSize
+ */
+ public int getErrorLogfileSize() {
+ return errorLogfileSize;
+ }
+
+ /**
+ * @param errorLogfileSize
+ * the errorLogfileSize to set
+ */
+ public void setErrorLogfileSize(int errorLogfileSize) {
+ this.errorLogfileSize = errorLogfileSize;
+ }
+
+ /**
* Adds the <code>node</code> to the search index.
*
* @param node
@@ -1308,34 +1273,39 @@
* @return the indexing configuration or <code>null</code> if there is none.
*/
protected Element getIndexingConfigurationDOM() {
- if (indexingConfiguration != null) {
- return indexingConfiguration;
+ if (indexingConfiguration == null) {
+ if (indexingConfigPath != null) {
+
+ // File config = new File(indexingConfigPath);
+
+ InputStream is = SearchIndex.class
+ .getResourceAsStream(indexingConfigPath);
+ if (is == null) {
+ try {
+ is = cfm.getInputStream(indexingConfigPath);
+ } catch (Exception e1) {
+ log.warn("Unable to load configuration "
+ + indexingConfigPath);
+ }
+ }
+
+ try {
+ DocumentBuilderFactory factory = DocumentBuilderFactory
+ .newInstance();
+ DocumentBuilder builder = factory.newDocumentBuilder();
+ builder
+ .setEntityResolver(new IndexingConfigurationEntityResolver());
+ indexingConfiguration = builder.parse(is)
+ .getDocumentElement();
+ } catch (ParserConfigurationException e) {
+ log.warn("Unable to create XML parser", e);
+ } catch (IOException e) {
+ log.warn("Exception parsing " + indexingConfigPath, e);
+ } catch (SAXException e) {
+ log.warn("Exception parsing " + indexingConfigPath, e);
+ }
+ }
}
- if (indexingConfigPath == null) {
- return null;
- }
- File config = new File(indexingConfigPath);
- if (!config.exists()) {
- log.warn("File does not exist: " + indexingConfigPath);
- return null;
- } else if (!config.canRead()) {
- log.warn("Cannot read file: " + indexingConfigPath);
- return null;
- }
- try {
- DocumentBuilderFactory factory = DocumentBuilderFactory
- .newInstance();
- DocumentBuilder builder = factory.newDocumentBuilder();
- builder
- .setEntityResolver(new IndexingConfigurationEntityResolver());
- indexingConfiguration = builder.parse(config).getDocumentElement();
- } catch (ParserConfigurationException e) {
- log.warn("Unable to create XML parser", e);
- } catch (IOException e) {
- log.warn("Exception parsing " + indexingConfigPath, e);
- } catch (SAXException e) {
- log.warn("Exception parsing " + indexingConfigPath, e);
- }
return indexingConfiguration;
}
@@ -2384,6 +2354,72 @@
errorLog.writeChanges(removed, added);
}
+ private void recoverErrorLog(ErrorLog errlog) throws IOException,
+ RepositoryException {
+ final Set<String> rem = new HashSet<String>();
+ final Set<String> add = new HashSet<String>();
+
+ errlog.readChanges(rem, add);
+
+ // check is any notifies in log
+ if (rem.isEmpty() && add.isEmpty()) {
+ // there is no sense to continue
+ return;
+ }
+
+ Iterator<String> removedStates = rem.iterator();
+
+ // make a new iterator;
+ Iterator<NodeData> addedStates = new Iterator<NodeData>() {
+ private final Iterator<String> iter = add.iterator();
+
+ public boolean hasNext() {
+ return iter.hasNext();
+ }
+
+ public NodeData next() {
+ String id;
+ // we have to iterrate through items till will meet ones
+ // existing in
+ // workspace
+ while (iter.hasNext()) {
+ id = iter.next();
+
+ try {
+ ItemData item = getContext().getItemStateManager()
+ .getItemData(id);
+ if (item != null) {
+ if (item.isNode()) {
+ return (NodeData) item; // return node here
+ } else
+ log
+ .warn("Node expected but property found with id "
+ + id
+ + ". Skipping "
+ + item.getQPath().getAsString());
+ } else {
+ log.warn("Unable to recovery node index " + id
+ + ". Node not found.");
+ }
+ } catch (RepositoryException e) {
+ log.error("ErrorLog recovery error. Item id " + id
+ + ". " + e, e);
+ }
+ }
+
+ return null;
+ }
+
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+ };
+
+ updateNodes(removedStates, addedStates);
+
+ errlog.clear();
+ }
+
/**
* @see org.exoplatform.services.jcr.impl.core.query.QueryHandler#executeQuery(org.apache.lucene.search.Query,
* boolean, org.exoplatform.services.jcr.datamodel.InternalQName[],
@@ -2398,4 +2434,5 @@
return new LuceneQueryHits(reader, searcher, query);
}
+
}
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VirtualTableResolver.java
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VirtualTableResolver.java (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VirtualTableResolver.java 2009-10-02 15:41:14 UTC (rev 198)
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2009 eXo Platform SAS.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.exoplatform.services.jcr.impl.core.query.lucene;
+
+import org.exoplatform.services.jcr.datamodel.InternalQName;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.query.InvalidQueryException;
+
+/**
+ * @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey Kabashnyuk</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34027 2009-07-15 23:26:43Z
+ * aheritier $
+ */
+public interface VirtualTableResolver<Q>
+{
+ /**
+ * Construct <Q>query for given table.
+ *
+ * @param tableName - name of the virtual table.
+ * @param includeInheritedTables - include inherited tables to the result.
+ * @return query.
+ */
+ Q resolve(InternalQName tableName, boolean includeInheritedTables) throws InvalidQueryException, RepositoryException;
+
+}
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/VirtualTableResolver.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.0.dtd
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.0.dtd 2009-10-02 15:39:44 UTC (rev 197)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.0.dtd 2009-10-02 15:41:14 UTC (rev 198)
@@ -16,7 +16,7 @@
-->
<!--
The configuration element configures the indexing behaviour of the lucene
- backed query handler in Jackrabbit. It allows you to define indexing
+ backed query handler . It allows you to define indexing
aggregates and configure which properties of a node are indexed.
This element must contain all the namespace declarations that are used
throughout this configuration.
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.1.dtd
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.1.dtd (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.1.dtd 2009-10-02 15:41:14 UTC (rev 198)
@@ -0,0 +1,84 @@
+<!--
+ 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.
+-->
+<!--
+ The configuration element configures the indexing behaviour of the lucene
+ backed query handler . It allows you to define indexing
+ aggregates and configure which properties of a node are indexed.
+ This element must contain all the namespace declarations that are used
+ throughout this configuration.
+-->
+<!ELEMENT configuration (aggregate*,index-rule*)>
+
+<!--
+ Each aggregate element defines an indexing aggregate based on the name of a
+ primary node type.
+-->
+<!ELEMENT aggregate (include*)>
+<!ATTLIST aggregate primaryType CDATA #REQUIRED>
+
+<!--
+ An include element contains a relative path pattern using either an exact
+ node name or *. Nodes that match the path pattern against the root of an
+ indexing aggregate are included in the aggregated node index. An include
+ element may optionally specify a primary node type name that needs to match
+ for the included node.
+-->
+<!ELEMENT include (#PCDATA)>
+<!ATTLIST include primaryType CDATA #IMPLIED>
+
+<!--
+ An index-rule element defines which properties of a node should be indexed.
+ When a node is indexed the list of index-rules is check for a matching
+ node type and whether the condition is true. If a match is found the
+ property is looked up.
+ The index-rule element also contains a boost value for the entire node
+ being indexed. A value higher than 1.0 will boost the score value for a node
+ that matched this index-rule.
+-->
+<!ELEMENT index-rule (property*)>
+<!ATTLIST index-rule nodeType CDATA #REQUIRED
+ condition CDATA #IMPLIED
+ boost CDATA "1.0">
+
+<!--
+ A property element defines the boost value for a matching property and a
+ flag that indicates whether the value of a string property should also be
+ included in the node scope fulltext index. Both boost and nodeScopeIndex
+ attributes only affect string properties and are ignored if the property
+ is not of type string. If isRegexp is set to true the name of the property
+ is interpreted as a regular expression to match properties on a node. Please
+ note that you may only use a regular expression for the local part of a
+ property name. The attribute useInExcerpt controls whether the contents
+ of the property is used to construct an excerpt. The default value for this
+ attribute is true.
+-->
+<!ELEMENT property (#PCDATA)>
+<!ATTLIST property boost CDATA "1.0"
+ nodeScopeIndex CDATA "true"
+ isRegexp CDATA "false"
+ useInExcerpt CDATA "true">
+
+<!--
+ An analyzer element with property elements in it defines which analyzer is to
+ be used for indexing and parsing the full text of this property. If the analyzer
+ class can not be found, the default analyzer is used. The node scope is always
+ indexed with the default analyzer, so might return different results for search
+ queries in some rare cases.
+-->
+<!ELEMENT analyzers (analyzer*)>
+<!ELEMENT analyzer (property*)>
+<!ATTLIST analyzer class CDATA #REQUIRED>
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.1.dtd
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.2.dtd
===================================================================
--- jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.2.dtd (rev 0)
+++ jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.2.dtd 2009-10-02 15:41:14 UTC (rev 198)
@@ -0,0 +1,93 @@
+<!--
+ 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.
+-->
+<!--
+ The configuration element configures the indexing behaviour of the lucene
+ backed query handler. It allows you to define indexing
+ aggregates and configure which properties of a node are indexed.
+ This element must contain all the namespace declarations that are used
+ throughout this configuration.
+-->
+<!ELEMENT configuration (aggregate*,index-rule*)>
+
+<!--
+ Each aggregate element defines an indexing aggregate based on the name of a
+ primary node type.
+-->
+<!ELEMENT aggregate (include*,include-property)>
+<!ATTLIST aggregate primaryType CDATA #REQUIRED>
+
+<!--
+ An include element contains a relative path pattern using either an exact
+ node name or *. Nodes that match the path pattern against the root of an
+ indexing aggregate are included in the aggregated node index. An include
+ element may optionally specify a primary node type name that needs to match
+ for the included node.
+-->
+<!ELEMENT include (#PCDATA)>
+<!ATTLIST include primaryType CDATA #IMPLIED>
+
+<!--
+ An include-property element contains a relative path to a property. Properties
+ that match the path against the root of an indexing aggregate are included
+ in the aggregated node index. Aggregated properties may be used to speed
+ up sorting of query results when the order by clause references a property
+ with a relative path.
+-->
+<!ELEMENT include-property (#PCDATA)>
+
+<!--
+ An index-rule element defines which properties of a node should be indexed.
+ When a node is indexed the list of index-rules is check for a matching
+ node type and whether the condition is true. If a match is found the
+ property is looked up.
+ The index-rule element also contains a boost value for the entire node
+ being indexed. A value higher than 1.0 will boost the score value for a node
+ that matched this index-rule.
+-->
+<!ELEMENT index-rule (property*)>
+<!ATTLIST index-rule nodeType CDATA #REQUIRED
+ condition CDATA #IMPLIED
+ boost CDATA "1.0">
+
+<!--
+ A property element defines the boost value for a matching property and a
+ flag that indicates whether the value of a string property should also be
+ included in the node scope fulltext index. Both boost and nodeScopeIndex
+ attributes only affect string properties and are ignored if the property
+ is not of type string. If isRegexp is set to true the name of the property
+ is interpreted as a regular expression to match properties on a node. Please
+ note that you may only use a regular expression for the local part of a
+ property name. The attribute useInExcerpt controls whether the contents
+ of the property is used to construct an excerpt. The default value for this
+ attribute is true.
+-->
+<!ELEMENT property (#PCDATA)>
+<!ATTLIST property boost CDATA "1.0"
+ nodeScopeIndex CDATA "true"
+ isRegexp CDATA "false"
+ useInExcerpt CDATA "true">
+
+<!--
+ An analyzer element with property elements in it defines which analyzer is to
+ be used for indexing and parsing the full text of this property. If the analyzer
+ class can not be found, the default analyzer is used. The node scope is always
+ indexed with the default analyzer, so might return different results for search
+ queries in some rare cases.
+-->
+<!ELEMENT analyzers (analyzer*)>
+<!ELEMENT analyzer (property*)>
+<!ATTLIST analyzer class CDATA #REQUIRED>
Property changes on: jcr/trunk/component/core/src/main/java/org/exoplatform/services/jcr/impl/core/query/lucene/indexing-configuration-1.2.dtd
___________________________________________________________________
Name: svn:mime-type
+ text/plain
14 years, 7 months
exo-jcr SVN: r197 - jcr/trunk/component/core/src/test/resources.
by do-not-reply@jboss.org
Author: skabashnyuk
Date: 2009-10-02 11:39:44 -0400 (Fri, 02 Oct 2009)
New Revision: 197
Modified:
jcr/trunk/component/core/src/test/resources/indexing-configuration.xml
Log:
EXOJCR-161 : indexer configuration update
Modified: jcr/trunk/component/core/src/test/resources/indexing-configuration.xml
===================================================================
--- jcr/trunk/component/core/src/test/resources/indexing-configuration.xml 2009-10-02 15:39:10 UTC (rev 196)
+++ jcr/trunk/component/core/src/test/resources/indexing-configuration.xml 2009-10-02 15:39:44 UTC (rev 197)
@@ -1,23 +1,54 @@
<?xml version="1.0"?>
-<!DOCTYPE configuration SYSTEM "http://www.exoplatform.org/dtd/indexing-configuration-1.0.dtd">
-<configuration xmlns:jcr="http://www.jcp.org/jcr/1.0" xmlns:nt="http://www.jcp.org/jcr/nt/1.0">
+<!DOCTYPE configuration SYSTEM "http://www.exoplatform.org/dtd/indexing-configuration-1.2.dtd">
+<configuration xmlns:jcr="http://www.jcp.org/jcr/1.0"
+ xmlns:nt="http://www.jcp.org/jcr/nt/1.0">
- <!-- aggregate primaryType="nt:file">
- <include>jcr:content</include>
- </aggregate -->
+ <index-rule nodeType="nt:unstructured" condition="@rule='boost1'">
+ <!-- default boost: 1.0 -->
+ <property>text</property>
+ </index-rule>
- <index-rule nodeType="nt:unstructured" boost="2.0" condition="ancestor::*/@priority = 'low'">
- <property>Text</property>
- </index-rule>
+ <index-rule nodeType="nt:unstructured" condition="@rule='boost2'">
+ <!-- boost: 2.0 -->
+ <property boost="2.0">text</property>
+ </index-rule>
- <index-rule nodeType="nt:unstructured" boost="2.0" condition="parent::indrootparent/@priority = 'low'">
- <property>Text</property>
- </index-rule>
+ <index-rule nodeType="nt:unstructured" condition="@rule='boost3'">
+ <!-- boost: 3.0 -->
+ <property boost="3.0">text</property>
+ </index-rule>
- <index-rule nodeType="nt:unstructured" boost="2.0" condition="indrootchild/@priority = 'gg'">
- <property>Text</property>
- </index-rule>
+ <index-rule nodeType="nt:unstructured" condition="@rule='nsiTrue'">
+ <!-- default value for nodeScopeIndex is true -->
+ <property>text</property>
+ </index-rule>
-</configuration>
+ <index-rule nodeType="nt:unstructured" condition="@rule='nsiFalse'">
+ <!-- do not include text in node scope index -->
+ <property nodeScopeIndex="false">text</property>
+ </index-rule>
+ <index-rule nodeType="nt:unstructured" condition="@rule='regexp'">
+ <property isRegexp="true">.*Text</property>
+ </index-rule>
+ <index-rule nodeType="nt:unstructured" condition="@rule='excerpt'">
+ <property useInExcerpt="false">title</property>
+ <property>text</property>
+ </index-rule>
+
+ <index-rule nodeType="nt:hierarchyNode">
+ <!-- do not index any properties -->
+ </index-rule>
+
+ <aggregate primaryType="nt:file">
+ <include>jcr:content</include>
+ <include>jcr:content/*</include>
+ <include-property>jcr:content/jcr:lastModified</include-property>
+ </aggregate>
+
+ <aggregate primaryType="nt:unstructured">
+ <include-property>child/property</include-property>
+ </aggregate>
+
+</configuration>
\ No newline at end of file
14 years, 7 months