View Javadoc
1   /*
2    * Copyright (C) 2007-2012 Argeo GmbH
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *         http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.argeo.cms.ui.workbench.internal.useradmin.commands;
17  
18  import javax.transaction.Status;
19  import javax.transaction.UserTransaction;
20  
21  import org.argeo.cms.CmsException;
22  import org.argeo.cms.ui.workbench.WorkbenchUiPlugin;
23  import org.argeo.cms.ui.workbench.internal.useradmin.UiAdminUtils;
24  import org.argeo.cms.ui.workbench.internal.useradmin.UserAdminWrapper;
25  import org.eclipse.core.commands.AbstractHandler;
26  import org.eclipse.core.commands.ExecutionEvent;
27  import org.eclipse.core.commands.ExecutionException;
28  import org.osgi.service.useradmin.UserAdminEvent;
29  
30  /** Manage the transaction that is bound to the current perspective */
31  public class UserTransactionHandler extends AbstractHandler {
32  	public final static String ID = WorkbenchUiPlugin.PLUGIN_ID
33  			+ ".userTransactionHandler";
34  
35  	public final static String PARAM_COMMAND_ID = "param.commandId";
36  
37  	public final static String TRANSACTION_BEGIN = "transaction.begin";
38  	public final static String TRANSACTION_COMMIT = "transaction.commit";
39  	public final static String TRANSACTION_ROLLBACK = "transaction.rollback";
40  
41  	/* DEPENDENCY INJECTION */
42  	private UserAdminWrapper userAdminWrapper;
43  
44  	public Object execute(ExecutionEvent event) throws ExecutionException {
45  		String commandId = event.getParameter(PARAM_COMMAND_ID);
46  		final UserTransaction userTransaction = userAdminWrapper
47  				.getUserTransaction();
48  		try {
49  			if (TRANSACTION_BEGIN.equals(commandId)) {
50  				if (userTransaction.getStatus() != Status.STATUS_NO_TRANSACTION)
51  					throw new CmsException("A transaction already exists");
52  				else
53  					userTransaction.begin();
54  			} else if (TRANSACTION_COMMIT.equals(commandId)) {
55  				if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION)
56  					throw new CmsException("No transaction.");
57  				else
58  					userTransaction.commit();
59  			} else if (TRANSACTION_ROLLBACK.equals(commandId)) {
60  				if (userTransaction.getStatus() == Status.STATUS_NO_TRANSACTION)
61  					throw new CmsException("No transaction to rollback.");
62  				else {
63  					userTransaction.rollback();
64  					userAdminWrapper.notifyListeners(new UserAdminEvent(null,
65  							UserAdminEvent.ROLE_CHANGED, null));
66  				}
67  			}
68  
69  			UiAdminUtils.notifyTransactionStateChange(userTransaction);
70  			// Try to remove invalid thread access errors when managing users.
71  			// HandlerUtil.getActivePart(event).getSite().getShell().getDisplay()
72  			// .asyncExec(new Runnable() {
73  			// @Override
74  			// public void run() {
75  			// UiAdminUtils
76  			// .notifyTransactionStateChange(userTransaction);
77  			// }
78  			// });
79  
80  		} catch (CmsException e) {
81  			throw e;
82  		} catch (Exception e) {
83  			throw new CmsException("Unable to call " + commandId + " on "
84  					+ userTransaction, e);
85  		}
86  		return null;
87  	}
88  
89  	/* DEPENDENCY INJECTION */
90  	public void setUserAdminWrapper(UserAdminWrapper userAdminWrapper) {
91  		this.userAdminWrapper = userAdminWrapper;
92  	}
93  }