001: /*
002: * $Header: /export/home/cvsroot/MyPersonalizerRepository/MyPersonalizer/Subsystems/Kernel/Sources/es/udc/mypersonalizer/kernel/model/repository/sql/plain/PlainActionProcessorSingleton.java,v 1.1.1.1 2004/03/25 12:08:36 fbellas Exp $
003: * $Revision: 1.1.1.1 $
004: * $Date: 2004/03/25 12:08:36 $
005: *
006: * =============================================================================
007: *
008: * Copyright (c) 2003, The MyPersonalizer Development Group
009: * (http://www.tic.udc.es/~fbellas/mypersonalizer/index.html) at
010: * University Of A Coruna
011: * All rights reserved.
012: *
013: * Redistribution and use in source and binary forms, with or without
014: * modification, are permitted provided that the following conditions are met:
015: *
016: * - Redistributions of source code must retain the above copyright notice,
017: * this list of conditions and the following disclaimer.
018: *
019: * - Redistributions in binary form must reproduce the above copyright notice,
020: * this list of conditions and the following disclaimer in the documentation
021: * and/or other materials provided with the distribution.
022: *
023: * - Neither the name of the University Of A Coruna nor the names of its
024: * contributors may be used to endorse or promote products derived from
025: * this software without specific prior written permission.
026: *
027: * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
028: * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
029: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
030: * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
031: * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
032: * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
033: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
034: * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
035: * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
036: * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
037: * POSSIBILITY OF SUCH DAMAGE.
038: *
039: */
040:
041: package es.udc.mypersonalizer.kernel.model.repository.sql.plain;
042:
043: import es.udc.mypersonalizer.kernel.log.Log;
044: import es.udc.mypersonalizer.kernel.log.LogManager;
045: import es.udc.mypersonalizer.kernel.log.LogNamingConventions;
046: import es.udc.mypersonalizer.kernel.model.actions.Action;
047: import es.udc.mypersonalizer.kernel.model.actions.ActionProcessorSingleton;
048: import es.udc.mypersonalizer.kernel.model.actions.ActionRegistrySingleton;
049: import es.udc.mypersonalizer.kernel.model.repository.sql.plain.Transaction;
050: import es.udc.mypersonalizer.kernel.model.repository.sql.plain.TransactionManager;
051: import es.udc.mypersonalizer.kernel.util.exceptions.InternalErrorException;
052: import es.udc.mypersonalizer.kernel.util.exceptions.ModelException;
053: import java.io.Serializable;
054:
055: /**
056: * This class provides a default implementation for ActionProcessorSingleton,
057: * which executes actions the expected way. Transactional actions are
058: * managed via the TransactionManager.
059: *
060: * @author Daniel Fernandez
061: * @author Fernando Bellas
062: * @author David Barral
063: * @since 1.0
064: */
065: public class PlainActionProcessorSingleton extends
066: ActionProcessorSingleton {
067:
068: /**
069: * The system's main log.
070: */
071: private static final Log myPersonalizerLog = LogManager
072: .getLog(LogNamingConventions.MYPERSONALIZER);
073:
074: /**
075: * Constructs an instance of this class.
076: */
077: public PlainActionProcessorSingleton() {
078: }
079:
080: /**
081: * Executes the model action specified by actionName taking event as
082: * the action's parameter.<p>
083: * The action is executed in transactional or non-transactional mode
084: * basing on its "transactional" parameter
085: *
086: * @return a Serializable with the result of the execution
087: * @param actionName the name of the action (defined in configuration)
088: * @param event the event that works as this action's parameters
089: * @throws InternalErrorException if execution throws an internal error
090: * (it causes rollback)
091: * @throws ModelException if execution throws a model error (it does not
092: * causes rollback)
093: */
094: public Serializable execute(String actionName, Serializable event)
095: throws InternalErrorException, ModelException {
096:
097: ActionRegistrySingleton actionRegistrySingleton = ActionRegistrySingleton
098: .getInstance();
099: Action action = actionRegistrySingleton.getAction(actionName);
100: if (action == null) {
101: throw new InternalErrorException("Action '" + actionName
102: + "' is not known. Check configuration files.",
103: new NullPointerException());
104: }
105: if (actionRegistrySingleton.getAction(actionName)
106: .isTransactional()) {
107: return executeTransactionalAction(actionName, event);
108: } else {
109: return executeNonTransactionalAction(actionName, event);
110: }
111: }
112:
113: /**
114: * Executes a transactional action using the TransactionManager to
115: * manage it.
116: *
117: * @param actionName the name of the action
118: * @param event the event to be used as a parameter for the action
119: * @throws InternalErrorException if any fatal errors happen.
120: * @throws ModelException if happens a non-fatal error which will cause a
121: * rollback.
122: * @return a Serializable object being the action's result (if any).
123: */
124: private Serializable executeTransactionalAction(String actionName,
125: Serializable event) throws InternalErrorException,
126: ModelException {
127:
128: Serializable actionResult = null;
129:
130: ActionRegistrySingleton actionRegistrySingleton = ActionRegistrySingleton
131: .getInstance();
132:
133: Action action = actionRegistrySingleton.getAction(actionName);
134:
135: TransactionManager transactionManager = TransactionManager
136: .getInstance();
137:
138: Transaction transaction = null;
139:
140: try {
141: transaction = transactionManager
142: .getTransaction(Transaction.TRANSACTION_REQUIRED);
143: actionResult = action.execute(event);
144: transaction.release();
145: } catch (ModelException e) {
146: transaction.release();
147: throw e;
148: } catch (InternalErrorException e) {
149: myPersonalizerLog
150: .write(
151: "Error executing a transactional action. ROLLBACK forced.",
152: e, this .getClass());
153: if (transaction != null) {
154: transaction.rollback();
155: }
156: throw e;
157: } catch (Exception e) {
158: myPersonalizerLog
159: .write(
160: "Error executing a transactional action. ROLLBACK forced.",
161: e, this .getClass());
162: if (transaction != null) {
163: transaction.rollback();
164: }
165: throw new InternalErrorException(e);
166: }
167:
168: return actionResult;
169: }
170:
171: /**
172: * Executes a transactional action using the TransactionManager to
173: * manage it.
174: *
175: * @param actionName the name of the action
176: * @param event the event to be used as a parameter for the action
177: * @throws InternalErrorException if any fatal errors happen.
178: * @throws ModelException if happens a non-fatal error which will cause a
179: * rollback.
180: * @return a Serializable object being the action's result (if any).
181: */
182: private Serializable executeNonTransactionalAction(
183: String actionName, Serializable event)
184: throws InternalErrorException, ModelException {
185:
186: Serializable actionResult = null;
187:
188: ActionRegistrySingleton actionRegistrySingleton = ActionRegistrySingleton
189: .getInstance();
190:
191: Action action = actionRegistrySingleton.getAction(actionName);
192:
193: try {
194: actionResult = action.execute(event);
195: } catch (InternalErrorException e) {
196: myPersonalizerLog.write(
197: "Error executing a non-transactional action.", e,
198: this.getClass());
199: }
200:
201: return actionResult;
202: }
203:
204: }
|