Yevgeny Zaspitsky has uploaded a new change for review. Change subject: engine: move Injector to vdsbroker ......................................................................
engine: move Injector to vdsbroker 1. add CDI functionality to vdsbroker 2. move Injector to vdsbroker Change-Id: I0009744272e5eef1ca505d4d5fd8030058c40f33 Signed-off-by: Yevgeny Zaspitsky <yzasp...@redhat.com> --- M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/NetworkHelper.java D backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/Injector.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java A backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/di/Injector.java M backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java A backend/manager/modules/vdsbroker/src/main/resources/META-INF/beans.xml 8 files changed, 112 insertions(+), 97 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/38/34138/11 diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java index 20c4c52..03cdd6e 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/Backend.java @@ -62,7 +62,6 @@ import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; import org.ovirt.engine.core.common.queries.VdcQueryType; -import org.ovirt.engine.core.bll.utils.Injector; import org.ovirt.engine.core.common.utils.SimpleDependecyInjector; import org.ovirt.engine.core.common.utils.customprop.VmPropertiesUtils; import org.ovirt.engine.core.compat.DateTime; @@ -70,6 +69,7 @@ import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.generic.DBConfigUtils; import org.ovirt.engine.core.dal.job.ExecutionMessageDirector; +import org.ovirt.engine.core.di.Injector; import org.ovirt.engine.core.searchbackend.BaseConditionFieldAutoCompleter; import org.ovirt.engine.core.searchbackend.OsValueAutoCompleter; import org.ovirt.engine.core.utils.EngineLocalConfig; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java index 1d8ce46..6d410a1 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/CommandsFactory.java @@ -9,18 +9,17 @@ import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.context.EngineContext; -import org.ovirt.engine.core.bll.utils.Injector; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.queries.VdcQueryParametersBase; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.di.Injector; import org.ovirt.engine.core.utils.ReflectionUtils; import org.ovirt.engine.core.utils.log.Log; import org.ovirt.engine.core.utils.log.LogFactory; public final class CommandsFactory { - private static final Injector injector = new Injector(); private static final String CLASS_NAME_FORMAT = "%1$s.%2$s%3$s"; private static final String CommandSuffix = "Command"; private static final String QueryPrefix = "Query"; diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/NetworkHelper.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/NetworkHelper.java index fc9b5f5..426addd 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/NetworkHelper.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/network/cluster/NetworkHelper.java @@ -9,7 +9,6 @@ import org.ovirt.engine.core.bll.context.CommandContext; import org.ovirt.engine.core.bll.network.NetworkParametersBuilder; import org.ovirt.engine.core.bll.network.RemoveNetworkParametersBuilder; -import org.ovirt.engine.core.bll.utils.Injector; import org.ovirt.engine.core.bll.utils.VersionSupport; import org.ovirt.engine.core.common.VdcObjectType; import org.ovirt.engine.core.common.action.VdcActionParametersBase; @@ -20,6 +19,7 @@ import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.di.Injector; import org.ovirt.engine.core.utils.NetworkUtils; /** diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/Injector.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/Injector.java deleted file mode 100644 index 1d06274..0000000 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/utils/Injector.java +++ /dev/null @@ -1,76 +0,0 @@ -package org.ovirt.engine.core.bll.utils; - -import javax.annotation.PostConstruct; -import javax.enterprise.inject.spi.AnnotatedType; -import javax.enterprise.inject.spi.Bean; -import javax.enterprise.inject.spi.BeanManager; -import javax.enterprise.inject.spi.InjectionTarget; -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.ovirt.engine.core.bll.CommandBase; -import org.ovirt.engine.core.common.action.VdcActionParametersBase; - -/** - * an application wide interaction point with the CDI container mostly to gap all the existing unmanged code - * or for unmanaged code which wants interaction with managed beans. - * Typically this injector could be used anywhere to get a manage instance from instances which - * aren't managed like some utility singletons etc - */ -@Singleton -public class Injector { - - private static Injector injector; - - @Inject - private BeanManager manager; - - @PostConstruct - private void init() { - injector = this; - } - - /** - * This method will take an instance and will fulfill all its dependencies, which are members - * annotated with <code>@Inject</code>. - * @param instance unmanaged CDI bean, essentially a regular object which is not managed by - * the CDI container. - * @param <T> an unmanaged CDI instance with some members containing <code>@Inject</code> annotated - * members - */ - public static <T extends CommandBase<? extends VdcActionParametersBase>> T injectMembers(T instance) { - AnnotatedType type = injector.manager.createAnnotatedType(instance.getClass()); - InjectionTarget injectionTarget = injector.manager.createInjectionTarget(type); - injectionTarget.inject(instance, injector.manager.createCreationalContext(null)); - injectionTarget.postConstruct(instance); - return instance; - } - - /** - * This method will fetch a managed CDI bean from the CDI container. - * Using this method should help us bridge all places where we are in unmanaged instances - * and we want an already managed instance. e.g all our Singletons getInstance methods are candidates for this usage, - * meaning we Make the Singleton a manged bean but let the existing code still - * get a reference by invoking getInstance which delegate to this method. - * @param clazz the Runtime class representing the desired instance - * @param <T> - * @return the instance of type <code><T></T></code> which is manged by the CDI container - */ - public static <T extends Object> T get(Class<T> clazz) { - return injector.instanceOf(clazz); - } - - /** - * convenience method, good for mocking and whoever holds a direct instance of Injector in hand.<br> - * after all its a jdk "bug" to call a static method on an instance.<br> - *{@link Injector#get(Class)} should supply the same behaiour exactly - * @param clazz - * @param <T> - * @return instance of T - * @see #get(Class) - */ - public <T extends Object> T instanceOf(Class<T> clazz) { - Bean bean = injector.manager.getBeans(clazz).iterator().next(); - return (T) injector.manager.getReference(bean, clazz, injector.manager.createCreationalContext(bean)); - } -} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java index 4766870..bb7c7ec 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/validator/NetworkValidator.java @@ -5,7 +5,6 @@ import org.ovirt.engine.core.bll.ValidationResult; import org.ovirt.engine.core.bll.network.cluster.ManagementNetworkUtil; -import org.ovirt.engine.core.bll.utils.Injector; import org.ovirt.engine.core.common.FeatureSupported; import org.ovirt.engine.core.common.businessentities.IscsiBond; import org.ovirt.engine.core.common.businessentities.Nameable; @@ -15,6 +14,7 @@ import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.errors.VdcBllMessages; import org.ovirt.engine.core.dal.dbbroker.DbFacade; +import org.ovirt.engine.core.di.Injector; import org.ovirt.engine.core.utils.NetworkUtils; import org.ovirt.engine.core.utils.ReplacementUtils; diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/di/Injector.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/di/Injector.java new file mode 100644 index 0000000..36cd588 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/di/Injector.java @@ -0,0 +1,92 @@ +package org.ovirt.engine.core.di; + +import javax.annotation.PostConstruct; +import javax.enterprise.context.spi.CreationalContext; +import javax.enterprise.inject.spi.AnnotatedType; +import javax.enterprise.inject.spi.Bean; +import javax.enterprise.inject.spi.BeanManager; +import javax.enterprise.inject.spi.InjectionTarget; +import javax.inject.Inject; +import javax.inject.Singleton; + +/** + * an application wide interaction point with the CDI container mostly to gap all the existing unmanaged code + * or for unmanaged code which wants interaction with managed beans. + * Typically this injector could be used anywhere to get a manage instance from instances which + * aren't managed like some utility singletons etc + */ +@Singleton +public class Injector { + + private static Injector injector; + + @Inject + private BeanManager manager; + + @PostConstruct + private void init() { + injector = this; + } + + /** + * This method will take an instance and will fulfill all its dependencies, which are members + * annotated with <code>@Inject</code>. + * + * @param instance + * unmanaged CDI bean, essentially a regular object which is not managed by + * the CDI container. + * @param <T> + * an unmanaged CDI instance with some members containing <code>@Inject</code> annotated + * members + */ + public static <T> T injectMembers(T instance) { + final BeanManager manager = injector.getManager(); + @SuppressWarnings("unchecked") + final Class<T> clazz = (Class<T>) instance.getClass(); + AnnotatedType<T> type = manager.createAnnotatedType(clazz); + InjectionTarget<T> injectionTarget = manager.createInjectionTarget(type); + final CreationalContext<T> creationalContext = manager.createCreationalContext(null); + injectionTarget.inject(instance, creationalContext); + injectionTarget.postConstruct(instance); + return instance; + } + + /** + * This method will fetch a managed CDI bean from the CDI container. + * Using this method should help us bridge all places where we are in unmanaged instances + * and we want an already managed instance. e.g all our Singletons getInstance methods are candidates for this + * usage, + * meaning we Make the Singleton a manged bean but let the existing code still + * get a reference by invoking getInstance which delegate to this method. + * + * @param clazz + * the Runtime class representing the desired instance + * @param <T> + * @return the instance of type <code><T></T></code> which is manged by the CDI container + */ + public static <T extends Object> T get(Class<T> clazz) { + return injector.instanceOf(clazz); + } + + /** + * convenience method, good for mocking and whoever holds a direct instance of Injector in hand.<br> + * after all its a jdk "bug" to call a static method on an instance.<br> + * {@link Injector#get(Class)} should supply the same behaiour exactly + * + * @param clazz + * @param <T> + * @return instance of T + * @see #get(Class) + */ + @SuppressWarnings("unchecked") + public <T extends Object> T instanceOf(Class<T> clazz) { + final BeanManager manager = injector.getManager(); + final Bean<T> bean = (Bean<T>) manager.getBeans(clazz).iterator().next(); + final CreationalContext<T> creationalContext = manager.createCreationalContext(bean); + return (T) manager.getReference(bean, clazz, creationalContext); + } + + private BeanManager getManager() { + return manager; + } +} diff --git a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java index 4d425a2..cc21d83 100644 --- a/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java +++ b/backend/manager/modules/vdsbroker/src/main/java/org/ovirt/engine/core/vdsbroker/ResourceManager.java @@ -36,6 +36,7 @@ import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogDirector; import org.ovirt.engine.core.dal.dbbroker.auditloghandling.AuditLogableBase; +import org.ovirt.engine.core.di.Injector; import org.ovirt.engine.core.utils.ReflectionUtils; import org.ovirt.engine.core.utils.collections.MultiValueMapUtils; import org.ovirt.engine.core.utils.ejb.BeanProxyType; @@ -363,22 +364,21 @@ /** * Create the command which needs to run. + * * @param <P> * @param commandType * @param parameters * @return The command, or null if it can't be created. */ - private <P extends VDSParametersBase> VDSCommandBase<P> CreateCommand( - VDSCommandType commandType, P parameters) { + private <P extends VDSParametersBase> VDSCommandBase<P> createCommand(VDSCommandType commandType, P parameters) { try { @SuppressWarnings("unchecked") - Class<VDSCommandBase<P>> type = - (Class<VDSCommandBase<P>>) Class.forName(GetCommandTypeName(commandType)); - Constructor<VDSCommandBase<P>> constructor = - ReflectionUtils.findConstructor(type, parameters.getClass()); + Class<VDSCommandBase<P>> type = (Class<VDSCommandBase<P>>) Class.forName(GetCommandTypeName(commandType)); + Constructor<VDSCommandBase<P>> constructor = ReflectionUtils.findConstructor(type, parameters.getClass()); if (constructor != null) { - return constructor.newInstance(new Object[] { parameters }); + final VDSCommandBase<P> newCommandInstance = constructor.newInstance(new Object[] { parameters }); + return Injector.injectMembers(newCommandInstance); } } catch (Exception e) { if (e.getCause() != null) { @@ -390,17 +390,17 @@ return null; } - private <P extends VdsIdVDSCommandParametersBase> FutureVDSCommand createFutureCommand(FutureVDSCommandType commandType, - P parameters) { + private <P extends VdsIdVDSCommandParametersBase> FutureVDSCommand<P> createFutureCommand(FutureVDSCommandType commandType, + P parameters) { try { - Class<FutureVDSCommand> type = - (Class<FutureVDSCommand>) Class.forName(commandType.getFullyQualifiedClassName()); - Constructor<FutureVDSCommand> constructor = - ReflectionUtils.findConstructor(type, - parameters.getClass()); + @SuppressWarnings("unchecked") + Class<FutureVDSCommand<P>> type = + (Class<FutureVDSCommand<P>>) Class.forName(commandType.getFullyQualifiedClassName()); + Constructor<FutureVDSCommand<P>> constructor = ReflectionUtils.findConstructor(type, parameters.getClass()); if (constructor != null) { - return constructor.newInstance(new Object[] { parameters }); + final FutureVDSCommand<P> newCommandInstance = constructor.newInstance(new Object[] { parameters }); + return Injector.injectMembers(newCommandInstance); } } catch (Exception e) { if (e.getCause() != null) { @@ -415,7 +415,7 @@ public <P extends VDSParametersBase> VDSReturnValue runVdsCommand(VDSCommandType commandType, P parameters) { // try run vds command - VDSCommandBase<P> command = CreateCommand(commandType, parameters); + VDSCommandBase<P> command = createCommand(commandType, parameters); if (command != null) { command.execute(); diff --git a/backend/manager/modules/vdsbroker/src/main/resources/META-INF/beans.xml b/backend/manager/modules/vdsbroker/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/backend/manager/modules/vdsbroker/src/main/resources/META-INF/beans.xml -- To view, visit http://gerrit.ovirt.org/34138 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0009744272e5eef1ca505d4d5fd8030058c40f33 Gerrit-PatchSet: 11 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Yevgeny Zaspitsky <yzasp...@redhat.com> Gerrit-Reviewer: Alona Kaplan <alkap...@redhat.com> Gerrit-Reviewer: Roy Golan <rgo...@redhat.com> Gerrit-Reviewer: automat...@ovirt.org Gerrit-Reviewer: oVirt Jenkins CI Server _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches