From c9c676732ad0faeec3f1f3b1c9c1281d8684d64d Mon Sep 17 00:00:00 2001 From: Cleverson Sacramento Date: Thu, 6 Sep 2012 18:08:59 -0300 Subject: [PATCH] Ajuste na mensagem de ambiguidade na seleção de estratégias --- impl/core/src/main/java/br/gov/frameworkdemoiselle/configuration/ConfigurationException.java | 1 - impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/SecurityContextImpl.java | 10 ++++++++-- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------------------- impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/TransactionContextImpl.java | 5 ++++- impl/core/src/main/resources/demoiselle-core-bundle.properties | 7 +------ 5 files changed, 91 insertions(+), 57 deletions(-) diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/configuration/ConfigurationException.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/configuration/ConfigurationException.java index 833ea98..440fdde 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/configuration/ConfigurationException.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/configuration/ConfigurationException.java @@ -68,5 +68,4 @@ public class ConfigurationException extends DemoiselleException { public ConfigurationException(String message, Throwable cause) { super(message, cause); } - } diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/SecurityContextImpl.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/SecurityContextImpl.java index eda4d3b..b62aa9d 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/SecurityContextImpl.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/SecurityContextImpl.java @@ -71,7 +71,10 @@ public class SecurityContextImpl implements SecurityContext { if (this.authenticator == null) { AuthenticatorBootstrap bootstrap = Beans.getReference(AuthenticatorBootstrap.class); Class clazz = getConfig().getAuthenticatorClass(); - clazz = StrategySelector.getClass(clazz, bootstrap.getCache()); + + if (clazz == null) { + clazz = StrategySelector.getClass(Authenticator.class, bootstrap.getCache()); + } this.authenticator = Beans.getReference(clazz); } @@ -83,7 +86,10 @@ public class SecurityContextImpl implements SecurityContext { if (this.authorizer == null) { AuthorizerBootstrap bootstrap = Beans.getReference(AuthorizerBootstrap.class); Class clazz = getConfig().getAuthorizerClass(); - clazz = StrategySelector.getClass(clazz, bootstrap.getCache()); + + if (clazz == null) { + clazz = StrategySelector.getClass(Authorizer.class, bootstrap.getCache()); + } this.authorizer = Beans.getReference(clazz); } diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java index 781f42b..7c4d6eb 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/StrategySelector.java @@ -44,6 +44,8 @@ import java.util.List; import br.gov.frameworkdemoiselle.annotation.Priority; import br.gov.frameworkdemoiselle.configuration.ConfigurationException; +import br.gov.frameworkdemoiselle.internal.producer.ResourceBundleProducer; +import br.gov.frameworkdemoiselle.util.ResourceBundle; public final class StrategySelector implements Serializable { @@ -57,21 +59,20 @@ public final class StrategySelector implements Serializable { private static final long serialVersionUID = 1L; + private static ResourceBundle bundle; + private StrategySelector() { } - public static Class getClass(Class configClass, - List> optionalClasses) { - Class result = configClass; - - if (configClass == null) { - result = getPriorityReference(optionalClasses); + private static ResourceBundle getBundle() { + if (bundle == null) { + bundle = ResourceBundleProducer.create("demoiselle-core-bundle"); } - return result; + return bundle; } - private static Class getPriorityReference(List> options) + public static Class getClass(Class type, List> options) throws ConfigurationException { Class selected = null; @@ -81,24 +82,13 @@ public final class StrategySelector implements Serializable { } } - checkForAmbiguity(selected, options); + checkForAmbiguity(type, selected, options); return selected; } - private static int getPriority(Class type) { - int result = Priority.MAX_PRIORITY; - Priority priority = type.getAnnotation(Priority.class); - - if (priority != null) { - result = priority.value(); - } - - return result; - } - - private static void checkForAmbiguity(Class selected, List> options) - throws ConfigurationException { + private static void checkForAmbiguity(Class type, Class selected, + List> options) throws ConfigurationException { int selectedPriority = getPriority(selected); List> ambiguous = new ArrayList>(); @@ -110,32 +100,73 @@ public final class StrategySelector implements Serializable { } if (!ambiguous.isEmpty()) { - throw new ConfigurationException("AMBIGUO"); + ambiguous.add(selected); + + String message = getExceptionMessage(type, ambiguous); + throw new ConfigurationException(message); + } + } + + private static String getExceptionMessage(Class type, List> ambiguous) { + StringBuffer classes = new StringBuffer(); + + int i = 0; + for (Class clazz : ambiguous) { + if (i++ != 0) { + classes.append(", "); + } + + classes.append(clazz.getCanonicalName()); } + + return getBundle().getString("ambiguous-strategy-resolution", type.getCanonicalName(), classes.toString()); + } + + private static int getPriority(Class type) { + int result = Priority.MAX_PRIORITY; + Priority priority = type.getAnnotation(Priority.class); + + if (priority != null) { + result = priority.value(); + } + + return result; } - /* - * public static T getExplicitReference(String configKey, Class strategyType, Class defaultType) { - * Class selectedType = loadSelected(configKey, strategyType, defaultType); return - * Beans.getReference(selectedType); } - */ - - /* - * @SuppressWarnings("unchecked") private static Class loadSelected(String configKey, Class strategyType, - * Class defaultType) { ResourceBundle bundle = ResourceBundleProducer.create("demoiselle-core-bundle", - * Beans.getReference(Locale.class)); Class result = null; String canonicalName = null; String typeName = - * strategyType.getSimpleName().toLowerCase(); String key = null; try { URL url = - * ConfigurationLoader.getResourceAsURL("demoiselle.properties"); Configuration config = new - * PropertiesConfiguration(url); canonicalName = config.getString(configKey, defaultType.getCanonicalName()); - * ClassLoader classLoader = ConfigurationLoader.getClassLoaderForClass(canonicalName); if (classLoader == null) { - * classLoader = Thread.currentThread().getContextClassLoader(); } result = (Class) Class.forName(canonicalName, - * false, classLoader); result.asSubclass(strategyType); } catch - * (org.apache.commons.configuration.ConfigurationException cause) { throw new - * ConfigurationException(bundle.getString("file-not-found", "demoiselle.properties")); } catch - * (ClassNotFoundException cause) { key = Strings.getString("{0}-class-not-found", typeName); throw new - * ConfigurationException(bundle.getString(key, canonicalName)); } catch (FileNotFoundException e) { throw new - * ConfigurationException(bundle.getString("file-not-found", "demoiselle.properties")); } catch (ClassCastException - * cause) { key = Strings.getString("{0}-class-must-be-of-type", typeName); throw new - * ConfigurationException(bundle.getString(key, canonicalName, strategyType)); } return result; } - */ + // public static T getExplicitReference(String configKey, Class strategyType, Class defaultType) { + // Class selectedType = loadSelected(configKey, strategyType, defaultType); + // return Beans.getReference(selectedType); + // } + // + // @SuppressWarnings("unchecked") + // private static Class loadSelected(String configKey, Class strategyType, Class defaultType) { + // ResourceBundle bundle = ResourceBundleProducer.create("demoiselle-core-bundle", + // Beans.getReference(Locale.class)); + // Class result = null; + // String canonicalName = null; + // String typeName = strategyType.getSimpleName().toLowerCase(); + // String key = null; + // try { + // URL url = ConfigurationLoader.getResourceAsURL("demoiselle.properties"); + // Configuration config = new PropertiesConfiguration(url); + // canonicalName = config.getString(configKey, defaultType.getCanonicalName()); + // ClassLoader classLoader = ConfigurationLoader.getClassLoaderForClass(canonicalName); + // if (classLoader == null) { + // classLoader = Thread.currentThread().getContextClassLoader(); + // } + // result = (Class) Class.forName(canonicalName, false, classLoader); + // result.asSubclass(strategyType); + // } catch (org.apache.commons.configuration.ConfigurationException cause) { + // throw new ConfigurationException(bundle.getString("file-not-found", "demoiselle.properties")); + // } catch (ClassNotFoundException cause) { + // key = Strings.getString("{0}-class-not-found", typeName); + // throw new ConfigurationException(bundle.getString(key, canonicalName)); + // } catch (FileNotFoundException e) { + // throw new ConfigurationException(bundle.getString("file-not-found", "demoiselle.properties")); + // } catch (ClassCastException cause) { + // key = Strings.getString("{0}-class-must-be-of-type", typeName); + // throw new ConfigurationException(bundle.getString(key, canonicalName, strategyType)); + // } + // return result; + // } } diff --git a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/TransactionContextImpl.java b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/TransactionContextImpl.java index d2fd6a0..f33d184 100644 --- a/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/TransactionContextImpl.java +++ b/impl/core/src/main/java/br/gov/frameworkdemoiselle/internal/implementation/TransactionContextImpl.java @@ -60,7 +60,10 @@ public class TransactionContextImpl implements TransactionContext { if (this.transaction == null) { TransactionBootstrap bootstrap = Beans.getReference(TransactionBootstrap.class); Class clazz = getConfig().getTransactionClass(); - clazz = StrategySelector.getClass(clazz, bootstrap.getCache()); + + if (clazz == null) { + clazz = StrategySelector.getClass(Transaction.class, bootstrap.getCache()); + } this.transaction = Beans.getReference(clazz); } diff --git a/impl/core/src/main/resources/demoiselle-core-bundle.properties b/impl/core/src/main/resources/demoiselle-core-bundle.properties index d98e389..c15bb8e 100644 --- a/impl/core/src/main/resources/demoiselle-core-bundle.properties +++ b/impl/core/src/main/resources/demoiselle-core-bundle.properties @@ -34,6 +34,7 @@ # 51 Franklin St, Fifth Floor, Boston, MA 02111-1301, USA. engine-on=Ligando os motores do Demoiselle ${project.version} +ambiguous-strategy-resolution=Foi detectada ambiguidade da interface "{0}" com as seguintes implementa\u00E7\u00F5es\: "{1}". Para resolver o conflito, defina explicitamente a implementa\u00E7\u00E3o no demoiselle.properties. bean-not-found=Voc\u00EA est\u00E1 tentando obter um objeto n\u00E3o reconhecido pelo CDI via Beans.getReference({0}) more-than-one-exceptionhandler-defined-for-same-class=Foi definido mais de um m\u00E9todo na classe {0} para tratar a exce\u00E7\u00E3o {1} handling-exception=Tratando a exce\u00E7\u00E3o {0} @@ -71,8 +72,6 @@ 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 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}] @@ -88,8 +87,6 @@ access-allowed=O usu\u00E1rio "{0}" acessou o recurso "{2}" com a a\u00E7\u00E3o access-denied=O usu\u00E1rio "{0}" n\u00E3o possui permiss\u00E3o para executar a a\u00E7\u00E3o "{1}" no recurso "{2}" access-denied-ui=Voc\u00EA n\u00E3o est\u00E1 autorizado a executar a a\u00E7\u00E3o {1} no recurso {0} authorizer-not-defined=Nenhuma regra de resolu\u00E7\u00E3o de permiss\u00F5es foi definida. Para utilizar @{0} \u00E9 preciso definir a propriedade frameworkdemoiselle.security.authorizer.class como regra de resolu\u00E7\u00E3o de permiss\u00F5es desejada no arquivo demoiselle.properties. -authorizer-class-not-found=A classe de resolu\u00E7\u00E3o de permiss\u00F5es "{0}" informada no demoiselle.properties n\u00E3o foi encontrada no classpath. -authorizer-class-must-be-of-type=A classe de resolu\u00E7\u00E3o de permiss\u00F5es "{0}" informada no demoiselle.properties deve ser do tipo "{1}" user-not-authenticated=Usu\u00E1rio n\u00E3o autenticado has-role-verification=Verificando se o usu\u00E1rio {0} possui a(s) role(s)\: {1} does-not-have-role=Usu\u00E1rio {0} n\u00E3o possui a(s) role(s)\: {1} @@ -97,5 +94,3 @@ does-not-have-role-ui=Para acessar este recurso \u00E9 necess\u00E1rio ser {0} user-has-role=Usu\u00E1rio {0} possui a(s) role(s)\: {1} authenticator-not-defined=Nenhum mecanismo de autentica\u00E7\u00E3o foi definido. Para utilizar {0} \u00E9 preciso definir a propriedade frameworkdemoiselle.security.authenticator.class como mecanismo de autentica\u00E7\u00E3o desejado no arquivo demoiselle.properties. -authenticator-class-not-found=A classe de autentica\u00E7\u00E3o "{0}" informada no demoiselle.properties n\u00E3o foi encontrada no classpath. -authenticator-class-must-be-of-type=A classe de autentica\u00E7\u00E3o "{0}" informada no demoiselle.properties deve ser do tipo "{1}" \ No newline at end of file -- libgit2 0.21.2