From 0ec8481c10cd8277d84c7c1a785483a0a739e5a0 Mon Sep 17 00:00:00 2001 From: abranson Date: Thu, 4 Aug 2011 00:42:34 +0200 Subject: 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 --- .../c2kernel/persistency/TransactionManager.java | 111 ++++++++++----------- 1 file changed, 52 insertions(+), 59 deletions(-) (limited to 'source/com/c2kernel/persistency/TransactionManager.java') 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(); pendingTransactions = new HashMap>(); } - + 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 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 exceptions = new HashMap(); // 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); } - + } -- cgit v1.2.3