package org.ovirt.engine.ui.webadmin.plugin;
import java.util.Arrays;
import java.util.List;
import org.ovirt.engine.ui.webadmin.plugin.api.ApiOptions;
import org.ovirt.engine.ui.webadmin.plugin.jsni.JsFunction;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.dom.client.IFrameElement;
/**
* Represents a UI plugin, containing meta-data as well as runtime state.
*/
public class Plugin {
private final PluginMetaData metaData;
private PluginState state;
// The iframe element used to load the plugin host page
private final IFrameElement iframe;
// The object containing plugin event handler functions
private JavaScriptObject eventHandlerObject;
// The object containing custom plugin API options
private ApiOptions apiOptionsObject;
public Plugin(PluginMetaData metaData, IFrameElement iframe) {
assert metaData != null : "Plugin meta-data cannot be null"; //$NON-NLS-1$
assert iframe != null : "Plugin iframe element cannot be null"; //$NON-NLS-1$
assert iframe.getParentElement() == null : "Plugin iframe element must be detached from DOM"; //$NON-NLS-1$
this.metaData = metaData;
this.state = PluginState.DEFINED;
this.iframe = iframe;
this.apiOptionsObject = JavaScriptObject.createObject().cast();
}
public PluginMetaData getMetaData() {
return metaData;
}
public String getName() {
return getMetaData().getName();
}
public boolean shouldPreLoad() {
return !getMetaData().isLazyLoad();
}
public boolean isInState(PluginState state) {
return this.state == state;
}
public IFrameElement getIFrameElement() {
return iframe;
}
public JavaScriptObject getEventHandlerObject() {
return eventHandlerObject;
}
public void setEventHandlerObject(JavaScriptObject eventHandlerObject) {
this.eventHandlerObject = eventHandlerObject;
}
/**
* Returns the given function contained in plugin event handler object, or an empty (no-op) function.
*/
public JsFunction getEventHandlerFunction(String functionName) {
return JsFunction.get(eventHandlerObject, functionName);
}
public ApiOptions getApiOptionsObject() {
return apiOptionsObject;
}
public void setApiOptionsObject(ApiOptions apiOptionsObject) {
this.apiOptionsObject = apiOptionsObject;
}
/**
* Verifies if the plugin is currently in one of the given states.
* <p>
* Returns {@code true} if successful, {@code false} otherwise.
*/
boolean checkCurrentState(List<PluginState> possibleCurrentStates) {
boolean match = possibleCurrentStates.contains(state);
assert match : "Unexpected plugin state [" + state + "], should be one of: " + possibleCurrentStates; //$NON-NLS-1$ //$NON-NLS-2$
return match;
}
/**
* Verifies if the plugin is currently in one of the given states, and moves plugin state to {@code newState} if
* successful.
*/
void moveToState(List<PluginState> possibleCurrentStates, PluginState newState) {
if (checkCurrentState(possibleCurrentStates)) {
state = newState;
}
}
/**
* Verifies if the plugin is currently in the given state, and moves plugin state to {@code newState} if successful.
*/
void moveToState(PluginState possibleCurrentState, PluginState newState) {
moveToState(Arrays.asList(possibleCurrentState), newState);
}
public void markAsLoading() {
assert iframe.getParentElement() != null : "Plugin iframe element must be attached to DOM"; //$NON-NLS-1$
moveToState(PluginState.DEFINED, PluginState.LOADING);
}
public void markAsReady() {
assert eventHandlerObject != null : "Event handler object must be assigned"; //$NON-NLS-1$
moveToState(PluginState.LOADING, PluginState.READY);
}
public void markAsInitializing() {
moveToState(PluginState.READY, PluginState.INITIALIZING);
}
public void markAsInUse() {
moveToState(PluginState.INITIALIZING, PluginState.IN_USE);
}
public void markAsFailed() {
assert iframe.getParentElement() == null : "Plugin iframe element must be detached from DOM"; //$NON-NLS-1$
moveToState(Arrays.asList(PluginState.INITIALIZING, PluginState.IN_USE), PluginState.FAILED);
}
}