Author: nzamosenchuk
Date: 2011-08-17 09:50:37 -0400 (Wed, 17 Aug 2011)
New Revision: 4768
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
Log:
EXOJCR-267 : getNodesLazily can be invoked instead of API getNodes() call by setting
system property. With this property set All TCK passed but one eXo-JCR test fails
"testRead(org.exoplatform.services.jcr.impl.access.TestAccess)". This is
implementetion specific issue.
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-08-17
09:06:09 UTC (rev 4767)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-08-17
13:50:37 UTC (rev 4768)
@@ -1044,6 +1044,19 @@
*/
public NodeIterator getNodes() throws RepositoryException
{
+
+ if (SessionImpl.FORCE_USE_GET_NODES_LAZILY)
+ {
+ if (LOG.isDebugEnabled())
+ {
+ LOG
+ .debug("EXPERIMENTAL! Be aware that \"getNodesLazily()\"
feature is used instead of JCR API getNodes()"
+ + " invocation.To disable this simply cleanup system property
\"org.exoplatform.jcr.forceUserGetNodesLazily\""
+ + " and restart JCR.");
+ }
+ return getNodesLazily();
+ }
+
long start = 0;
if (LOG.isDebugEnabled())
{
@@ -1093,6 +1106,7 @@
*/
public NodeIterator getNodesLazily() throws RepositoryException
{
+ checkValid();
return new LazyNodeIteratorByPage(dataManager);
}
@@ -3487,6 +3501,8 @@
private int pos = 0;
+ private int size = -1;
+
private LazyNodeIterator lazyNodeItetator = new LazyNodeIterator(new
ArrayList<NodeData>());
LazyNodeIteratorByPage(SessionDataManager dataManager) throws RepositoryException
@@ -3578,11 +3594,10 @@
public void skip(long skipNum)
{
pos += skipNum;
-
long leftToSkip = lazyNodeItetator.trySkip(skipNum, false);
if (leftToSkip != 0)
{
- readNextPage(leftToSkip);
+ readNextPage(leftToSkip + 1);
}
}
@@ -3591,7 +3606,18 @@
*/
public long getSize()
{
- return -1;
+ if (size < 0)
+ {
+ try
+ {
+ size = dataManager.getChildNodesCount(nodeData());
+ }
+ catch (RepositoryException e)
+ {
+ LOG.error("Can't determmine number of child nodes.", e);
+ }
+ }
+ return size;
}
public ItemImpl nextItem()
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java 2011-08-17
09:06:09 UTC (rev 4767)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java 2011-08-17
13:50:37 UTC (rev 4768)
@@ -53,7 +53,6 @@
import org.exoplatform.services.jcr.impl.xml.importing.ContentImporter;
import org.exoplatform.services.jcr.impl.xml.importing.StreamImporter;
import org.exoplatform.services.jcr.storage.WorkspaceDataContainer;
-import org.exoplatform.services.jcr.util.IdGenerator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.security.ConversationState;
@@ -118,12 +117,21 @@
*/
private static final boolean PROHIBIT_CLOSED_SESSION_USAGE =
Boolean.valueOf(PropertyManager.getProperty("exo.jcr.prohibit.closed.session.usage"));
+
+ protected static boolean FORCE_USE_GET_NODES_LAZILY =
+
Boolean.valueOf(PropertyManager.getProperty("org.exoplatform.jcr.forceUserGetNodesLazily"));
+
static
{
if (PROHIBIT_CLOSED_SESSION_USAGE)
{
log.info("The JCR will throw an exception anytime we will try to use a dead
session.");
}
+ if (FORCE_USE_GET_NODES_LAZILY)
+ {
+ log.warn("EXPERIMENTAL! The JCR will use ExtendedNode.getNodesLazily() for
each Node.getNodes() "
+ + "invocation. This is an experimental feauture and should be used with
care.");
+ }
}
private static final AtomicLong SEQUENCE = new AtomicLong();
Show replies by date