View Javadoc
1   package org.argeo.cms.ui.workbench.internal.useradmin.providers;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   
6   import javax.transaction.Status;
7   import javax.transaction.UserTransaction;
8   
9   import org.apache.commons.logging.Log;
10  import org.apache.commons.logging.LogFactory;
11  import org.argeo.cms.CmsException;
12  import org.argeo.cms.ui.workbench.WorkbenchUiPlugin;
13  import org.eclipse.ui.AbstractSourceProvider;
14  import org.eclipse.ui.ISources;
15  
16  /** Observe and notify UI on UserTransaction state changes */
17  public class UserTransactionProvider extends AbstractSourceProvider {
18  	private final static Log log = LogFactory
19  			.getLog(UserTransactionProvider.class);
20  
21  	public final static String TRANSACTION_STATE = WorkbenchUiPlugin.PLUGIN_ID
22  			+ ".userTransactionState";
23  	public final static String STATUS_ACTIVE = "status.active";
24  	public final static String STATUS_NO_TRANSACTION = "status.noTransaction";
25  
26  	/* DEPENDENCY INJECTION */
27  	private UserTransaction userTransaction;
28  
29  	@Override
30  	public String[] getProvidedSourceNames() {
31  		return new String[] { TRANSACTION_STATE };
32  	}
33  
34  	@Override
35  	public Map<String, String> getCurrentState() {
36  		Map<String, String> currentState = new HashMap<String, String>(1);
37  		currentState.put(TRANSACTION_STATE, getInternalCurrentState());
38  		return currentState;
39  	}
40  
41  	@Override
42  	public void dispose() {
43  	}
44  
45  	private String getInternalCurrentState() {
46  		try {
47  			String transactionState;
48  			if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION)
49  				transactionState = STATUS_NO_TRANSACTION;
50  			else
51  				// if (userTransaction.getStatus() == Status.STATUS_ACTIVE)
52  				transactionState = STATUS_ACTIVE;
53  			return transactionState;
54  		} catch (Exception e) {
55  			throw new CmsException("Unable to begin transaction", e);
56  		}
57  	}
58  
59  	/** Publishes the ability to notify a state change */
60  	public void fireTransactionStateChange() {
61  		try {
62  			fireSourceChanged(ISources.WORKBENCH, TRANSACTION_STATE,
63  					getInternalCurrentState());
64  		} catch (Exception e) {
65  			log.warn("Cannot fire transaction state change event. Caught exception: "
66  					+ e.getClass().getCanonicalName() + " - " + e.getMessage());
67  		}
68  	}
69  
70  	/* DEPENDENCY INJECTION */
71  	public void setUserTransaction(UserTransaction userTransaction) {
72  		this.userTransaction = userTransaction;
73  	}
74  }