/******************************************************************************* * Copyright (c) 2008, 2011 VMware Inc. and others * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * VMware Inc. - initial contribution * EclipseSource - Bug 358442 Change InstallArtifact graph from a tree to a DAG *******************************************************************************/ package org.eclipse.virgo.kernel.install.artifact; import java.util.Set; import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS; import org.eclipse.virgo.nano.core.AbortableSignal; import org.eclipse.virgo.nano.deployer.api.core.DeploymentException; import org.eclipse.virgo.nano.serviceability.NonNull; import org.eclipse.virgo.util.common.GraphNode; import org.osgi.framework.Version; /** * An {@link InstallArtifact} is a single node in an install tree. * * <p /> * * <strong>Concurrent Semantics</strong><br /> * * Implementation <strong>must</strong> be thread-safe. * */ public interface InstallArtifact { /** * The possible states of an artifact. */ public enum State { INITIAL, INSTALLING, INSTALLED, RESOLVING, RESOLVED, STARTING, ACTIVE, STOPPING, UNINSTALLING, UNINSTALLED } /** * Returns the type of the artifact. * * @return the artifact's type. */ String getType(); /** * Returns the name of the artifact. * * @return the artifact's name. */ String getName(); /** * Returns the version of the artifact. * * @return the artifact's version. */ Version getVersion(); /** * Returns the name of the scope in which this <code>InstallArtifact</code> * resides, or <code>null</code> if it is not scoped. * * @return the artifact's scope name */ String getScopeName(); /** * Gets the {@link State} of this {@link InstallArtifact}. * * @return a non-<code>null</code> <code>State</code> */ State getState(); /** * Starts this {@link InstallArtifact}. Returns before any asynchronous * processing has necessarily completed. * <p/> * Equivalent to calling {@link InstallArtifact#start(AbortableSignal) * start(null)}. * * @throws DeploymentException */ void start() throws DeploymentException; /** * Starts this {@link InstallArtifact} and drives the given * {@link AbortableSignal} when the start, including any asynchronous * processing, completes either successfully or unsuccessfully. * <p/> * If the start does not involve asynchronous processing, drives the given * <code>Signal</code> before returning. * <p/> * Note that the given <code>Signal</code> may be driven before this method * returns, after the method has returned, or possibly never if there is * asynchronous processing which never completes. The caller must ensure * that the given <code>Signal</code> is ready to be driven <i>before</i> * calling this method. * <p/> * If the caller is not interested in being signalled, it should pass a * <code>null</code> <code>Signal</code>. * <p/> * Note: this method behaves as specified above when called multiple times * on the same <code>InstallArtifact</code> with any combination of the same * or distinct or <code>null</code> <code>Signals</code>. * * @param signal * a <code>AbortableSignal</code> that is ready to be driven or * <code>null</code> if signalling is not required * @throws DeploymentException */ void start(AbortableSignal signal) throws DeploymentException; /** * Stops this {@link InstallArtifact}. If the <code>InstallArtifact</code> * is already stopped, do nothing. * * @throws DeploymentException * if the operation fails */ void stop() throws DeploymentException; /** * Uninstalls this {@link InstallArtifact}. If the * <code>InstallArtifact</code> is already uninstalled, do nothing. * * @throws DeploymentException * if the operation fails */ void uninstall() throws DeploymentException; /** * Returns the <code>ArtifactFS</code> for this artifact * * @return the <code>ArtifactFS</code> */ ArtifactFS getArtifactFS(); /** * Attempts to refresh this {@link InstallArtifact}. Returns * <code>true</code> if and only if this has completed successfully. * * @return <code>true</code> if and only if the operation completed * successfully * @throws DeploymentException */ boolean refresh() throws DeploymentException; /** * Associates the property with the given name and value with this * {@link InstallArtifact}. Properties may be set by participants in the * artifact's installation. Once the artifact has been installed, an MBean * representing it is exported and these properties will be available via * that MBean. * * @param name * the property name * @param value * the property value * @return the property's previous value or <code>null</code> if there was * no such property */ String setProperty(@NonNull String name, @NonNull String value); /** * Returns the property with the given name associated with this * {@link InstallArtifact}. If there is no associated property with the * given name, returns <code>null</code>. * * @param name * the property name * @return the property value or <code>null</code> if there is no property * with the given name */ String getProperty(@NonNull String name); /** * Returns the names of the properties that are associated with this * {@link InstallArtifact}. * * @return a set of property names */ Set<String> getPropertyNames(); /** * Returns the local name of the repository from which the artifact was * installed, or null if not from a repository. * * @return the local name of the repository whence the artifact came */ String getRepositoryName(); /** * Returns the install graph rooted in this {@link InstallArtifact}. * * @return this artifact's graph */ GraphNode<InstallArtifact> getGraph(); }