From f02aa5478b0e230fea69b8eb96912b39b91267a7 Mon Sep 17 00:00:00 2001 From: Cheng Fang Date: Thu, 5 May 2016 22:24:25 -0400 Subject: [PATCH] Issue #72 fix PurgeBatchlet to work with the JdbcRepository wrapper in WildFly, and add wildfly-jberet-samples/purgeJdbcRepository2. --- .../org/jberet/_private/BatchMessages.java | 2 + .../org/jberet/repository/PurgeBatchlet.java | 63 ++++++++++--- wildfly-jberet-samples/pom.xml | 5 ++ .../purgeJdbcRepository2/pom.xml | 86 ++++++++++++++++++ .../META-INF/batch-jobs/prepurge2.xml | 26 ++++++ .../batch-jobs/purgeJdbcRepository2.xml | 39 ++++++++ .../main/resources/purgeJdbcRepository2.sql | 8 ++ .../src/main/webapp/WEB-INF/beans.xml | 0 .../WEB-INF/jboss-deployment-structure.xml | 7 ++ .../src/main/webapp/WEB-INF/web.xml | 9 ++ .../PurgeJdbcRepository2IT.java | 88 +++++++++++++++++++ 11 files changed, 323 insertions(+), 10 deletions(-) create mode 100644 wildfly-jberet-samples/purgeJdbcRepository2/pom.xml create mode 100644 wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/META-INF/batch-jobs/prepurge2.xml create mode 100644 wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/META-INF/batch-jobs/purgeJdbcRepository2.xml create mode 100644 wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/purgeJdbcRepository2.sql create mode 100644 wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/beans.xml create mode 100644 wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/jboss-deployment-structure.xml create mode 100644 wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/web.xml create mode 100644 wildfly-jberet-samples/purgeJdbcRepository2/src/test/java/org/jberet/samples/wildfly/purgeJdbcRepository2/PurgeJdbcRepository2IT.java diff --git a/jberet-core/src/main/java/org/jberet/_private/BatchMessages.java b/jberet-core/src/main/java/org/jberet/_private/BatchMessages.java index 63fcfb788..d3c73a9d9 100644 --- a/jberet-core/src/main/java/org/jberet/_private/BatchMessages.java +++ b/jberet-core/src/main/java/org/jberet/_private/BatchMessages.java @@ -195,5 +195,7 @@ public interface BatchMessages { @Message(id = 653, value = "Failed to deserialize: %s") BatchRuntimeException failedToDeserialize(@Cause Throwable cause, Serializable value); + @Message(id = 654, value = "Failed to get JdbcRepository.") + BatchRuntimeException failedToGetJdbcRepository(@Cause Throwable cause); } diff --git a/jberet-core/src/main/java/org/jberet/repository/PurgeBatchlet.java b/jberet-core/src/main/java/org/jberet/repository/PurgeBatchlet.java index b67715e4f..4b78d202e 100644 --- a/jberet-core/src/main/java/org/jberet/repository/PurgeBatchlet.java +++ b/jberet-core/src/main/java/org/jberet/repository/PurgeBatchlet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Red Hat, Inc. and/or its affiliates. + * Copyright (c) 2015-2016 Red Hat, Inc. and/or its affiliates. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 @@ -12,6 +12,7 @@ package org.jberet.repository; +import java.lang.reflect.Method; import java.util.Date; import java.util.Set; import javax.batch.api.BatchProperty; @@ -20,9 +21,10 @@ import javax.batch.runtime.context.StepContext; import javax.inject.Inject; +import org.jberet._private.BatchMessages; import org.jberet.runtime.context.JobContextImpl; -public final class PurgeBatchlet implements Batchlet { +public class PurgeBatchlet implements Batchlet { @Inject private JobContext jobContext; @@ -131,23 +133,64 @@ public String process() throws Exception { jobRepository.removeJobExecutions(selector); } - if (jobRepository instanceof JdbcRepository) { - if (sql != null) { - ((JdbcRepository) jobRepository).executeStatements(sql, null); - } else if (sqlFile != null) { - ((JdbcRepository) jobRepository).executeStatements(null, sqlFile); + if (sql != null) { + sql = sql.trim(); + if (sql.isEmpty()) { + sql = null; } - } else if (jobRepository instanceof MongoRepository) { - if (mongoRemoveQueries != null) { - ((MongoRepository) jobRepository).executeRemoveQueries(mongoRemoveQueries); + } + if (sqlFile != null) { + sqlFile = sqlFile.trim(); + if (sqlFile.isEmpty()) { + sqlFile = null; + } + } + if (sql != null || sqlFile != null) { + final JdbcRepository jdbcRepository = getJdbcRepository(jobRepository); + if (jdbcRepository != null) { + jdbcRepository.executeStatements(sql, sqlFile); } } + if (mongoRemoveQueries != null && jobRepository instanceof MongoRepository) { + ((MongoRepository) jobRepository).executeRemoveQueries(mongoRemoveQueries); + } + return null; } @Override public void stop() throws Exception { + } + /** + * Gets the {@code org.jberet.repository.JdbcRepository} from the + * {@code org.jberet.repository.JobRepository} passed in, in order to + * perform operations specific to {@code org.jberet.repository.JdbcRepository}. + * + * @param repo {@code JobRepository} + * @return {@code org.jberet.repository.JdbcRepository} + */ + protected JdbcRepository getJdbcRepository(final JobRepository repo) { + if (repo instanceof JdbcRepository) { + return (JdbcRepository) repo; + } + if (repo instanceof InMemoryRepository || repo instanceof MongoRepository + || repo instanceof InfinispanRepository) { + return null; + } + + try { + final Method getDelegateMethod = repo.getClass().getDeclaredMethod("getDelegate"); + if (!getDelegateMethod.isAccessible()) { + getDelegateMethod.setAccessible(true); + } + final Object result = getDelegateMethod.invoke(repo); + return (result instanceof JdbcRepository) ? (JdbcRepository) result : null; + } catch (final NoSuchMethodException e) { + return null; + } catch (final Exception e) { + throw BatchMessages.MESSAGES.failedToGetJdbcRepository(e); + } } } diff --git a/wildfly-jberet-samples/pom.xml b/wildfly-jberet-samples/pom.xml index f21943b48..a9404200c 100644 --- a/wildfly-jberet-samples/pom.xml +++ b/wildfly-jberet-samples/pom.xml @@ -42,6 +42,7 @@ restWriter scheduleExecutor scheduleTimer + purgeJdbcRepository2 @@ -111,6 +112,10 @@ org.jberet jberet-rest-api + + org.jberet + jberet-schedule-executor + diff --git a/wildfly-jberet-samples/purgeJdbcRepository2/pom.xml b/wildfly-jberet-samples/purgeJdbcRepository2/pom.xml new file mode 100644 index 000000000..481cd3ede --- /dev/null +++ b/wildfly-jberet-samples/purgeJdbcRepository2/pom.xml @@ -0,0 +1,86 @@ + + + + + + 4.0.0 + + wildfly-jberet-samples + org.jberet.samples + 1.3.0.Beta2-SNAPSHOT + + + purgeJdbcRepository + + war + + purgeJdbcRepository Maven Webapp + + + + org.jberet.samples + jberet-samples-common + ${project.version} + + + + + purgeJdbcRepository2 + + + + + default + + true + + + + + maven-failsafe-plugin + + + **/*.java + + + + + + + + wildfly + + + wildfly + + + + + + org.wildfly.plugins + wildfly-maven-plugin + + + maven-failsafe-plugin + + + **/*IT.java + + + + + + + + diff --git a/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/META-INF/batch-jobs/prepurge2.xml b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/META-INF/batch-jobs/prepurge2.xml new file mode 100644 index 000000000..6dc3f115f --- /dev/null +++ b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/META-INF/batch-jobs/prepurge2.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + diff --git a/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/META-INF/batch-jobs/purgeJdbcRepository2.xml b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/META-INF/batch-jobs/purgeJdbcRepository2.xml new file mode 100644 index 000000000..b485e98b8 --- /dev/null +++ b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/META-INF/batch-jobs/purgeJdbcRepository2.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/purgeJdbcRepository2.sql b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/purgeJdbcRepository2.sql new file mode 100644 index 000000000..fe7010c3c --- /dev/null +++ b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/resources/purgeJdbcRepository2.sql @@ -0,0 +1,8 @@ +delete from STEP_EXECUTION where JOBEXECUTIONID in + (select JOBEXECUTIONID from JOB_EXECUTION, JOB_INSTANCE + where JOB_EXECUTION.JOBINSTANCEID = JOB_INSTANCE.JOBINSTANCEID and JOB_INSTANCE.JOBNAME = 'prepurge2'); + + +delete from JOB_EXECUTION where JOBEXECUTIONID in + (select JOBEXECUTIONID from JOB_EXECUTION, JOB_INSTANCE + where JOB_EXECUTION.JOBINSTANCEID = JOB_INSTANCE.JOBINSTANCEID and JOB_INSTANCE.JOBNAME = 'prepurge2') diff --git a/wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/beans.xml b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/beans.xml new file mode 100644 index 000000000..e69de29bb diff --git a/wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/jboss-deployment-structure.xml b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/jboss-deployment-structure.xml new file mode 100644 index 000000000..c42544d62 --- /dev/null +++ b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/jboss-deployment-structure.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/web.xml b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 000000000..6909267c5 --- /dev/null +++ b/wildfly-jberet-samples/purgeJdbcRepository2/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,9 @@ + + + javax.ws.rs.core.Application + /api/* + + diff --git a/wildfly-jberet-samples/purgeJdbcRepository2/src/test/java/org/jberet/samples/wildfly/purgeJdbcRepository2/PurgeJdbcRepository2IT.java b/wildfly-jberet-samples/purgeJdbcRepository2/src/test/java/org/jberet/samples/wildfly/purgeJdbcRepository2/PurgeJdbcRepository2IT.java new file mode 100644 index 000000000..b1ce81469 --- /dev/null +++ b/wildfly-jberet-samples/purgeJdbcRepository2/src/test/java/org/jberet/samples/wildfly/purgeJdbcRepository2/PurgeJdbcRepository2IT.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2014-2016 Red Hat, Inc. and/or its affiliates. + * + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Cheng Fang - Initial API and implementation + */ + +package org.jberet.samples.wildfly.purgeJdbcRepository2; + +import java.util.Properties; +import javax.batch.runtime.BatchStatus; + +import org.jberet.rest.client.BatchClient; +import org.jberet.rest.entity.JobExecutionEntity; +import org.jberet.samples.wildfly.common.BatchTestBase; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Tests to verify {@code PurgeBatchlet} in JBoss EAP and WildFly. + * + * Similar tests for Java SE environment are: + *
    + *
  • test-apps/purgeJdbcRepository + *
  • test-apps/purgeInMemoryRepository + *
  • test-apps/purgeMongoRepository + *
