/* * 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<InstallTask> { /** * 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 <code>1</code>. */ 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 <code>null</code>. */ 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 <code>true</code> * 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, <code>true</code> * otherwise <code>false</code> * @since 1.3 */ public boolean isAsynchronousTask() { return false; } }