summaryrefslogtreecommitdiff
path: root/source/com/c2kernel/persistency/TransactionManager.java
diff options
context:
space:
mode:
authorabranson <andrew.branson@cern.ch>2011-08-04 00:42:34 +0200
committerabranson <andrew.branson@cern.ch>2011-08-04 00:42:34 +0200
commit0ec8481c10cd8277d84c7c1a785483a0a739e5a0 (patch)
tree5f6e5d9ae75193e67e6f3b3dfa488960c5cde1d5 /source/com/c2kernel/persistency/TransactionManager.java
parent036cbdba66f804743c4c838ed598d6972c4b3e17 (diff)
More code cleanup:
Refactored Entity Proxy Subscription to handle generics better Rewrote RemoteMap to use TreeMap instead of the internal array for order. It now sorts its keys by number if they parse, else as strings. Removed a no-longer-in-progress outcome form class
Diffstat (limited to 'source/com/c2kernel/persistency/TransactionManager.java')
-rw-r--r--source/com/c2kernel/persistency/TransactionManager.java111
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);
}
-
+
}