All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.sling.installer.api.tasks.InstallTask Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.sling.installer.api.tasks;

/**
 * Base class for tasks that can be executed by the
 * {@link org.apache.sling.installer.api.OsgiInstaller}.
 *
 * The task is invoked by the installer through the {@link #execute(InstallationContext)}
 * method. During execution the task should use the {@link #setFinishedState(ResourceState)}
 * or {@link #setFinishedState(ResourceState, String)} method once the task is
 * performed or the task decided that the task can never be performed.
 *
 * If the task needs to be retried, the implementation should just not alter the
 * state at all. The installer will invoke the tasks at a later time again for
 * retrying.
 */
public abstract class InstallTask implements Comparable {

    /**
     * Attribute which is set by the OSGi installer for asynchronous execution.
     * The value of the attribute is an Integer which is increased on each async call,
     * it starts with the value 1.
     */
    public static final String ASYNC_ATTR_NAME = "org.apache.sling.installer.api.tasks.ASyncInstallTask";

    /** The resource group this task is working on. */
    private final TaskResourceGroup resourceGroup;

    /**
     * Constructor for the task
     * @param erl The resource group or null.
     */
    public InstallTask(final TaskResourceGroup erl) {
        this.resourceGroup = erl;
    }

    /**
     * Return the corresponding resource - depending on the task this might be null.
     * @return The task resource or {@code null}.
     */
    public TaskResource getResource() {
        if ( this.resourceGroup != null ) {
            return this.resourceGroup.getActiveResource();
        }
        return null;
    }

    /**
     * Return the corresponding resource - depending on the task this might be null.
     * @return The task resource group or {@code null}.
     */
    public TaskResourceGroup getResourceGroup() {
        return this.resourceGroup;
    }

    /**
     * This is the heart of the task - it performs the actual task.
     * @param ctx The installation context.
     */
    public abstract void execute(InstallationContext ctx);

	/**
	 * Tasks are sorted according to this key.
	 * Therefore this key must uniquely identify this task.
	 * A typical sort key contains the entity id of the resource
	 * in execution.
	 * @return The sorting key.
	 */
	public abstract String getSortKey();

	/**
	 * Set the finished state for the resource.
	 * @param state The new state.
	 */
	public void setFinishedState(final ResourceState state) {
	    setFinishedState(state, null, null);
	}

    /**
     * Set the finished state for the resource and the alias
     * @param state The new state.
     * @param alias The new alias
     * @since 1.1
     */
    public void setFinishedState(final ResourceState state, final String alias) {
        setFinishedState(state, alias, null);
    }

    /**
     * Set the finish state for the active resource and alias (may be null).
     * In addition set an error text (may be {@code null}).
     * @param state The new state.
     * @param alias The new alias (may be {@code null}).
     * @param error An error text (may be {@code null}).
     *
     * @see #setFinishedState(ResourceState)
     * @since 1.4
     */
    public void setFinishedState(ResourceState state, String alias, String error) {
        if ( this.resourceGroup != null ) {
            this.resourceGroup.setFinishState(state, alias, error);
        }
    }

    @Override
    public String toString() {
        return getClass().getSimpleName() + ": " + this.getResource();
    }

    @Override
	public final boolean equals(Object o) {
		if (o instanceof InstallTask) {
			return getSortKey().equals(((InstallTask)o).getSortKey());
		}
		return false;
	}

	@Override
	public final int hashCode() {
		return getSortKey().hashCode();
	}

    /**
     * All comparisons are based on getSortKey().
     */
    @Override
    public final int compareTo(final InstallTask o) {
        return getSortKey().compareTo(o.getSortKey());
    }

    /**
     * If this an asynchronous task it should return true
     * The OSGi installer will set the attribute {@link #ASYNC_ATTR_NAME}
     * with an integer value.
     * The next time, after the asynchronous task has been run and
     * the OSGi installer has restarted, this attribute will be set
     * on the resource.
     *
     * Asynchronous tasks should only be used for tasks which require
     * the OSGi installer to stop and force it to restart, like
     * a bundle update of the installer itself or a system update.
     * The OSGi installer stops itself for an asynchronous task and
     * is not able to restart itself!
     *
     * @return If this is a async request, true
     *         otherwise false
     * @since 1.3
     */
    public boolean isAsynchronousTask() {
        return false;
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy