Author: areshetnyak
Date: 2009-11-09 12:22:55 -0500 (Mon, 09 Nov 2009)
New Revision: 528
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JDBCCacheLoader.java
Log:
EXOJCR-201 : The JDBCCacheLoader.
Modified:
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JDBCCacheLoader.java
===================================================================
---
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JDBCCacheLoader.java 2009-11-09
16:36:32 UTC (rev 527)
+++
jcr/branches/1.12.0-JBC/component/core/src/main/java/org/exoplatform/services/jcr/impl/storage/jbosscache/JDBCCacheLoader.java 2009-11-09
17:22:55 UTC (rev 528)
@@ -43,8 +43,10 @@
import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.datamodel.QPathEntry;
import org.exoplatform.services.jcr.impl.Constants;
+import org.exoplatform.services.jcr.impl.storage.jdbc.JDBCStorageConnection;
import org.exoplatform.services.jcr.storage.WorkspaceDataContainer;
import org.exoplatform.services.jcr.storage.WorkspaceStorageConnection;
+import org.jboss.cache.CacheException;
import org.jboss.cache.Fqn;
import org.jboss.cache.Modification;
import org.jboss.cache.config.CacheLoaderConfig.IndividualCacheLoaderConfig;
@@ -58,6 +60,8 @@
import java.util.Map;
import java.util.Set;
+import javax.jcr.RepositoryException;
+
/**
* Created by The eXo Platform SAS.
*
@@ -94,11 +98,118 @@
*/
public void put(List<Modification> modifications) throws Exception
{
- // TODO
System.out.println(modifications);
+
+ JDBCStorageConnection jdbcConnection =
(JDBCStorageConnection)dataContainer.openConnection();
+
+ try
+ {
+ for (Modification m : modifications)
+ {
+ switch (m.getType())
+ {
+ case PUT_DATA:
+ System.out.println(m);
+ break;
+ case PUT_DATA_ERASE:
+ System.out.println(m);
+ break;
+ case PUT_KEY_VALUE:
+ System.out.println(m);
+ doAddOrUpdate(m, jdbcConnection);
+ break;
+ case REMOVE_DATA:
+ System.out.println(m);
+ break;
+ case REMOVE_KEY_VALUE:
+ System.out.println(m);
+ break;
+ case REMOVE_NODE:
+ System.out.println(m);
+ break;
+ case MOVE:
+ System.out.println(m);
+ break;
+ default:
+ throw new CacheException("Unknown modification " +
m.getType());
+ }
+ }
+
+ if (jdbcConnection != null)
+ jdbcConnection.commit();
+ }
+ finally
+ {
+ if (jdbcConnection != null && jdbcConnection.isOpened())
+ jdbcConnection.rollback();
+ }
+ }
+ private void doRemove(Modification modification, JDBCStorageConnection jdbcConnection,
String identifier)
+ throws IllegalStateException, RepositoryException
+ {
+
+ ItemData itemData = jdbcConnection.getItemData(identifier);
+
+ if (itemData instanceof NodeData)
+ jdbcConnection.delete((NodeData) itemData);
+ if (itemData instanceof PropertyData)
+ jdbcConnection.delete((PropertyData) itemData);
}
+
+ private boolean isNodeData(Fqn<String> fqn)
+ {
+ return fqn.toString().startsWith("/" +JBossCacheStorage.NODES);
+ }
+
+ /**
+ * Performs ADD and UPDATE to NodeData and PropertyData.
+ * @param modification
+ * @param jdbcConnection
+ * @throws IllegalStateException
+ * @throws RepositoryException
+ */
+ private void doAddOrUpdate(Modification modification, JDBCStorageConnection
jdbcConnection)
+ throws IllegalStateException, RepositoryException
+ {
+ if (modification.getValue() instanceof NodeData)
+ {
+ //add or update node data
+ NodeData nodeData = (NodeData)modification.getValue();
+ ItemData itemData = jdbcConnection.getItemData(nodeData.getIdentifier());
+
+ if (itemData == null)
+ {
+ //add
+ jdbcConnection.add(nodeData);
+ }
+ else
+ {
+ //update
+ jdbcConnection.update(nodeData);
+ }
+ }
+ else if (modification.getValue() instanceof PropertyData)
+ {
+ //add or update property data
+ PropertyData propertyData = (PropertyData)modification.getValue();
+
+ ItemData itemData = jdbcConnection.getItemData(propertyData.getIdentifier());
+
+ if (itemData == null)
+ {
+ //add
+ jdbcConnection.add(propertyData);
+ }
+ else
+ {
+ //update
+ jdbcConnection.update(propertyData);
+ }
+ }
+ }
+
protected QPathEntry[] makeNodePath(Fqn<String> nodeFqn) throws
NumberFormatException, IllegalNameException
{
List<String> elements = nodeFqn.peekElements();