Repository: incubator-batchee Updated Branches: refs/heads/master 987e7134f -> f08eead0c
BATCHEE-98 try to find not ran jobs for embedded servlet mode Project: http://git-wip-us.apache.org/repos/asf/incubator-batchee/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-batchee/commit/f08eead0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-batchee/tree/f08eead0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-batchee/diff/f08eead0 Branch: refs/heads/master Commit: f08eead0c06749023aa5726fe67e8a2492b2dc2a Parents: 987e713 Author: Romain manni-Bucau <[email protected]> Authored: Fri Mar 11 18:07:45 2016 +0100 Committer: Romain manni-Bucau <[email protected]> Committed: Fri Mar 11 18:07:45 2016 +0100 ---------------------------------------------------------------------- .../batchee/servlet/JBatchController.java | 98 +++++++++++++++++++- .../servlet/JBatchServletInitializer.java | 2 + 2 files changed, 97 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f08eead0/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchController.java ---------------------------------------------------------------------- diff --git a/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchController.java b/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchController.java index 89bd1c6..6587822 100644 --- a/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchController.java +++ b/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchController.java @@ -30,19 +30,28 @@ import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.FileNotFoundException; +import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; +import java.net.URL; import java.net.URLDecoder; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class JBatchController extends HttpServlet { private static final String DEFAULT_MAPPING_SERVLET25 = "/jbatch"; @@ -64,6 +73,8 @@ public class JBatchController extends HttpServlet { private String mapping = DEFAULT_MAPPING_SERVLET25; private int executionByPage = DEFAULT_PAGE_SIZE; private boolean readOnly = false; + private boolean defaultScan = false; + private final Set<String> appBatches = new HashSet<String>(); public JBatchController mapping(final String rawMapping) { this.mapping = rawMapping.substring(0, rawMapping.length() - 2); // mapping pattern is /xxx/* @@ -80,6 +91,11 @@ public class JBatchController extends HttpServlet { return this; } + public JBatchController defaultScan(final boolean defaultScan) { + this.defaultScan = defaultScan; + return this; + } + @Override public void init(final ServletConfig config) throws ServletException { this.operator = BatchRuntime.getJobOperator(); @@ -91,8 +107,33 @@ public class JBatchController extends HttpServlet { mapping = context + mapping; this.simpleRestController = new SimpleRestController(operator); + + // this is not perfect but when it works it list jobs not executed yet which is helpful + // try to find not yet started jobs + if (defaultScan) { + final ClassLoader loader = Thread.currentThread().getContextClassLoader(); + final Enumeration<URL> resources; + try { + resources = loader.getResources("META-INF/batch-jobs"); + } catch (final IOException e) { + return; + } + while (resources.hasMoreElements()) { + final URL url = resources.nextElement(); + final File file = toFile(url); + + if (file != null) { + if (file.isDirectory()) { + findInDirectory(file); + } else { + findInJar(file); + } + } + } + } } + @Override protected void service(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html"); @@ -244,9 +285,10 @@ public class JBatchController extends HttpServlet { } private void listJobs(final HttpServletRequest req) throws ServletException, IOException { - Set<String> names = operator.getJobNames(); - if (names == null) { - names = Collections.emptySet(); + final Set<String> names = new HashSet<String>(appBatches); + final Set<String> registered = operator.getJobNames(); + if (registered != null) { + names.addAll(registered); } req.setAttribute("view", "jobs"); @@ -284,6 +326,56 @@ public class JBatchController extends HttpServlet { return properties; } + private Collection<String> findInJar(final File file) { + final Pattern pattern = Pattern.compile("META\\-INF/batch-jobs/\\(*\\).xml"); + final JarFile jar; + try { + jar = new JarFile(file); + } catch (final IOException e) { + return Collections.emptySet(); + } + final Enumeration<JarEntry> entries = jar.entries(); + final Collection<String> values = new HashSet<String>(); + while (entries.hasMoreElements()) { + final JarEntry entry = entries.nextElement(); + final Matcher matcher = pattern.matcher(entry.getName()); + if (matcher.matches()) { + values.add(matcher.group(1)); + } + } + return values; + } + + private Collection<String> findInDirectory(final File file) { + final String[] batches = file.list(new FilenameFilter() { + @Override + public boolean accept(final File dir, final String name) { + return name.endsWith(".xml"); + } + }); + if (batches != null) { + final Collection<String> values = new HashSet<String>(); + for (final String batch : batches) { + values.add(batch.substring(0, batch.length() - ".xml".length())); + } + return values; + } + return Collections.emptySet(); + } + + private static File toFile(final URL url) { + final File file; + final String externalForm = url.toExternalForm(); + if ("jar".equals(url.getProtocol())) { + file = new File(externalForm.substring("jar:".length(), externalForm.lastIndexOf('!'))); + } else if ("file".equals(url.getProtocol())) { + file = new File(externalForm.substring("file:".length())); + } else { + file = null; + } + return file; + } + private static class JobInstanceIdComparator implements java.util.Comparator<JobInstance> { private static final JobInstanceIdComparator INSTANCE = new JobInstanceIdComparator(); http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/f08eead0/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchServletInitializer.java ---------------------------------------------------------------------- diff --git a/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchServletInitializer.java b/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchServletInitializer.java index 44d7deb..f5379d2 100644 --- a/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchServletInitializer.java +++ b/gui/servlet/embedded/src/main/java/org/apache/batchee/servlet/JBatchServletInitializer.java @@ -35,6 +35,7 @@ import java.util.Set; public class JBatchServletInitializer implements ServletContainerInitializer { public static final String ACTIVE = "org.apache.batchee.servlet.active"; public static final String CONTROLLER_MAPPING = "org.apache.batchee.servlet.mapping"; + public static final String DEFAULT_SCANNING = "org.apache.batchee.servlet.scan"; public static final String ACTIVE_PRIVATE_FILTER = "org.apache.batchee.servlet.filter.private"; public static final String BY_PAGE = "org.apache.batchee.servlet.pagination"; @@ -63,6 +64,7 @@ public class JBatchServletInitializer implements ServletContainerInitializer { ctx.addServlet("JBatch Servlet", new JBatchController() .readOnly(false) + .defaultScan(Boolean.parseBoolean(ctx.getInitParameter(DEFAULT_SCANNING))) .mapping(mapping) .executionByPage(Integer.parseInt(byPage))) .addMapping(mapping);