+ */ +public final class PurgeJdbcRepository2IT extends BatchTestBase { + /** + * The job name defined in {@code META-INF/batch-jobs/purgeJdbcRepository2.xml} + */ + private static final String jobName = "purgeJdbcRepository2"; + + /** + * The job name defined in {@code META-INF/batch-jobs/prepurge2.xml} + */ + private static final String prepurge2JobName = "prepurge2"; + + /** + * The full REST API URL, including scheme, hostname, port number, context path, servlet path for REST API. + * For example, "http://localhost:8080/testApp/api" + */ + private static final String restUrl = BASE_URL + "purgeJdbcRepository2/api"; + + private BatchClient batchClient = new BatchClient(restUrl); + + @Override + protected BatchClient getBatchClient() { + return batchClient; + } + + @Test + public void withSql() throws Exception { + final long prepurgeExecutionId = prepurge(); + JobExecutionEntity prepurgeJobExecution = batchClient.getJobExecution(prepurgeExecutionId); + assertEquals(BatchStatus.COMPLETED, prepurgeJobExecution.getBatchStatus()); + + final String sql = + "delete from STEP_EXECUTION where JOBEXECUTIONID in " + + "(select JOBEXECUTIONID from JOB_EXECUTION, JOB_INSTANCE " + + "where JOB_EXECUTION.JOBINSTANCEID = JOB_INSTANCE.JOBINSTANCEID and JOB_INSTANCE.JOBNAME like 'prepurge%'); " + + + "delete from JOB_EXECUTION where JOBINSTANCEID in " + + "(select JOBINSTANCEID from JOB_INSTANCE where JOBNAME like 'prepurge%');"; + + + final Properties jobParams = new Properties(); + jobParams.setProperty("sql", sql); + startJobCheckStatus(jobName, jobParams, 3000, BatchStatus.COMPLETED); + +// prepurgeJobExecution = batchClient.getJobExecution(prepurgeExecutionId); +// assertEquals(null, prepurgeJobExecution); + } + + private long prepurge() throws Exception { + final JobExecutionEntity jobExecutionEntity = batchClient.startJob(prepurge2JobName, null); + Thread.sleep(1000); + return jobExecutionEntity.getExecutionId(); + } + +}