r4107 - in branches/4.3.0-log4j2: . src/main/java/fr/ifremer/isisfish/simulator/launcher src/main/java/fr/ifremer/isisfish/util src/test/java/fr/ifremer/isisfish/simulator src/test/java/fr/ifremer/isisfish/simulator/launcher src/test/java/fr/ifremer/isisfish/util
Author: echatellier Date: 2014-09-09 12:06:34 +0200 (Tue, 09 Sep 2014) New Revision: 4107 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/4107 Log: fixes #568: D?\195?\169pendances non incluses dans la simulation Modified: branches/4.3.0-log4j2/pom.xml branches/4.3.0-log4j2/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java branches/4.3.0-log4j2/src/main/java/fr/ifremer/isisfish/util/DependencyUtil.java branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/simulator/SimulationPreScriptTest.java branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/util/DependencyUtilTest.java Modified: branches/4.3.0-log4j2/pom.xml =================================================================== --- branches/4.3.0-log4j2/pom.xml 2014-09-01 11:05:03 UTC (rev 4106) +++ branches/4.3.0-log4j2/pom.xml 2014-09-09 10:06:34 UTC (rev 4107) @@ -216,10 +216,10 @@ </dependency> <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - <version>1.7.7</version> - <scope>runtime</scope> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>1.7.7</version> + <scope>runtime</scope> </dependency> <dependency> @@ -323,6 +323,12 @@ <artifactId>ssj</artifactId> <version>2.5</version> <scope>runtime</scope> + <exclusions> + <exclusion> + <groupId>dsol</groupId> + <artifactId>dsol-xml</artifactId> + </exclusion> + </exclusions> </dependency> <!-- fin ssj pour les calculs stockastiques --> @@ -342,10 +348,6 @@ <groupId>com.jcraft</groupId> </exclusion> <exclusion> - <artifactId>sqljet</artifactId> - <groupId>org.tmatesoft.sqljet</groupId> - </exclusion> - <exclusion> <artifactId>platform</artifactId> <groupId>net.java.dev.jna</groupId> </exclusion> Modified: branches/4.3.0-log4j2/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java =================================================================== --- branches/4.3.0-log4j2/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java 2014-09-01 11:05:03 UTC (rev 4106) +++ branches/4.3.0-log4j2/src/main/java/fr/ifremer/isisfish/simulator/launcher/SimulationService.java 2014-09-09 10:06:34 UTC (rev 4107) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2002 - 2012 Ifremer, Code Lutin, Benjamin Poussin, Chatellier Eric + * Copyright (C) 2002 - 2014 Ifremer, Code Lutin, Benjamin Poussin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -47,8 +47,9 @@ import java.util.concurrent.Executors; import org.apache.commons.beanutils.BeanUtils; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.mutable.MutableInt; import org.apache.commons.lang3.time.DurationFormatUtils; @@ -96,6 +97,7 @@ import fr.ifremer.isisfish.simulator.sensitivity.SensitivityUtils; import fr.ifremer.isisfish.simulator.sensitivity.domain.RuleDiscreteDomain; import fr.ifremer.isisfish.util.CompileHelper; +import fr.ifremer.isisfish.util.DependencyUtil; /** * Cette classe est responsable de conservation de toutes les simulations faites @@ -193,14 +195,6 @@ log.warn(t("Can't instantiate %s", value), eee); } } - - // fait un appel au moniteur - // pour reprendre le monitoring des simulation en cours - // TODO check this, don't restart monitoring on non ui launch - // moved to main() - //if (IsisFish.config.isLaunchUI()) { - // SimulationMonitor.getInstance().reloadConfig(this); - //} } /** @@ -403,7 +397,7 @@ } // on construit le zip de la simulation - File zip = prepareSimulationZipFile(control, localParameters, null, null, true); + File zip = prepareSimulationZipFile(control, localParameters, null, null); item.setSimulationZip(zip); if (localParameters.getUseSimulationPlan() && localParameters.isIndependentPlan()) { @@ -481,7 +475,7 @@ // on construit le zip de la simulation // in zip, there will be param "without" prescript - File zip = prepareSimulationZipFile(controlJustForZip, localParameters, xmlDesignPlan, sensitivityScenarios, true); + File zip = prepareSimulationZipFile(controlJustForZip, localParameters, xmlDesignPlan, sensitivityScenarios); // for each simulation, we neeed to launch a specific simulation // new simulation ids will be id + "_" + x @@ -715,48 +709,35 @@ * @param param les parametre de la simulation * @param xmlDesignPlan contenu xml des design plan * @param sensitivityScenarios used to add some extra files (such as rules) - * @param compile si vrai la version compile des fichiers Java est aussi - * mise dans le fichier zip. Cela peut servir pour les simulations locales - * pour ne pas recompiler pour chaque simulation avec plan de simulation * @return un zip de simulation pour une simulation pret a être faite * @throws SimulationException pour tout problème rencontré (IO,Topia...) */ protected File prepareSimulationZipFile(SimulationControl control, - SimulationParameter param, String xmlDesignPlan, SensitivityScenarios sensitivityScenarios, boolean compile) + SimulationParameter param, String xmlDesignPlan, SensitivityScenarios sensitivityScenarios) throws SimulationException { + try { - File tmpDirectory = FileUtil.createTempDirectory( - "isisfish-simulation-", "-preparation"); - //File regionXML = IsisConfig.getDataBackupFile(tmpDirectory); - File regionXML = new File(tmpDirectory, - SimulationStorage.DATA_BACKUP_FILENAME); + File tmpDirectory = FileUtil.createTempDirectory("isisfish-simulation-", "-preparation"); // sauvegarde des parametres Properties prop = param.toProperties(); - //File f = IsisConfig.getSimulationParametersFile(tmpDirectory); File f = new File(tmpDirectory, SimulationStorage.PARAMETERS_FILENAME); - FileOutputStream out = null; - try { - out = new FileOutputStream(f); + try (FileOutputStream out = new FileOutputStream(f)) { prop.store(out, "Parameters"); - } finally { - IOUtils.closeQuietly(out); } // backup pour toutes les simulations, pour eviter que l'utilisateur // ne puisse le modifier en meme temps control.setText(t("isisfish.message.backup.database.progress")); - RegionStorage region = RegionStorage.getRegion(param - .getRegionName()); + File regionBackup = new File(tmpDirectory, SimulationStorage.DATA_BACKUP_FILENAME); + RegionStorage region = RegionStorage.getRegion(param.getRegionName()); TopiaContext tc = region.getStorage().beginTransaction(); - tc.backup(regionXML, true); + tc.backup(regionBackup, true); tc.closeContext(); control.setText(t("isisfish.message.backup.database.finished")); - // copie de toutes regles a utiliser + // extract Rules defined in factors List<Rule> rules = param.getRules(); - - // FIXME small hack to add rules defined in simulations factors if (sensitivityScenarios != null) { for (Scenario sensitivityScenario : sensitivityScenarios.getScenarios()) { List<Factor> factors = sensitivityScenario.getFactors(); @@ -865,13 +846,6 @@ } } - // copie de tous les scripts a utiliser - // les script officiel prevalent sur les scripts communautés - FileUtil.copyRecursively(ScriptStorage.getCommunityScriptDirectory(), - tmpDirectory, ".*\\.java$"); - FileUtil.copyRecursively(ScriptStorage.getScriptDirectory(), - tmpDirectory, ".*\\.java$"); - // copie de tous les simulateurs a utiliser File simulatorFile = new File(SimulatorStorage.getSimulatorDirectory(), param.getSimulatorName()); if (!simulatorFile.isFile()) { @@ -881,14 +855,10 @@ SimulatorStorage.SIMULATOR_PATH + File.separator + param.getSimulatorName())); - // convert all file to UTF-8 - //convertAllFile(control, tmpDirectory); - - if (compile) { - compileAllFile(control, tmpDirectory); - } + // compile and add dependencies + compileAllFile(control, tmpDirectory); - // Sauvegarde du design plan en XML + // sauvegarde du design plan en XML if (!StringUtils.isEmpty(xmlDesignPlan)) { File simulationDesignPlanFile = SimulationStorage.getMexicoDesignPlan(tmpDirectory); FileUtils.writeStringToFile(simulationDesignPlanFile, xmlDesignPlan, "utf-8"); @@ -915,47 +885,6 @@ } - /* - * Convertit tous les fichiers du répertoire directory en UTF-8, - * pour eviter les erreurs d'encodage du la compilation - * sur un autre systeme ne supportant pas l'encodage courant. - * - * @param control le controleur - * @param directory le répertoire a convertir - * - protected void convertAllFile(SimulationControl control, File directory) { - - control.setText("Converting file to unicode"); - - List<File> fileToConvert = new ArrayList<File>(); - - List<File> tmp = FileUtil.find(new File(directory, - ExportStorage.EXPORT_PATH), ".*\\.java$", true); - fileToConvert.addAll(tmp); - - tmp = FileUtil.find(new File(directory, - SensitivityExportStorage.SENSITIVITY_EXPORT_PATH), ".*\\.java$", true); - fileToConvert.addAll(tmp); - - tmp = FileUtil.find(new File(directory, RuleStorage.RULE_PATH), - ".*\\.java$", true); - fileToConvert.addAll(tmp); - - tmp = FileUtil.find(new File(directory, - SimulationPlanStorage.SIMULATION_PLAN_PATH), ".*\\.java$", true); - fileToConvert.addAll(tmp); - - tmp = FileUtil.find( - new File(directory, SimulatorStorage.SIMULATOR_PATH), - ".*\\.java$", true); - fileToConvert.addAll(tmp); - - // - // Convertion - // - //CompileHelper.convertToUnicode(fileToConvert); - }*/ - /** * Compile les fichiers présent dans le répertoire passé en * parametre, ce répertoire est hiérarchisé en: rules, exports, simulators @@ -967,19 +896,21 @@ * * @param control le controleur * @param directory le répertoire où compiler + * @throws IOException */ - protected void compileAllFile(SimulationControl control, File directory) { + protected void compileAllFile(SimulationControl control, File directory) throws IOException { control.setText(t("isisfish.simulation.message.scriptscompilation")); long currentTime = System.nanoTime(); - // // Recherche des fichiers a compiler // On ne prend pas les scripts, car ils sont tous copiés mais pas // forcément util. Lors de la compilation des autres fichiers, les // script servant réellement seront automatiquement compilé - List<File> fileToCompile = new ArrayList<File>(); + List<File> fileToCompile = new ArrayList<>(); // *.java + List<File> fileToInpect = new ArrayList<>(); // *.class + Set<String> dependencies = new HashSet<String>(); // packages String[] modules = { ExportStorage.EXPORT_PATH, @@ -990,17 +921,46 @@ SimulationPlanStorage.SIMULATION_PLAN_PATH, SimulatorStorage.SIMULATOR_PATH }; - + for (String module : modules) { - List<File> tmp = FileUtil.find(new File(directory, module), ".*\\.java$", true); + File moduleDir = new File(directory, module); + List<File> tmp = FileUtil.find(moduleDir, ".*\\.java$", true); fileToCompile.addAll(tmp); + for (File srcFile : tmp) { + // source + fileToCompile.add(srcFile); + // class + File classFile = new File(srcFile.getAbsolutePath().replaceFirst("\\.java", ".class")); + fileToInpect.add(classFile); + // package + dependencies.add(module + "." + FilenameUtils.getBaseName(srcFile.getName())); + } } // // Compilation // - CompileHelper.compile(directory, fileToCompile, directory, null); + + // + // Check dependencies + // + Set<String> allDeps = DependencyUtil.extractDependencies(directory, fileToInpect); + Collection<String> missingDeps = CollectionUtils.subtract(allDeps, dependencies); + for (String missingDep : missingDeps) { + String relativePath = missingDep.replace('.', File.separatorChar) + ".java"; + // try official first + File srcFile = new File(IsisFish.config.getContextDatabaseDirectory(), relativePath); + if (!srcFile.isFile()) { + // if official file not exists, look for community file + srcFile = new File(IsisFish.config.getCommunityDatabaseDirectory(), missingDep.replace('.', File.separatorChar) + ".java"); + } + File destFile = new File(directory, missingDep.replace('.', File.separatorChar) + ".java"); + FileUtils.copyFile(srcFile, destFile); + } + // there is no need to compile this dependancies, they have been compiled by first compilation + // only add missing java files + long time = System.nanoTime() - currentTime; control.setText(t("isisfish.message.compilation.time", DurationFormatUtils.formatDuration(time / 1000000, "s'.'S"))); Modified: branches/4.3.0-log4j2/src/main/java/fr/ifremer/isisfish/util/DependencyUtil.java =================================================================== --- branches/4.3.0-log4j2/src/main/java/fr/ifremer/isisfish/util/DependencyUtil.java 2014-09-01 11:05:03 UTC (rev 4106) +++ branches/4.3.0-log4j2/src/main/java/fr/ifremer/isisfish/util/DependencyUtil.java 2014-09-09 10:06:34 UTC (rev 4107) @@ -25,8 +25,13 @@ package fr.ifremer.isisfish.util; +import java.io.BufferedInputStream; +import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.regex.Matcher; @@ -70,21 +75,56 @@ * Extrait les dépendences d'une class compilé à partir de son bytecode en ne conservant que * les dependances des scripts utilisateurs. * - * @param clazz la classe à analyser + * @param rootDirectory + * @param files ensemble de fichier à analyzer (fichiers .class) * @return extract class set */ - public static Set<String> extractDependencies(Class<?> clazz) { - return extractDependencies(clazz, true); + public static Set<String> extractDependencies(File rootDirectory, Collection<File> files) { + Set<String> deps = new HashSet<String>(); + Set<File> alreadyDone = new HashSet<File>(); + recursiveExtractDependencies(rootDirectory, files, alreadyDone, deps); + return deps; } + protected static void recursiveExtractDependencies(File rootDirectory, Collection<File> todoClassFiles, Set<File> alreadyDone, Set<String> deps) { + + // extract deps + for (File file : todoClassFiles) { + alreadyDone.add(file); + try (InputStream is = new BufferedInputStream(new FileInputStream(file))) { + Set<String> fileDeps = extractDependencies(is); + deps.addAll(fileDeps); + } catch (IOException ex) { + if (log.isErrorEnabled()) { + log.error("Can't extract dependencies", ex); + } + } + + } + + // convert deps to class filTopiaFlywayServicees + Collection<File> newClassFiles = new ArrayList<>(); + for (String dep : deps) { + String classRelative = dep.replace('.', File.separatorChar) + ".class"; + File classFile = new File(rootDirectory, classRelative); + if (!alreadyDone.contains(classFile)) { + newClassFiles.add(classFile); + } + } + + // make new recursion if necessary + if (!newClassFiles.isEmpty()) { + recursiveExtractDependencies(rootDirectory, newClassFiles, alreadyDone, deps); + } + } + /** * Extrait les dépendences d'une class compilé à partir de son bytecode. * * @param clazz la classe à analyser - * @param onlyUserScript only keep user script types * @return extract class set */ - public static Set<String> extractDependencies(Class<?> clazz, final boolean onlyUserScript) { + protected static Set<String> extractDependencies(InputStream clazzStream) { final Set<String> result = new HashSet<>(); // method body visitor @@ -92,59 +132,59 @@ @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - registerDescriptor(result, desc, onlyUserScript); + registerDescriptor(result, desc); return super.visitAnnotation(desc, visible); } @Override public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String desc, boolean visible) { - registerDescriptor(result, desc, onlyUserScript); + registerDescriptor(result, desc); return super.visitTypeAnnotation(typeRef, typePath, desc, visible); } @Override public AnnotationVisitor visitParameterAnnotation(int parameter, String desc, boolean visible) { - registerDescriptor(result, desc, onlyUserScript); + registerDescriptor(result, desc); return super.visitParameterAnnotation(parameter, desc, visible); } @Override public void visitTypeInsn(int opcode, String type) { - registerType(result, type, onlyUserScript); + registerType(result, type); super.visitTypeInsn(opcode, type); } @Override public void visitFieldInsn(int opcode, String owner, String name, String desc) { - registerType(result, owner, onlyUserScript); - registerDescriptor(result, desc, onlyUserScript); + registerType(result, owner); + registerDescriptor(result, desc); super.visitFieldInsn(opcode, owner, name, desc); } @Override public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { - registerType(result, owner, onlyUserScript); - registerDescriptor(result, desc, onlyUserScript); + registerType(result, owner); + registerDescriptor(result, desc); super.visitMethodInsn(opcode, owner, name, desc, itf); } @Override public void visitLdcInsn(Object cst) { if (cst instanceof Type) { - registerType(result, ((Type)cst).getClassName(), onlyUserScript); + registerType(result, ((Type)cst).getClassName()); } super.visitLdcInsn(cst); } @Override public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { - registerType(result, type, onlyUserScript); + registerType(result, type); super.visitTryCatchBlock(start, end, handler, type); } @Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { - registerDescriptor(result, desc, onlyUserScript); + registerDescriptor(result, desc); super.visitLocalVariable(name, desc, signature, start, end, index); } }; @@ -155,35 +195,35 @@ @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { - registerType(result, superName, onlyUserScript); + registerType(result, superName); super.visit(version, access, name, signature, superName, interfaces); } @Override public AnnotationVisitor visitAnnotation(String desc, boolean visible) { - registerDescriptor(result, desc, onlyUserScript); + registerDescriptor(result, desc); return super.visitAnnotation(desc, visible); } @Override public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) { - registerDescriptor(result, desc, onlyUserScript); + registerDescriptor(result, desc); return super.visitField(access, name, desc, signature, value); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { - registerDescriptor(result, desc, onlyUserScript); + registerDescriptor(result, desc); return mv; } }; - // parse inpu class - try (InputStream in = clazz.getResourceAsStream("/" + clazz.getName().replace('.', '/') + ".class")) { - ClassReader classReader = new ClassReader(in); + // parse input class + try { + ClassReader classReader = new ClassReader(clazzStream); classReader.accept(visitor, 0); } catch (IOException ex) { if (log.isErrorEnabled()) { @@ -199,11 +239,10 @@ * * @param types types collection * @param type type to add - * @param onlyUserScript only keep user script types */ - protected static void registerType(Set<String> types, String type, boolean onlyUserScript) { + protected static void registerType(Set<String> types, String type) { //System.out.println("==> " + type); - if (!onlyUserScript || StringUtils.startsWithAny(type, + if (StringUtils.startsWithAny(type, ExportStorage.EXPORT_PATH, FormuleStorage.FORMULE_PATH, ObjectiveStorage.OBJECTIVE_PATH, @@ -227,25 +266,25 @@ * <li>Lfr/ifremer/isisfish/types/Month;</li> * <li>[Ljava/lang/String;</li> * <li>(Ljava/lang/Class;)Lorg/apache/commons/logging/Log;</li> + * </ul> * * @param types types collection * @param descriptor descriptor - * @param onlyUserScript only keep user script types */ - protected static void registerDescriptor(Set<String> types, String descriptor, boolean onlyUserScript) { + protected static void registerDescriptor(Set<String> types, String descriptor) { if (descriptor.startsWith("(")) { int endIndex = descriptor.indexOf(')'); - registerDescriptor(types, descriptor.substring(1, endIndex), onlyUserScript); - registerDescriptor(types, descriptor.substring(endIndex + 1), onlyUserScript); + registerDescriptor(types, descriptor.substring(1, endIndex)); + registerDescriptor(types, descriptor.substring(endIndex + 1)); } else { - Pattern pattern = Pattern.compile("\\[*L([^;]+);|\\[[ZBCSIFDJ]|[ZBCSIFDJ]"); + // full pattern : \\[*L([^;]+);|\\[[ZBCSIFDJ]|[ZBCSIFDJ] + // on exclut la fin (les types primitifs) pour ne conserver que la partie interessante + // du pattern qui nous concerne + Pattern pattern = Pattern.compile("\\[*L([^;]+);"); Matcher matcher = pattern.matcher(descriptor); while (matcher.find()) { String match = matcher.group(1); - // sinon c'est un type primitif - if (match != null) { - registerType(types, match, onlyUserScript); - } + registerType(types, match); } } } Modified: branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/simulator/SimulationPreScriptTest.java =================================================================== --- branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/simulator/SimulationPreScriptTest.java 2014-09-01 11:05:03 UTC (rev 4106) +++ branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/simulator/SimulationPreScriptTest.java 2014-09-09 10:06:34 UTC (rev 4107) @@ -31,9 +31,7 @@ import org.apache.commons.beanutils.BeanUtils; import org.apache.commons.beanutils.ConvertUtilsBean; -import org.junit.After; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import org.nuiton.math.matrix.MatrixFactory; import org.nuiton.math.matrix.MatrixND; @@ -55,21 +53,6 @@ */ public class SimulationPreScriptTest extends AbstractIsisFishTest { - @Before - public void setUp() throws Exception { - // not do it in @BeforeClass - // test will fail ! - init(); - // very important , other test wil fail with that - //System.setProperty("hibernate.hbm2ddl.auto", "create"); - } - - @After - public void tearDown() { - // very important , other test wil fail with that - //System.clearProperty("hibernate.hbm2ddl.auto"); - } - /** * Test que les chaine represantant des matrices sont correctement * transformée en MatrixND. Modified: branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java =================================================================== --- branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2014-09-01 11:05:03 UTC (rev 4106) +++ branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/simulator/launcher/SimulationServiceTest.java 2014-09-09 10:06:34 UTC (rev 4107) @@ -5,7 +5,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2006 - 2011 Ifremer, Code Lutin, Chatellier Eric + * Copyright (C) 2006 - 2014 Ifremer, Code Lutin, Chatellier Eric * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as @@ -25,6 +25,7 @@ package fr.ifremer.isisfish.simulator.launcher; +import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Properties; @@ -34,7 +35,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.junit.Assert; -import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.nuiton.math.matrix.MatrixFactory; @@ -47,6 +47,9 @@ import fr.ifremer.isisfish.IsisFishException; import fr.ifremer.isisfish.datastore.RegionStorage; import fr.ifremer.isisfish.datastore.RuleStorage; +import fr.ifremer.isisfish.datastore.ScriptStorage; +import fr.ifremer.isisfish.datastore.SimulationStorage; +import fr.ifremer.isisfish.datastore.SimulatorStorage; import fr.ifremer.isisfish.datastore.StorageException; import fr.ifremer.isisfish.entities.Population; import fr.ifremer.isisfish.entities.PopulationGroup; @@ -84,11 +87,61 @@ /** Commons logging log. */ private static Log log = LogFactory.getLog(SimulationServiceTest.class); - @Before - public void setUp() throws Exception { - // not do it in @BeforeClass - // test will fail ! - AbstractIsisFishTest.init(); + /** + * Lance une simulation simple avec le simulateur par cellule. + * + * Test is wrong if it take more than 2 min. + * + * @throws InterruptedException + */ + @Test(timeout=120 * 1000) + public void testSimulationEffortByCell() throws InterruptedException { + + SimulationParameter params = new SimulationParameterImpl(); + // set params region + params.setRegionName("DemoRegion"); + // simulator + params.setSimulatorName("SimulatorEffortByCell.java"); + // set population + List<Population> pops = new ArrayList<Population>(); + Population pop = new PopulationImpl(); + pop.setName("test population"); + pop.setPopulationGroup(new ArrayList<PopulationGroup>()); + pop.setPopulationZone(new ArrayList<Zone>()); + pops.add(pop); + params.setPopulations(pops); + // strat + List<Strategy> strats = new ArrayList<Strategy>(); + Strategy strategy = new StrategyImpl(); + strategy.setName("stratest"); + strats.add(strategy); + params.setStrategies(strats); + // number of year + params.setNumberOfYear(1); + + // run simulation + SimulationService service = SimulationService.getService(); + SimulatorLauncher launcher = new InProcessSimulatorLauncher(); + service.addSimulationLauncher(launcher); + String simulationId = "effort by cell test number 1"; + service.submit("effort by cell test number 1", params, launcher, 0); + + // temporise la fin de test , sinon junit tue tous les process + do { + Thread.sleep(2000); + } while (!service.jobs.isEmpty()); + + // suite au changement de la compilation, on vérifie que certains fichier java + // doivent être automatiquement inclut dans les sources + File simDir = SimulationStorage.getSimulationDirectory(simulationId); + File simulatorDir = new File(simDir, SimulatorStorage.SIMULATOR_PATH); + File scriptDir = new File(simDir, ScriptStorage.SCRIPT_PATH); + Assert.assertTrue(new File(simulatorDir, "DefaultSimulator.java").exists()); + Assert.assertTrue(new File(simulatorDir, "SimulatorEffortByCell.java").exists()); + Assert.assertTrue(new File(scriptDir, "ResultName.java").exists()); + Assert.assertTrue(new File(scriptDir, "SiMatrix.java").exists()); + Assert.assertTrue(new File(scriptDir, "GravityModel.java").exists()); + Assert.assertTrue(new File(scriptDir, "RuleUtil.java").exists()); } /** @@ -180,9 +233,11 @@ * Lance une simulation avec des facteurs de sensibilité. * * Test is wrong if it take more than 2 min. + * + * @throws InterruptedException */ @Test(timeout=120 * 1000) - public void testRunSensivitySimulation() { + public void testRunSensivitySimulation() throws InterruptedException { SimulationParameter params = new SimulationParameterImpl(); // set params region @@ -216,15 +271,10 @@ sensitivityAnalysis, designPlan); // temporise la fin de test , sinon junit tue tous les process - try { - do { - Thread.sleep(2000); - } while (!service.jobs.isEmpty()); - } catch (InterruptedException e) { - if (log.isErrorEnabled()) { - log.error("Can't wait wimulation to end", e); - } - } + do { + Thread.sleep(2000); + } while (!service.jobs.isEmpty()); + } /** Modified: branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/util/DependencyUtilTest.java =================================================================== --- branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/util/DependencyUtilTest.java 2014-09-01 11:05:03 UTC (rev 4106) +++ branches/4.3.0-log4j2/src/test/java/fr/ifremer/isisfish/util/DependencyUtilTest.java 2014-09-09 10:06:34 UTC (rev 4107) @@ -24,13 +24,18 @@ */ package fr.ifremer.isisfish.util; +import java.io.File; +import java.io.IOException; +import java.util.Collections; import java.util.Set; import org.junit.Assert; import org.junit.Test; import fr.ifremer.isisfish.AbstractIsisFishTest; +import fr.ifremer.isisfish.IsisFish; import fr.ifremer.isisfish.IsisFishException; +import fr.ifremer.isisfish.datastore.JavaSourceStorage; import fr.ifremer.isisfish.datastore.RuleStorage; import fr.ifremer.isisfish.datastore.ScriptStorage; import fr.ifremer.isisfish.datastore.SimulatorStorage; @@ -43,18 +48,39 @@ public class DependencyUtilTest extends AbstractIsisFishTest { /** + * Extract dependency for test. + * + * @param storage storage + * @return deps + * @throws IsisFishException + */ + protected static Set<String> extractDependencies(JavaSourceStorage storage) throws IsisFishException { + String clazzName = storage.getCodeClass().getName(); + File classFile = new File(IsisFish.config.getCompileDirectory(), clazzName.replace('.', File.separatorChar) + ".class"); + Set<String> result = DependencyUtil.extractDependencies(IsisFish.config.getCompileDirectory(), Collections.singletonList(classFile)); + return result; + } + + /** * Récupère une classe parmis les scripts de test et vérifie que les dépendances sont bien * extraites. * * @throws IsisFishException + * @throws IOException */ @Test - public void testExtractDependencies1() throws IsisFishException { - SimulatorStorage simulatorByCell = SimulatorStorage.getSimulator("SimulatorEffortByCell"); - Class<?> clazz = simulatorByCell.getCodeClass(); - Set<String> deps = DependencyUtil.extractDependencies(clazz, false); - Assert.assertTrue(deps.size() >= 10); + public void testExtractDependencies1() throws IsisFishException, IOException { + SimulatorStorage script = SimulatorStorage.getSimulator("SimulatorEffortByCell"); + Set<String> deps = extractDependencies(script); + // premier niveau Assert.assertTrue(deps.contains("simulators.DefaultSimulator")); + // deuxieme niveau de dependance + Assert.assertTrue(deps.contains("scripts.SiMatrix")); + Assert.assertTrue(deps.contains("scripts.GravityModel")); + // troisieme niveau + Assert.assertTrue(deps.contains("scripts.MinimisationUtil")); + Assert.assertTrue(deps.contains("scripts.ObjectiveFunction")); + Assert.assertTrue(deps.contains("scripts.ObjectiveFunctionBaranov")); } /** @@ -62,13 +88,12 @@ * extraites. * * @throws IsisFishException + * @throws IOException */ @Test - public void testExtractDependencies2() throws IsisFishException { - SimulatorStorage simulator = SimulatorStorage.getSimulator("DefaultSimulator"); - Class<?> clazz = simulator.getCodeClass(); - Set<String> deps = DependencyUtil.extractDependencies(clazz, false); - Assert.assertTrue(deps.size() >= 35); + public void testExtractDependencies2() throws IsisFishException, IOException { + SimulatorStorage script = SimulatorStorage.getSimulator("DefaultSimulator"); + Set<String> deps = extractDependencies(script); Assert.assertTrue(deps.contains("scripts.GravityModel")); Assert.assertTrue(deps.contains("scripts.ResultName")); Assert.assertTrue(deps.contains("scripts.SiMatrix")); @@ -80,13 +105,12 @@ * extraites. * * @throws IsisFishException + * @throws IOException */ @Test - public void testExtractDependencies3() throws IsisFishException { - RuleStorage cantonnement = RuleStorage.getRule("Cantonnement"); - Class<?> clazz = cantonnement.getCodeClass(); - Set<String> deps = DependencyUtil.extractDependencies(clazz, false); - Assert.assertTrue(deps.size() >= 30); + public void testExtractDependencies3() throws IsisFishException, IOException { + RuleStorage script = RuleStorage.getRule("Cantonnement"); + Set<String> deps = extractDependencies(script); Assert.assertTrue(deps.contains("scripts.ResultName")); } @@ -95,13 +119,12 @@ * extraites. * * @throws IsisFishException + * @throws IOException */ @Test - public void testExtractDependencies4() throws IsisFishException { + public void testExtractDependencies4() throws IsisFishException, IOException { ScriptStorage script = ScriptStorage.getScript("SiMatrix"); - Class<?> clazz = script.getCodeClass(); - Set<String> deps = DependencyUtil.extractDependencies(clazz, false); - Assert.assertTrue(deps.size() >= 51); + Set<String> deps = extractDependencies(script); Assert.assertTrue(deps.contains("scripts.ObjectiveFunctionBaranov")); Assert.assertTrue(deps.contains("scripts.ObjectiveFunction")); Assert.assertTrue(deps.contains("scripts.MinimisationUtil")); @@ -113,13 +136,12 @@ * extraites. * * @throws IsisFishException + * @throws IOException */ @Test - public void testExtractDependencies5() throws IsisFishException { + public void testExtractDependencies5() throws IsisFishException, IOException { ScriptStorage script = ScriptStorage.getScript("GravityModel"); - Class<?> clazz = script.getCodeClass(); - Set<String> deps = DependencyUtil.extractDependencies(clazz, false); - Assert.assertTrue(deps.size() >= 31); + Set<String> deps = extractDependencies(script); Assert.assertTrue(deps.contains("scripts.SiMatrix")); Assert.assertTrue(deps.contains("scripts.ResultName")); } @@ -129,14 +151,12 @@ * extraites. * * @throws IsisFishException + * @throws IOException */ @Test - public void testExtractDependencies6() throws IsisFishException { + public void testExtractDependencies6() throws IsisFishException, IOException { ScriptStorage script = ScriptStorage.getScript("ObjectiveFunctionBaranov"); - Class<?> clazz = script.getCodeClass(); - Set<String> deps = DependencyUtil.extractDependencies(clazz, false); - Assert.assertTrue(deps.size() >= 4); + Set<String> deps = extractDependencies(script); Assert.assertTrue(deps.contains("scripts.ObjectiveFunction")); - Assert.assertTrue(deps.contains("fr.ifremer.isisfish.util.Nocache")); } }
participants (1)
-
echatellier@users.forge.codelutin.com