[exo-jcr-commits] exo-jcr SVN: r4755 - in jcr/trunk/exo.jcr.component.core/src: main/java/org/exoplatform/services/jcr/impl/dataflow/persistent and 4 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Mon Aug 15 11:06:52 EDT 2011
Author: nzamosenchuk
Date: 2011-08-15 11:06:52 -0400 (Mon, 15 Aug 2011)
New Revision: 4755
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/SessionFactory.java
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/dataflow/persistent/WorkspacePersistentDataManager.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java
jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java
Log:
EXOJCR-267 : contains multiple fixes:
1) fixed critical bug, when result set was not properly processed, causing completely wrong nodeDatas and result list. CQ result set was processed as non-CQ. Fixed.
2) last node retrieved from DB is not added to result child list cause it can be incomplete. It is added only if current page is the last one;
3) updated logic with min page size.
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-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/NodeImpl.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -302,9 +302,9 @@
if (primaryTypeName == null)
{
throw new ConstraintViolationException("Can not define node type for " + name.getAsString()
- + ". No default primary type defined for child nodes in \""
- + nodeData().getPrimaryTypeName().getAsString()
- + "\" node type and no explicit primary type given to create a child node.");
+ + ". No default primary type defined for child nodes in \""
+ + nodeData().getPrimaryTypeName().getAsString()
+ + "\" node type and no explicit primary type given to create a child node.");
}
}
// try to make new node
@@ -460,7 +460,7 @@
{
checkValid();
-
+
if (!session.getAccessManager().hasPermission(getACL(),
new String[]{PermissionType.ADD_NODE, PermissionType.SET_PROPERTY}, session.getUserState().getIdentity()))
{
@@ -544,7 +544,7 @@
{
throw new LockException("Node " + getPath() + " is locked ");
}
-
+
if (checkedOut())
{
return;
@@ -911,8 +911,8 @@
NodeData parent = (NodeData)dataManager.getItemData(getParentIdentifier());
this.definition =
- nodeTypesHolder.getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(),
- parent.getPrimaryTypeName(), parent.getMixinTypeNames());
+ nodeTypesHolder.getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(), parent
+ .getPrimaryTypeName(), parent.getMixinTypeNames());
if (definition == null)
{
@@ -1295,8 +1295,8 @@
else
{
childs =
- new ArrayList<PropertyData>(dataManager.getChildPropertiesData(nodeData(),
- filter.getQPathEntryFilters()));
+ new ArrayList<PropertyData>(dataManager.getChildPropertiesData(nodeData(), filter
+ .getQPathEntryFilters()));
Collections.sort(childs, new PropertiesDataOrderComparator<PropertyData>());
}
@@ -1631,18 +1631,15 @@
new InternalQName[]{Constants.NT_BASE}, null, false);
return;
}
-
+
if (parent == null)
{
parent = (NodeData)dataManager.getItemData(getParentIdentifier());
}
this.definition =
- session
- .getWorkspace()
- .getNodeTypesHolder()
- .getChildNodeDefinition(getInternalName(), nodeData().getPrimaryTypeName(), parent.getPrimaryTypeName(),
- parent.getMixinTypeNames());
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(getInternalName(),
+ nodeData().getPrimaryTypeName(), parent.getPrimaryTypeName(), parent.getMixinTypeNames());
if (definition == null)
{
@@ -2563,11 +2560,8 @@
}
// Check if node is not protected
NodeDefinitionData childNodeDefinition =
- session
- .getWorkspace()
- .getNodeTypesHolder()
- .getChildNodeDefinition(name, primaryTypeName, nodeData().getPrimaryTypeName(),
- nodeData().getMixinTypeNames());
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(name, primaryTypeName,
+ nodeData().getPrimaryTypeName(), nodeData().getMixinTypeNames());
if (childNodeDefinition == null)
{
throw new ConstraintViolationException("Can't find child node definition for "
@@ -3045,11 +3039,8 @@
if (def == null)
{
def =
- session
- .getWorkspace()
- .getNodeTypesHolder()
- .getChildNodeDefinition(nameToAdd, primaryTypeName, parentNode.getPrimaryTypeName(),
- parentNode.getMixinTypeNames());
+ session.getWorkspace().getNodeTypesHolder().getChildNodeDefinition(nameToAdd, primaryTypeName,
+ parentNode.getPrimaryTypeName(), parentNode.getMixinTypeNames());
}
boolean allowSns = def.isAllowsSameNameSiblings();
@@ -3493,7 +3484,7 @@
private int fromOrderNum = 0;
private boolean hasNext = true;
-
+
private int pos = 0;
private LazyNodeIterator lazyNodeItetator = new LazyNodeIterator(new ArrayList<NodeData>());
@@ -3631,16 +3622,13 @@
LOG.error("There are no more elements in iterator", e);
throw new NoSuchElementException(e.toString());
}
-
+
Collections.sort(storedNodes, new NodeDataOrderComparator());
int size = storedNodes.size();
- fromOrderNum =
- size == 0 ? fromOrderNum + limit : Math.max(fromOrderNum + limit, storedNodes.get(size - 1)
- .getOrderNumber() + 1);
+ fromOrderNum = size == 0 ? fromOrderNum + limit : storedNodes.get(size - 1).getOrderNumber() + 1;
-
// skip some nodes
if (size != 0)
{
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionFactory.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -98,6 +98,9 @@
if (config.getContainer().getParameterInteger(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_DEFAULT) < WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN)
{
+ // set proper value
+ config.getContainer().putParameterValue(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
+ Integer.toString(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN));
LOG.warn("Value for \"lazy-node-iterator-page-size\" is too small. Using allowed minimum page size : "
+ WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN + ".");
}
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-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/SessionImpl.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -257,10 +257,6 @@
this.lazyNodeIteatorPageSize =
wsConfig.getContainer().getParameterInteger(WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE,
WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_DEFAULT);
- if (this.lazyNodeIteatorPageSize < WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN)
- {
- this.lazyNodeIteatorPageSize = WorkspaceDataContainer.LAZY_NODE_ITERATOR_PAGE_SIZE_MIN;
- }
}
/**
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/dataflow/persistent/WorkspacePersistentDataManager.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -109,7 +109,7 @@
* Read-only status.
*/
protected boolean readOnly = false;
-
+
/**
* The resource manager
*/
@@ -136,7 +136,7 @@
{
this.log = log;
}
-
+
protected ItemStateChangesLog getChangesLog()
{
return log;
@@ -180,7 +180,7 @@
{
this(dataContainer, systemDataContainerHolder, null);
}
-
+
/**
* WorkspacePersistentDataManager constructor.
*
@@ -290,7 +290,7 @@
{
// The rollback is done normally
persister.rollback();
- }
+ }
}
/**
@@ -310,29 +310,28 @@
// fail later in the tx
txResourceManager.addListener(new TransactionableResourceManagerListener()
{
-
+
public void onCommit(boolean onePhase) throws Exception
{
persister.commit();
}
-
+
public void onAfterCompletion(int status) throws Exception
{
}
-
+
public void onAbort() throws Exception
{
persister.rollback();
}
});
- }
+ }
}
- private enum ConnectionMode
- {
+ private enum ConnectionMode {
NORMAL, PARTIALLY_MANAGED
}
-
+
class ChangesLogPersister
{
@@ -629,11 +628,11 @@
con.close();
}
}
-
+
/**
* {@inheritDoc}
*/
- public boolean getChildNodesDataByPage(final NodeData nodeData, int fromOrderNum, int limit, List<NodeData> childs)
+ public boolean getChildNodesDataByPage(final NodeData nodeData, int fromOrderNum, int limit, List<NodeData> childNodes)
throws RepositoryException
{
final WorkspaceStorageConnection con = dataContainer.openConnection();
@@ -641,8 +640,7 @@
{
try
{
- childs.addAll(((JDBCStorageConnection)con).getChildNodesDataByPage(nodeData, fromOrderNum, limit));
- return childs.size() == limit;
+ return ((JDBCStorageConnection)con).getChildNodesDataByPage(nodeData, fromOrderNum, limit, childNodes);
}
finally
{
@@ -689,7 +687,7 @@
con.close();
}
}
-
+
/**
* {@inheritDoc}
*/
@@ -725,8 +723,8 @@
/**
* {@inheritDoc}
*/
- public List<PropertyData> getChildPropertiesData(final NodeData nodeData, final List<QPathEntryFilter> itemDataFilters)
- throws RepositoryException
+ public List<PropertyData> getChildPropertiesData(final NodeData nodeData,
+ final List<QPathEntryFilter> itemDataFilters) throws RepositoryException
{
final WorkspaceStorageConnection con = dataContainer.openConnection();
try
@@ -1050,8 +1048,7 @@
/**
* {@inheritDoc}
*/
- public ItemData getItemData(final NodeData parentData, final QPathEntry name)
- throws RepositoryException
+ public ItemData getItemData(final NodeData parentData, final QPathEntry name) throws RepositoryException
{
return getItemData(parentData, name, ItemType.UNKNOWN);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/JDBCStorageConnection.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -73,6 +73,7 @@
import javax.jcr.InvalidItemStateException;
import javax.jcr.PropertyType;
import javax.jcr.RepositoryException;
+import javax.jcr.UnsupportedRepositoryOperationException;
/**
* Created by The eXo Platform SAS.
@@ -859,9 +860,11 @@
// update type
if (updatePropertyByIdentifier(data.getPersistedVersion(), data.getType(), cid) <= 0)
+ {
throw new JCRInvalidItemStateException("(update) Property not found " + data.getQPath().getAsString() + " "
+ data.getIdentifier() + ". Probably was deleted by another session ", data.getIdentifier(),
ItemState.UPDATED);
+ }
// update reference
try
@@ -893,13 +896,17 @@
catch (IOException e)
{
if (LOG.isDebugEnabled())
+ {
LOG.error("Property update. IO error: " + e, e);
+ }
throw new RepositoryException("Error of Property Value update " + e, e);
}
catch (SQLException e)
{
if (LOG.isDebugEnabled())
+ {
LOG.error("Property update. Database error: " + e, e);
+ }
exceptionHandler.handleUpdateException(e, data);
}
}
@@ -1045,7 +1052,9 @@
{
List<PropertyData> children = new ArrayList<PropertyData>();
while (prop.next())
+ {
children.add((PropertyData)itemData(parent.getQPath(), prop, I_CLASS_PROPERTY, null));
+ }
return children;
}
@@ -1092,8 +1101,8 @@
* @throws RepositoryException
* @throws IllegalStateException
*/
- public List<NodeDataIndexing> getNodesAndProperties(String lastNodeId, int offset, int limit) throws RepositoryException,
- IllegalStateException
+ public List<NodeDataIndexing> getNodesAndProperties(String lastNodeId, int offset, int limit)
+ throws RepositoryException, IllegalStateException
{
List<NodeDataIndexing> result = new ArrayList<NodeDataIndexing>();
@@ -1172,43 +1181,11 @@
* @throws RepositoryException
* @throws IllegalStateException
*/
- public List<NodeData> getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit) throws RepositoryException,
- IllegalStateException
+ public boolean getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit, List<NodeData> childNodes)
+ throws RepositoryException, IllegalStateException
{
- checkIfOpened();
- try
- {
- ResultSet node = findChildNodesByParentIdentifier(getInternalId(parent.getIdentifier()), fromOrderNum, limit);
- try
- {
- List<NodeData> childrens = new ArrayList<NodeData>();
- while (node.next())
- {
- childrens.add((NodeData)itemData(parent.getQPath(), node, I_CLASS_NODE, parent.getACL()));
- }
-
- return childrens;
- }
- finally
- {
- try
- {
- node.close();
- }
- catch (SQLException e)
- {
- LOG.error("Can't close the ResultSet: " + e);
- }
- }
- }
- catch (SQLException e)
- {
- throw new RepositoryException(e);
- }
- catch (IOException e)
- {
- throw new RepositoryException(e);
- }
+ // not supported by non-CQ deprecated JDBC container
+ throw new UnsupportedRepositoryOperationException();
}
/**
@@ -1224,7 +1201,9 @@
{
List<PropertyData> children = new ArrayList<PropertyData>();
while (prop.next())
+ {
children.add(propertyData(parent.getQPath(), prop));
+ }
return children;
}
@@ -1342,8 +1321,8 @@
if (valueRecord.next())
{
String storageId = valueRecord.getString(COLUMN_VSTORAGE_DESC);
- return valueRecord.wasNull() ? readValueData(cid, orderNumb, persistedVersion,
- valueRecord.getBinaryStream(COLUMN_VDATA)) : readValueData(propertyId, orderNumb, storageId);
+ return valueRecord.wasNull() ? readValueData(cid, orderNumb, persistedVersion, valueRecord
+ .getBinaryStream(COLUMN_VDATA)) : readValueData(propertyId, orderNumb, storageId);
}
return null;
@@ -1516,7 +1495,9 @@
try
{
if (!parent.next())
+ {
throw new InvalidItemStateException("Parent not found, uuid: " + getIdentifier(caid));
+ }
QPathEntry qpe =
new QPathEntry(InternalQName.parse(parent.getString(COLUMN_NAME)), parent.getInt(COLUMN_INDEX));
@@ -1608,12 +1589,18 @@
{
MixinInfo naMixins = readMixins(caid);
if (naMixins.hasPrivilegeable())
+ {
return readACLPermisions(caid);
+ }
if (naMixins.parentId == null)
+ {
caid = findParentId(caid);
+ }
else
+ {
caid = naMixins.parentId;
+ }
}
throw new IllegalACLException("Can not find permissions for a node with id " + getIdentifier(cpid));
@@ -1625,9 +1612,13 @@
try
{
if (pidrs.next())
+ {
return pidrs.getString(COLUMN_PARENTID);
+ }
else
+ {
throw new RepositoryException("Item not found id: " + getIdentifier(cid));
+ }
}
finally
{
@@ -1666,12 +1657,18 @@
{
MixinInfo naMixins = readMixins(caid);
if (naMixins.hasOwneable())
+ {
return readACLOwner(caid);
+ }
if (naMixins.parentId == null)
+ {
caid = findParentId(caid);
+ }
else
+ {
caid = naMixins.parentId;
+ }
}
throw new IllegalACLException("Can not find owner for a node with id " + getIdentifier(cpid));
@@ -1707,19 +1704,27 @@
{
naOwner = readACLOwner(caid);
if (naPermissions != null)
+ {
break;
+ }
}
if (naPermissions == null && naMixins.hasPrivilegeable())
{
naPermissions = readACLPermisions(caid);
if (naOwner != null)
+ {
break;
+ }
}
if (naMixins.parentId == null)
+ {
caid = findParentId(caid);
+ }
else
+ {
caid = naMixins.parentId;
+ }
}
if (naOwner != null && naPermissions != null)
@@ -1733,8 +1738,10 @@
return new AccessControlList();
}
else
+ {
throw new IllegalACLException("ACL is not found for node with id " + getIdentifier(cpid)
+ " or for its ancestors. But repository is ACL enabled.");
+ }
}
/**
@@ -1787,7 +1794,9 @@
// parent = findItemByIdentifier(caid);
if (qrpath.size() <= 0)
+ {
throw new InvalidItemStateException("Parent not found, uuid: " + getIdentifier(cpid));
+ }
}
finally
@@ -1805,7 +1814,9 @@
}
if (cstmt != null)
+ {
cstmt.close();
+ }
}
QPathEntry[] qentries = new QPathEntry[qrpath.size()];
@@ -1989,7 +2000,9 @@
return mns;
}
else
+ {
return new InternalQName[0];
+ }
}
/**
@@ -2050,9 +2063,13 @@
mts.add(mxn);
if (!privilegeable && Constants.EXO_PRIVILEGEABLE.equals(mxn))
+ {
privilegeable = true;
+ }
else if (!owneable && Constants.EXO_OWNEABLE.equals(mxn))
+ {
owneable = true;
+ }
} // else, if SQL NULL - skip it
}
while (mtrs.next());
@@ -2103,8 +2120,10 @@
return naPermissions;
}
else
+ {
throw new IllegalACLException("Property exo:permissions is not found for node with id: "
+ getIdentifier(cid));
+ }
}
finally
{
@@ -2136,9 +2155,13 @@
try
{
if (exoOwner.next())
+ {
return new String(exoOwner.getBytes(COLUMN_VDATA));
+ }
else
+ {
throw new IllegalACLException("Property exo:owner is not found for node with id: " + getIdentifier(cid));
+ }
}
finally
{
@@ -2215,8 +2238,10 @@
{
if (!ptProp.next())
+ {
throw new PrimaryTypeNotFoundException("FATAL ERROR primary type record not found. Node "
+ qpath.getAsString() + ", id " + cid + ", container " + this.containerName, null);
+ }
byte[] data = ptProp.getBytes(COLUMN_VDATA);
InternalQName ptName = InternalQName.parse(new String((data != null ? data : new byte[]{})));
@@ -2239,8 +2264,8 @@
{
// use permissions from existed parent
acl =
- new AccessControlList(readACLOwner(cid), parentACL.hasPermissions()
- ? parentACL.getPermissionEntries() : null);
+ new AccessControlList(readACLOwner(cid), parentACL.hasPermissions() ? parentACL
+ .getPermissionEntries() : null);
}
else
{
@@ -2272,14 +2297,18 @@
else
{
if (parentACL != null)
+ {
// construct ACL from existed parent ACL
acl =
- new AccessControlList(parentACL.getOwner(), parentACL.hasPermissions()
- ? parentACL.getPermissionEntries() : null);
+ new AccessControlList(parentACL.getOwner(), parentACL.hasPermissions() ? parentACL
+ .getPermissionEntries() : null);
+ }
else
+ {
// have to search nearest ancestor owner and permissions in ACL manager
// acl = traverseACL(cpid);
acl = null;
+ }
}
return new PersistedNodeData(getIdentifier(cid), qpath, getIdentifier(parentCid), cversion, cnordernumb,
@@ -2449,8 +2478,8 @@
final int orderNum = valueRecords.getInt(COLUMN_VORDERNUM);
final String storageId = valueRecords.getString(COLUMN_VSTORAGE_DESC);
ValueData vdata =
- valueRecords.wasNull() ? readValueData(cid, orderNum, cversion,
- valueRecords.getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
+ valueRecords.wasNull() ? readValueData(cid, orderNum, cversion, valueRecords
+ .getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
data.add(vdata);
}
}
@@ -2531,6 +2560,7 @@
{
// stream from database
if (content != null)
+ {
while ((read = content.read(spoolBuffer)) >= 0)
{
if (out != null)
@@ -2566,6 +2596,7 @@
len += read;
}
}
+ }
}
finally
{
@@ -2747,8 +2778,7 @@
// build property data
PropertyData pdata =
- new PersistedPropertyData(identifier, qpath, tempNode.cid, prop.version, prop.type, prop.multi,
- valueData);
+ new PersistedPropertyData(identifier, qpath, tempNode.cid, prop.version, prop.type, prop.multi, valueData);
childProps.put(propName, pdata);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/CQJDBCStorageConnection.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -322,6 +322,85 @@
* {@inheritDoc}
*/
@Override
+ public boolean getChildNodesDataByPage(NodeData parent, int fromOrderNum, int limit, List<NodeData> childNodes)
+ throws RepositoryException, IllegalStateException
+ {
+ checkIfOpened();
+ ResultSet resultSet = null;
+ try
+ {
+ // query will return nodes and properties in same result set
+ // last node can be incomplete, so reading one more ahead, to be sure returning
+ // at least "limit" nodes.
+ int rowsLimit = (limit + 1) * 4;
+ resultSet = findChildNodesByParentIdentifier(getInternalId(parent.getIdentifier()), fromOrderNum, rowsLimit);
+ TempNodeData data = null;
+ int resultSetSize = 0;
+ while (resultSet.next())
+ {
+ resultSetSize++;
+ if (data == null)
+ {
+ data = new TempNodeData(resultSet);
+ }
+ else if (!resultSet.getString(COLUMN_ID).equals(data.cid))
+ {
+ NodeData nodeData = loadNodeFromTemporaryNodeData(data, parent.getQPath(), parent.getACL());
+ childNodes.add(nodeData);
+ data = new TempNodeData(resultSet);
+ }
+ Map<String, SortedSet<TempPropertyData>> properties = data.properties;
+ String key = resultSet.getString("PROP_NAME");
+ SortedSet<TempPropertyData> values = properties.get(key);
+ if (values == null)
+ {
+ values = new TreeSet<TempPropertyData>();
+ properties.put(key, values);
+ }
+ values.add(new TempPropertyData(resultSet));
+ }
+ // last node can be incomplete, so removed
+ boolean hasNext = resultSetSize == rowsLimit;
+ if (!hasNext)
+ {
+ // the last one node
+ if (data != null)
+ {
+ NodeData nodeData = loadNodeFromTemporaryNodeData(data, parent.getQPath(), parent.getACL());
+ childNodes.add(nodeData);
+ }
+ }
+
+ return hasNext;
+ }
+ catch (SQLException e)
+ {
+ throw new RepositoryException(e);
+ }
+ catch (IOException e)
+ {
+ throw new RepositoryException(e);
+ }
+ finally
+ {
+ if (resultSet != null)
+ {
+ try
+ {
+ resultSet.close();
+ }
+ catch (SQLException e)
+ {
+ LOG.error("Can't close the ResultSet: " + e);
+ }
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
public void update(PropertyData data) throws RepositoryException, UnsupportedOperationException,
InvalidItemStateException, IllegalStateException
{
@@ -357,7 +436,7 @@
+ data.getIdentifier() + ". Probably was deleted by another session ", data.getIdentifier(),
ItemState.UPDATED);
}
-
+
// update reference
try
{
@@ -652,8 +731,8 @@
try
{
qpath =
- QPath.makeChildPath(parentPath == null ? traverseQPath(cpid) : parentPath,
- InternalQName.parse(cname));
+ QPath.makeChildPath(parentPath == null ? traverseQPath(cpid) : parentPath, InternalQName
+ .parse(cname));
}
catch (IllegalNameException e)
{
@@ -670,8 +749,8 @@
{
final String storageId = resultSet.getString(COLUMN_VSTORAGE_DESC);
ValueData vdata =
- resultSet.wasNull() ? readValueData(cid, orderNum, cversion,
- resultSet.getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
+ resultSet.wasNull() ? readValueData(cid, orderNum, cversion, resultSet
+ .getBinaryStream(COLUMN_VDATA)) : readValueData(identifier, orderNum, storageId);
data.add(vdata);
}
Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/storage/jdbc/optimisation/db/MultiDbJDBCConnection.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -226,9 +226,13 @@
protected int addNodeRecord(NodeData data) throws SQLException
{
if (insertNode == null)
+ {
insertNode = dbConnection.prepareStatement(INSERT_NODE);
+ }
else
+ {
insertNode.clearParameters();
+ }
insertNode.setString(1, data.getIdentifier());
insertNode.setString(2, data.getParentIdentifier() == null ? Constants.ROOT_PARENT_UUID : data
@@ -247,9 +251,13 @@
protected int addPropertyRecord(PropertyData data) throws SQLException
{
if (insertProperty == null)
+ {
insertProperty = dbConnection.prepareStatement(INSERT_PROPERTY);
+ }
else
+ {
insertProperty.clearParameters();
+ }
insertProperty.setString(1, data.getIdentifier());
insertProperty.setString(2, data.getParentIdentifier());
@@ -269,12 +277,18 @@
protected int addReference(PropertyData data) throws SQLException, IOException
{
if (insertReference == null)
+ {
insertReference = dbConnection.prepareStatement(INSERT_REF);
+ }
else
+ {
insertReference.clearParameters();
+ }
if (data.getQPath().getAsString().indexOf("versionableUuid") > 0)
+ {
LOG.info("add ref versionableUuid " + data.getQPath().getAsString());
+ }
List<ValueData> values = data.getValues();
int added = 0;
@@ -299,9 +313,13 @@
protected int deleteReference(String propertyIdentifier) throws SQLException
{
if (deleteReference == null)
+ {
deleteReference = dbConnection.prepareStatement(DELETE_REF);
+ }
else
+ {
deleteReference.clearParameters();
+ }
deleteReference.setString(1, propertyIdentifier);
return deleteReference.executeUpdate();
@@ -314,9 +332,13 @@
protected int deleteItemByIdentifier(String identifier) throws SQLException
{
if (deleteItem == null)
+ {
deleteItem = dbConnection.prepareStatement(DELETE_ITEM);
+ }
else
+ {
deleteItem.clearParameters();
+ }
deleteItem.setString(1, identifier);
return deleteItem.executeUpdate();
@@ -329,9 +351,13 @@
protected int updateNodeByIdentifier(int version, int index, int orderNumb, String identifier) throws SQLException
{
if (updateNode == null)
+ {
updateNode = dbConnection.prepareStatement(UPDATE_NODE);
+ }
else
+ {
updateNode.clearParameters();
+ }
updateNode.setInt(1, version);
updateNode.setInt(2, index);
@@ -347,9 +373,13 @@
protected int updatePropertyByIdentifier(int version, int type, String identifier) throws SQLException
{
if (updateProperty == null)
+ {
updateProperty = dbConnection.prepareStatement(UPDATE_PROPERTY);
+ }
else
+ {
updateProperty.clearParameters();
+ }
updateProperty.setInt(1, version);
updateProperty.setInt(2, type);
@@ -364,9 +394,13 @@
protected ResultSet findItemByName(String parentId, String name, int index) throws SQLException
{
if (findItemByName == null)
+ {
findItemByName = dbConnection.prepareStatement(FIND_ITEM_BY_NAME);
+ }
else
+ {
findItemByName.clearParameters();
+ }
findItemByName.setString(1, parentId);
findItemByName.setString(2, name);
@@ -381,9 +415,13 @@
protected ResultSet findPropertyByName(String parentId, String name) throws SQLException
{
if (findPropertyByName == null)
+ {
findPropertyByName = dbConnection.prepareStatement(FIND_PROPERTY_BY_NAME);
+ }
else
+ {
findPropertyByName.clearParameters();
+ }
findPropertyByName.setString(1, parentId);
findPropertyByName.setString(2, name);
@@ -397,9 +435,13 @@
protected ResultSet findItemByIdentifier(String identifier) throws SQLException
{
if (findItemById == null)
+ {
findItemById = dbConnection.prepareStatement(FIND_ITEM_BY_ID);
+ }
else
+ {
findItemById.clearParameters();
+ }
findItemById.setString(1, identifier);
return findItemById.executeQuery();
@@ -412,9 +454,13 @@
protected ResultSet findReferences(String nodeIdentifier) throws SQLException
{
if (findReferences == null)
+ {
findReferences = dbConnection.prepareStatement(FIND_REFERENCES);
+ }
else
+ {
findReferences.clearParameters();
+ }
findReferences.setString(1, nodeIdentifier);
return findReferences.executeQuery();
@@ -427,9 +473,13 @@
protected ResultSet findChildNodesByParentIdentifier(String parentIdentifier) throws SQLException
{
if (findNodesByParentId == null)
+ {
findNodesByParentId = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID);
+ }
else
+ {
findNodesByParentId.clearParameters();
+ }
findNodesByParentId.setString(1, parentIdentifier);
return findNodesByParentId.executeQuery();
@@ -442,9 +492,13 @@
protected ResultSet findChildNodesByParentIdentifierCQ(String parentIdentifier) throws SQLException
{
if (findNodesByParentIdCQ == null)
+ {
findNodesByParentIdCQ = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID_CQ);
+ }
else
+ {
findNodesByParentIdCQ.clearParameters();
+ }
findNodesByParentIdCQ.setString(1, parentIdentifier);
return findNodesByParentIdCQ.executeQuery();
@@ -496,9 +550,13 @@
protected ResultSet findLastOrderNumberByParentIdentifier(String parentIdentifier) throws SQLException
{
if (findLastOrderNumberByParentId == null)
+ {
findLastOrderNumberByParentId = dbConnection.prepareStatement(FIND_LAST_ORDER_NUMBER_BY_PARENTID);
+ }
else
+ {
findLastOrderNumberByParentId.clearParameters();
+ }
findLastOrderNumberByParentId.setString(1, parentIdentifier);
return findLastOrderNumberByParentId.executeQuery();
@@ -511,9 +569,13 @@
protected ResultSet findChildNodesCountByParentIdentifier(String parentIdentifier) throws SQLException
{
if (findNodesCountByParentId == null)
+ {
findNodesCountByParentId = dbConnection.prepareStatement(FIND_NODES_COUNT_BY_PARENTID);
+ }
else
+ {
findNodesCountByParentId.clearParameters();
+ }
findNodesCountByParentId.setString(1, parentIdentifier);
return findNodesCountByParentId.executeQuery();
@@ -526,9 +588,13 @@
protected ResultSet findChildPropertiesByParentIdentifier(String parentIdentifier) throws SQLException
{
if (findPropertiesByParentId == null)
+ {
findPropertiesByParentId = dbConnection.prepareStatement(FIND_PROPERTIES_BY_PARENTID);
+ }
else
+ {
findPropertiesByParentId.clearParameters();
+ }
findPropertiesByParentId.setString(1, parentIdentifier);
return findPropertiesByParentId.executeQuery();
@@ -577,9 +643,13 @@
throws SQLException
{
if (findNodesByParentIdLazilyCQ == null)
+ {
findNodesByParentIdLazilyCQ = dbConnection.prepareStatement(FIND_NODES_BY_PARENTID_LAZILY_CQ);
+ }
else
+ {
findNodesByParentIdLazilyCQ.clearParameters();
+ }
findNodesByParentIdLazilyCQ.setString(1, parentCid);
findNodesByParentIdLazilyCQ.setInt(2, fromOrderNum);
@@ -599,9 +669,13 @@
{
if (insertValue == null)
+ {
insertValue = dbConnection.prepareStatement(INSERT_VALUE);
+ }
else
+ {
insertValue.clearParameters();
+ }
if (stream == null)
{
@@ -627,9 +701,13 @@
protected int deleteValueData(String cid) throws SQLException
{
if (deleteValue == null)
+ {
deleteValue = dbConnection.prepareStatement(DELETE_VALUE);
+ }
else
+ {
deleteValue.clearParameters();
+ }
deleteValue.setString(1, cid);
return deleteValue.executeUpdate();
@@ -642,9 +720,13 @@
protected ResultSet findValuesByPropertyId(String cid) throws SQLException
{
if (findValuesByPropertyId == null)
+ {
findValuesByPropertyId = dbConnection.prepareStatement(FIND_VALUES_BY_PROPERTYID);
+ }
else
+ {
findValuesByPropertyId.clearParameters();
+ }
findValuesByPropertyId.setString(1, cid);
return findValuesByPropertyId.executeQuery();
@@ -657,9 +739,13 @@
protected ResultSet findValueByPropertyIdOrderNumber(String cid, int orderNumb) throws SQLException
{
if (findValueByPropertyIdOrderNumber == null)
+ {
findValueByPropertyIdOrderNumber = dbConnection.prepareStatement(FIND_VALUE_BY_PROPERTYID_OREDERNUMB);
+ }
else
+ {
findValueByPropertyIdOrderNumber.clearParameters();
+ }
findValueByPropertyIdOrderNumber.setString(1, cid);
findValueByPropertyIdOrderNumber.setInt(2, orderNumb);
@@ -673,9 +759,13 @@
protected int renameNode(NodeData data) throws SQLException
{
if (renameNode == null)
+ {
renameNode = dbConnection.prepareStatement(RENAME_NODE);
+ }
else
+ {
renameNode.clearParameters();
+ }
renameNode.setString(1, data.getParentIdentifier() == null ? Constants.ROOT_PARENT_UUID : data
.getParentIdentifier());
@@ -694,10 +784,14 @@
protected ResultSet findValuesStorageDescriptorsByPropertyId(String cid) throws SQLException
{
if (findValuesStorageDescriptorsByPropertyId == null)
+ {
findValuesStorageDescriptorsByPropertyId =
dbConnection.prepareStatement(FIND_VALUES_VSTORAGE_DESC_BY_PROPERTYID);
+ }
else
+ {
findValuesStorageDescriptorsByPropertyId.clearParameters();
+ }
findValuesStorageDescriptorsByPropertyId.setString(1, cid);
return findValuesStorageDescriptorsByPropertyId.executeQuery();
@@ -710,9 +804,13 @@
protected ResultSet findChildPropertiesByParentIdentifierCQ(String parentIdentifier) throws SQLException
{
if (findPropertiesByParentIdCQ == null)
+ {
findPropertiesByParentIdCQ = dbConnection.prepareStatement(FIND_PROPERTIES_BY_PARENTID_CQ);
+ }
else
+ {
findPropertiesByParentIdCQ.clearParameters();
+ }
findPropertiesByParentIdCQ.setString(1, parentIdentifier);
return findPropertiesByParentIdCQ.executeQuery();
@@ -725,10 +823,14 @@
protected ResultSet findNodeMainPropertiesByParentIdentifierCQ(String parentIdentifier) throws SQLException
{
if (findNodeMainPropertiesByParentIdentifierCQ == null)
+ {
findNodeMainPropertiesByParentIdentifierCQ =
dbConnection.prepareStatement(FIND_NODE_MAIN_PROPERTIES_BY_PARENTID_CQ);
+ }
else
+ {
findNodeMainPropertiesByParentIdentifierCQ.clearParameters();
+ }
findNodeMainPropertiesByParentIdentifierCQ.setString(1, parentIdentifier);
return findNodeMainPropertiesByParentIdentifierCQ.executeQuery();
@@ -741,9 +843,13 @@
protected ResultSet findItemQPathByIdentifierCQ(String identifier) throws SQLException
{
if (findItemQPathByIdentifierCQ == null)
+ {
findItemQPathByIdentifierCQ = dbConnection.prepareStatement(FIND_ITEM_QPATH_BY_ID_CQ);
+ }
else
+ {
findItemQPathByIdentifierCQ.clearParameters();
+ }
findItemQPathByIdentifierCQ.setString(1, identifier);
return findItemQPathByIdentifierCQ.executeQuery();
@@ -752,9 +858,13 @@
protected int deleteValueDataByOrderNum(String id, int orderNum) throws SQLException
{
if (deleteValueDataByOrderNum == null)
+ {
deleteValueDataByOrderNum = dbConnection.prepareStatement(DELETE_VALUE_BY_ORDER_NUM);
+ }
else
+ {
deleteValueDataByOrderNum.clearParameters();
+ }
deleteValueDataByOrderNum.setString(1, id);
deleteValueDataByOrderNum.setInt(2, orderNum);
@@ -764,9 +874,13 @@
protected ResultSet findPropertyById(String id) throws SQLException
{
if (findPropertyById == null)
+ {
findPropertyById = dbConnection.prepareStatement(FIND_PROPERTY_BY_ID);
+ }
else
+ {
findPropertyById.clearParameters();
+ }
findPropertyById.setString(1, id);
return findPropertyById.executeQuery();
@@ -777,9 +891,13 @@
{
if (updateValue == null)
+ {
updateValue = dbConnection.prepareStatement(UPDATE_VALUE);
+ }
else
+ {
updateValue.clearParameters();
+ }
if (stream == null)
{
Modified: jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java 2011-08-15 14:18:02 UTC (rev 4754)
+++ jcr/trunk/exo.jcr.component.core/src/test/java/org/exoplatform/services/jcr/impl/core/TestGetNodesLazily.java 2011-08-15 15:06:52 UTC (rev 4755)
@@ -53,10 +53,12 @@
testRoot = (NodeImpl)session.getRootNode().addNode("TestGetNodesLazily");
// add first 150 child nodes
- nodesCount = 150;
+ nodesCount = 350;
for (int i = 0; i < nodesCount; i++)
{
- testRoot.addNode("child" + i).setProperty(INDEX_PROPERTY, i);
+ Node newNode = testRoot.addNode("child" + i);
+ newNode.setProperty(INDEX_PROPERTY, i);
+ newNode.addMixin("exo:owneable");
}
session.save();
txService = (TransactionService)container.getComponentInstanceOfType(TransactionService.class);
More information about the exo-jcr-commits
mailing list