Repository: incubator-batchee
Updated Branches:
  refs/heads/master a40e36816 -> 8f61b7270


BATCHEE-107 improve getJobNames handling


Project: http://git-wip-us.apache.org/repos/asf/incubator-batchee/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-batchee/commit/8f61b727
Tree: http://git-wip-us.apache.org/repos/asf/incubator-batchee/tree/8f61b727
Diff: http://git-wip-us.apache.org/repos/asf/incubator-batchee/diff/8f61b727

Branch: refs/heads/master
Commit: 8f61b727030a85e069bbb5082ab3c2346b2db12f
Parents: a40e368
Author: Mark Struberg <[email protected]>
Authored: Wed Aug 17 14:29:31 2016 +0200
Committer: Mark Struberg <[email protected]>
Committed: Wed Aug 17 16:13:03 2016 +0200

----------------------------------------------------------------------
 .../batchee/shiro/ShiroSecurityService.java     |  7 ++++++
 .../batchee/container/impl/JobOperatorImpl.java | 14 +++++-------
 .../JDBCPersistenceManagerService.java          | 24 ++++++++++++++++++++
 .../JPAPersistenceManagerService.java           | 17 ++++++++++++++
 .../MemoryPersistenceManagerService.java        | 11 +++++++++
 .../services/persistence/jdbc/Dictionary.java   |  9 +++++++-
 .../jpa/domain/JobInstanceEntity.java           |  4 +++-
 .../security/DefaultSecurityService.java        |  5 ++++
 .../services/security/JAASSecurityService.java  |  5 ++++
 .../batchee/spi/PersistenceManagerService.java  |  5 ++++
 .../org/apache/batchee/spi/SecurityService.java |  6 +++++
 11 files changed, 97 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/extensions/shiro/src/main/java/org/apache/batchee/shiro/ShiroSecurityService.java
----------------------------------------------------------------------
diff --git 
a/extensions/shiro/src/main/java/org/apache/batchee/shiro/ShiroSecurityService.java
 
