PublicationPlugin.java
/*
* Copyright (C) 2003-2008 eXo Platform SAS.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License
* as published by the Free Software Foundation; either version 3
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see<http://www.gnu.org/licenses/>.
*/
package org.exoplatform.services.ecm.publication;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import javax.jcr.Node;
import org.exoplatform.container.component.BaseComponentPlugin;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.form.UIForm;
/**
* Base class of Publication plugins.
* Publication plugins implement a publication lifecycle. Each time a new
* custom lifecycle needs to be defined, a new plugin has to be implemented
* and registered with the Publication Service.
*
* The getName() method in the parent class is used to identify the lifecycle.
* The getDescription() method in the parent class is used to describe the
* lifecycle. Internationalization resource bundles are used in the
* implementation of the method.
*/
public abstract class PublicationPlugin extends BaseComponentPlugin {
/**
* Retrieves all possible states in the publication lifecycle.
*
* @return an array of Strings giving the names of all possible states
*/
public abstract String[] getPossibleStates();
/**
* Change the state of the specified Node.
* The implementation of this method basically retrieves the current
* state from the publication mixin of the specified Node. Then, based on
* the newState, it is able to determine if the update is possible. If
* yes, appropriate action is made (eg: launch a publication workflow). In
* all cases, the current state information is updated in the publication
* mixin of the specified Node.
*
* @param node the Node whose state needs to be changed
* @param newState the new state.
* @param context a Hashmap containing contextual information needed
* to change the state. The information set is defined on a State basis.
*
* @throws IncorrectStateUpdateLifecycleException if the update is not
* allowed
* @throws Exception the exception
*/
public abstract void changeState(Node node,
String newState,
HashMap<String, String> context)
throws IncorrectStateUpdateLifecycleException, Exception;
/**
* Retrieves the WebUI form corresponding to the current state of the
* specified node.
* There are two cases here. Either the form contains read only fields (when
* the state is supposed to be processed by an external entity such as a
* Workflow). Or the form has editable fields or buttons (in the case the
* user can interfere. In that case, some action listeners are leveraged.).
* In all cases, all UI and listener classes are provided in the JAR
* corresponding to the PublicationPlugin.
* The method first inspects the specified Node. If it does not contain
* a publication mixin, then it throws a NotInPublicationLifecycleException
* exception. Else, it retrieves the lifecycle name from the mixin,
* selects the appropriate publication plugin and delegates the call to it.
*
* @param node the Node from which the state UI should be retrieved
* @param component the component
*
* @return a WebUI form corresponding to the current state and node.
*
* @throws Exception the exception
*/
public abstract UIForm getStateUI(Node node, UIComponent component) throws Exception;
/**
* Retrieves an image showing the lifecycle state of the specified Node.
* The implementation of this method typically retrieves the current state
* of the specified Node, then fetches the bytes of an appropriate image
* found in the jar of the plugin. This image is supposed to be shown in
* the publication dialog of the JCR File Explorer Portlet.
*
* @param node the node from which the image should be obtained
* @param locale the locale
*
* @return an array of bytes corresponding to the image to be shown to the
* user
*
* @throws IOException Signals that an I/O exception has occurred.
* @throws FileNotFoundException the file not found exception
* @throws Exception the exception
*/
public abstract byte[] getStateImage(Node node, Locale locale) throws IOException,FileNotFoundException,Exception;
/**
* Retrieves description information explaining to the user the current
* publication state of the specified Node. Possible examples are
* - "The document has been submitted to the following group for validation:
* /organization/management.".
* - "The document has been validated and will be published from
* May 3rd 10:00am to May 3rd 10:00pm. At that time, it will be unpublished
* and put in a backup state.".
* - "The document is in draft state. At any time you can turn it to
* published state."
*
* The returned message should be obtained from internationalization
* resource bundles (ie not hardcoded).
*
* @param node the node from which the publication state should be retrieved
* @param locale the locale
*
* @return a String giving the current state.
*
* @throws Exception the exception
*/
public abstract String getUserInfo(Node node, Locale locale) throws Exception;
/**
* Retrieves the lifecycleName.
*
* @return a String giving the lifecycleName
*/
public String getLifecycleName() {
return getName();
}
/**
* Retrieves the description of the plugin.
*
* @param node the node
*
* @return a String giving the description
*/
public String getNodeLifecycleDesc(Node node) {
return getDescription();
}
/**
* Return if the plugin can add the specific mixin for the publication.
*
* @param node the node to add the mixin
*
* @return boolean
*
* @throws Exception the exception
*/
public abstract boolean canAddMixin (Node node) throws Exception;
/**
* Add the specific plugin mixin to the node.
*
* @param node the node
*
* @throws Exception the exception
*/
public abstract void addMixin (Node node) throws Exception;
/**
* Retrieves a node view of the specific node in a context
*
* @param node the node
* @param context the context
*
* @return the node to view
*
* @throws Exception the exception
*/
public abstract Node getNodeView(Node node, Map<String,Object> context) throws Exception;
/**
* Get localized log messages and substitute variables.
*
* @param locale : the locale to use
* @param key : the key to translate
* @param values : array of string to susbtitute in the string
*
* @return a string localized and where values are substitute
*/
public abstract String getLocalizedAndSubstituteMessage(Locale locale, String key, String[] values) throws Exception;
}