diff options
Diffstat (limited to 'source/com/c2kernel/persistency/TransactionManager.java')
| -rw-r--r-- | source/com/c2kernel/persistency/TransactionManager.java | 111 |
1 files changed, 52 insertions, 59 deletions
diff --git a/source/com/c2kernel/persistency/TransactionManager.java b/source/com/c2kernel/persistency/TransactionManager.java index 0908051..6517d8b 100644 --- a/source/com/c2kernel/persistency/TransactionManager.java +++ b/source/com/c2kernel/persistency/TransactionManager.java @@ -2,13 +2,11 @@ package com.c2kernel.persistency; import java.util.ArrayList;
import java.util.HashMap;
-import java.util.Iterator;
import com.c2kernel.common.ObjectNotFoundException;
import com.c2kernel.entity.C2KLocalObject;
import com.c2kernel.entity.agent.JobList;
import com.c2kernel.events.History;
-import com.c2kernel.lookup.InvalidEntityPathException;
import com.c2kernel.utils.Logger;
public class TransactionManager {
@@ -22,12 +20,12 @@ public class TransactionManager { locks = new HashMap<Integer, Object>();
pendingTransactions = new HashMap<Object, ArrayList<TransactionEntry>>();
}
-
+
public boolean hasPendingTransactions()
{
return pendingTransactions.size() > 0;
}
-
+
public ClusterStorageManager getDb() {
return storage;
}
@@ -40,40 +38,36 @@ public class TransactionManager { Logger.msg("Transaction Manager: Closing storages");
storage.close();
}
-
+
public String[] getClusterContents(int sysKey, String path) throws ClusterStorageException {
if (path.startsWith("/") && path.length() > 1) path = path.substring(1);
return storage.getClusterContents(new Integer(sysKey), path);
}
-
+
/**
* Public get method. Required a 'locker' object for a transaction key.
* Checks the transaction table first to see if the caller has uncommitted changes
*/
- public C2KLocalObject get(int sysKey, String path, Object locker)
- throws ClusterStorageException,
+ public C2KLocalObject get(int sysKey, String path, Object locker)
+ throws ClusterStorageException,
ObjectNotFoundException {
if (path.startsWith("/") && path.length() > 1) path = path.substring(1);
-
+
// deal out top level remote maps
- if (path.indexOf('/') == -1) {
- try {
- if (path.equals(ClusterStorage.HISTORY))
- return new History(sysKey, locker);
- if (path.equals(ClusterStorage.JOB))
- return new JobList(sysKey, locker);
- } catch (InvalidEntityPathException ex) {
- throw new ObjectNotFoundException("Invalid key");
- }
+ if (path.indexOf('/') == -1) {
+ if (path.equals(ClusterStorage.HISTORY))
+ return new History(sysKey, locker);
+ if (path.equals(ClusterStorage.JOB))
+ return new JobList(sysKey, locker);
}
-
+
Integer sysKeyIntObj = new Integer(sysKey);
// check to see if the locker has been modifying this cluster
synchronized(locks) {
if (locks.containsKey(sysKeyIntObj) && locks.get(sysKeyIntObj).equals(locker)) {
- ArrayList lockerTransaction = (ArrayList)pendingTransactions.get(locker);
- for (Iterator i = lockerTransaction.iterator(); i.hasNext(); ) {
- TransactionEntry thisEntry = (TransactionEntry)i.next();
+ ArrayList<?> lockerTransaction = pendingTransactions.get(locker);
+ for (Object name : lockerTransaction) {
+ TransactionEntry thisEntry = (TransactionEntry)name;
if (sysKey == thisEntry.sysKey.intValue() && path.equals(thisEntry.getPath())) {
if (thisEntry.obj == null)
throw new ClusterStorageException("ClusterStorageManager.get() - Cluster " + path + " has been deleted in " + sysKey +
@@ -94,7 +88,7 @@ public class TransactionManager { Integer sysKeyIntObj = new Integer(sysKey);
ArrayList<TransactionEntry> lockerTransaction;
String path = ClusterStorage.getPath(obj);
-
+
synchronized(locks) {
// look to see if this object is already locked
if (locks.containsKey(sysKeyIntObj)) {
@@ -157,7 +151,7 @@ public class TransactionManager { pendingTransactions.put(locker, lockerTransaction);
}
}
-
+
// create the new entry in the transaction table
TransactionEntry newEntry = new TransactionEntry(sysKeyIntObj, path, null);
/* equals() in TransactionEntry only compares sysKey and path, so we can use
@@ -167,38 +161,38 @@ public class TransactionManager { if (lockerTransaction.contains(newEntry))
lockerTransaction.remove(newEntry);
lockerTransaction.add(newEntry);
- }
+ }
}
-
+
/**
* Removes all child objects from the given path
- *
+ *
* @param sysKey - entity to delete from
* @param path - root path to delete
* @param locker - locking object
- *
+ *
* @throws ClusterStorageException - when deleting fails
*/
public void removeCluster(int sysKey, String path, Object locker) throws ClusterStorageException {
-
+
String[] children = getClusterContents(sysKey, path);
- for (int i = 0; i < children.length; i++)
- removeCluster(sysKey, path+(path.length()>0?"/":"")+children[i], locker);
+ for (String element : children)
+ removeCluster(sysKey, path+(path.length()>0?"/":"")+element, locker);
if (children.length==0 && path.indexOf("/") > -1)
remove(sysKey, path, locker);
- }
+ }
/**
* Writes all pending changes to the backends.
*/
public void commit(Object locker) {
synchronized(locks) {
- ArrayList lockerTransactions = (ArrayList)pendingTransactions.get(locker);
+ ArrayList<?> lockerTransactions = pendingTransactions.get(locker);
HashMap<TransactionEntry, Exception> exceptions = new HashMap<TransactionEntry, Exception>();
// quit if no transactions are present;
if (lockerTransactions == null) return;
- for (Iterator i = lockerTransactions.iterator();i.hasNext();) {
- TransactionEntry thisEntry = (TransactionEntry)i.next();
+ for (Object name : lockerTransactions) {
+ TransactionEntry thisEntry = (TransactionEntry)name;
try {
if (thisEntry.obj == null)
storage.remove(thisEntry.sysKey, thisEntry.path);
@@ -207,14 +201,13 @@ public class TransactionManager { locks.remove(thisEntry.sysKey);
} catch (Exception e) {
exceptions.put(thisEntry, e);
- }
+ }
}
pendingTransactions.remove(locker);
if (exceptions.size() > 0) { // oh dear
Logger.error("TransactionManager.commit() - Problems during transaction commit of locker "+locker.toString()+". Database may be in an inconsistent state.");
- for (Iterator iter = exceptions.keySet().iterator(); iter.hasNext();) {
- TransactionEntry entry = (TransactionEntry) iter.next();
- Exception ex = (Exception)exceptions.get(entry);
+ for (TransactionEntry entry : exceptions.keySet()) {
+ Exception ex = exceptions.get(entry);
Logger.msg(entry.toString());
Logger.error(ex);
}
@@ -231,8 +224,7 @@ public class TransactionManager { public void abort(Object locker) {
synchronized(locks) {
if (locks.containsValue(locker)) {
- for (Iterator i=locks.keySet().iterator(); i.hasNext();) {
- Integer thisKey = (Integer)i.next();
+ for (Integer thisKey : locks.keySet()) {
if (locks.get(thisKey).equals(locker))
locks.remove(thisKey);
}
@@ -240,7 +232,7 @@ public class TransactionManager { pendingTransactions.remove(locker);
}
}
-
+
public void clearCache(int sysKey, String path) {
if (sysKey == -1)
storage.clearCache();
@@ -248,9 +240,9 @@ public class TransactionManager { storage.clearCache(new Integer(sysKey));
else
storage.clearCache(new Integer(sysKey), path);
-
+
}
-
+
public void dumpPendingTransactions(int logLevel) {
Logger.msg(logLevel, "================");
Logger.msg(logLevel, "Transaction dump");
@@ -258,22 +250,20 @@ public class TransactionManager { if (locks.size() == 0)
Logger.msg(logLevel, " None");
else
- for (Iterator iter = locks.keySet().iterator(); iter.hasNext();) {
- Integer thisKey = (Integer)iter.next();
+ for (Integer thisKey : locks.keySet()) {
Object locker = locks.get(thisKey);
Logger.msg(logLevel, " "+thisKey+" locked by "+locker);
}
-
+
Logger.msg(logLevel, "Open transactions:");
if (pendingTransactions.size() == 0)
Logger.msg(logLevel, " None");
else
- for (Iterator iter = pendingTransactions.keySet().iterator(); iter.hasNext();) {
- Object thisLocker = iter.next();
+ for (Object thisLocker : pendingTransactions.keySet()) {
Logger.msg(logLevel, " Transaction owner:"+thisLocker);
- ArrayList entries = (ArrayList)pendingTransactions.get(thisLocker);
- for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
- TransactionEntry thisEntry = (TransactionEntry) iterator.next();
+ ArrayList<?> entries = pendingTransactions.get(thisLocker);
+ for (Object name : entries) {
+ TransactionEntry thisEntry = (TransactionEntry) name;
Logger.msg(logLevel, " "+thisEntry.toString());
}
}
@@ -290,12 +280,13 @@ public class TransactionManager { this.path = path;
this.obj = obj;
}
-
+
public String getPath() {
return ClusterStorage.getPath(obj);
}
- public String toString() {
+ @Override
+ public String toString() {
StringBuffer report = new StringBuffer();
if (obj == null)
report.append("Delete");
@@ -303,11 +294,12 @@ public class TransactionManager { report.append("Put "+obj.getClass().getName());
report.append(" at ").append(path).append(" in ").append(sysKey);
return report.toString();
-
+
}
/**
* @see java.lang.Object#hashCode()
*/
+ @Override
public int hashCode() {
return sysKey.hashCode()*getPath().hashCode();
}
@@ -315,20 +307,21 @@ public class TransactionManager { /**
* @see java.lang.Object#equals(java.lang.Object)
*/
+ @Override
public boolean equals(Object other) {
if (other instanceof TransactionEntry)
- return hashCode() == ((TransactionEntry)other).hashCode();
+ return hashCode() == ((TransactionEntry)other).hashCode();
return false;
}
}
-
+
public Object query(String id, Object query) throws ClusterStorageException {
return storage.query(id, query);
}
-
+
public String queryToXML(String id, String query, boolean genericFormat) throws ClusterStorageException {
return storage.queryToXML(id, query, genericFormat);
}
-
+
}
|
