[exo-jcr-commits] exo-jcr SVN: r2766 - in jcr/trunk: exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl and 1 other directory.

do-not-reply at jboss.org do-not-reply at jboss.org
Mon Jul 12 05:22:10 EDT 2010


Author: tolusha
Date: 2010-07-12 05:22:10 -0400 (Mon, 12 Jul 2010)
New Revision: 2766

Modified:
   jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java
   jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/PendingChangesLog.java
Log:
EXOJCR-837: fix ClassCastException

Modified: jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java	2010-07-09 15:13:07 UTC (rev 2765)
+++ jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/BackupWorkspaceInitializer.java	2010-07-12 09:22:10 UTC (rev 2766)
@@ -31,11 +31,12 @@
 import org.exoplatform.services.jcr.datamodel.IllegalNameException;
 import org.exoplatform.services.jcr.datamodel.ItemData;
 import org.exoplatform.services.jcr.datamodel.NodeData;
+import org.exoplatform.services.jcr.datamodel.ValueData;
 import org.exoplatform.services.jcr.impl.Constants;
 import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
 import org.exoplatform.services.jcr.impl.core.value.ValueFactoryImpl;
-import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
 import org.exoplatform.services.jcr.impl.dataflow.persistent.CacheableWorkspaceDataManager;
+import org.exoplatform.services.jcr.impl.dataflow.persistent.StreamPersistedValueData;
 import org.exoplatform.services.jcr.impl.storage.JCRInvalidItemStateException;
 import org.exoplatform.services.jcr.impl.storage.JCRItemExistsException;
 import org.exoplatform.services.jcr.impl.util.io.FileCleaner;
