r3929 - in branches/4.0.1/src/main/java/fr/ifremer/isisfish: simulator util
Author: bpoussin Date: 2014-04-03 20:03:32 +0200 (Thu, 03 Apr 2014) New Revision: 3929 Url: http://forge.codelutin.com/projects/isis-fish/repository/revisions/3929 Log: - fixes bug if script contains "import" section - add db parameter for pre script Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScript.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScriptListener.java branches/4.0.1/src/main/java/fr/ifremer/isisfish/util/EvaluatorHelper.java Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScript.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScript.java 2014-04-03 18:02:35 UTC (rev 3928) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScript.java 2014-04-03 18:03:32 UTC (rev 3929) @@ -25,6 +25,7 @@ package fr.ifremer.isisfish.simulator; import fr.ifremer.isisfish.util.Args; +import org.nuiton.topia.TopiaContext; /** * Interface d'utilisation d'un prescript. @@ -37,9 +38,10 @@ * Compute prescript * * @param context simulation context + * @param db database use during simulation * @throws Exception */ - @Args({"context"}) - public void compute(SimulationContext context) throws Exception; + @Args({"context", "db"}) + public void compute(SimulationContext context, TopiaContext db) throws Exception; } Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScriptListener.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScriptListener.java 2014-04-03 18:02:35 UTC (rev 3928) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/simulator/SimulationPreScriptListener.java 2014-04-03 18:03:32 UTC (rev 3929) @@ -78,6 +78,7 @@ Map<String, Object> args = new HashMap<>(); args.put("context", context); + args.put("db", tx); if (StringUtils.isNotBlank(generatedPreScript)) { EvaluatorHelper.evaluate(SimulationPreScript.class.getPackage().getName(), Modified: branches/4.0.1/src/main/java/fr/ifremer/isisfish/util/EvaluatorHelper.java =================================================================== --- branches/4.0.1/src/main/java/fr/ifremer/isisfish/util/EvaluatorHelper.java 2014-04-03 18:02:35 UTC (rev 3928) +++ branches/4.0.1/src/main/java/fr/ifremer/isisfish/util/EvaluatorHelper.java 2014-04-03 18:03:32 UTC (rev 3929) @@ -42,6 +42,9 @@ import fr.ifremer.isisfish.IsisFish; import fr.ifremer.isisfish.IsisFishRuntimeException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.nuiton.util.FileUtil; /** * Permet d'evaluer les equations ecritent en Java @@ -59,8 +62,16 @@ /** Logger for this class. */ private static Log log = LogFactory.getLog(EvaluatorHelper.class); + /** + * Regex to match import: + * - "^(import ...;)" for import at line beginning + * - ";(import ...;)" for multiple import on same line + */ + static protected Pattern grepImportPattern = Pattern.compile("(?:^\\s*|(?<=;)\\s*)(import[^;]+;)", Pattern.DOTALL + Pattern.MULTILINE); + + protected static String normalizeClassName(String name) { - StringBuffer result = new StringBuffer(name); + StringBuilder result = new StringBuilder(name); for (int i=0; i<result.length(); i++) { char c = result.charAt(i); if (!Character.isJavaIdentifierPart(c)) { @@ -189,7 +200,7 @@ // try to load class try { ClassLoader cl = IsisFish.config.getScriptClassLoader(); - clazz = cl.loadClass(classname); + clazz = cl.loadClass(classname); } catch (Exception zzz) { throw new IsisFishRuntimeException(t("isisfish.error.load.class", classname), zzz); } @@ -211,6 +222,12 @@ * @return script return (or null) */ protected static String generateContent(String packageName, String className, Method interfaceMethod, String script) { + + StringBuilder imports = new StringBuilder(); + StringBuilder code = new StringBuilder(); + + grepImport(script, imports, code); + String content = ""; if (packageName != null && !"".equals(packageName)) { content += "package " + packageName + ";"; @@ -223,6 +240,7 @@ content += "import fr.ifremer.isisfish.types.*;"; content += "import org.nuiton.math.matrix.*;"; content += "import org.apache.commons.logging.*;"; + content += imports.toString(); // generate content (do not add \n here, this help debug) content += "public class " + className + " implements " + interfaceMethod.getDeclaringClass().getName() + " {"; @@ -251,12 +269,36 @@ } } content += ") throws Exception {"; - content += script; + content += code.toString(); content += "\n}\n}\n"; return content; } + /** + * looking for import in code. return all import as found in code in imports args + * all other code are put in others + * + * @param code + * @param imports + * @param others + */ + protected static void grepImport(String code, StringBuilder imports, StringBuilder others) { + Matcher matches = grepImportPattern.matcher(code); + int pos = 0; + while (matches.find()) { + int begin = matches.start(1); + int end = matches.end(1); + + others.append(code.substring(pos, begin)); + imports.append(code.substring(begin, end)); + pos = end; + + } + + others.append(code.substring(pos)); + } + protected static Object invoke(Class clazz, Method interfaceMethod, Map<String, Object> args) { try { Method method = clazz.getDeclaredMethod(interfaceMethod.getName(),
participants (1)
-
bpoussin@users.forge.codelutin.com