diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/TransactionBootstrap.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/TransactionBootstrap.java index 20ab1ba..1188722 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/TransactionBootstrap.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/bootstrap/TransactionBootstrap.java @@ -40,24 +40,51 @@ import javax.enterprise.event.Observes; import javax.enterprise.inject.spi.ProcessAnnotatedType; import org.apache.commons.configuration.Configuration; -import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; +import br.gov.frameworkdemoiselle.configuration.ConfigurationException; import br.gov.frameworkdemoiselle.internal.implementation.DefaultTransaction; import br.gov.frameworkdemoiselle.transaction.Transaction; public class TransactionBootstrap extends AbstractBootstrap { - public void processAnnotatedType(@Observes final ProcessAnnotatedType event) throws ConfigurationException { + private static Class selected; - Configuration config = new PropertiesConfiguration("demoiselle.properties"); - String selected = config.getString("frameworkdemoiselle.transaction.class", - DefaultTransaction.class.getCanonicalName()); + public void processAnnotatedType(@Observes final ProcessAnnotatedType event) { + Class annotated = event.getAnnotatedType().getJavaClass(); - Class type = event.getAnnotatedType().getJavaClass(); - if (Transaction.class.isAssignableFrom(type) && type != Transaction.class - && !type.getCanonicalName().equals(selected)) { + if (Transaction.class.isAssignableFrom(annotated) && annotated != Transaction.class + && !annotated.equals(getSelected())) { event.veto(); } } + + @SuppressWarnings("unchecked") + private synchronized static Class getSelected() { + if (selected == null) { + String canonicalName = null; + + try { + Configuration config = new PropertiesConfiguration("demoiselle.properties"); + canonicalName = config.getString("frameworkdemoiselle.transaction.class", + DefaultTransaction.class.getCanonicalName()); + + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + selected = (Class) Class.forName(canonicalName, false, classLoader); + selected.asSubclass(Transaction.class); + + } catch (org.apache.commons.configuration.ConfigurationException cause) { + throw new ConfigurationException(getBundle().getString("file-not-found", "demoiselle.properties")); + + } catch (ClassNotFoundException cause) { + throw new ConfigurationException(getBundle().getString("transaction-class-not-found", canonicalName)); + + } catch (ClassCastException cause) { + throw new ConfigurationException(getBundle().getString("transaction-class-must-be-of-type", + canonicalName, Transaction.class.getCanonicalName())); + } + } + + return selected; + } } diff --git a/impl/core/src/main/resources/demoiselle-core-bundle.properties b/impl/core/src/main/resources/demoiselle-core-bundle.properties index 17f5791..d94cd1a 100644 --- a/impl/core/src/main/resources/demoiselle-core-bundle.properties +++ b/impl/core/src/main/resources/demoiselle-core-bundle.properties @@ -58,7 +58,7 @@ configuration-attribute-is-mandatory=A configura\u00E7\u00E3o {0} \u00E9 obrigat configuration-name-attribute-cant-be-empty=A nota\u00E7\u00E3o Name n\u00E3o pode estar em branco configuration-key-not-found=Chave de configura\u00E7\u00E3o "{0}" n\u00E3o encontrada. Conven\u00E7\u00F5es verificadas\: "{1}" -transaction-not-defined=Nenhuma transa\u00E7\u00E3o foi definida. Para utilizar @{0} \u00E9 preciso definir a estrat\u00E9gia de transa\u00E7\u00E3o desejada no arquivo beans.xml +transaction-not-defined=Nenhuma transa\u00E7\u00E3o foi definida. Para utilizar @{0} \u00E9 preciso definir a propriedade "frameworkdemoiselle.transaction.class" com a estrat\u00E9gia de transa\u00E7\u00E3o desejada no arquivo demoiselle.properties executing-all=Executando todos os \: {0} custom-context-was-registered=O contexto {0} foi registrado custom-context-was-unregistered=O contexto {0} foi removido @@ -70,8 +70,8 @@ error-creating-new-instance-for=Error creating a new instance for "{0}" executed-successfully=\ {0} execultado com sucesso must-declare-one-single-parameter=Voc\u00EA deve declarar um par\u00E2metro \u00FAnico em {0} loading-default-transaction-manager=Carregando o gerenciador de transa\u00E7\u00E3o padr\u00E3o {0} -transaction-class-not-found=A classe de transa\u00E7\u00E3o "{0}" informada n\u00E3o foi encontrada. -transaction-class-must-be-of-type=A classe de transa\u00E7\u00E3o "{0}" informada deve ser do tipo {1} +transaction-class-not-found=A classe de transa\u00E7\u00E3o "{0}" informada no demoiselle.properties n\u00E3o foi encontrada no classpath. +transaction-class-must-be-of-type=A classe de transa\u00E7\u00E3o "{0}" informada no demoiselle.properties deve ser do tipo "{1}" results-count-greater-page-size=Quantidade de resultados {0} \u00E9 maior que o tamanho da p\u00E1gina {1} page-result=Resultado paginado [p\u00E1gina\={0}, total de resultados\={1}] page=P\u00E1gina [n\u00FAmero\={0}, tamanho\={1}] -- libgit2 0.21.2