b/extensions/shiro/src/main/java/org/apache/batchee/shiro/ShiroSecurityService.java
index 5ae20c0..bdccb58 100644
--- 
a/extensions/shiro/src/main/java/org/apache/batchee/shiro/ShiroSecurityService.java
+++ 
b/extensions/shiro/src/main/java/org/apache/batchee/shiro/ShiroSecurityService.java
@@ -25,6 +25,7 @@ import static org.apache.shiro.SecurityUtils.getSubject;
 public class ShiroSecurityService extends DefaultSecurityService {
     private String instancePrefix;
     private String permissionPrefix;
+    private String jobNamePrefix;
 
     private boolean isAuthenticatedAndAuthorized(final String permission) {
         return getSubject().isAuthenticated() && 
getSubject().isPermitted(permission);
@@ -41,6 +42,11 @@ public class ShiroSecurityService extends 
DefaultSecurityService {
     }
 
     @Override
+    public boolean isAuthorizedJobName(String jobName) {
+        return isAuthenticatedAndAuthorized(jobNamePrefix + jobName);
+    }
+
+    @Override
     public String getLoggedUser() {
         if (getSubject().isAuthenticated()) {
             return getSubject().getPrincipal().toString();
@@ -53,5 +59,6 @@ public class ShiroSecurityService extends 
DefaultSecurityService {
         super.init(batchConfig);
         permissionPrefix = 
batchConfig.getProperty("security.job.permission-prefix", "jbatch:");
         instancePrefix = permissionPrefix + 
batchConfig.getProperty("security.job.permission-prefix", "instance:");
+        jobNamePrefix = permissionPrefix + 
batchConfig.getProperty("security.job.permission-prefix", "jobName:");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/container/impl/JobOperatorImpl.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/container/impl/JobOperatorImpl.java 
b/jbatch/src/main/java/org/apache/batchee/container/impl/JobOperatorImpl.java
index 790def2..bde0b87 100755
--- 
a/jbatch/src/main/java/org/apache/batchee/container/impl/JobOperatorImpl.java
+++ 
b/jbatch/src/main/java/org/apache/batchee/container/impl/JobOperatorImpl.java
@@ -54,7 +54,6 @@ import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.logging.Level;
@@ -173,8 +172,8 @@ public class JobOperatorImpl implements JobOperator {
         final InternalJobExecution jobEx = 
persistenceManagerService.jobOperatorGetJobExecution(executionId);
 
         // if it is not in STARTED or STARTING state, mark it as ABANDONED
-        BatchStatus status = jobEx.getBatchStatus();
-        if (status == BatchStatus.STARTING ||  status == BatchStatus.STARTED) {
+        BatchStatus status = jobEx.getBatchStatus();
+        if (status == BatchStatus.STARTING ||  status == BatchStatus.STARTED) {
             throw new JobExecutionIsRunningException("Job Execution: " + 
executionId + " is still running");
         }
 
@@ -284,11 +283,10 @@ public class JobOperatorImpl implements JobOperator {
     @Override
     public Set<String> getJobNames() throws JobSecurityException {
         final Set<String> jobNames = new HashSet<String>();
-        final Map<Long, String> data = 
persistenceManagerService.jobOperatorGetExternalJobInstanceData();
-        for (final Map.Entry<Long, String> entry : data.entrySet()) {
-            long instanceId = entry.getKey();
-            if (securityService.isAuthorized(instanceId)) {
-                jobNames.add(entry.getValue());
+        final Set<String> jobNamesFromDb = 
persistenceManagerService.getJobNames();
+        for (String jobName : jobNamesFromDb) {
+            if (securityService.isAuthorizedJobName(jobName)) {
+                jobNames.add(jobName);
             }
         }
         return jobNames;

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JDBCPersistenceManagerService.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JDBCPersistenceManagerService.java
 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JDBCPersistenceManagerService.java
index d09abef..56101b5 100755
--- 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JDBCPersistenceManagerService.java
+++ 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JDBCPersistenceManagerService.java
@@ -571,6 +571,30 @@ public class JDBCPersistenceManagerService implements 
PersistenceManagerService
     }
 
     @Override
+    public Set<String> getJobNames() {
+        Connection conn = null;
+        PreparedStatement statement = null;
+        ResultSet rs = null;
+
+        Set<String> jobNames = new HashSet<String>();
+        try {
+            conn = getConnection();
+
+            statement = conn.prepareStatement(dictionary.getFindJobNames());
+            rs = statement.executeQuery();
+            while (rs.next()) {
+                jobNames.add(rs.getString(1));
+            }
+
+        } catch (final SQLException e) {
+            throw new PersistenceException(e);
+        } finally {
+            cleanupConnection(conn, rs, statement);
+        }
+        return jobNames;
+    }
+
+    @Override
     public Timestamp jobOperatorQueryJobExecutionTimestamp(final long key, 
final TimestampType timestampType) {
         Connection conn = null;
         PreparedStatement statement = null;

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JPAPersistenceManagerService.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JPAPersistenceManagerService.java
 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JPAPersistenceManagerService.java
index 90eea56..be07489 100644
--- 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JPAPersistenceManagerService.java
+++ 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/JPAPersistenceManagerService.java
@@ -63,6 +63,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
+import java.util.TreeSet;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
@@ -166,6 +167,22 @@ public class JPAPersistenceManagerService implements 
PersistenceManagerService {
     }
 
     @Override
+    public Set<String> getJobNames() {
+        Set<String> jobNames = new TreeSet<String>();
+        final EntityManager em = emProvider.newEntityManager();
+
+        try {
+            final List<String> list = 
em.createNamedQuery(JobInstanceEntity.Queries.FIND_JOBNAMES, String.class)
+                                        .setParameter("pattern", 
PartitionedStepBuilder.JOB_ID_SEPARATOR + "%")
+                                        .getResultList();
+            jobNames.addAll(list);
+        } finally {
+            emProvider.release(em);
+        }
+        return jobNames;
+    }
+
+    @Override
     public JobStatus getJobStatusFromExecution(final long executionId) {
         final EntityManager em = emProvider.newEntityManager();
         try {

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/container/services/persistence/MemoryPersistenceManagerService.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/MemoryPersistenceManagerService.java
 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/MemoryPersistenceManagerService.java
index a2165f8..78d5e68 100644
--- 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/MemoryPersistenceManagerService.java
+++ 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/MemoryPersistenceManagerService.java
@@ -144,6 +144,17 @@ public class MemoryPersistenceManagerService implements 
PersistenceManagerServic
     }
 
     @Override
+    public Set<String> getJobNames() {
+        Set<String> jobNames = new HashSet<String>();
+        for (final Structures.JobInstanceData jobInstanceData : 
data.jobInstanceData.values()) {
+            if (jobInstanceData.instance.getJobName() != null && 
!jobInstanceData.instance.getJobName().startsWith(PartitionedStepBuilder.JOB_ID_SEPARATOR))
 {
+                jobNames.add(jobInstanceData.instance.getJobName());
+            }
+        }
+        return jobNames;
+    }
+
+    @Override
     public List<Long> jobOperatorGetJobInstanceIds(final String jobName, final 
int start, final int count) {
         return jobOperatorGetJobInstanceIds(jobName, null, start, count);
     }

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jdbc/Dictionary.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jdbc/Dictionary.java
 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jdbc/Dictionary.java
index 33b7608..8e24433 100644
--- 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jdbc/Dictionary.java
+++ 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jdbc/Dictionary.java
@@ -20,7 +20,7 @@ import 
org.apache.batchee.container.impl.controller.PartitionedStepBuilder;
 import 
org.apache.batchee.container.services.persistence.jdbc.database.Database;
 
 public class Dictionary {
-    public static interface SQL { // needs to be kept aligned with JPA 
mapping, we can't use reflection to find fields since order can change between 
executions with java 7
+    public interface SQL { // needs to be kept aligned with JPA mapping, we 
can't use reflection to find fields since order can change between executions 
with java 7
         String CREATE_TABLE = "create table ";
         String INSERT_INTO = "insert into ";
         String SELECT = "select ";
@@ -45,6 +45,7 @@ public class Dictionary {
         String JOB_INSTANCE_COUNT = JOB_INSTANCE_COUNT_FROM_NAME + " and %s = 
?";
         String JOB_INSTANCE_IDS = SELECT + "%s" + FROM + "%s" + WHERE + "%s = 
? and %s = ? order by %s desc";
         String JOB_INSTANCE_IDS_FROM_NAME = SELECT + "%s" + FROM + "%s" + 
WHERE + " %s = ? order by %s desc";
+        String JOB_NAMES = SELECT + "distinct %s" + FROM + "%s" + WHERE + "%s 
not like '%s'";
         String EXTERNAL_JOB_INSTANCE = SELECT + "distinct %s, %s" + FROM + 
"%s" + WHERE + "%s not like '%s'";
         String JOB_INSTANCE_CREATE = INSERT_INTO + "%s" + "(%s, %s) VALUES(?, 
?)";
         String JOB_INSTANCE_CREATE_WITH_JOB_XML = INSERT_INTO + "%s" + "(%s, 
%s, %s) VALUES(?, ?, ?)";
@@ -112,6 +113,7 @@ public class Dictionary {
     private final String countJobInstanceByNameAndTag;
     private final String findJoBInstanceIds;
     private final String findJobInstanceIdsByName;
+    private final String findJobNames;
     private final String findExternalJobInstances;
     private final String createJobInstance;
     private final String createJobInstanceWithJobXml;
@@ -199,6 +201,7 @@ public class Dictionary {
             this.findJoBInstanceIds = String.format(SQL.JOB_INSTANCE_IDS, 
jobInstanceColumns[0], jobInstanceTable, jobInstanceColumns[3],
                     jobInstanceColumns[8], jobInstanceColumns[0]);
             this.findJobInstanceIdsByName = 
String.format(SQL.JOB_INSTANCE_IDS_FROM_NAME, jobInstanceColumns[0], 
jobInstanceTable, jobInstanceColumns[3], jobInstanceColumns[0]);
+            this.findJobNames = String.format(SQL.JOB_NAMES, 
jobInstanceColumns[3], jobInstanceTable, jobInstanceColumns[3], 
PartitionedStepBuilder.JOB_ID_SEPARATOR + "%");
             this.findExternalJobInstances = 
String.format(SQL.EXTERNAL_JOB_INSTANCE, jobInstanceColumns[0], 
jobInstanceColumns[3], jobInstanceTable,
                     jobInstanceColumns[3], 
PartitionedStepBuilder.JOB_ID_SEPARATOR + "%");
             this.createJobInstance = String.format(SQL.JOB_INSTANCE_CREATE, 
jobInstanceTable, jobInstanceColumns[3], jobInstanceColumns[8]);
@@ -365,6 +368,10 @@ public class Dictionary {
         return findExternalJobInstances;
     }
 
+    public String getFindJobNames() {
+        return findJobNames;
+    }
+
     public String getCreateJobInstance() {
         return createJobInstance;
     }

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jpa/domain/JobInstanceEntity.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jpa/domain/JobInstanceEntity.java
 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jpa/domain/JobInstanceEntity.java
index a4e8862..c005d5f 100644
--- 
a/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jpa/domain/JobInstanceEntity.java
+++ 
b/jbatch/src/main/java/org/apache/batchee/container/services/persistence/jpa/domain/JobInstanceEntity.java
@@ -39,6 +39,7 @@ import java.util.List;
     @NamedQuery(name = JobInstanceEntity.Queries.COUNT_BY_NAME, query = 
"select count(j) from JobInstanceEntity j where j.name = :name"),
     @NamedQuery(name = JobInstanceEntity.Queries.FIND_FROM_EXECUTION, query = 
"select j from JobInstanceEntity j inner join j.executions e where 
e.executionId = :executionId"),
     @NamedQuery(name = JobInstanceEntity.Queries.FIND_EXTERNALS, query = 
"select j from JobInstanceEntity j where j.name not like :pattern"),
+    @NamedQuery(name = JobInstanceEntity.Queries.FIND_JOBNAMES, query = 
"select distinct(j.name) from JobInstanceEntity j where j.name not like 
:pattern"),
     @NamedQuery(name = JobInstanceEntity.Queries.FIND_BY_NAME_AND_TAG, query = 
"select j from JobInstanceEntity j where j.name = :name and j.tag = :tag"),
     @NamedQuery(name = JobInstanceEntity.Queries.FIND_BY_NAME, query = "select 
j from JobInstanceEntity j where j.name = :name"),
     @NamedQuery(name = JobInstanceEntity.Queries.DELETE_BY_INSTANCE_ID, query 
= "delete from JobInstanceEntity e where e.jobInstanceId = :instanceId"),
@@ -48,12 +49,13 @@ import java.util.List;
 })
 @Table(name=JobInstanceEntity.TABLE_NAME)
 public class JobInstanceEntity {
-    public static interface Queries {
+    public interface Queries {
         String COUNT_BY_NAME_AND_TAG = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.countByNameAndTag";
         String COUNT_BY_NAME = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.countByName";
         String FIND_BY_NAME = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.findByName";
         String FIND_BY_NAME_AND_TAG = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.findByNameAndTag";
         String FIND_EXTERNALS = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.findExternals";
+        String FIND_JOBNAMES = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.findJobNames";
         String FIND_FROM_EXECUTION = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.findByExecution";
         String DELETE_BY_INSTANCE_ID = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.deleteFromInstanceId";
         String DELETE_BY_DATE = 
"org.apache.batchee.container.services.persistence.jpa.domain.JobInstanceEntity.deleteByDate";

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/container/services/security/DefaultSecurityService.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/container/services/security/DefaultSecurityService.java
 
b/jbatch/src/main/java/org/apache/batchee/container/services/security/DefaultSecurityService.java
index f827226..0ace389 100644
--- 
a/jbatch/src/main/java/org/apache/batchee/container/services/security/DefaultSecurityService.java
+++ 
b/jbatch/src/main/java/org/apache/batchee/container/services/security/DefaultSecurityService.java
@@ -35,6 +35,11 @@ public class DefaultSecurityService implements 
SecurityService {
     }
 
     @Override
+    public boolean isAuthorizedJobName(String jobName) {
+        return isDefaultUserAuthorized();
+    }
+
+    @Override
     public String getLoggedUser() {
         return defaultUser;
     }

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/container/services/security/JAASSecurityService.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/container/services/security/JAASSecurityService.java
 
b/jbatch/src/main/java/org/apache/batchee/container/services/security/JAASSecurityService.java
index 8891ae5..b97dea8 100644
--- 
a/jbatch/src/main/java/org/apache/batchee/container/services/security/JAASSecurityService.java
+++ 
b/jbatch/src/main/java/org/apache/batchee/container/services/security/JAASSecurityService.java
@@ -51,6 +51,11 @@ public class JAASSecurityService extends 
DefaultSecurityService {
     }
 
     @Override
+    public boolean isAuthorizedJobName(String jobName) {
+        return isAuthenticatedAndAuthorized("read");
+    }
+
+    @Override
     public String getLoggedUser() {
         final Subject subject = getSubject();
         if (subject != null) {

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/spi/PersistenceManagerService.java
----------------------------------------------------------------------
diff --git 
a/jbatch/src/main/java/org/apache/batchee/spi/PersistenceManagerService.java 
b/jbatch/src/main/java/org/apache/batchee/spi/PersistenceManagerService.java
index a50e10a..0613ea0 100755
--- a/jbatch/src/main/java/org/apache/batchee/spi/PersistenceManagerService.java
+++ b/jbatch/src/main/java/org/apache/batchee/spi/PersistenceManagerService.java
@@ -49,6 +49,11 @@ public interface PersistenceManagerService extends 
BatchService {
 
     int jobOperatorGetJobInstanceCount(String jobName, String appTag);
 
+    Set<String> getJobNames();
+
+    /**
+     * @deprecated replaced by {@link #getJobNames()} 
+     */
     Map<Long, String> jobOperatorGetExternalJobInstanceData();
 
     List<Long> jobOperatorGetJobInstanceIds(String jobName, int start, int 
count);

http://git-wip-us.apache.org/repos/asf/incubator-batchee/blob/8f61b727/jbatch/src/main/java/org/apache/batchee/spi/SecurityService.java
----------------------------------------------------------------------
diff --git a/jbatch/src/main/java/org/apache/batchee/spi/SecurityService.java 
b/jbatch/src/main/java/org/apache/batchee/spi/SecurityService.java
index cc9623f..c32dbdf 100644
--- a/jbatch/src/main/java/org/apache/batchee/spi/SecurityService.java
+++ b/jbatch/src/main/java/org/apache/batchee/spi/SecurityService.java
@@ -21,6 +21,12 @@ public interface SecurityService extends BatchService {
     boolean isAuthorized(String perm);
 
     /**
+     * @return whether the current user is allowed to see the given jobName
+     * @see javax.batch.operations.JobOperator#getJobNames()
+     */
+    boolean isAuthorizedJobName(String jobName);
+
+    /**
      * @return logged user if exists or a default name for anonymous launches
      */
     String getLoggedUser();

Reply via email to