package clear.transaction.djn; import java.util.ArrayList; import java.util.Map; import java.util.List; import com.google.gson.Gson; import com.softwarementors.extjs.djn.api.RegisteredAction; import com.softwarementors.extjs.djn.api.RegisteredStandardMethod; import com.softwarementors.extjs.djn.api.Registry; import com.softwarementors.extjs.djn.config.annotations.DirectMethod; import clear.djn.router.RequestRouter; import clear.transaction.BatchMember; import clear.transaction.IBatchGateway; import clear.transaction.UserTransactionManager; import com.softwarementors.extjs.djn.router.dispatcher.Dispatcher; import com.softwarementors.extjs.djn.router.processor.RequestException; public class BatchGateway implements IBatchGateway { @DirectMethod public List<BatchMember> execute(List<BatchMember> items) { try { UserTransactionManager.joinUserTransaction(); List<BatchMember> res = executeInternal(items); UserTransactionManager.commitUserTransaction(); return res; } catch (Throwable e) { try { UserTransactionManager.rollbackUserTransaction(); } catch (Throwable th) { throw new RuntimeException(th); } throw new RuntimeException(e); } } private List<BatchMember> executeInternal(List<BatchMember> items) { RequestRouter router = RequestRouter.getRequestRouter(); Registry registry = router.getRegistry(); Dispatcher dispatcher = router.getDispatcher(); Gson gson = new Gson(); List<BatchMember> results = new ArrayList<BatchMember>(items.size()); for (int i = 0; i < items.size(); i++) { @SuppressWarnings("unchecked") Map<String, String> mapItem = (Map<String, String>) items.get(i); String jsonItem = gson.toJson(mapItem); BatchMember batchMember = gson .fromJson(jsonItem, BatchMember.class); RegisteredAction action = registry.getAction(batchMember.className); if (action == null) { throw RequestException.forActionNotFound(batchMember.className); } RegisteredStandardMethod method = action .getStandardMethod(batchMember.methodName); if (method == null) { throw RequestException.forActionMethodNotFound( action.getName(), batchMember.methodName); } batchMember.result = dispatcher.dispatch(method, batchMember.parameters.toArray()); results.add(batchMember); } return results; } }