diff --git a/common/src/main/java/org/apache/sqoop/json/ConnectionBean.java b/common/src/main/java/org/apache/sqoop/json/ConnectionBean.java
index a014ddd1..688bb646 100644
--- a/common/src/main/java/org/apache/sqoop/json/ConnectionBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/ConnectionBean.java
@@ -104,9 +104,11 @@ public JSONObject extract(boolean skipSensitive) {
object.put(ID, connection.getPersistenceId());
object.put(NAME, connection.getName());
- object.put(CREATED, connection.getCreationDate().getTime());
- object.put(UPDATED, connection.getLastUpdateDate().getTime());
object.put(ENABLED, connection.getEnabled());
+ object.put(CREATION_USER, connection.getCreationUser());
+ object.put(CREATION_DATE, connection.getCreationDate().getTime());
+ object.put(UPDATE_USER, connection.getLastUpdateUser());
+ object.put(UPDATE_DATE, connection.getLastUpdateDate().getTime());
object.put(CONNECTOR_ID, connection.getConnectorId());
object.put(CONNECTOR_PART,
extractForms(connection.getConnectorPart().getForms(), skipSensitive));
@@ -158,9 +160,11 @@ public void restore(JSONObject jsonObject) {
connection.setPersistenceId((Long) object.get(ID));
connection.setName((String) object.get(NAME));
- connection.setCreationDate(new Date((Long) object.get(CREATED)));
- connection.setLastUpdateDate(new Date((Long) object.get(UPDATED)));
connection.setEnabled((Boolean) object.get(ENABLED));
+ connection.setCreationUser((String) object.get(CREATION_USER));
+ connection.setCreationDate(new Date((Long) object.get(CREATION_DATE)));
+ connection.setLastUpdateUser((String) object.get(UPDATE_USER));
+ connection.setLastUpdateDate(new Date((Long) object.get(UPDATE_DATE)));
connections.add(connection);
}
diff --git a/common/src/main/java/org/apache/sqoop/json/JobBean.java b/common/src/main/java/org/apache/sqoop/json/JobBean.java
index 46857977..1555bd5d 100644
--- a/common/src/main/java/org/apache/sqoop/json/JobBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/JobBean.java
@@ -107,9 +107,11 @@ public JSONObject extract(boolean skipSensitive) {
object.put(ID, job.getPersistenceId());
object.put(NAME, job.getName());
object.put(TYPE, job.getType().name());
- object.put(CREATED, job.getCreationDate().getTime());
- object.put(UPDATED, job.getLastUpdateDate().getTime());
object.put(ENABLED, job.getEnabled());
+ object.put(CREATION_USER, job.getCreationUser());
+ object.put(CREATION_DATE, job.getCreationDate().getTime());
+ object.put(UPDATE_USER, job.getLastUpdateUser());
+ object.put(UPDATE_DATE, job.getLastUpdateDate().getTime());
object.put(CONNECTION_ID, job.getConnectionId());
object.put(CONNECTOR_ID, job.getConnectorId());
object.put(CONNECTOR_PART,
@@ -170,9 +172,11 @@ public void restore(JSONObject jsonObject) {
job.setPersistenceId((Long) object.get(ID));
job.setName((String) object.get(NAME));
- job.setCreationDate(new Date((Long) object.get(CREATED)));
- job.setLastUpdateDate(new Date((Long) object.get(UPDATED)));
job.setEnabled((Boolean) object.get(ENABLED));
+ job.setCreationUser((String) object.get(CREATION_USER));
+ job.setCreationDate(new Date((Long) object.get(CREATION_DATE)));
+ job.setLastUpdateUser((String) object.get(UPDATE_USER));
+ job.setLastUpdateDate(new Date((Long) object.get(UPDATE_DATE)));
jobs.add(job);
}
diff --git a/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java b/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java
index 79490f80..61d65767 100644
--- a/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java
+++ b/common/src/main/java/org/apache/sqoop/json/SubmissionBean.java
@@ -41,7 +41,9 @@ public class SubmissionBean implements JsonBean {
private static final String ALL = "all";
private static final String JOB = "job";
+ private static final String CREATION_USER = "creation-user";
private static final String CREATION_DATE = "creation-date";
+ private static final String LAST_UPDATE_USER = "last-udpate-user";
private static final String LAST_UPDATE_DATE = "last-update-date";
private static final String STATUS = "status";
private static final String EXTERNAL_ID = "external-id";
@@ -87,9 +89,15 @@ public JSONObject extract(boolean skipSensitive) {
object.put(STATUS, submission.getStatus().name());
object.put(PROGRESS, submission.getProgress());
+ if(submission.getCreationUser() != null) {
+ object.put(CREATION_USER, submission.getCreationUser());
+ }
if(submission.getCreationDate() != null) {
object.put(CREATION_DATE, submission.getCreationDate().getTime());
}
+ if(submission.getLastUpdateUser() != null) {
+ object.put(LAST_UPDATE_USER, submission.getLastUpdateUser());
+ }
if(submission.getLastUpdateDate() != null) {
object.put(LAST_UPDATE_DATE, submission.getLastUpdateDate().getTime());
}
@@ -153,9 +161,15 @@ public void restore(JSONObject json) {
submission.setStatus(SubmissionStatus.valueOf((String) object.get(STATUS)));
submission.setProgress((Double) object.get(PROGRESS));
+ if(object.containsKey(CREATION_USER)) {
+ submission.setCreationUser((String) object.get(CREATION_USER));
+ }
if(object.containsKey(CREATION_DATE)) {
submission.setCreationDate(new Date((Long) object.get(CREATION_DATE)));
}
+ if(object.containsKey(LAST_UPDATE_USER)) {
+ submission.setLastUpdateUser((String) object.get(LAST_UPDATE_USER));
+ }
if(object.containsKey(LAST_UPDATE_DATE)) {
submission.setLastUpdateDate(new Date((Long) object.get(LAST_UPDATE_DATE)));
}
diff --git a/common/src/main/java/org/apache/sqoop/json/util/FormSerialization.java b/common/src/main/java/org/apache/sqoop/json/util/FormSerialization.java
index 3daf8d2e..95589411 100644
--- a/common/src/main/java/org/apache/sqoop/json/util/FormSerialization.java
+++ b/common/src/main/java/org/apache/sqoop/json/util/FormSerialization.java
@@ -46,9 +46,11 @@ public final class FormSerialization {
public static final String VERSION = "version";
public static final String FRAMEWORK_VERSION = "framework-version";
public static final String CLASS = "class";
- public static final String CREATED = "created";
- public static final String UPDATED = "updated";
public static final String ENABLED = "enabled";
+ public static final String CREATION_USER = "creation-user";
+ public static final String CREATION_DATE = "creation-date";
+ public static final String UPDATE_USER = "update-user";
+ public static final String UPDATE_DATE = "update-date";
public static final String CON_FORMS = "con-forms";
public static final String JOB_FORMS = "job-forms";
diff --git a/common/src/main/java/org/apache/sqoop/model/MAccountableEntity.java b/common/src/main/java/org/apache/sqoop/model/MAccountableEntity.java
index 55249831..8af7c15d 100644
--- a/common/src/main/java/org/apache/sqoop/model/MAccountableEntity.java
+++ b/common/src/main/java/org/apache/sqoop/model/MAccountableEntity.java
@@ -27,11 +27,21 @@ abstract public class MAccountableEntity extends MPersistableEntity {
private final boolean DEFAULT_ENABLED = true;
+ /**
+ * The user who creates the entity
+ */
+ private String creationUser;
+
/**
* Date when the entity was created.
*/
private Date creationDate;
+ /**
+ * The user who lastly updates the entity
+ */
+ private String lastUpdateUser;
+
/**
* Date when the entity was lastly updated.
*/
@@ -43,11 +53,21 @@ abstract public class MAccountableEntity extends MPersistableEntity {
private boolean enabled;
public MAccountableEntity() {
+ this.creationUser = null;
this.creationDate = new Date();
+ this.lastUpdateUser = this.creationUser;
this.lastUpdateDate = this.creationDate;
this.enabled = DEFAULT_ENABLED;
}
+ public void setCreationUser(String name) {
+ this.creationUser = name;
+ }
+
+ public String getCreationUser() {
+ return creationUser;
+ }
+
public void setCreationDate(Date createDate) {
this.creationDate = createDate;
}
@@ -56,6 +76,14 @@ public Date getCreationDate() {
return creationDate;
}
+ public void setLastUpdateUser(String name) {
+ this.lastUpdateUser = name;
+ }
+
+ public String getLastUpdateUser() {
+ return lastUpdateUser;
+ }
+
public void setLastUpdateDate(Date lastUpdateDate) {
this.lastUpdateDate = lastUpdateDate;
}
diff --git a/common/src/test/java/org/apache/sqoop/json/TestConnectionBean.java b/common/src/test/java/org/apache/sqoop/json/TestConnectionBean.java
index 2f2b974c..19f81a83 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestConnectionBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestConnectionBean.java
@@ -41,7 +41,9 @@ public void testSerialization() {
MConnection connection = getConnection("ahoj");
connection.setName("Connection");
connection.setPersistenceId(666);
+ connection.setCreationUser("admin");
connection.setCreationDate(created);
+ connection.setLastUpdateUser("user");
connection.setLastUpdateDate(updated);
connection.setEnabled(false);
@@ -76,7 +78,9 @@ public void testSerialization() {
// Check id and name
assertEquals(666, target.getPersistenceId());
assertEquals("Connection", target.getName());
+ assertEquals("admin", target.getCreationUser());
assertEquals(created, target.getCreationDate());
+ assertEquals("user", target.getLastUpdateUser());
assertEquals(updated, target.getLastUpdateDate());
assertEquals(false, target.getEnabled());
@@ -93,7 +97,9 @@ public void testSensitivityFilter() {
MConnection connection = getConnection("ahoj");
connection.setName("Connection");
connection.setPersistenceId(666);
+ connection.setCreationUser("admin");
connection.setCreationDate(created);
+ connection.setLastUpdateUser("user");
connection.setLastUpdateDate(updated);
connection.setEnabled(true);
diff --git a/common/src/test/java/org/apache/sqoop/json/TestSubmissionBean.java b/common/src/test/java/org/apache/sqoop/json/TestSubmissionBean.java
index 3b561713..d87655eb 100644
--- a/common/src/test/java/org/apache/sqoop/json/TestSubmissionBean.java
+++ b/common/src/test/java/org/apache/sqoop/json/TestSubmissionBean.java
@@ -69,6 +69,29 @@ public void testTransferJobId() {
assertEquals(888, targets.get(1).getJobId());
}
+ public void testTransferCreationUser() {
+ String username = "admin";
+ MSubmission source = new MSubmission();
+ source.setCreationUser(username);
+
+ MSubmission target = transfer(source);
+ assertEquals("admin", target.getCreationUser());
+
+ List
* SQ_CONNECTION: Stored connections
*
- * +------------------------------+
- * | SQ_CONNECTION |
- * +------------------------------+
- * | SQN_ID: BIGINT PK AUTO-GEN |
- * | SQN_NAME: VARCHAR(64) |
- * | SQN_CONNECTOR: BIGINT | FK SQ_CONNECTOR(SQC_ID)
- * | SQN_CREATION_DATE: TIMESTAMP |
- * | SQN_UPDATE_DATE: TIMESTAMP |
- * | SQN_ENABLED: BOOLEAN |
- * +------------------------------+
+ * +--------------------------------+
+ * | SQ_CONNECTION |
+ * +--------------------------------+
+ * | SQN_ID: BIGINT PK AUTO-GEN |
+ * | SQN_NAME: VARCHAR(64) |
+ * | SQN_CONNECTOR: BIGINT | FK SQ_CONNECTOR(SQC_ID)
+ * | SQN_CREATION_USER: VARCHAR(32) |
+ * | SQN_CREATION_DATE: TIMESTAMP |
+ * | SQN_UPDATE_USER: VARCHAR(32) |
+ * | SQN_UPDATE_DATE: TIMESTAMP |
+ * | SQN_ENABLED: BOOLEAN |
+ * +--------------------------------+
*
*
* SQ_JOB: Stored jobs *
- * +------------------------------+ - * | SQ_JOB | - * +------------------------------+ - * | SQB_ID: BIGINT PK AUTO-GEN | - * | SQB_NAME: VARCHAR(64) | - * | SQB_TYPE: VARCHAR(64) | - * | SQB_CONNECTION: BIGINT | FK SQ_CONNECTION(SQN_ID) - * | SQB_CREATION_DATE: TIMESTAMP | - * | SQB_UPDATE_DATE: TIMESTAMP | - * | SQB_ENABLED: BOOLEAN | - * +------------------------------+ + * +--------------------------------+ + * | SQ_JOB | + * +--------------------------------+ + * | SQB_ID: BIGINT PK AUTO-GEN | + * | SQB_NAME: VARCHAR(64) | + * | SQB_TYPE: VARCHAR(64) | + * | SQB_CONNECTION: BIGINT | FK SQ_CONNECTION(SQN_ID) + * | SQB_CREATION_USER: VARCHAR(32) | + * | SQB_CREATION_DATE: TIMESTAMP | + * | SQB_UPDATE_USER: VARCHAR(32) | + * | SQB_UPDATE_DATE: TIMESTAMP | + * | SQB_ENABLED: BOOLEAN | + * +--------------------------------+ ** *
@@ -143,7 +147,9 @@ * | SQS_ID: BIGINT PK | * | SQS_JOB: BIGINT | FK SQ_JOB(SQB_ID) * | SQS_STATUS: VARCHAR(20) | + * | SQS_CREATION_USER: VARCHAR(32) | * | SQS_CREATION_DATE: TIMESTAMP | + * | SQS_UPDATE_USER: VARCHAR(32) | * | SQS_UPDATE_DATE: TIMESTAMP | * | SQS_EXTERNAL_ID: VARCHAR(25) | * | SQS_EXTERNAL_LINK: VARCHAR(150) | @@ -264,6 +270,18 @@ public final class DerbySchemaQuery { + COLUMN_SQN_ENABLED + " BOOLEAN " + "DEFAULT TRUE"; + // DDL: Add creation_user column to table SQ_CONNECTION + public static final String QUERY_UPGRADE_TABLE_SQ_CONNECTION_ADD_COLUMN_CREATION_USER = + "ALTER TABLE " + TABLE_SQ_CONNECTION + " ADD " + + COLUMN_SQN_CREATION_USER + " VARCHAR(32) " + + "DEFAULT NULL"; + + // DDL: Add update_user column to table SQ_CONNECTION + public static final String QUERY_UPGRADE_TABLE_SQ_CONNECTION_ADD_COLUMN_UPDATE_USER = + "ALTER TABLE " + TABLE_SQ_CONNECTION + " ADD " + + COLUMN_SQN_UPDATE_USER + " VARCHAR(32) " + + "DEFAULT NULL"; + // DDL: Create table SQ_JOB public static final String QUERY_CREATE_TABLE_SQ_JOB = "CREATE TABLE " + TABLE_SQ_JOB + " (" @@ -284,6 +302,18 @@ public final class DerbySchemaQuery { + COLUMN_SQB_ENABLED + " BOOLEAN " + "DEFAULT TRUE"; + // DDL: Add creation_user column to table SQ_JOB + public static final String QUERY_UPGRADE_TABLE_SQ_JOB_ADD_COLUMN_CREATION_USER = + "ALTER TABLE " + TABLE_SQ_JOB + " ADD " + + COLUMN_SQB_CREATION_USER + " VARCHAR(32) " + + "DEFAULT NULL"; + + // DDL: Add update_user column to table SQ_JOB + public static final String QUERY_UPGRADE_TABLE_SQ_JOB_ADD_COLUMN_UPDATE_USER = + "ALTER TABLE " + TABLE_SQ_JOB + " ADD " + + COLUMN_SQB_UPDATE_USER + " VARCHAR(32) " + + "DEFAULT NULL"; + // DDL: Create table SQ_CONNECTION_INPUT public static final String QUERY_CREATE_TABLE_SQ_CONNECTION_INPUT = "CREATE TABLE " + TABLE_SQ_CONNECTION_INPUT + " (" @@ -332,6 +362,18 @@ public final class DerbySchemaQuery { + "REFERENCES " + TABLE_SQ_JOB + "(" + COLUMN_SQB_ID + ") ON DELETE CASCADE" + ")"; + // DDL: Add creation_user column to table SQ_SUBMISSION + public static final String QUERY_UPGRADE_TABLE_SQ_SUBMISSION_ADD_COLUMN_CREATION_USER = + "ALTER TABLE " + TABLE_SQ_SUBMISSION + " ADD " + + COLUMN_SQS_CREATION_USER + " VARCHAR(32) " + + "DEFAULT NULL"; + + // DDL: Add update_user column to table SQ_SUBMISSION + public static final String QUERY_UPGRADE_TABLE_SQ_SUBMISSION_ADD_COLUMN_UPDATE_USER = + "ALTER TABLE " + TABLE_SQ_SUBMISSION + " ADD " + + COLUMN_SQS_UPDATE_USER + " VARCHAR(32) " + + "DEFAULT NULL"; + // DDL: Create table SQ_COUNTER_GROUP public static final String QUERY_CREATE_TABLE_SQ_COUNTER_GROUP = "CREATE TABLE " + TABLE_SQ_COUNTER_GROUP + " (" @@ -558,10 +600,12 @@ public final class DerbySchemaQuery { "INSERT INTO " + TABLE_SQ_CONNECTION + " (" + COLUMN_SQN_NAME + ", " + COLUMN_SQN_CONNECTOR + ", " + + COLUMN_SQN_ENABLED + ", " + + COLUMN_SQN_CREATION_USER + ", " + COLUMN_SQN_CREATION_DATE + ", " - + COLUMN_SQN_UPDATE_DATE + ", " - + COLUMN_SQN_ENABLED - + ") VALUES (?, ?, ?, ?, ?)"; + + COLUMN_SQN_UPDATE_USER + ", " + + COLUMN_SQN_UPDATE_DATE + + ") VALUES (?, ?, ?, ?, ?, ?, ?)"; // DML: Insert new connection inputs public static final String STMT_INSERT_CONNECTION_INPUT = @@ -575,6 +619,7 @@ public final class DerbySchemaQuery { public static final String STMT_UPDATE_CONNECTION = "UPDATE " + TABLE_SQ_CONNECTION + " SET " + COLUMN_SQN_NAME + " = ?, " + + COLUMN_SQN_UPDATE_USER + " = ?, " + COLUMN_SQN_UPDATE_DATE + " = ? " + " WHERE " + COLUMN_SQN_ID + " = ?"; @@ -600,9 +645,11 @@ public final class DerbySchemaQuery { + COLUMN_SQN_ID + ", " + COLUMN_SQN_NAME + ", " + COLUMN_SQN_CONNECTOR + ", " + + COLUMN_SQN_ENABLED + ", " + + COLUMN_SQN_CREATION_USER + ", " + COLUMN_SQN_CREATION_DATE + ", " - + COLUMN_SQN_UPDATE_DATE + ", " - + COLUMN_SQN_ENABLED + + COLUMN_SQN_UPDATE_USER + ", " + + COLUMN_SQN_UPDATE_DATE + " FROM " + TABLE_SQ_CONNECTION + " WHERE " + COLUMN_SQN_ID + " = ?"; @@ -612,9 +659,11 @@ public final class DerbySchemaQuery { + COLUMN_SQN_ID + ", " + COLUMN_SQN_NAME + ", " + COLUMN_SQN_CONNECTOR + ", " + + COLUMN_SQN_ENABLED + ", " + + COLUMN_SQN_CREATION_USER + ", " + COLUMN_SQN_CREATION_DATE + ", " - + COLUMN_SQN_UPDATE_DATE + ", " - + COLUMN_SQN_ENABLED + + COLUMN_SQN_UPDATE_USER + ", " + + COLUMN_SQN_UPDATE_DATE + " FROM " + TABLE_SQ_CONNECTION; // DML: Select all connections for a specific connector. @@ -623,9 +672,11 @@ public final class DerbySchemaQuery { + COLUMN_SQN_ID + ", " + COLUMN_SQN_NAME + ", " + COLUMN_SQN_CONNECTOR + ", " + + COLUMN_SQN_CREATION_USER + ", " + COLUMN_SQN_CREATION_DATE + ", " - + COLUMN_SQN_UPDATE_DATE + ", " - + COLUMN_SQN_ENABLED + + COLUMN_SQN_ENABLED + ", " + + COLUMN_SQN_UPDATE_USER + ", " + + COLUMN_SQN_UPDATE_DATE + " FROM " + TABLE_SQ_CONNECTION + " WHERE " + COLUMN_SQN_CONNECTOR + " = ?"; @@ -640,10 +691,12 @@ public final class DerbySchemaQuery { + COLUMN_SQB_NAME + ", " + COLUMN_SQB_CONNECTION + ", " + COLUMN_SQB_TYPE + ", " + + COLUMN_SQB_ENABLED + ", " + + COLUMN_SQB_CREATION_USER + ", " + COLUMN_SQB_CREATION_DATE + ", " - + COLUMN_SQB_UPDATE_DATE + ", " - + COLUMN_SQB_ENABLED - + ") VALUES (?, ?, ?, ?, ?, ?)"; + + COLUMN_SQB_UPDATE_USER + ", " + + COLUMN_SQB_UPDATE_DATE + + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; // DML: Insert new job inputs public static final String STMT_INSERT_JOB_INPUT = @@ -656,6 +709,7 @@ public final class DerbySchemaQuery { public static final String STMT_UPDATE_JOB = "UPDATE " + TABLE_SQ_JOB + " SET " + COLUMN_SQB_NAME + " = ?, " + + COLUMN_SQB_UPDATE_USER + " = ?, " + COLUMN_SQB_UPDATE_DATE + " = ? " + " WHERE " + COLUMN_SQB_ID + " = ?"; @@ -697,9 +751,11 @@ public final class DerbySchemaQuery { + COLUMN_SQB_NAME + ", " + COLUMN_SQB_CONNECTION + ", " + COLUMN_SQB_TYPE + ", " + + COLUMN_SQB_ENABLED + ", " + + COLUMN_SQB_CREATION_USER + ", " + COLUMN_SQB_CREATION_DATE + ", " - + COLUMN_SQB_UPDATE_DATE + ", " - + COLUMN_SQB_ENABLED + + COLUMN_SQB_UPDATE_USER + ", " + + COLUMN_SQB_UPDATE_DATE + " FROM " + TABLE_SQ_JOB + " LEFT JOIN " + TABLE_SQ_CONNECTION + " ON " + COLUMN_SQB_CONNECTION + " = " + COLUMN_SQN_ID @@ -713,9 +769,11 @@ public final class DerbySchemaQuery { + COLUMN_SQB_NAME + ", " + COLUMN_SQB_CONNECTION + ", " + COLUMN_SQB_TYPE + ", " + + COLUMN_SQB_ENABLED + ", " + + COLUMN_SQB_CREATION_USER + ", " + COLUMN_SQB_CREATION_DATE + ", " - + COLUMN_SQB_UPDATE_DATE + ", " - + COLUMN_SQB_ENABLED + + COLUMN_SQB_UPDATE_USER + ", " + + COLUMN_SQB_UPDATE_DATE + " FROM " + TABLE_SQ_JOB + " LEFT JOIN " + TABLE_SQ_CONNECTION + " ON " + COLUMN_SQB_CONNECTION + " = " + COLUMN_SQN_ID; @@ -728,9 +786,11 @@ public final class DerbySchemaQuery { + COLUMN_SQB_NAME + ", " + COLUMN_SQB_CONNECTION + ", " + COLUMN_SQB_TYPE + ", " + + COLUMN_SQB_ENABLED + ", " + + COLUMN_SQB_CREATION_USER + ", " + COLUMN_SQB_CREATION_DATE + ", " - + COLUMN_SQB_UPDATE_DATE + ", " - + COLUMN_SQB_ENABLED + + COLUMN_SQB_UPDATE_USER + ", " + + COLUMN_SQB_UPDATE_DATE + " FROM " + TABLE_SQ_JOB + " LEFT JOIN " + TABLE_SQ_CONNECTION + " ON " + COLUMN_SQB_CONNECTION + " = " + COLUMN_SQN_ID @@ -741,18 +801,21 @@ public final class DerbySchemaQuery { "INSERT INTO " + TABLE_SQ_SUBMISSION + "(" + COLUMN_SQS_JOB + ", " + COLUMN_SQS_STATUS + ", " + + COLUMN_SQS_CREATION_USER + ", " + COLUMN_SQS_CREATION_DATE + ", " + + COLUMN_SQS_UPDATE_USER + ", " + COLUMN_SQS_UPDATE_DATE + ", " + COLUMN_SQS_EXTERNAL_ID + ", " + COLUMN_SQS_EXTERNAL_LINK + ", " + COLUMN_SQS_EXCEPTION + ", " + COLUMN_SQS_EXCEPTION_TRACE + ") " - + " VALUES(?, ?, ?, ?, ?, substr(?, 1, 150) , substr(?, 1, 150), substr(?, 1, 750))"; + + " VALUES(?, ?, ?, ?, ?, ?, ?, substr(?, 1, 150) , substr(?, 1, 150), substr(?, 1, 750))"; // DML: Update existing submission public static final String STMT_UPDATE_SUBMISSION = "UPDATE " + TABLE_SQ_SUBMISSION + " SET " + COLUMN_SQS_STATUS + " = ?, " + + COLUMN_SQS_UPDATE_USER + " = ?, " + COLUMN_SQS_UPDATE_DATE + " = ?, " + COLUMN_SQS_EXCEPTION + " = ?, " + COLUMN_SQS_EXCEPTION_TRACE + " = ?" @@ -776,7 +839,9 @@ public final class DerbySchemaQuery { + COLUMN_SQS_ID + ", " + COLUMN_SQS_JOB + ", " + COLUMN_SQS_STATUS + ", " + + COLUMN_SQS_CREATION_USER + ", " + COLUMN_SQS_CREATION_DATE + ", " + + COLUMN_SQS_UPDATE_USER + ", " + COLUMN_SQS_UPDATE_DATE + ", " + COLUMN_SQS_EXTERNAL_ID + ", " + COLUMN_SQS_EXTERNAL_LINK + ", " @@ -791,7 +856,9 @@ public final class DerbySchemaQuery { + COLUMN_SQS_ID + ", " + COLUMN_SQS_JOB + ", " + COLUMN_SQS_STATUS + ", " + + COLUMN_SQS_CREATION_USER + ", " + COLUMN_SQS_CREATION_DATE + ", " + + COLUMN_SQS_UPDATE_USER + ", " + COLUMN_SQS_UPDATE_DATE + ", " + COLUMN_SQS_EXTERNAL_ID + ", " + COLUMN_SQS_EXTERNAL_LINK + ", " @@ -806,7 +873,9 @@ public final class DerbySchemaQuery { + COLUMN_SQS_ID + ", " + COLUMN_SQS_JOB + ", " + COLUMN_SQS_STATUS + ", " + + COLUMN_SQS_CREATION_USER + ", " + COLUMN_SQS_CREATION_DATE + ", " + + COLUMN_SQS_UPDATE_USER + ", " + COLUMN_SQS_UPDATE_DATE + ", " + COLUMN_SQS_EXTERNAL_ID + ", " + COLUMN_SQS_EXTERNAL_LINK + ", " diff --git a/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/DerbyTestCase.java b/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/DerbyTestCase.java index eac87b86..8a5aee88 100644 --- a/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/DerbyTestCase.java +++ b/repository/repository-derby/src/test/java/org/apache/sqoop/repository/derby/DerbyTestCase.java @@ -102,6 +102,12 @@ protected void createSchema() throws Exception { runQuery(QUERY_CREATE_TABLE_SQ_SYSTEM); runQuery(QUERY_UPGRADE_TABLE_SQ_CONNECTION_ADD_COLUMN_ENABLED); runQuery(QUERY_UPGRADE_TABLE_SQ_JOB_ADD_COLUMN_ENABLED); + runQuery(QUERY_UPGRADE_TABLE_SQ_CONNECTION_ADD_COLUMN_CREATION_USER); + runQuery(QUERY_UPGRADE_TABLE_SQ_CONNECTION_ADD_COLUMN_UPDATE_USER); + runQuery(QUERY_UPGRADE_TABLE_SQ_JOB_ADD_COLUMN_CREATION_USER); + runQuery(QUERY_UPGRADE_TABLE_SQ_JOB_ADD_COLUMN_UPDATE_USER); + runQuery(QUERY_UPGRADE_TABLE_SQ_SUBMISSION_ADD_COLUMN_CREATION_USER); + runQuery(QUERY_UPGRADE_TABLE_SQ_SUBMISSION_ADD_COLUMN_UPDATE_USER); runQuery("INSERT INTO SQOOP.SQ_SYSTEM(SQM_KEY, SQM_VALUE) VALUES('version', '2')"); runQuery("INSERT INTO SQOOP.SQ_SYSTEM(SQM_KEY, SQM_VALUE) " + "VALUES('framework.version', '1')"); diff --git a/server/src/main/java/org/apache/sqoop/handler/ConnectionRequestHandler.java b/server/src/main/java/org/apache/sqoop/handler/ConnectionRequestHandler.java index 875729fa..c9c7648e 100644 --- a/server/src/main/java/org/apache/sqoop/handler/ConnectionRequestHandler.java +++ b/server/src/main/java/org/apache/sqoop/handler/ConnectionRequestHandler.java @@ -138,11 +138,14 @@ private JsonBean createUpdateConnection(RequestContext ctx, boolean update) { // String sxid = ctx.getLastURLElement(); // long xid = Long.valueOf(sxid); + String username = ctx.getUserName(); + ConnectionBean bean = new ConnectionBean(); try { JSONObject json = (JSONObject) JSONValue.parse(ctx.getRequest().getReader()); + bean.restore(json); } catch (IOException e) { throw new SqoopException(ServerError.SERVER_0003, @@ -211,8 +214,11 @@ private JsonBean createUpdateConnection(RequestContext ctx, boolean update) { .logAuditEvent(ctx.getUserName(), ctx.getRequest().getRemoteAddr(), "update", "connection", String.valueOf(connection.getPersistenceId())); + connection.setLastUpdateUser(username); RepositoryManager.getInstance().getRepository().updateConnection(connection); } else { + connection.setCreationUser(username); + connection.setLastUpdateUser(username); RepositoryManager.getInstance().getRepository().createConnection(connection); outputBean.setId(connection.getPersistenceId()); diff --git a/server/src/main/java/org/apache/sqoop/handler/JobRequestHandler.java b/server/src/main/java/org/apache/sqoop/handler/JobRequestHandler.java index 59a45118..362ba79e 100644 --- a/server/src/main/java/org/apache/sqoop/handler/JobRequestHandler.java +++ b/server/src/main/java/org/apache/sqoop/handler/JobRequestHandler.java @@ -138,6 +138,8 @@ private JsonBean createUpdateJob(RequestContext ctx, boolean update) { // String sxid = ctx.getLastURLElement(); // long xid = Long.valueOf(sxid); + String username = ctx.getUserName(); + JobBean bean = new JobBean(); try { @@ -210,8 +212,11 @@ private JsonBean createUpdateJob(RequestContext ctx, boolean update) { .logAuditEvent(ctx.getUserName(), ctx.getRequest().getRemoteAddr(), "update", "job", String.valueOf(job.getPersistenceId())); + job.setLastUpdateUser(username); RepositoryManager.getInstance().getRepository().updateJob(job); } else { + job.setCreationUser(username); + job.setLastUpdateUser(username); RepositoryManager.getInstance().getRepository().createJob(job); outputBean.setId(job.getPersistenceId()); diff --git a/server/src/main/java/org/apache/sqoop/handler/SubmissionRequestHandler.java b/server/src/main/java/org/apache/sqoop/handler/SubmissionRequestHandler.java index 6d9777a6..6e21dd90 100644 --- a/server/src/main/java/org/apache/sqoop/handler/SubmissionRequestHandler.java +++ b/server/src/main/java/org/apache/sqoop/handler/SubmissionRequestHandler.java @@ -28,6 +28,7 @@ import org.apache.sqoop.json.SubmissionBean; import org.apache.sqoop.model.MSubmission; import org.apache.sqoop.repository.RepositoryManager; +import org.apache.sqoop.request.HttpEventContext; import org.apache.sqoop.server.RequestContext; import org.apache.sqoop.server.RequestHandler; import org.apache.sqoop.server.common.ServerError; @@ -95,6 +96,10 @@ private JsonBean handleNotification(RequestContext ctx, String sjid) { private JsonBean handleActionEvent(RequestContext ctx, String sjid) { long jid = Long.parseLong(sjid); + String username = ctx.getUserName(); + HttpEventContext ectx = new HttpEventContext(); + ectx.setUsername(username); + switch (ctx.getMethod()) { case GET: AuditLoggerManager.getInstance() @@ -114,13 +119,13 @@ private JsonBean handleActionEvent(RequestContext ctx, String sjid) { .logAuditEvent(ctx.getUserName(), ctx.getRequest().getRemoteAddr(), "submit", "submission", String.valueOf(jid)); - return submissionSubmit(jid); + return submissionSubmit(jid, ectx); case DELETE: AuditLoggerManager.getInstance() .logAuditEvent(ctx.getUserName(), ctx.getRequest().getRemoteAddr(), "stop", "submission", String.valueOf(jid)); - return submissionStop(jid); + return submissionStop(jid, ectx); } return null; @@ -138,13 +143,13 @@ private JsonBean handleHistoryEvent(RequestContext ctx, String sjid) { } } - private JsonBean submissionStop(long jid) { - MSubmission submission = JobManager.getInstance().stop(jid); + private JsonBean submissionStop(long jid, HttpEventContext ctx) { + MSubmission submission = JobManager.getInstance().stop(jid, ctx); return new SubmissionBean(submission); } - private JsonBean submissionSubmit(long jid) { - MSubmission submission = JobManager.getInstance().submit(jid); + private JsonBean submissionSubmit(long jid, HttpEventContext ctx) { + MSubmission submission = JobManager.getInstance().submit(jid, ctx); return new SubmissionBean(submission); } diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java index b7204ffe..b55d5d11 100644 --- a/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java +++ b/shell/src/main/java/org/apache/sqoop/shell/ShowConnectionFunction.java @@ -107,7 +107,9 @@ private void displayConnection(MConnection connection) { connection.getPersistenceId(), connection.getName(), connection.getEnabled(), + connection.getCreationUser(), formatter.format(connection.getCreationDate()), + connection.getLastUpdateUser(), formatter.format(connection.getLastUpdateDate()) ); diff --git a/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java b/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java index fc6f4162..da4a4ff3 100644 --- a/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java +++ b/shell/src/main/java/org/apache/sqoop/shell/ShowJobFunction.java @@ -109,7 +109,9 @@ private void displayJob(MJob job) { job.getPersistenceId(), job.getName(), job.getEnabled(), + job.getCreationUser(), formatter.format(job.getCreationDate()), + job.getLastUpdateUser(), formatter.format(job.getLastUpdateDate()) ); printlnResource(Constants.RES_SHOW_PROMPT_JOB_XID_CID_INFO, diff --git a/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java b/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java index 0e33d420..475f41c3 100644 --- a/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java +++ b/shell/src/main/java/org/apache/sqoop/shell/core/Constants.java @@ -428,8 +428,12 @@ public class Constants { "submission.submission_detail"; public static final String RES_SUBMISSION_JOB_ID = "submission.job_id"; + public static final String RES_SUBMISSION_CREATION_USER = + "submission.creation_user"; public static final String RES_SUBMISSION_CREATION_DATE = "submission.creation_date"; + public static final String RES_SUBMISSION_UPDATE_USER = + "submission.update_user"; public static final String RES_SUBMISSION_EXTERNAL_ID = "submission.external_id"; public static final String RES_SUBMISSION_PROGRESS_NOT_AVAIL = diff --git a/shell/src/main/java/org/apache/sqoop/shell/utils/SubmissionDisplayer.java b/shell/src/main/java/org/apache/sqoop/shell/utils/SubmissionDisplayer.java index 1f61fb20..6dbd870b 100644 --- a/shell/src/main/java/org/apache/sqoop/shell/utils/SubmissionDisplayer.java +++ b/shell/src/main/java/org/apache/sqoop/shell/utils/SubmissionDisplayer.java @@ -48,9 +48,15 @@ public static void displayHeader(MSubmission submission) { print(resourceString(Constants.RES_SUBMISSION_SERVER_URL)+": "); println(getServerUrl()); + print(resourceString(Constants.RES_SUBMISSION_CREATION_USER) + ": "); + println(submission.getCreationUser()); + print(resourceString(Constants.RES_SUBMISSION_CREATION_DATE)+": "); println(dateFormat.format(submission.getCreationDate())); + print(resourceString(Constants.RES_SUBMISSION_UPDATE_USER) + ": "); + println(submission.getLastUpdateUser()); + String externalId = submission.getExternalId(); if(externalId != null) { print(resourceString(Constants.RES_SUBMISSION_EXTERNAL_ID)+": "); diff --git a/shell/src/main/resources/shell-resource.properties b/shell/src/main/resources/shell-resource.properties index 1a8f963d..df9457df 100644 --- a/shell/src/main/resources/shell-resource.properties +++ b/shell/src/main/resources/shell-resource.properties @@ -136,7 +136,7 @@ show.prompt_display_all_conns = Display all connections show.prompt_display_conn_xid = Display the connection with xid show.conn_usage = Usage: show connection show.prompt_conns_to_show = @|bold {0} connection(s) to show: |@ -show.prompt_conn_info = Connection with id {0} and name {1} (Enabled: {2}, Created {3}, Updated {4}) +show.prompt_conn_info = Connection with id {0} and name {1} (Enabled: {2}, Created by {3} at {4}, Updated by {5} at {6}) show.prompt_conn_cid_info = Using Connector id {0} show.prompt_display_all_connectors = Display all connectors @@ -153,7 +153,7 @@ show.prompt_display_all_jobs = Display all jobs show.prompt_display_job_jid = Display jobwith given jid show.job_usage = Usage: show job show.prompt_jobs_to_show = @|bold {0} job(s) to show: |@ -show.prompt_job_info = Job with id {0} and name {1} (Enabled: {2}, Created {3}, Updated {4}) +show.prompt_job_info = Job with id {0} and name {1} (Enabled: {2}, Created by {3} at {4}, Updated by {5} at {6}) show.prompt_job_xid_cid_info = Using Connection id {0} and Connector id {1} show.prompt_display_all_submissions = Display all submissions @@ -222,7 +222,9 @@ formdisplayer.warning_message = There were warnings while create or update, but submission.submission_detail = Submission details submission.job_id = Job ID +submission.creation_user = Created by submission.creation_date = Creation date +submission.update_user = Lastly updated by submission.external_id = External ID submission.progress_not_available = Progress is not available submission.counters = Counters