diff --git a/manager/api/src/main/java/org/jboss/forge/furnace/manager/AddonManager.java b/manager/api/src/main/java/org/jboss/forge/furnace/manager/AddonManager.java index 826077dc..fc0c3cf3 100644 --- a/manager/api/src/main/java/org/jboss/forge/furnace/manager/AddonManager.java +++ b/manager/api/src/main/java/org/jboss/forge/furnace/manager/AddonManager.java @@ -7,7 +7,10 @@ package org.jboss.forge.furnace.manager; +import java.util.Set; + import org.jboss.forge.furnace.addons.AddonId; +import org.jboss.forge.furnace.manager.request.CompositeAddonActionRequest; import org.jboss.forge.furnace.manager.request.DeployRequest; import org.jboss.forge.furnace.manager.request.DisableRequest; import org.jboss.forge.furnace.manager.request.EnableRequest; @@ -50,6 +53,16 @@ public interface AddonManager */ InstallRequest install(AddonId id, AddonRepository addonRepository); + /** + * Create a new {@link CompositeAddonActionRequest} for the given {@link Set} of {@link AddonId} instances and + * {@link AddonRepository}. + * + * @param ids the addons to be installed + * @param addonRepository the {@link AddonRepository} to be used + * @return the request for installation + */ + CompositeAddonActionRequest install(Set ids, AddonRepository target); + /** * Create a new {@link DeployRequest} for the given {@link AddonId}. * @@ -83,6 +96,16 @@ public interface AddonManager */ RemoveRequest remove(AddonId id, AddonRepository addonRepository); + /** + * Create a new {@link RemoveRequest} for the given {@link Set} of {@link AddonId} instances and + * {@link AddonRepository}. + * + * @param ids the addons to be installed + * @param addonRepository the {@link AddonRepository} to be used + * @return the request for installation + */ + CompositeAddonActionRequest remove(Set ids, AddonRepository target); + /** * Create a new {@link EnableRequest} for the given {@link AddonId}. * diff --git a/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/AddonActionRequest.java b/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/AddonActionRequest.java index 7e7ad3e2..be9b582d 100644 --- a/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/AddonActionRequest.java +++ b/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/AddonActionRequest.java @@ -15,15 +15,10 @@ * @author George Gastaldi * */ -public interface AddonActionRequest +public interface AddonActionRequest extends FurnaceAction { /** - * Target Addon + * Get the target {@link AddonInfo}. */ AddonInfo getRequestedAddonInfo(); - - /** - * Execute the desired request - */ - void perform(); } \ No newline at end of file diff --git a/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/CompositeAddonActionRequest.java b/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/CompositeAddonActionRequest.java new file mode 100644 index 00000000..e411dd05 --- /dev/null +++ b/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/CompositeAddonActionRequest.java @@ -0,0 +1,20 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.jboss.forge.furnace.manager.request; + +import java.util.List; + +/** + * Performs an aggregate set of {@link AddonActionRequest} operations. + * + * @author Lincoln Baxter, III + */ +public interface CompositeAddonActionRequest extends FurnaceAction +{ + public List getActions(); +} \ No newline at end of file diff --git a/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/FurnaceAction.java b/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/FurnaceAction.java new file mode 100644 index 00000000..0def7bd6 --- /dev/null +++ b/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/FurnaceAction.java @@ -0,0 +1,25 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.jboss.forge.furnace.manager.request; + +/** + * @author Lincoln Baxter, III + * + */ +public interface FurnaceAction +{ + + /** + * Execute the desired request + */ + void perform(); + + /** + * Execute the desired request using the given {@link FurnaceIsolationType} + */ + void perform(FurnaceIsolationType type); +} diff --git a/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/FurnaceIsolationType.java b/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/FurnaceIsolationType.java new file mode 100644 index 00000000..188bf6cd --- /dev/null +++ b/manager/api/src/main/java/org/jboss/forge/furnace/manager/request/FurnaceIsolationType.java @@ -0,0 +1,27 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.jboss.forge.furnace.manager.request; + +import org.jboss.forge.furnace.Furnace; +import org.jboss.forge.furnace.manager.AddonManager; + +/** + * Specifies the isolation types that an {@link AddonManager} should use during {@link FurnaceAction} execution. + * + * @author Lincoln Baxter, III + */ +public enum FurnaceIsolationType +{ + /** + * Does not require any isolation; the operation will be performed without waiting. + */ + NONE, + /** + * Requires that {@link Furnace} rescan its configuration at least once after the operation has been performed. + */ + CONFIGURATION_RELOAD; +} diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/AddonManagerImpl.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/AddonManagerImpl.java index 0039c575..11822b66 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/AddonManagerImpl.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/AddonManagerImpl.java @@ -7,12 +7,12 @@ package org.jboss.forge.furnace.manager.impl; -import static org.jboss.forge.furnace.manager.impl.request.AddonActionRequestFactory.createDeployRequest; -import static org.jboss.forge.furnace.manager.impl.request.AddonActionRequestFactory.createDisableRequest; -import static org.jboss.forge.furnace.manager.impl.request.AddonActionRequestFactory.createEnableRequest; -import static org.jboss.forge.furnace.manager.impl.request.AddonActionRequestFactory.createInstallRequest; -import static org.jboss.forge.furnace.manager.impl.request.AddonActionRequestFactory.createRemoveRequest; -import static org.jboss.forge.furnace.manager.impl.request.AddonActionRequestFactory.createUpdateRequest; +import static org.jboss.forge.furnace.manager.impl.action.AddonActionRequestFactory.createDeployRequest; +import static org.jboss.forge.furnace.manager.impl.action.AddonActionRequestFactory.createDisableRequest; +import static org.jboss.forge.furnace.manager.impl.action.AddonActionRequestFactory.createEnableRequest; +import static org.jboss.forge.furnace.manager.impl.action.AddonActionRequestFactory.createInstallRequest; +import static org.jboss.forge.furnace.manager.impl.action.AddonActionRequestFactory.createRemoveRequest; +import static org.jboss.forge.furnace.manager.impl.action.AddonActionRequestFactory.createUpdateRequest; import java.util.ArrayList; import java.util.HashMap; @@ -20,11 +20,14 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.addons.AddonId; import org.jboss.forge.furnace.manager.AddonManager; +import org.jboss.forge.furnace.manager.impl.request.CompositeRequestImpl; import org.jboss.forge.furnace.manager.request.AddonActionRequest; +import org.jboss.forge.furnace.manager.request.CompositeAddonActionRequest; import org.jboss.forge.furnace.manager.request.DeployRequest; import org.jboss.forge.furnace.manager.request.DisableRequest; import org.jboss.forge.furnace.manager.request.EnableRequest; @@ -92,7 +95,33 @@ public InstallRequest install(final AddonId addonId, final AddonRepository repos actions.add(request); } } - return createInstallRequest(addonInfo, actions); + return createInstallRequest(addonInfo, actions, furnace); + } + + @Override + public CompositeAddonActionRequest install(Set ids, AddonRepository repository) + { + List actions = new ArrayList(); + + for (AddonId addonId : ids) + { + actions.add(install(addonId, repository)); + } + + return new CompositeRequestImpl(actions, furnace); + } + + @Override + public CompositeAddonActionRequest remove(Set ids, AddonRepository repository) + { + List actions = new ArrayList(); + + for (AddonId addonId : ids) + { + actions.add(remove(addonId, repository)); + } + + return new CompositeRequestImpl(actions, furnace); } @Override @@ -149,11 +178,6 @@ public EnableRequest enable(final AddonId id, final AddonRepository repository) /** * Calculate the necessary request based in the list of installed addons for a given {@link MutableAddonRepository} - * - * @param addonInfo - * @param repository - * @param installedAddons - * @return */ private AddonActionRequest createRequest(final AddonInfo requestedAddonInfo, final AddonInfo addonInfo, final MutableAddonRepository repository, @@ -230,12 +254,7 @@ private AddonActionRequest createRequest(final AddonInfo requestedAddonInfo, fin } /** - * Collect all required addons for a specific addon. - * - * It traverses the whole graph - * - * @param addonInfo - * @param addons + * Collect all required addons for a specific addon. Traverses the whole graph. */ private void collectRequiredAddons(AddonInfo addonInfo, List addons) { diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/AbstractAddonActionRequest.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AbstractAddonActionRequest.java similarity index 54% rename from manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/AbstractAddonActionRequest.java rename to manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AbstractAddonActionRequest.java index 71ea3918..58efb8d0 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/AbstractAddonActionRequest.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AbstractAddonActionRequest.java @@ -5,7 +5,7 @@ * http://www.eclipse.org/legal/epl-v10.html */ -package org.jboss.forge.furnace.manager.impl.request; +package org.jboss.forge.furnace.manager.impl.action; import java.util.logging.Logger; @@ -13,31 +13,29 @@ import org.jboss.forge.furnace.manager.request.AddonActionRequest; import org.jboss.forge.furnace.manager.spi.AddonInfo; import org.jboss.forge.furnace.repositories.MutableAddonRepository; -import org.jboss.forge.furnace.spi.ContainerLifecycleListener; -import org.jboss.forge.furnace.spi.ListenerRegistration; import org.jboss.forge.furnace.util.Assert; /** * Abstract class for {@link AddonActionRequest} implementations * * @author George Gastaldi + * @author Lincoln Baxter, III * */ -public abstract class AbstractAddonActionRequest implements AddonActionRequest +public abstract class AbstractAddonActionRequest extends AbstractFurnaceAction implements AddonActionRequest { protected final AddonInfo addonInfo; - protected final Furnace furnace; protected final MutableAddonRepository repository; protected Logger log = Logger.getLogger(getClass().getName()); protected AbstractAddonActionRequest(AddonInfo addonInfo, MutableAddonRepository addonRepository, Furnace furnace) { + super(furnace); Assert.notNull(addonInfo, "AddonInfo must not be null."); Assert.notNull(furnace, "Addon Repository must not be null."); - Assert.notNull(furnace, "Furnace must not be null."); + this.addonInfo = addonInfo; - this.furnace = furnace; this.repository = addonRepository; } @@ -47,37 +45,6 @@ public final AddonInfo getRequestedAddonInfo() return addonInfo; } - @Override - public final void perform() - { - ConfigurationScanListener listener = new ConfigurationScanListener(); - ListenerRegistration reg = furnace.addContainerLifecycleListener(listener); - try - { - execute(); - if (!furnace.getStatus().isStopped()) - { - while (furnace.getStatus().isStarting() || !listener.isConfigurationScanned()) - { - try - { - Thread.sleep(100); - } - catch (InterruptedException e) - { - throw new RuntimeException(e); - } - } - } - } - finally - { - reg.removeListener(); - } - } - - public abstract void execute(); - @Override public String toString() { diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AbstractFurnaceAction.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AbstractFurnaceAction.java new file mode 100644 index 00000000..baf3b154 --- /dev/null +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AbstractFurnaceAction.java @@ -0,0 +1,82 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ +package org.jboss.forge.furnace.manager.impl.action; + +import org.jboss.forge.furnace.Furnace; +import org.jboss.forge.furnace.manager.request.FurnaceAction; +import org.jboss.forge.furnace.manager.request.FurnaceIsolationType; +import org.jboss.forge.furnace.spi.ContainerLifecycleListener; +import org.jboss.forge.furnace.spi.ListenerRegistration; +import org.jboss.forge.furnace.util.Assert; + +/** + * Default implementation of {@link FurnaceAction}. + * + * @author Lincoln Baxter, III + */ +public abstract class AbstractFurnaceAction implements FurnaceAction +{ + protected final Furnace furnace; + + public AbstractFurnaceAction(Furnace furnace) + { + Assert.notNull(furnace, "Furnace must not be null."); + this.furnace = furnace; + } + + public abstract void execute(); + + @Override + public final void perform() + { + perform(FurnaceIsolationType.CONFIGURATION_RELOAD); + } + + @Override + public void perform(FurnaceIsolationType type) + { + switch (type) + { + case CONFIGURATION_RELOAD: + executeAndWaitForReload(); + break; + case NONE: + execute(); + default: + break; + } + } + + private void executeAndWaitForReload() + { + ConfigurationScanListener listener = new ConfigurationScanListener(); + ListenerRegistration reg = furnace.addContainerLifecycleListener(listener); + try + { + execute(); + if (!furnace.getStatus().isStopped()) + { + while (furnace.getStatus().isStarting() || !listener.isConfigurationScanned()) + { + try + { + Thread.sleep(100); + } + catch (InterruptedException e) + { + throw new RuntimeException(e); + } + } + } + } + finally + { + reg.removeListener(); + } + } + +} diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/AddonActionRequestFactory.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AddonActionRequestFactory.java similarity index 78% rename from manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/AddonActionRequestFactory.java rename to manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AddonActionRequestFactory.java index 63f93a38..fed499bb 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/AddonActionRequestFactory.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/AddonActionRequestFactory.java @@ -5,11 +5,17 @@ * http://www.eclipse.org/legal/epl-v10.html */ -package org.jboss.forge.furnace.manager.impl.request; +package org.jboss.forge.furnace.manager.impl.action; import java.util.List; import org.jboss.forge.furnace.Furnace; +import org.jboss.forge.furnace.manager.impl.request.DeployRequestImpl; +import org.jboss.forge.furnace.manager.impl.request.DisableRequestImpl; +import org.jboss.forge.furnace.manager.impl.request.EnableRequestImpl; +import org.jboss.forge.furnace.manager.impl.request.InstallRequestImpl; +import org.jboss.forge.furnace.manager.impl.request.RemoveRequestImpl; +import org.jboss.forge.furnace.manager.impl.request.UpdateRequestImpl; import org.jboss.forge.furnace.manager.request.AddonActionRequest; import org.jboss.forge.furnace.manager.request.DeployRequest; import org.jboss.forge.furnace.manager.request.DisableRequest; @@ -28,9 +34,10 @@ */ public class AddonActionRequestFactory { - public static InstallRequest createInstallRequest(AddonInfo addonInfo, List actions) + public static InstallRequest createInstallRequest(AddonInfo addonInfo, List actions, + Furnace furnace) { - return new InstallRequestImpl(addonInfo, actions); + return new InstallRequestImpl(addonInfo, actions, furnace); } public static DeployRequest createDeployRequest(AddonInfo addonInfo, MutableAddonRepository repository, @@ -44,7 +51,7 @@ public static UpdateRequest createUpdateRequest(AddonInfo addonToRemove, AddonIn { RemoveRequest removeRequest = createRemoveRequest(addonToRemove, repository, furnace); DeployRequest installRequest = createDeployRequest(addonToInstall, repository, furnace); - return new UpdateRequestImpl(removeRequest, installRequest); + return new UpdateRequestImpl(removeRequest, installRequest, furnace); } public static RemoveRequest createRemoveRequest(AddonInfo addonInfo, MutableAddonRepository repository, diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/ConfigurationScanListener.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/ConfigurationScanListener.java similarity index 95% rename from manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/ConfigurationScanListener.java rename to manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/ConfigurationScanListener.java index 7e7e1f18..ae4842e1 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/ConfigurationScanListener.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/action/ConfigurationScanListener.java @@ -4,7 +4,7 @@ * Licensed under the Eclipse Public License version 1.0, available at * http://www.eclipse.org/legal/epl-v10.html */ -package org.jboss.forge.furnace.manager.impl.request; +package org.jboss.forge.furnace.manager.impl.action; import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.exception.ContainerException; diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/CompositeRequestImpl.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/CompositeRequestImpl.java new file mode 100644 index 00000000..15ffb77c --- /dev/null +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/CompositeRequestImpl.java @@ -0,0 +1,57 @@ +/* + * Copyright 2013 Red Hat, Inc. and/or its affiliates. + * + * Licensed under the Eclipse Public License version 1.0, available at + * http://www.eclipse.org/legal/epl-v10.html + */ + +package org.jboss.forge.furnace.manager.impl.request; + +import java.util.Collections; +import java.util.List; + +import org.jboss.forge.furnace.Furnace; +import org.jboss.forge.furnace.manager.impl.action.AbstractFurnaceAction; +import org.jboss.forge.furnace.manager.request.AddonActionRequest; +import org.jboss.forge.furnace.manager.request.CompositeAddonActionRequest; +import org.jboss.forge.furnace.manager.request.FurnaceIsolationType; +import org.jboss.forge.furnace.manager.request.InstallRequest; + +/** + * Implementation of the {@link InstallRequest} interface + * + * @author George Gastaldi + * + */ +public class CompositeRequestImpl extends AbstractFurnaceAction implements CompositeAddonActionRequest +{ + private final List actions; + + public CompositeRequestImpl(List actions, Furnace furnace) + { + super(furnace); + this.actions = Collections.unmodifiableList(actions); + } + + @Override + public void execute() + { + for (AddonActionRequest action : actions) + { + action.perform(FurnaceIsolationType.NONE); + } + } + + @Override + public List getActions() + { + return actions; + } + + @Override + public String toString() + { + return actions.toString(); + } + +} diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/DeployRequestImpl.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/DeployRequestImpl.java index 64a38cf7..8b54b280 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/DeployRequestImpl.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/DeployRequestImpl.java @@ -14,6 +14,7 @@ import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.addons.AddonId; import org.jboss.forge.furnace.lock.LockMode; +import org.jboss.forge.furnace.manager.impl.action.AbstractAddonActionRequest; import org.jboss.forge.furnace.manager.request.DeployRequest; import org.jboss.forge.furnace.manager.spi.AddonInfo; import org.jboss.forge.furnace.repositories.AddonDependencyEntry; @@ -26,14 +27,12 @@ * @author George Gastaldi * */ -class DeployRequestImpl extends AbstractAddonActionRequest implements DeployRequest +public class DeployRequestImpl extends AbstractAddonActionRequest implements DeployRequest { /** * Package-access constructor. Only AddonManager should be allowed to call this constructor. - * - * @param addonManager */ - DeployRequestImpl(AddonInfo info, MutableAddonRepository repository, Furnace forge) + public DeployRequestImpl(AddonInfo info, MutableAddonRepository repository, Furnace forge) { super(info, repository, forge); } diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/DisableRequestImpl.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/DisableRequestImpl.java index 9d01250b..26925fb9 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/DisableRequestImpl.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/DisableRequestImpl.java @@ -8,6 +8,7 @@ import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.addons.AddonId; +import org.jboss.forge.furnace.manager.impl.action.AbstractAddonActionRequest; import org.jboss.forge.furnace.manager.request.DisableRequest; import org.jboss.forge.furnace.manager.spi.AddonInfo; import org.jboss.forge.furnace.repositories.MutableAddonRepository; @@ -19,9 +20,9 @@ * @author George Gastaldi * */ -class DisableRequestImpl extends AbstractAddonActionRequest implements DisableRequest +public class DisableRequestImpl extends AbstractAddonActionRequest implements DisableRequest { - DisableRequestImpl(AddonInfo info, MutableAddonRepository repository, Furnace forge) + public DisableRequestImpl(AddonInfo info, MutableAddonRepository repository, Furnace forge) { super(info, repository, forge); } diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/EnableRequestImpl.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/EnableRequestImpl.java index 77eeeb1b..dab808f9 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/EnableRequestImpl.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/EnableRequestImpl.java @@ -8,6 +8,7 @@ import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.addons.AddonId; +import org.jboss.forge.furnace.manager.impl.action.AbstractAddonActionRequest; import org.jboss.forge.furnace.manager.request.EnableRequest; import org.jboss.forge.furnace.manager.spi.AddonInfo; import org.jboss.forge.furnace.repositories.MutableAddonRepository; @@ -18,9 +19,9 @@ * @author Lincoln Baxter, III * @author George Gastaldi */ -class EnableRequestImpl extends AbstractAddonActionRequest implements EnableRequest +public class EnableRequestImpl extends AbstractAddonActionRequest implements EnableRequest { - EnableRequestImpl(AddonInfo info, MutableAddonRepository repository, Furnace forge) + public EnableRequestImpl(AddonInfo info, MutableAddonRepository repository, Furnace forge) { super(info, repository, forge); } diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/InstallRequestImpl.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/InstallRequestImpl.java index 6013ae09..82e93695 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/InstallRequestImpl.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/InstallRequestImpl.java @@ -10,7 +10,10 @@ import java.util.Collections; import java.util.List; +import org.jboss.forge.furnace.Furnace; +import org.jboss.forge.furnace.manager.impl.action.AbstractFurnaceAction; import org.jboss.forge.furnace.manager.request.AddonActionRequest; +import org.jboss.forge.furnace.manager.request.FurnaceIsolationType; import org.jboss.forge.furnace.manager.request.InstallRequest; import org.jboss.forge.furnace.manager.spi.AddonInfo; @@ -20,23 +23,24 @@ * @author George Gastaldi * */ -class InstallRequestImpl implements InstallRequest +public class InstallRequestImpl extends AbstractFurnaceAction implements InstallRequest { private final AddonInfo addonInfo; private final List actions; - public InstallRequestImpl(AddonInfo addonInfo, List actions) + public InstallRequestImpl(AddonInfo addonInfo, List actions, Furnace furnace) { + super(furnace); this.addonInfo = addonInfo; this.actions = Collections.unmodifiableList(actions); } @Override - public void perform() + public void execute() { for (AddonActionRequest action : actions) { - action.perform(); + action.perform(FurnaceIsolationType.NONE); } } diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/RemoveRequestImpl.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/RemoveRequestImpl.java index 81888dc1..4b6e30fc 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/RemoveRequestImpl.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/RemoveRequestImpl.java @@ -11,6 +11,7 @@ import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.addons.AddonId; import org.jboss.forge.furnace.lock.LockMode; +import org.jboss.forge.furnace.manager.impl.action.AbstractAddonActionRequest; import org.jboss.forge.furnace.manager.request.RemoveRequest; import org.jboss.forge.furnace.manager.spi.AddonInfo; import org.jboss.forge.furnace.repositories.MutableAddonRepository; @@ -19,9 +20,9 @@ * @author Lincoln Baxter, III * */ -class RemoveRequestImpl extends AbstractAddonActionRequest implements RemoveRequest +public class RemoveRequestImpl extends AbstractAddonActionRequest implements RemoveRequest { - RemoveRequestImpl(AddonInfo addonInfo, MutableAddonRepository repository, Furnace forge) + public RemoveRequestImpl(AddonInfo addonInfo, MutableAddonRepository repository, Furnace forge) { super(addonInfo, repository, forge); } diff --git a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/UpdateRequestImpl.java b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/UpdateRequestImpl.java index 43e3a6ba..3d99d986 100644 --- a/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/UpdateRequestImpl.java +++ b/manager/impl/src/main/java/org/jboss/forge/furnace/manager/impl/request/UpdateRequestImpl.java @@ -7,8 +7,11 @@ package org.jboss.forge.furnace.manager.impl.request; +import org.jboss.forge.furnace.Furnace; import org.jboss.forge.furnace.addons.AddonId; +import org.jboss.forge.furnace.manager.impl.action.AbstractFurnaceAction; import org.jboss.forge.furnace.manager.request.DeployRequest; +import org.jboss.forge.furnace.manager.request.FurnaceIsolationType; import org.jboss.forge.furnace.manager.request.RemoveRequest; import org.jboss.forge.furnace.manager.request.UpdateRequest; import org.jboss.forge.furnace.manager.spi.AddonInfo; @@ -19,13 +22,14 @@ * @author George Gastaldi * */ -class UpdateRequestImpl implements UpdateRequest +public class UpdateRequestImpl extends AbstractFurnaceAction implements UpdateRequest { private final RemoveRequest removeRequest; private final DeployRequest deployRequest; - public UpdateRequestImpl(RemoveRequest removeRequest, DeployRequest deployRequest) + public UpdateRequestImpl(RemoveRequest removeRequest, DeployRequest deployRequest, Furnace furnace) { + super(furnace); this.removeRequest = removeRequest; this.deployRequest = deployRequest; } @@ -49,10 +53,10 @@ public RemoveRequest getRemoveRequest() } @Override - public void perform() + public void execute() { - removeRequest.perform(); - deployRequest.perform(); + removeRequest.perform(FurnaceIsolationType.CONFIGURATION_RELOAD); + deployRequest.perform(FurnaceIsolationType.CONFIGURATION_RELOAD); } @Override diff --git a/se-tests/src/test/java/test/org/jboss/forge/furnace/views/FurnaceSETest.java b/se-tests/src/test/java/test/org/jboss/forge/furnace/views/FurnaceSETest.java index fb96acdc..990af898 100644 --- a/se-tests/src/test/java/test/org/jboss/forge/furnace/views/FurnaceSETest.java +++ b/se-tests/src/test/java/test/org/jboss/forge/furnace/views/FurnaceSETest.java @@ -17,7 +17,7 @@ import org.jboss.forge.furnace.addons.AddonId; import org.jboss.forge.furnace.manager.AddonManager; import org.jboss.forge.furnace.manager.impl.AddonManagerImpl; -import org.jboss.forge.furnace.manager.impl.request.ConfigurationScanListener; +import org.jboss.forge.furnace.manager.impl.action.ConfigurationScanListener; import org.jboss.forge.furnace.manager.maven.MavenContainer; import org.jboss.forge.furnace.manager.maven.addon.MavenAddonDependencyResolver; import org.jboss.forge.furnace.manager.spi.AddonDependencyResolver; diff --git a/test-harness/arquillian/classpath/src/main/java/org/jboss/forge/arquillian/ForgeDeployableContainer.java b/test-harness/arquillian/classpath/src/main/java/org/jboss/forge/arquillian/ForgeDeployableContainer.java index 9599acf3..589674ca 100644 --- a/test-harness/arquillian/classpath/src/main/java/org/jboss/forge/arquillian/ForgeDeployableContainer.java +++ b/test-harness/arquillian/classpath/src/main/java/org/jboss/forge/arquillian/ForgeDeployableContainer.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Map; +import java.util.Set; import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; @@ -24,8 +25,8 @@ import org.jboss.arquillian.container.spi.client.protocol.metadata.ProtocolMetaData; import org.jboss.arquillian.core.api.Instance; import org.jboss.arquillian.core.api.annotation.Inject; -import org.jboss.forge.arquillian.archive.ForgeArchive; import org.jboss.forge.arquillian.archive.ForgeRemoteAddon; +import org.jboss.forge.arquillian.archive.ForgeArchive; import org.jboss.forge.arquillian.archive.RepositoryForgeArchive; import org.jboss.forge.arquillian.protocol.ForgeProtocolDescription; import org.jboss.forge.arquillian.protocol.FurnaceHolder; @@ -108,7 +109,8 @@ else if (archive instanceof ForgeRemoteAddon) AddonManager addonManager = new AddonManagerImpl(runnable.furnace, resolver, false); AddonRepository target = selectTargetRepository(archive); - addonManager.install(remoteAddon.getAddonId(), target).perform(); + Set ids = remoteAddon.getAddonIds(); + addonManager.install(ids, target).perform(); waitForDeploymentCompletion(deployment, addonToDeploy); } @@ -324,8 +326,24 @@ private void stopContainer() @Override public void undeploy(Archive archive) throws DeploymentException { - undeploying = true; - AddonId addonToUndeploy = getAddonEntry(deploymentInstance.get()); + if (archive instanceof ForgeArchive) + { + undeploying = true; + AddonId addonToUndeploy = getAddonEntry(deploymentInstance.get()); + undeploy(addonToUndeploy); + } + else if (archive instanceof ForgeRemoteAddon) + { + Set addonIds = ((ForgeRemoteAddon) archive).getAddonIds(); + for (AddonId addonId : addonIds) + { + undeploy(addonId); + } + } + } + + private void undeploy(AddonId addonToUndeploy) throws DeploymentException + { AddonRegistry registry = runnable.getForge().getAddonRegistry(); System.out.println("Undeploying [" + addonToUndeploy + "] ... "); diff --git a/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/ForgeDeploymentScenarioGenerator.java b/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/ForgeDeploymentScenarioGenerator.java index a0bc6285..3c3d9c7d 100644 --- a/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/ForgeDeploymentScenarioGenerator.java +++ b/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/ForgeDeploymentScenarioGenerator.java @@ -7,8 +7,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.UUID; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.graph.Dependency; @@ -53,11 +56,13 @@ public List generate(TestClass testClass) private Collection generateDependencyDeployments(Class classUnderTest, Method deploymentMethod) { - Dependencies dependency = deploymentMethod.getAnnotation(Dependencies.class); + Dependencies dependencies = deploymentMethod.getAnnotation(Dependencies.class); Collection deployments = new ArrayList(); - if (dependency.value() != null) - for (AddonDependency addon : dependency.value()) + if (dependencies.value() != null) + { + Set dependencyIds = new LinkedHashSet(); + for (AddonDependency addon : dependencies.value()) { String version; if (addon.version().isEmpty()) @@ -76,16 +81,21 @@ private Collection generateDependencyDeployments(Class version = addon.version(); } AddonId id = AddonId.from(addon.name(), version); - ForgeRemoteAddon remoteAddon = ShrinkWrap.create(ForgeRemoteAddon.class).setAddonId(id); + dependencyIds.add(id); + } - if (Annotations.isAnnotationPresent(deploymentMethod, DeployToRepository.class)) - remoteAddon.setAddonRepository(Annotations.getAnnotation(deploymentMethod, DeployToRepository.class) - .value()); + ForgeRemoteAddon remoteAddon = ShrinkWrap.create(ForgeRemoteAddon.class).setAddonIds( + dependencyIds); - DeploymentDescription deploymentDescription = new DeploymentDescription(id.toCoordinates(), remoteAddon); - deploymentDescription.shouldBeTestable(false); - deployments.add(deploymentDescription); - } + if (Annotations.isAnnotationPresent(deploymentMethod, DeployToRepository.class)) + remoteAddon.setAddonRepository(Annotations.getAnnotation(deploymentMethod, DeployToRepository.class) + .value()); + + DeploymentDescription deploymentDescription = new DeploymentDescription(UUID.randomUUID().toString(), + remoteAddon); + deploymentDescription.shouldBeTestable(false); + deployments.add(deploymentDescription); + } return deployments; } diff --git a/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/archive/ForgeRemoteAddon.java b/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/archive/ForgeRemoteAddon.java index b3028787..ba30c682 100644 --- a/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/archive/ForgeRemoteAddon.java +++ b/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/archive/ForgeRemoteAddon.java @@ -1,5 +1,7 @@ package org.jboss.forge.arquillian.archive; +import java.util.Set; + import org.jboss.forge.furnace.addons.AddonId; import org.jboss.shrinkwrap.api.Archive; @@ -10,9 +12,9 @@ */ public interface ForgeRemoteAddon extends Archive { - AddonId getAddonId(); + Set getAddonIds(); - ForgeRemoteAddon setAddonId(AddonId id); + ForgeRemoteAddon setAddonIds(Set ids); String getAddonRepository(); diff --git a/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/archive/ForgeRemoteAddonImpl.java b/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/archive/ForgeRemoteAddonImpl.java index dfc7a6bb..3cd3ecee 100644 --- a/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/archive/ForgeRemoteAddonImpl.java +++ b/test-harness/arquillian/core/src/main/java/org/jboss/forge/arquillian/archive/ForgeRemoteAddonImpl.java @@ -16,6 +16,9 @@ */ package org.jboss.forge.arquillian.archive; +import java.util.LinkedHashSet; +import java.util.Set; + import org.jboss.forge.furnace.addons.AddonId; import org.jboss.shrinkwrap.api.Archive; import org.jboss.shrinkwrap.api.ArchivePath; @@ -24,21 +27,22 @@ /** * @author Lincoln Baxter, III */ -public class ForgeRemoteAddonImpl extends ContainerBase implements ForgeRemoteAddon +public class ForgeRemoteAddonImpl extends ContainerBase implements + ForgeRemoteAddon { - private AddonId id; + private Set ids = new LinkedHashSet(); private String repository; @Override - public AddonId getAddonId() + public Set getAddonIds() { - return id; + return ids; } @Override - public ForgeRemoteAddon setAddonId(AddonId id) + public ForgeRemoteAddon setAddonIds(Set ids) { - this.id = id; + this.ids = ids; return this; }