r510 - in masc: . masc-api masc-api/src/main/java/fr/inra/masc masc-api/src/main/java/fr/inra/masc/services
Author: sletellier Date: 2011-12-07 12:01:38 +0100 (Wed, 07 Dec 2011) New Revision: 510 Url: http://nuiton.org/repositories/revision/sandbox/510 Log: - Creating masc config - Initialize services Added: masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java masc/masc-api/src/main/java/fr/inra/masc/MascTechnicalException.java masc/masc-api/src/main/java/fr/inra/masc/services/DexiEvalInvokerService.java masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java masc/masc-api/src/main/java/fr/inra/masc/services/ImageGeneratorService.java masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java masc/masc-api/src/main/java/fr/inra/masc/services/MascService.java masc/masc-api/src/main/java/fr/inra/masc/services/MascServiceContext.java masc/masc-api/src/main/java/fr/inra/masc/services/MascServiceFactory.java masc/masc-api/src/main/java/fr/inra/masc/services/OptionCRUDService.java masc/masc-api/src/main/java/fr/inra/masc/services/ReportGeneratorService.java masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java Removed: masc/masc-api/src/main/java/fr/inra/masc/services/ImportService.java Modified: masc/masc-api/pom.xml masc/pom.xml Modified: masc/masc-api/pom.xml =================================================================== --- masc/masc-api/pom.xml 2011-12-01 09:04:18 UTC (rev 509) +++ masc/masc-api/pom.xml 2011-12-07 11:01:38 UTC (rev 510) @@ -24,6 +24,23 @@ <description>Masc - API module</description> <dependencies> + + <!-- nuiton dependencies --> + <dependency> + <groupId>org.nuiton</groupId> + <artifactId>nuiton-utils</artifactId> + </dependency> + + <dependency> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </dependency> + + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + </dependency> + </dependencies> <!-- ************************************************************* --> Added: masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/MascConfig.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,211 @@ +package fr.inra.masc; + +import com.google.common.base.Preconditions; +import org.apache.commons.lang3.builder.ReflectionToStringBuilder; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.nuiton.util.*; + +import java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +/** + * Masc configuration. + * + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class MascConfig { + + /** Logger. */ + protected static final Log log = + LogFactory.getLog(MascConfig.class); + + /** Delegate application config object containing configuration. */ + protected ApplicationConfig applicationConfig; + + public MascConfig() { + this("masc.properties"); + } + + public MascConfig(String file) { + + applicationConfig = new ApplicationConfig(); + applicationConfig.setConfigFileName(file); + + if (log.isInfoEnabled()) { + log.info(this + " is initializing..."); + } + try { + applicationConfig.loadDefaultOptions(MascConfigOption.class); + applicationConfig.parse(); + } catch (ArgumentsParserException e) { + throw new MascTechnicalException( + "Could not parse configuration", e); + } + + if (log.isDebugEnabled()) { + log.debug("parsed options in config file" + applicationConfig.getOptions()); + } + } + + @Override + public String toString() { + return ReflectionToStringBuilder.toString(this); + } + + public Properties getProperties() { + Properties result = applicationConfig.getFlatOptions(); + return result; + } + + public Version getApplicationVersion() { + String versionStr = applicationConfig.getOption(MascConfigOption.VERSION.key); + String s = VersionUtil.removeSnapshot(versionStr); + Version v = VersionUtil.valueOf(s); + Preconditions.checkNotNull(v); + return v; + } + + public URL getApplicationSite() { + URL url = applicationConfig.getOptionAsURL(MascConfigOption.SITE_URL.key); + Preconditions.checkNotNull(url); + return url; + } + + public String getDexiPath() { + String dexyPath = applicationConfig.getOption(MascConfigOption.DEXI_APP_PATH.key); + Preconditions.checkNotNull(dexyPath); + return dexyPath; + } + + public String getDexiEvalPath() { + String dexyEvalPath = applicationConfig.getOption(MascConfigOption.DEXI_EVAL_APP_PATH.key); + Preconditions.checkNotNull(dexyEvalPath); + return dexyEvalPath; + } + + public boolean getOptionAsBoolean(String propertyName) { + Boolean result = applicationConfig.getOptionAsBoolean(propertyName); + return result != null && result; + } + + /** + * Creates a directory given the configuration given key. + * + * @param key the configuration option key which contains the location of + * the directory to create + */ + protected void createDirectory(MascConfigOption key) { + + File directory = applicationConfig.getOptionAsFile(key.getKey()); + + Preconditions.checkNotNull( + directory, + "Could not find directory " + directory + " (key " + + key + + "in your configuration file named echobase.properties)" + ); + if (log.isInfoEnabled()) { + log.info(key + " = " + directory); + } + try { + FileUtil.createDirectoryIfNecessary(directory); + } catch (IOException e) { + throw new MascTechnicalException( + "Could not create directory " + directory, e); + } + } + + /** + * All Masc configuration options. + * + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ + public enum MascConfigOption implements ApplicationConfig.OptionDef { + + /** Main directory where to put echobase data (logs, and others...). */ + VERSION("project.version", + "Version de l'application", + "", Version.class), + SITE_URL("project.siteUrl", + "URL du site de l'application", + "", URL.class), + DEXI_APP_PATH("masc.dexi.path", + "Chemin de l'application masc", + "", String.class), + DEXI_EVAL_APP_PATH("masc.dexiEval.path", + "Chemin de l'application masc eval", + "", String.class); + + /** Configuration key. */ + protected final String key; + + /** I18n key of option description */ + protected final String description; + + /** Type of option */ + protected final Class<?> type; + + /** Default value of option. */ + protected String defaultValue; + + MascConfigOption(String key, + String description, + String defaultValue, + Class<?> type) { + this.key = key; + this.description = description; + this.defaultValue = defaultValue; + this.type = type; + } + + @Override + public String getKey() { + return key; + } + + @Override + public Class<?> getType() { + return type; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public String getDefaultValue() { + return defaultValue; + } + + @Override + public boolean isTransient() { + return true; + } + + @Override + public boolean isFinal() { + return true; + } + + @Override + public void setDefaultValue(String defaultValue) { + this.defaultValue = defaultValue; + } + + @Override + public void setTransient(boolean newValue) { + // not used + } + + @Override + public void setFinal(boolean newValue) { + // not used + } + } +} Added: masc/masc-api/src/main/java/fr/inra/masc/MascTechnicalException.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/MascTechnicalException.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/MascTechnicalException.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,25 @@ +package fr.inra.masc; + +/** + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class MascTechnicalException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public MascTechnicalException() { + } + + public MascTechnicalException(String message) { + super(message); + } + + public MascTechnicalException(String message, Throwable cause) { + super(message, cause); + } + + public MascTechnicalException(Throwable cause) { + super(cause); + } +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/DexiEvalInvokerService.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/DexiEvalInvokerService.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/DexiEvalInvokerService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,8 @@ +package fr.inra.masc.services; + +/** + * @author sletellier <letellier@codelutin.com> + */ +public class DexiEvalInvokerService extends MascService { + +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/DexiInvokerService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,8 @@ +package fr.inra.masc.services; + +/** + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class DexiInvokerService extends MascService { +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/ImageGeneratorService.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/ImageGeneratorService.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/ImageGeneratorService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,8 @@ +package fr.inra.masc.services; + +/** + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class ImageGeneratorService extends MascService { +} Deleted: masc/masc-api/src/main/java/fr/inra/masc/services/ImportService.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/ImportService.java 2011-12-01 09:04:18 UTC (rev 509) +++ masc/masc-api/src/main/java/fr/inra/masc/services/ImportService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -1,16 +0,0 @@ -package fr.inra.masc.services; - -import fr.inra.masc.model.MascModel; - -import java.io.File; - -/** - * @author sletellier <letellier@codelutin.com> - * @since 0.1 - */ -public class ImportService { - - public MascModel importMascFile(File mascFile) { - return null; - } -} Copied: masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java (from rev 509, masc/masc-api/src/main/java/fr/inra/masc/services/ImportService.java) =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/LoadModelService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,17 @@ +package fr.inra.masc.services; + +import fr.inra.masc.model.MascModel; + +import java.io.File; + +/** + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class LoadModelService extends MascService { + + public MascModel loadModel(File mascFile) { + // TODO + return null; + } +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/MascService.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/MascService.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/MascService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,24 @@ +package fr.inra.masc.services; + +import fr.inra.masc.MascConfig; + +/** + * Contract to place on each Masc service to push the {@code serviceContext} + * inside the service. + * + * @author sletellier <letellier@codelutin.com> + * @see MascServiceContext + * @since 0.1 + */ +public abstract class MascService { + + protected MascServiceContext serviceContext; + + public void setServiceContext(MascServiceContext serviceContext) { + this.serviceContext = serviceContext; + } + + public MascConfig getConfig() { + return serviceContext.getConfig(); + } +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/MascServiceContext.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/MascServiceContext.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/MascServiceContext.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,36 @@ +package fr.inra.masc.services; + +import fr.inra.masc.MascConfig; + +/** + * This contract represents objects you must provide when asking for a service. + * Objects provided may be injected in services returned by + * {@link MascServiceFactory#newService(Class, MascServiceContext)} + * + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class MascServiceContext { + + protected MascConfig config; + + protected MascServiceFactory serviceFactory; + + public MascServiceContext(MascConfig config, MascServiceFactory serviceFactory) { + this.config = config; + this.serviceFactory = serviceFactory; + } + + public MascConfig getConfig() { + return config; + } + + public MascServiceFactory getServiceFactory() { + return serviceFactory; + } + + public <E extends MascService> E newService(Class<E> clazz) { + return serviceFactory.newService(clazz, this); + } + +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/MascServiceFactory.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/MascServiceFactory.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/MascServiceFactory.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,34 @@ +package fr.inra.masc.services; + +import fr.inra.masc.MascTechnicalException; + +import java.lang.reflect.InvocationTargetException; + +/** + * Factory of services. + * + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class MascServiceFactory { + + public <E extends MascService> E newService(Class<E> clazz, MascServiceContext serviceContext) { + // instantiate service using empty constructor + E service; + try { + service = clazz.getConstructor().newInstance(); + } catch (InstantiationException e) { + throw new MascTechnicalException(e); + } catch (IllegalAccessException e) { + throw new MascTechnicalException(e); + } catch (InvocationTargetException e) { + throw new MascTechnicalException(e); + } catch (NoSuchMethodException e) { + throw new MascTechnicalException(e); + } + + service.setServiceContext(serviceContext); + + return service; + } +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/OptionCRUDService.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/OptionCRUDService.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/OptionCRUDService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,8 @@ +package fr.inra.masc.services; + +/** + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class OptionCRUDService extends MascService { +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/ReportGeneratorService.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/ReportGeneratorService.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/ReportGeneratorService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,8 @@ +package fr.inra.masc.services; + +/** + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class ReportGeneratorService extends MascService { +} Added: masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java =================================================================== --- masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java (rev 0) +++ masc/masc-api/src/main/java/fr/inra/masc/services/SaveModelService.java 2011-12-07 11:01:38 UTC (rev 510) @@ -0,0 +1,17 @@ +package fr.inra.masc.services; + +import fr.inra.masc.model.MascModel; + +import java.io.File; + +/** + * @author sletellier <letellier@codelutin.com> + * @since 0.1 + */ +public class SaveModelService extends MascService { + + public File saveModel(MascModel mascModel) { + // TODO + return null; + } +} Modified: masc/pom.xml =================================================================== --- masc/pom.xml 2011-12-01 09:04:18 UTC (rev 509) +++ masc/pom.xml 2011-12-07 11:01:38 UTC (rev 510) @@ -76,7 +76,7 @@ <!-- libraries version --> <nuitonI18nVersion>2.4.1</nuitonI18nVersion> - <nuitonUtilsVersion>2.1</nuitonUtilsVersion> + <nuitonUtilsVersion>2.4</nuitonUtilsVersion> <eugenePluginVersion>2.4.1</eugenePluginVersion> <jaxxVersion>2.4.2</jaxxVersion> @@ -92,6 +92,7 @@ <dependencyManagement> <dependencies> + <!-- nuiton dependencies --> <dependency> <groupId>org.nuiton</groupId> <artifactId>nuiton-validator</artifactId> @@ -110,6 +111,12 @@ <version>${nuitonI18nVersion}</version> </dependency> + <dependency> + <groupId>com.google.guava</groupId> + <artifactId>guava</artifactId> + <version>10.0.1</version> + </dependency> + </dependencies> </dependencyManagement>
participants (1)
-
sletellier@users.nuiton.org