/******************************************************************************* * Copyright (c) 2010-2014 SAP AG 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: * SAP AG - initial API and implementation *******************************************************************************/ package org.eclipse.skalli.view.ext; import java.util.List; import org.eclipse.skalli.model.Project; import com.vaadin.ui.Component; /** * Extension point for info boxes on the project details page. * Implementations must be registered as OSGi service component. * <p> * IMPORTANT NOTES:<br> * <ul> * <li>There is only one instance of a <code>ProjectInfoBox</code> per implementing class, i.e. * info boxes must be stateless and thread safe.</li> * <li>An implementation of <code>ProjectInfoBox</code> must not have Vaadin components/layouts * as instance variables. Otherwise there is the risk of <tt>Out-Of-Sync</tt> errors.</li> * </ul> */ public interface InfoBox extends IconProvider { /** The infobox should appear in the left column of a project's detail page. */ public static final int COLUMN_WEST = 1; /** The infobox should appear in the right column of a project's detail page. */ public static final int COLUMN_EAST = 2; /** * Action attribute that triggers a refresh of the infobox content. For example, if * the infobox shows content of a remote system, the action should synchronize the * content of the infobox with the remote system. * * Usage: <tt>/projects/<projectId>/infoboxes?action=refresh</tt> or * <tt>/projects/<projectId>/infoboxes/<shortName>?action=refresh</tt>, respectively. * * @see #perform(String, Project, String) */ public static final String REFRESH_ACTION = "refresh"; //$NON-NLS-1$ /** * Returns the caption of the info box. */ public String getCaption(); /** * Returns the rank of the info box in relation to the other info * boxes in the column. Smaller rank means the info box should * appear above all other info boxes with larger rank. Info boxes * with the same rank are arranged in alphabetical order of to their * captions. * * @return the rank of the info box, i.e. a positive float number greater 1.0. */ public float getPositionWeight(); /** * Specifies whether the info box prefers the left ("west") or right ("east") column * on the project details page. * * @return either {@link #COLUMN_WEST} or {@link #COLUMN_EAST}. */ public int getPreferredColumn(); /** * Returns <code>true</code>, if the info box is visible and the user * requesting the info box is allowed to see it. * * Info boxes that can be switched on/off in the project edit dialog should * check whether a corresponding extension is attached to the <code>project</code> * and return <code>false</code> if there is no such extension available. * * @param project the project for which the info box is to be rendered. * @param userId the unique identifier of the user viewing the project details page. * * @return <code>true</code>, if the info box is visible. */ public boolean isVisible(Project project, String userId); /** * Returns the Vaadin component to be rendered inside the info box panel, * or <code>null</code> if the info box has nothing to display and should * therefore not be rendered at all. * * @param project the project for which the component is to be created. * @param util context information for the creation of the component. */ public Component getContent(Project project, ExtensionUtil util); /** * Returns a short name for the info box or null. * If the short name is not null it must be unique among all info boxes in the system. * Consumers should treed a null short name as if it does not require his conditions. * * One possible Consumer is a Project filer, which perform actions only to those Infoxes which have the requested name. */ public String getShortName(); /** * Performs a given action on a project related to this info box. * For example, an info box might trigger a refresh of remote content that it displays. * This method is called before rendering of the project's detail page for URLs of the * form <tt>/projects/<projectId>/infoboxes?action=<action></tt> * and <tt>/projects/<projectId>/infoboxes/<shortName>>action=<action></tt>, respectively. * @param action the action to perform * @param project the project for which to perform the action * @param userId the unique identifier of the user that triggered the action */ public void perform(String action, Project project, String userId); /** * Returns the actions supported by this infobox. * @return a list of actions, or an empty list. */ public List<String> getSupportedActions(); }