@@ -440,20 +441,75 @@
 
       public void restore() throws IOException
       {
-         List<ItemState> listItemState = itemDataChangesLog.getAllStates();
-         for (int i = 0; i < this.listFixupStream.size(); i++)
+         int index = 0;
+         int restoredItemStateId = index < listFixupStream.size() ? listFixupStream.get(index).getItemSateId() : -1;
+         int restoredValueDataId = index < listFixupStream.size() ? listFixupStream.get(index).getValueDataId() : -1;
+
+         TransactionChangesLog restoredItemDataChangesLog = new TransactionChangesLog();
+
+         ChangesLogIterator logIterator = itemDataChangesLog.getLogIterator();
+         int curItemStateId = 0;
+         while (logIterator.hasNextLog())
          {
-            ItemState itemState = listItemState.get(listFixupStream.get(i).getItemSateId());
-            ItemData itemData = itemState.getData();
+            List<ItemState> restoredItems = new ArrayList<ItemState>();
 
-            PersistedPropertyData propertyData = (PersistedPropertyData)itemData;
-            TransientValueData tvd =
-               (TransientValueData)(propertyData.getValues().get(listFixupStream.get(i).getValueDataId()));
+            PlainChangesLog log = logIterator.nextLog();
+            for (ItemState item : log.getAllStates())
+            {
+               if (curItemStateId != restoredItemStateId)
+               {
+                  restoredItems.add(item);
+               }
+               else
+               {
+                  List<ValueData> restoredValues = new ArrayList<ValueData>();
 
-            // re-init the value
-            tvd.delegate(new TransientValueData(tvd.getOrderNumber(), null, null, new SpoolFile(PrivilegedFileHelper
-               .getAbsolutePath(listFile.get(i))), fileCleaner, -1, null, true));
+                  PersistedPropertyData propertyData = (PersistedPropertyData)item.getData();
+                  for (int curValueDataId = 0; curValueDataId < propertyData.getValues().size(); curValueDataId++)
+                  {
+                     ValueData valueData = propertyData.getValues().get(curValueDataId);
+
+                     if (curItemStateId == restoredItemStateId && curValueDataId == restoredValueDataId)
+                     {
+                        // reinit valuedata
+                        ValueData restoredValueData =
+                           new StreamPersistedValueData(valueData.getOrderNumber(), new SpoolFile(listFile.get(index)
+                              .getAbsolutePath()));
+
+                        restoredValues.add(restoredValueData);
+
+                        index++;
+                        restoredItemStateId =
+                           index < listFixupStream.size() ? listFixupStream.get(index).getItemSateId() : -1;
+                        restoredValueDataId =
+                           index < listFixupStream.size() ? listFixupStream.get(index).getValueDataId() : -1;
+                     }
+                     else
+                     {
+                        restoredValues.add(valueData);
+                     }
+                  }
+
+                  PersistedPropertyData restoredPropertyData =
+                     new PersistedPropertyData(propertyData.getIdentifier(), propertyData.getQPath(), propertyData
+                        .getParentIdentifier(), propertyData.getPersistedVersion(), propertyData.getType(),
+                        propertyData.isMultiValued(), restoredValues);
+
+                  ItemState restoredItem =
+                     new ItemState(restoredPropertyData, item.getState(), item.isEventFire(), item.getAncestorToSave(),
+                        item.isInternallyCreated(), item.isPersisted());
+
+                  restoredItems.add(restoredItem);
+               }
+
+               curItemStateId++;
+            }
+
+            PlainChangesLog restoredLog =
+               new PlainChangesLogImpl(restoredItems, log.getSessionId(), log.getEventType(), log.getPairId());
+            restoredItemDataChangesLog.addLog(restoredLog);
          }
+         itemDataChangesLog = restoredItemDataChangesLog;
 
          for (int i = 0; i < listFile.size(); i++)
             fileCleaner.addFile(listFile.get(i));

Modified: jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/PendingChangesLog.java
===================================================================
--- jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/PendingChangesLog.java	2010-07-09 15:13:07 UTC (rev 2765)
+++ jcr/trunk/exo.jcr.component.ext/src/main/java/org/exoplatform/services/jcr/ext/backup/impl/PendingChangesLog.java	2010-07-12 09:22:10 UTC (rev 2766)
@@ -18,12 +18,16 @@
  */
 package org.exoplatform.services.jcr.ext.backup.impl;
 
+import org.exoplatform.services.jcr.dataflow.ChangesLogIterator;
 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.dataflow.persistent.PersistedPropertyData;
 import org.exoplatform.services.jcr.datamodel.ItemData;
+import org.exoplatform.services.jcr.datamodel.ValueData;
 import org.exoplatform.services.jcr.ext.replication.FixupStream;
-import org.exoplatform.services.jcr.impl.dataflow.TransientValueData;
+import org.exoplatform.services.jcr.impl.dataflow.persistent.StreamPersistedValueData;
 import org.exoplatform.services.jcr.impl.util.io.FileCleaner;
 import org.exoplatform.services.jcr.impl.util.io.SpoolFile;
 import org.exoplatform.services.jcr.util.IdGenerator;
@@ -482,20 +486,75 @@
    {
       // TODO same code as in BackupWorkspaceInitializer?
 
-      List<ItemState> listItemState = itemDataChangesLog.getAllStates();
-      for (int i = 0; i < this.listFixupStream.size(); i++)
+      int index = 0;
+      int restoredItemStateId = index < listFixupStream.size() ? listFixupStream.get(index).getItemSateId() : -1;
+      int restoredValueDataId = index < listFixupStream.size() ? listFixupStream.get(index).getValueDataId() : -1;
+
+      TransactionChangesLog restoredItemDataChangesLog = new TransactionChangesLog();
+
+      ChangesLogIterator logIterator = itemDataChangesLog.getLogIterator();
+      int curItemStateId = 0;
+      while (logIterator.hasNextLog())
       {
-         ItemState itemState = listItemState.get(listFixupStream.get(i).getItemSateId());
-         ItemData itemData = itemState.getData();
+         List<ItemState> restoredItems = new ArrayList<ItemState>();
 
-         PersistedPropertyData propertyData = (PersistedPropertyData)itemData;
-         TransientValueData tvd =
-            (TransientValueData)(propertyData.getValues().get(listFixupStream.get(i).getValueDataId()));
+         PlainChangesLog log = logIterator.nextLog();
+         for (ItemState item : log.getAllStates())
+         {
+            if (curItemStateId != restoredItemStateId)
+            {
+               restoredItems.add(item);
+            }
+            else
+            {
+               List<ValueData> restoredValues = new ArrayList<ValueData>();
 
-         // re-init the value
-         tvd.delegate(new TransientValueData(tvd.getOrderNumber(), null, null, new SpoolFile(listFile.get(i)
-            .getAbsolutePath()), fileCleaner, -1, null, true));
+               PersistedPropertyData propertyData = (PersistedPropertyData)item.getData();
+               for (int curValueDataId = 0; curValueDataId < propertyData.getValues().size(); curValueDataId++)
+               {
+                  ValueData valueData = propertyData.getValues().get(curValueDataId);
+
+                  if (curItemStateId == restoredItemStateId && curValueDataId == restoredValueDataId)
+                  {
+                     // reinit valuedata
+                     ValueData restoredValueData =
+                        new StreamPersistedValueData(valueData.getOrderNumber(), new SpoolFile(listFile.get(index)
+                           .getAbsolutePath()));
+
+                     restoredValues.add(restoredValueData);
+
+                     index++;
+                     restoredItemStateId =
+                        index < listFixupStream.size() ? listFixupStream.get(index).getItemSateId() : -1;
+                     restoredValueDataId =
+                        index < listFixupStream.size() ? listFixupStream.get(index).getValueDataId() : -1;
+                  }
+                  else
+                  {
+                     restoredValues.add(valueData);
+                  }
+               }
+
+               PersistedPropertyData restoredPropertyData =
+                  new PersistedPropertyData(propertyData.getIdentifier(), propertyData.getQPath(), propertyData
+                     .getParentIdentifier(), propertyData.getPersistedVersion(), propertyData.getType(), propertyData
+                     .isMultiValued(), restoredValues);
+
+               ItemState restoredItem =
+                  new ItemState(restoredPropertyData, item.getState(), item.isEventFire(), item.getAncestorToSave(),
+                     item.isInternallyCreated(), item.isPersisted());
+
+               restoredItems.add(restoredItem);
+            }
+
+            curItemStateId++;
+         }
+
+         PlainChangesLog restoredLog =
+            new PlainChangesLogImpl(restoredItems, log.getSessionId(), log.getEventType(), log.getPairId());
+         restoredItemDataChangesLog.addLog(restoredLog);
       }
+      itemDataChangesLog = restoredItemDataChangesLog;
 
       if (listRandomAccessFile != null)
          for (int i = 0; i < listRandomAccessFile.size(); i++)
@@ -503,7 +562,6 @@
 
       for (int i = 0; i < listFile.size(); i++)
          fileCleaner.addFile(listFile.get(i));
-
    }
 
 }
\ No newline at end of file



More information about the exo-jcr-commits mailing list