Author: tchemit Date: 2010-11-16 16:38:19 +0100 (Tue, 16 Nov 2010) New Revision: 2135 Url: http://nuiton.org/repositories/revision/topia/2135 Log: Evolution #1042: In ServiceTransformer, closetransaction should throw like the beginTransaction method a TopiaException Evolution #1043: In service transformer, add the transaction tag value also to the all service when the service is not connected to any database Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/ServiceTransformer.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/ServiceTransformer.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/ServiceTransformer.java 2010-11-11 23:26:25 UTC (rev 2134) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/ServiceTransformer.java 2010-11-16 15:38:19 UTC (rev 2135) @@ -36,6 +36,7 @@ import org.nuiton.eugene.java.ObjectModelTransformerToJava; import org.nuiton.eugene.models.object.ObjectModel; import org.nuiton.eugene.models.object.ObjectModelClass; +import org.nuiton.eugene.models.object.ObjectModelElement; import org.nuiton.eugene.models.object.ObjectModelInterface; import org.nuiton.eugene.models.object.ObjectModelModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; @@ -214,15 +215,18 @@ } @Override - public void transformFromInterface(ObjectModelInterface interfacez) { - if (!interfacez.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_SERVICE)) { + public void transformFromInterface(ObjectModelInterface input) { + if (!input.hasStereotype(TopiaGeneratorUtil.STEREOTYPE_SERVICE)) { return; } - ObjectModelInterface serviceContract = - createServiceContract(interfacez); + // global transaction needed (if set to false then never use transaction) + boolean needTransaction = isTransactionNeeded(input); - createServiceAbstract(interfacez, serviceContract); + ObjectModelInterface serviceContract = + createServiceContract(input); + + createServiceAbstract(input, serviceContract, needTransaction); } /** @@ -236,8 +240,7 @@ ObjectModelInterface source) { ObjectModelInterface serviceContract = - createInterface(source.getName(), - source.getPackageName()); + createInterface(source.getName(), source.getPackageName()); setDocumentation(serviceContract, source.getDocumentation()); for (ObjectModelOperation op : source.getOperations()) { @@ -270,9 +273,11 @@ * * @param source interface from model * @param serviceContract to implement + * @param needTransaction flag to know if service globally use transaction */ protected void createServiceAbstract(ObjectModelInterface source, - ObjectModelInterface serviceContract) { + ObjectModelInterface serviceContract, + boolean needTransaction) { ObjectModelClass serviceAbstract = createAbstractClass( getServiceAbstractClassName(serviceContract.getName()), @@ -293,18 +298,21 @@ addImport(serviceAbstract, LogFactory.class); // Create abstract methods - ObjectModelOperation beginTransaction = - addOperation(serviceAbstract, OP_NAME_BEGIN_TRANSACTION, - TopiaContext.class, - ObjectModelModifier.ABSTRACT, - ObjectModelModifier.PROTECTED); - addException(beginTransaction, TopiaException.class); - + if (needTransaction) { + ObjectModelOperation beginTransaction = + addOperation(serviceAbstract, OP_NAME_BEGIN_TRANSACTION, + TopiaContext.class, + ObjectModelModifier.ABSTRACT, + ObjectModelModifier.PROTECTED); + addException(beginTransaction, TopiaException.class); + } ObjectModelOperation treateError1 = addOperation(serviceAbstract, OP_NAME_TREATE_ERROR, "void", ObjectModelModifier.ABSTRACT, ObjectModelModifier.PROTECTED); - addParameter(treateError1, TopiaContext.class, "transaction"); + if (needTransaction) { + addParameter(treateError1, TopiaContext.class, "transaction"); + } addParameter(treateError1, Exception.class, "eee"); addParameter(treateError1, String.class, "message"); addParameter(treateError1, "Object...", "args"); @@ -312,43 +320,50 @@ addException(treateError1, exceptionName); } - ObjectModelOperation closeTransaction = - addOperation(serviceAbstract, OP_NAME_CLOSE_TRANSACTION, "void", - ObjectModelModifier.ABSTRACT, - ObjectModelModifier.PROTECTED); - addParameter(closeTransaction, TopiaContext.class, "transaction"); + if (needTransaction) { + ObjectModelOperation closeTransaction = + addOperation(serviceAbstract, OP_NAME_CLOSE_TRANSACTION, "void", + ObjectModelModifier.ABSTRACT, + ObjectModelModifier.PROTECTED); + addParameter(closeTransaction, TopiaContext.class, "transaction"); + addException(closeTransaction, TopiaException.class); + } + // Create abstract execute methods + Map<String, ObjectModelOperation> abstOps = + new HashMap<String, ObjectModelOperation>(); - // Create abstract execute methods - Map<String, ObjectModelOperation> abstOps = - new HashMap<String, ObjectModelOperation>(); + // Use source interfacez to have tagvalues from model + for (ObjectModelOperation op : source.getOperations()) { + ObjectModelOperation abstOp = createOperationExecuteAbstract( + serviceAbstract, + op, + needTransaction + ); + // Keep abstract methods to use them in operationImplementation + // generation + abstOps.put(getAbstractOperationKeyMap(op), abstOp); + } + if (needTransaction) { + ObjectModelOperation treateError2 = + addOperation(serviceAbstract, OP_NAME_TREATE_ERROR, "void", + ObjectModelModifier.PROTECTED); + addParameter(treateError2, Exception.class, "eee"); + addParameter(treateError2, String.class, "message"); + addParameter(treateError2, "Object...", "args"); + if (exceptionName != null) { + addException(treateError2, exceptionName); + } - // Use source interfacez to have tagvalues from model - for (ObjectModelOperation op : source.getOperations()) { - ObjectModelOperation abstOp = - createOperationExecuteAbstract(serviceAbstract, op); - // Keep abstract methods to use them in operationImplementation - // generation - abstOps.put(getAbstractOperationKeyMap(op), abstOp); + setOperationBody(treateError2, "" + /*{ + treateError(null, eee, message, args); + }*/ + ); } - - ObjectModelOperation treateError2 = - addOperation(serviceAbstract, OP_NAME_TREATE_ERROR, "void", - ObjectModelModifier.PROTECTED); - addParameter(treateError2, Exception.class, "eee"); - addParameter(treateError2, String.class, "message"); - addParameter(treateError2, "Object...", "args"); - if (exceptionName != null) { - addException(treateError2, exceptionName); + // Imports for implementations + if (needTransaction) { + addImport(serviceAbstract, TopiaContext.class); } - - setOperationBody(treateError2, "" - /*{ - treateError(null, eee, message, args); - }*/ - ); - - // Imports for implementations - addImport(serviceAbstract, TopiaContext.class); addImport(serviceAbstract, I18n.class); addImport(serviceAbstract, ArrayList.class); addImport(serviceAbstract, DurationFormatUtils.class); @@ -359,7 +374,9 @@ serviceAbstract, abstOps.get(getAbstractOperationKeyMap(op)), op, - source.getName()); + source.getName(), + needTransaction + ); } } @@ -386,12 +403,15 @@ * * @param serviceAbstract where the operation will be created * @param source ObjectModelOperation from model + * @param needTransaction flag to know if service globally use transaction * @return the abstract operation created * @see #isErrorArgsNeeded(ObjectModelOperation) - * @see #isTransactionNeeded(ObjectModelOperation) + * @see #isTransactionNeeded(ObjectModelElement) */ protected ObjectModelOperation createOperationExecuteAbstract( - ObjectModelClass serviceAbstract, ObjectModelOperation source) { + ObjectModelClass serviceAbstract, + ObjectModelOperation source, + boolean needTransaction) { String opName = StringUtils.capitalize(source.getName()); // Abstract operation to execute method content @@ -405,7 +425,7 @@ // They will be catched by interface method to use treateError addException(abstOp, Exception.class); - if (isTransactionNeeded(source)) { + if (needTransaction && isTransactionNeeded(source)) { addParameter(abstOp, TopiaContext.class, "transaction"); } @@ -434,19 +454,21 @@ * @param abstOp to execute into the implementation body * @param source ObjectModelOperation from model * @param serviceContractName where the signature method is defined + * @param needTransaction flag to know if service globally use transaction * @see #isErrorArgsNeeded(ObjectModelOperation) - * @see #isTransactionNeeded(ObjectModelOperation) + * @see #isTransactionNeeded(ObjectModelElement) */ protected void createOperationImplementation( ObjectModelClass serviceAbstract, ObjectModelOperation abstOp, ObjectModelOperation source, - String serviceContractName) { + String serviceContractName, + boolean needTransaction) { // boolean to specify if the method need a transaction or not // Default set to true but can be override by a tagvalue on the // method - boolean needTransaction = isTransactionNeeded(source); + needTransaction &= isTransactionNeeded(source); // boolean to specify if the method need error arguments or not // Default set to true but can be override by a tagvalue on the @@ -518,6 +540,7 @@ TopiaContext transaction = null; try { transaction = beginTransaction(); + try { }*/ ); // Add transaction in treateError parameters @@ -557,6 +580,17 @@ } <%=abstReturn%> }*/); + if (needTransaction) { + // Finally block to close transaction + buffer.append("" + /*{ + } finally { + closeTransaction(transaction); + } + }*/ + ); + + } // Copy exceptions for (String ex : source.getExceptions()) { addException(implOp, ex); @@ -576,13 +610,6 @@ } catch (Exception eee) { treateError(<%=treateErrorParams%>); }*/); - if (needTransaction) { - // Finally block to close transaction - buffer.append("" - /*{ - } finally { - closeTransaction(transaction); }*/); - } buffer.append("" /*{ @@ -602,7 +629,7 @@ * @param op where the tagvalue is set * @return true if transaction is needed */ - protected boolean isTransactionNeeded(ObjectModelOperation op) { + protected boolean isTransactionNeeded(ObjectModelElement op) { boolean needTransaction = true; String transactionTag =