/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.module;
import java.lang.reflect.Constructor;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import org.openflexo.ApplicationContext;
import org.openflexo.GeneralPreferences;
import org.openflexo.drm.DocItem;
import org.openflexo.drm.DocResourceManager;
import org.openflexo.drm.Language;
import org.openflexo.icon.CGIconLibrary;
import org.openflexo.icon.DEIconLibrary;
import org.openflexo.icon.DGIconLibrary;
import org.openflexo.icon.DMEIconLibrary;
import org.openflexo.icon.DREIconLibrary;
import org.openflexo.icon.FPSIconLibrary;
import org.openflexo.icon.SEIconLibrary;
import org.openflexo.icon.SGIconLibrary;
import org.openflexo.icon.VEIconLibrary;
import org.openflexo.icon.VPMIconLibrary;
import org.openflexo.icon.WKFIconLibrary;
import org.openflexo.icon.WSEIconLibrary;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.module.external.IModule;
/**
* Represents a Module a Flexo Application Suite
*
* NB: this represents a module, not a module instance !
*
* @author sguerin
*
*/
public abstract class Module implements IModule {
private static final Logger logger = Logger.getLogger(Module.class.getPackage().getName());
public static final Module WKF_MODULE = new WKF();
public static final Module IE_MODULE = new IE();
public static final Module DM_MODULE = new DM();
public static final Module CG_MODULE = new CG();
public static final Module DG_MODULE = new DG();
public static final Module DE_MODULE = new DE();
public static final Module WSE_MODULE = new WSE();
public static final Module VE_MODULE = new VE();
public static final Module DRE_MODULE = new DRE();
public static final Module FPS_MODULE = new FPS();
public static final Module VPM_MODULE = new VPM();
public static final Module SG_MODULE = new SG();
public static final Module TEST_MODULE = new TEST();
public static final Module XXX_MODULE = new XXX();
private Class<? extends FlexoModule> _moduleClass;
public Constructor<? extends FlexoModule> getConstructor() {
return _constructor;
}
protected static class WKF extends Module {
public static final String WKF_MODULE_SHORT_NAME = "WKF";
public static final String WKF_MODULE_NAME = "workflow_editor";
protected WKF() {
super(WKF_MODULE_NAME, WKF_MODULE_SHORT_NAME, "org.openflexo.wkf.WKFModule", "modules/flexoworkfloweditor", "10000", "wkf",
WKFIconLibrary.WKF_SMALL_ICON, WKFIconLibrary.WKF_MEDIUM_ICON, WKFIconLibrary.WKF_MEDIUM_ICON_WITH_HOVER,
WKFIconLibrary.WKF_BIG_ICON, true);
}
}
protected static class IE extends Module {
public static final String IE_MODULE_SHORT_NAME = "IE";
public static final String IE_MODULE_NAME = "interface_editor";
public IE() {
super(IE_MODULE_NAME, IE_MODULE_SHORT_NAME, "org.openflexo.ie.IEModule", "modules/flexointerfaceeditor", "10001", "ie",
SEIconLibrary.SE_SMALL_ICON, SEIconLibrary.SE_MEDIUM_ICON, SEIconLibrary.SE_MEDIUM_ICON_WITH_HOVER,
SEIconLibrary.SE_BIG_ICON, true);
}
}
protected static class DM extends Module {
public static final String DM_MODULE_SHORT_NAME = "DM";
public static final String DM_MODULE_NAME = "data_model_editor";
public DM() {
super(DM_MODULE_NAME, DM_MODULE_SHORT_NAME, "org.openflexo.dm.DMModule", "modules/flexodatamodeleditor", "10006", "dm",
DMEIconLibrary.DME_SMALL_ICON, DMEIconLibrary.DME_MEDIUM_ICON, DMEIconLibrary.DME_MEDIUM_ICON_WITH_HOVER,
DMEIconLibrary.DME_BIG_ICON, true);
}
}
protected static class CG extends Module {
public static final String GENERATOR_MODULE_SHORT_NAME = "CG";
public static final String GENERATOR_MODULE_NAME = "code_generator";
public CG() {
super(GENERATOR_MODULE_NAME, GENERATOR_MODULE_SHORT_NAME, "org.openflexo.cgmodule.GeneratorModule",
"modules/flexocodegenerator", "10002", "cg", CGIconLibrary.CG_SMALL_ICON, CGIconLibrary.CG_MEDIUM_ICON,
CGIconLibrary.CG_MEDIUM_ICON_WITH_HOVER, CGIconLibrary.CG_BIG_ICON, true);
}
}
protected static class DG extends Module {
public static final String DG_MODULE_SHORT_NAME = "DG";
public static final String DG_MODULE_NAME = "doc_generator";
public DG() {
super(DG_MODULE_NAME, DG_MODULE_SHORT_NAME, "org.openflexo.dgmodule.DGModule", "modules/flexodocgenerator", "10004", "dg",
DGIconLibrary.DG_SMALL_ICON, DGIconLibrary.DG_MEDIUM_ICON, DGIconLibrary.DG_MEDIUM_ICON_WITH_HOVER,
DGIconLibrary.DG_BIG_ICON, true);
}
}
protected static class SG extends Module {
public static final String SOURCE_GENERATOR_MODULE_SHORT_NAME = "SG";
public static final String SOURCE_GENERATOR_MODULE_NAME = "source_generator";
public SG() {
super(SOURCE_GENERATOR_MODULE_NAME, SOURCE_GENERATOR_MODULE_SHORT_NAME, "org.openflexo.sgmodule.SGModule",
"modules/flexosourcegenerator", "10004", "sg", SGIconLibrary.SG_SMALL_ICON, SGIconLibrary.SG_MEDIUM_ICON,
SGIconLibrary.SG_MEDIUM_ICON_WITH_HOVER, SGIconLibrary.SG_BIG_ICON, true);
}
}
protected static class DE extends Module {
public static final String DE_MODULE_SHORT_NAME = "DE";
public static final String DE_MODULE_NAME = "doc_editor";
public DE() {
super(DE_MODULE_NAME, DE_MODULE_SHORT_NAME, "org.openflexo.doceditormodule.DEModule", "modules/flexodoceditor", "10005", "de",
DEIconLibrary.DE_SMALL_ICON, DEIconLibrary.DE_MEDIUM_ICON, DEIconLibrary.DE_MEDIUM_ICON_WITH_HOVER,
DEIconLibrary.DE_BIG_ICON, true);
}
}
protected static class WSE extends Module {
public static final String WSE_MODULE_SHORT_NAME = "WSE";
public static final String WSE_MODULE_NAME = "wse_module_name";
public WSE() {
super(WSE_MODULE_NAME, WSE_MODULE_SHORT_NAME, "org.openflexo.wse.WSEModule", "modules/flexowebserviceeditor", "10007", "wse",
WSEIconLibrary.WS_SMALL_ICON, WSEIconLibrary.WS_MEDIUM_ICON, WSEIconLibrary.WS_MEDIUM_ICON_WITH_HOVER,
WSEIconLibrary.WS_BIG_ICON, true);
}
}
protected static class VE extends Module {
public static final String VE_MODULE_SHORT_NAME = "VE";
public static final String VE_MODULE_NAME = "ve_module_name";
public VE() {
super(VE_MODULE_NAME, VE_MODULE_SHORT_NAME, "org.openflexo.ve.VEModule", "modules/flexovieweditor", "10008", "ve",
VEIconLibrary.VE_SMALL_ICON, VEIconLibrary.VE_MEDIUM_ICON, VEIconLibrary.VE_MEDIUM_ICON_WITH_HOVER,
VEIconLibrary.VE_BIG_ICON, true);
}
}
protected static class DRE extends Module {
public static final String DRE_MODULE_SHORT_NAME = "DRE";
public static final String DRE_MODULE_NAME = "doc_resource_manager";
public DRE() {
super(DRE_MODULE_NAME, DRE_MODULE_SHORT_NAME, "org.openflexo.dre.DREModule", "modules/flexodocresourceeditor", "10010", "dre",
DREIconLibrary.DRE_SMALL_ICON, DREIconLibrary.DRE_MEDIUM_ICON, DREIconLibrary.DRE_MEDIUM_ICON_WITH_HOVER,
DREIconLibrary.DRE_BIG_ICON, false);
}
}
protected static class FPS extends Module {
public static final String FPS_MODULE_SHORT_NAME = "FPS";
public static final String FPS_MODULE_NAME = "fps_module_name";
public FPS() {
super(FPS_MODULE_NAME, FPS_MODULE_SHORT_NAME, "org.openflexo.fps.FPSModule", "modules/flexoprjsharingmodule", "10011", "fps",
FPSIconLibrary.FPS_SMALL_ICON, FPSIconLibrary.FPS_MEDIUM_ICON, FPSIconLibrary.FPS_MEDIUM_ICON_WITH_HOVER,
FPSIconLibrary.FPS_BIG_ICON, false);
}
}
protected static class VPM extends Module {
public static final String VPM_MODULE_SHORT_NAME = "VPM";
public static final String VPM_MODULE_NAME = "vpm_module_name";
public VPM() {
super(VPM_MODULE_NAME, VPM_MODULE_SHORT_NAME, "org.openflexo.vpm.VPMModule", "modules/flexoviewpointmodeller", "10009", "vpm",
VPMIconLibrary.VPM_SMALL_ICON, VPMIconLibrary.VPM_MEDIUM_ICON, VPMIconLibrary.VPM_MEDIUM_ICON_WITH_HOVER,
VPMIconLibrary.VPM_BIG_ICON, false);
}
}
protected static class TEST extends Module {
public TEST() {
super("TestModule", "TEST", "org.openflexo.TestModule", "modules/flexoworkfloweditor", null, "test",
WKFIconLibrary.WKF_SMALL_ICON, WKFIconLibrary.WKF_MEDIUM_ICON, WKFIconLibrary.WKF_MEDIUM_ICON_WITH_HOVER,
WKFIconLibrary.WKF_BIG_ICON, true);
}
}
protected static class XXX extends Module {
public XXX() {
super("XXXModuleName", "xxx", "org.openflexo.xxx.XXXModule", "modules/flexonewmodule", null, "xx", null, null, null, null, true);
}
}
private String name;
private String shortName;
private String className;
private String relativeDirectory;
private String jiraComponentID;
private String helpTopic;
private ImageIcon smallIcon;
private ImageIcon mediumIcon;
private ImageIcon mediumIconWithHover;
private ImageIcon bigIcon;
private boolean requiresProject;
protected Module(String name, String shortName, String className, String relativeDirectory, String jiraComponentID, String helpTopic,
ImageIcon smallIcon, ImageIcon mediumIcon, ImageIcon mediumIconWithHover, ImageIcon bigIcon, boolean requiresProject) {
super();
this.name = name;
this.shortName = shortName;
this.className = className;
this.relativeDirectory = relativeDirectory;
this.jiraComponentID = jiraComponentID;
this.helpTopic = helpTopic;
this.smallIcon = smallIcon;
this.mediumIcon = mediumIcon;
this.mediumIconWithHover = mediumIconWithHover;
this.bigIcon = bigIcon;
this.requiresProject = requiresProject;
}
protected Module() {
super();
}
public String getName() {
return name;
}
public String getShortName() {
return shortName;
}
public String getClassName() {
return className;
}
protected String getRelativeDirectory() {
return relativeDirectory;
}
public String getJiraComponentID() {
return jiraComponentID;
}
public String getHelpTopic() {
return helpTopic;
}
public ImageIcon getSmallIcon() {
return smallIcon;
}
public ImageIcon getMediumIcon() {
return mediumIcon;
}
public ImageIcon getMediumIconWithHover() {
return mediumIconWithHover;
}
public ImageIcon getBigIcon() {
return bigIcon;
}
public boolean requireProject() {
return requiresProject;
}
public boolean isNotFoundNotified() {
return notFoundNotified;
}
/**
* @return
*/
public Class<? extends FlexoModule> getModuleClass() {
if (_moduleClass == null) {
_moduleClass = searchModuleClass(getClassName());
}
return _moduleClass;
}
public String getLocalizedName() {
return FlexoLocalization.localizedForKey(getName());
}
public final String getDescription() {
return getName() + "_description";
}
public String getLocalizedDescription() {
return FlexoLocalization.localizedForKey(getDescription());
}
private boolean notFoundNotified = false;
@SuppressWarnings("unchecked")
private Class<? extends FlexoModule> searchModuleClass(String fullQualifiedModuleName) {
try {
Class<?> forName = Class.forName(fullQualifiedModuleName);
if (FlexoModule.class.isAssignableFrom(forName)) {
return (Class<? extends FlexoModule>) forName;
} else {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Class '" + fullQualifiedModuleName + "' was found but does not extend FlexoModule.");
}
return null;
}
} catch (ClassNotFoundException e) {
if (!notFoundNotified) {
if (logger.isLoggable(Level.INFO)) {
logger.info("Could not find MODULE " + fullQualifiedModuleName);
}
notFoundNotified = true;
}
return null;
}
}
private Constructor<? extends FlexoModule> _constructor;
public boolean register() {
_constructor = lookupConstructor();
return _constructor != null;
}
/**
* Internally used to lookup constructor
*
*/
private Constructor<? extends FlexoModule> lookupConstructor() {
if (logger.isLoggable(Level.INFO)) {
logger.info("Registering module '" + getName() + "'");
}
Class[] constructorSigner;
constructorSigner = new Class[1];
constructorSigner[0] = ApplicationContext.class;
try {
Constructor<? extends FlexoModule> constructor = getModuleClass().getDeclaredConstructor(constructorSigner);
if (logger.isLoggable(Level.FINE)) {
logger.finer("Contructor:" + constructor);
}
return constructor;
} catch (SecurityException e) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("SecurityException raised during module " + getName() + " registering. Aborting.");
}
} catch (NoSuchMethodException e) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("NoSuchMethodException raised during module " + getName() + " registering. Aborting.");
}
}
return null;
}
@Override
public String toString() {
return getLocalizedName();
}
public String getHTMLDescription() {
Language language = DocResourceManager.instance().getLanguage(GeneralPreferences.getLanguage());
DocItem docItem = DocResourceManager.getDocItem(getHelpTopic());
if (docItem != null) {
if (docItem.getLastApprovedActionForLanguage(language) != null) {
String returned = "<html>" + docItem.getLastApprovedActionForLanguage(language).getVersion().getFullHTMLDescription()
+ "</html>";
return returned;
}
}
return "<html>No description available for <b>" + getLocalizedName() + "</b>" + "<br>"
+ "Please submit documentation in documentation resource center" + "<br>" + "</html>";
}
}