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 sources = new ArrayList(); + MSubmission sourcex = new MSubmission(); + sourcex.setCreationUser("userA"); + sources.add(sourcex); + MSubmission sourcey = new MSubmission(); + sourcey.setCreationUser("userB"); + sources.add(sourcey); + + List targets = transfer(sources); + assertNotNull(targets.get(0)); + assertEquals("userA", targets.get(0).getCreationUser()); + assertNotNull(targets.get(1)); + assertEquals("userB", targets.get(1).getCreationUser()); + } + public void testTransferCreationDate() { Date date = new Date(); MSubmission source = new MSubmission(); @@ -94,6 +117,29 @@ public void testTransferCreationDate() { assertEquals(datey, targets.get(1).getCreationDate()); } + public void testTransferLastUpdateUser() { + String username = "admin"; + MSubmission source = new MSubmission(); + source.setLastUpdateUser(username); + + MSubmission target = transfer(source); + assertEquals("admin", target.getLastUpdateUser()); + + List sources = new ArrayList(); + MSubmission sourcex = new MSubmission(); + sourcex.setLastUpdateUser("userA"); + sources.add(sourcex); + MSubmission sourcey = new MSubmission(); + sourcey.setLastUpdateUser("userB"); + sources.add(sourcey); + + List targets = transfer(sources); + assertNotNull(targets.get(0)); + assertEquals("userA", targets.get(0).getLastUpdateUser()); + assertNotNull(targets.get(1)); + assertEquals("userB", targets.get(1).getLastUpdateUser()); + } + public void testTransferLastUpdateDate() { Date date = new Date(); MSubmission source = new MSubmission(); diff --git a/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java b/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java index bf103e40..f3d41663 100644 --- a/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java +++ b/common/src/test/java/org/apache/sqoop/model/TestMAccountableEntity.java @@ -47,11 +47,15 @@ public void testInitialization() { assertEquals(connection.getCreationDate(), connection.getLastUpdateDate()); Date testCreationDate = new Date(); Date testLastUpdateDate = new Date(); + connection.setCreationUser("admin"); connection.setCreationDate(testCreationDate); + connection.setLastUpdateUser("user"); connection.setLastUpdateDate(testLastUpdateDate); connection.setEnabled(false); assertEquals(testCreationDate, connection.getCreationDate()); + assertEquals("admin", connection.getCreationUser()); assertEquals(testLastUpdateDate, connection.getLastUpdateDate()); assertEquals(false, connection.getEnabled()); + assertEquals("user", connection.getLastUpdateUser()); } } diff --git a/core/src/main/java/org/apache/sqoop/framework/JobManager.java b/core/src/main/java/org/apache/sqoop/framework/JobManager.java index d0a087d1..e0525846 100644 --- a/core/src/main/java/org/apache/sqoop/framework/JobManager.java +++ b/core/src/main/java/org/apache/sqoop/framework/JobManager.java @@ -21,6 +21,7 @@ import org.apache.sqoop.common.MapContext; import org.apache.sqoop.common.SqoopException; import org.apache.sqoop.connector.ConnectorManager; +import org.apache.sqoop.request.HttpEventContext; import org.apache.sqoop.connector.spi.SqoopConnector; import org.apache.sqoop.core.Reconfigurable; import org.apache.sqoop.core.SqoopConfiguration; @@ -262,7 +263,9 @@ public synchronized void initialize() { LOG.info("Submission manager initialized: OK"); } - public MSubmission submit(long jobId) { + public MSubmission submit(long jobId, HttpEventContext ctx) { + String username = ctx.getUsername(); + Repository repository = RepositoryManager.getInstance().getRepository(); MJob job = repository.findJob(jobId); @@ -310,6 +313,9 @@ public MSubmission submit(long jobId) { MSubmission summary = new MSubmission(jobId); SubmissionRequest request = executionEngine.createSubmissionRequest(); + summary.setCreationUser(username); + summary.setLastUpdateUser(username); + // Save important variables to the submission request request.setSummary(summary); request.setConnector(connector); @@ -477,7 +483,9 @@ private void destroySubmission(SubmissionRequest request) { request.getConfigConnectorJob()); } - public MSubmission stop(long jobId) { + public MSubmission stop(long jobId, HttpEventContext ctx) { + String username = ctx.getUsername(); + Repository repository = RepositoryManager.getInstance().getRepository(); MSubmission submission = repository.findSubmissionLastForJob(jobId); @@ -489,6 +497,8 @@ public MSubmission stop(long jobId) { String externalId = submission.getExternalId(); submissionEngine.stop(externalId); + submission.setLastUpdateUser(username); + // Fetch new information to verify that the stop command has actually worked update(submission); diff --git a/core/src/main/java/org/apache/sqoop/request/HttpEventContext.java b/core/src/main/java/org/apache/sqoop/request/HttpEventContext.java new file mode 100644 index 00000000..fda75eb8 --- /dev/null +++ b/core/src/main/java/org/apache/sqoop/request/HttpEventContext.java @@ -0,0 +1,35 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sqoop.request; + +/** + * Context for all events in the server + */ +public class HttpEventContext { + + // The user who executes this Http event + private String username; + + public String getUsername() { + return username; + } + + public void setUsername(String value) { + username = value; + } +} diff --git a/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java b/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java index f025ee94..f6bd5b5c 100644 --- a/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java +++ b/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbyRepositoryHandler.java @@ -388,6 +388,12 @@ public void createOrUpdateInternals(Connection conn) { runQuery(QUERY_CREATE_TABLE_SQ_SYSTEM, conn); runQuery(QUERY_UPGRADE_TABLE_SQ_CONNECTION_ADD_COLUMN_ENABLED, conn); runQuery(QUERY_UPGRADE_TABLE_SQ_JOB_ADD_COLUMN_ENABLED, conn); + runQuery(QUERY_UPGRADE_TABLE_SQ_CONNECTION_ADD_COLUMN_CREATION_USER, conn); + runQuery(QUERY_UPGRADE_TABLE_SQ_CONNECTION_ADD_COLUMN_UPDATE_USER, conn); + runQuery(QUERY_UPGRADE_TABLE_SQ_JOB_ADD_COLUMN_CREATION_USER, conn); + runQuery(QUERY_UPGRADE_TABLE_SQ_JOB_ADD_COLUMN_UPDATE_USER, conn); + runQuery(QUERY_UPGRADE_TABLE_SQ_SUBMISSION_ADD_COLUMN_CREATION_USER, conn); + runQuery(QUERY_UPGRADE_TABLE_SQ_SUBMISSION_ADD_COLUMN_UPDATE_USER, conn); } ResultSet rs = null; @@ -600,9 +606,11 @@ public void createConnection(MConnection connection, Connection conn) { Statement.RETURN_GENERATED_KEYS); stmt.setString(1, connection.getName()); stmt.setLong(2, connection.getConnectorId()); - stmt.setTimestamp(3, new Timestamp(connection.getCreationDate().getTime())); - stmt.setTimestamp(4, new Timestamp(connection.getLastUpdateDate().getTime())); - stmt.setBoolean(5, connection.getEnabled()); + stmt.setBoolean(3, connection.getEnabled()); + stmt.setString(4, connection.getCreationUser()); + stmt.setTimestamp(5, new Timestamp(connection.getCreationDate().getTime())); + stmt.setString(6, connection.getLastUpdateUser()); + stmt.setTimestamp(7, new Timestamp(connection.getLastUpdateDate().getTime())); result = stmt.executeUpdate(); if (result != 1) { @@ -653,9 +661,10 @@ public void updateConnection(MConnection connection, Connection conn) { // Update CONNECTION table updateStmt = conn.prepareStatement(STMT_UPDATE_CONNECTION); updateStmt.setString(1, connection.getName()); - updateStmt.setTimestamp(2, new Timestamp(new Date().getTime())); + updateStmt.setString(2, connection.getLastUpdateUser()); + updateStmt.setTimestamp(3, new Timestamp(new Date().getTime())); - updateStmt.setLong(3, connection.getPersistenceId()); + updateStmt.setLong(4, connection.getPersistenceId()); updateStmt.executeUpdate(); // And reinsert new values @@ -923,9 +932,11 @@ public void createJob(MJob job, Connection conn) { stmt.setString(1, job.getName()); stmt.setLong(2, job.getConnectionId()); stmt.setString(3, job.getType().name()); - stmt.setTimestamp(4, new Timestamp(job.getCreationDate().getTime())); - stmt.setTimestamp(5, new Timestamp(job.getLastUpdateDate().getTime())); - stmt.setBoolean(6, job.getEnabled()); + stmt.setBoolean(4, job.getEnabled()); + stmt.setString(5, job.getCreationUser()); + stmt.setTimestamp(6, new Timestamp(job.getCreationDate().getTime())); + stmt.setString(7, job.getLastUpdateUser()); + stmt.setTimestamp(8, new Timestamp(job.getLastUpdateDate().getTime())); result = stmt.executeUpdate(); if (result != 1) { @@ -976,9 +987,10 @@ public void updateJob(MJob job, Connection conn) { // Update job table updateStmt = conn.prepareStatement(STMT_UPDATE_JOB); updateStmt.setString(1, job.getName()); - updateStmt.setTimestamp(2, new Timestamp(new Date().getTime())); + updateStmt.setString(2, job.getLastUpdateUser()); + updateStmt.setTimestamp(3, new Timestamp(new Date().getTime())); - updateStmt.setLong(3, job.getPersistenceId()); + updateStmt.setLong(4, job.getPersistenceId()); updateStmt.executeUpdate(); // And reinsert new values @@ -1173,12 +1185,14 @@ public void createSubmission(MSubmission submission, Connection conn) { Statement.RETURN_GENERATED_KEYS); stmt.setLong(1, submission.getJobId()); stmt.setString(2, submission.getStatus().name()); - stmt.setTimestamp(3, new Timestamp(submission.getCreationDate().getTime())); - stmt.setTimestamp(4, new Timestamp(submission.getLastUpdateDate().getTime())); - stmt.setString(5, submission.getExternalId()); - stmt.setString(6, submission.getExternalLink()); - stmt.setString(7, submission.getExceptionInfo()); - stmt.setString(8, submission.getExceptionStackTrace()); + stmt.setString(3, submission.getCreationUser()); + stmt.setTimestamp(4, new Timestamp(submission.getCreationDate().getTime())); + stmt.setString(5, submission.getLastUpdateUser()); + stmt.setTimestamp(6, new Timestamp(submission.getLastUpdateDate().getTime())); + stmt.setString(7, submission.getExternalId()); + stmt.setString(8, submission.getExternalLink()); + stmt.setString(9, submission.getExceptionInfo()); + stmt.setString(10, submission.getExceptionStackTrace()); result = stmt.executeUpdate(); if (result != 1) { @@ -1245,11 +1259,12 @@ public void updateSubmission(MSubmission submission, Connection conn) { // Update properties in main table stmt = conn.prepareStatement(STMT_UPDATE_SUBMISSION); stmt.setString(1, submission.getStatus().name()); - stmt.setTimestamp(2, new Timestamp(submission.getLastUpdateDate().getTime())); - stmt.setString(3, submission.getExceptionInfo()); - stmt.setString(4, submission.getExceptionStackTrace()); + stmt.setString(2, submission.getLastUpdateUser()); + stmt.setTimestamp(3, new Timestamp(submission.getLastUpdateDate().getTime())); + stmt.setString(4, submission.getExceptionInfo()); + stmt.setString(5, submission.getExceptionStackTrace()); - stmt.setLong(5, submission.getPersistenceId()); + stmt.setLong(6, submission.getPersistenceId()); stmt.executeUpdate(); // Delete previous counters @@ -1534,12 +1549,14 @@ private MSubmission loadSubmission(ResultSet rs, Connection conn) throws SQLExce submission.setPersistenceId(rs.getLong(1)); submission.setJobId(rs.getLong(2)); submission.setStatus(SubmissionStatus.valueOf(rs.getString(3))); - submission.setCreationDate(rs.getTimestamp(4)); - submission.setLastUpdateDate(rs.getTimestamp(5)); - submission.setExternalId(rs.getString(6)); - submission.setExternalLink(rs.getString(7)); - submission.setExceptionInfo(rs.getString(8)); - submission.setExceptionStackTrace(rs.getString(9)); + submission.setCreationUser(rs.getString(4)); + submission.setCreationDate(rs.getTimestamp(5)); + submission.setLastUpdateUser(rs.getString(6)); + submission.setLastUpdateDate(rs.getTimestamp(7)); + submission.setExternalId(rs.getString(8)); + submission.setExternalLink(rs.getString(9)); + submission.setExceptionInfo(rs.getString(10)); + submission.setExceptionStackTrace(rs.getString(11)); Counters counters = loadCountersSubmission(rs.getLong(1), conn); submission.setCounters(counters); @@ -1602,9 +1619,11 @@ private List loadConnections(PreparedStatement stmt, long id = rsConnection.getLong(1); String name = rsConnection.getString(2); long connectorId = rsConnection.getLong(3); - Date creationDate = rsConnection.getTimestamp(4); - Date lastUpdateDate = rsConnection.getTimestamp(5); - boolean enabled = rsConnection.getBoolean(6); + boolean enabled = rsConnection.getBoolean(4); + String creationUser = rsConnection.getString(5); + Date creationDate = rsConnection.getTimestamp(6); + String updateUser = rsConnection.getString(7); + Date lastUpdateDate = rsConnection.getTimestamp(8); formConnectorFetchStmt.setLong(1, connectorId); @@ -1631,7 +1650,9 @@ private List loadConnections(PreparedStatement stmt, connection.setPersistenceId(id); connection.setName(name); + connection.setCreationUser(creationUser); connection.setCreationDate(creationDate); + connection.setLastUpdateUser(updateUser); connection.setLastUpdateDate(lastUpdateDate); connection.setEnabled(enabled); @@ -1668,9 +1689,11 @@ private List loadJobs(PreparedStatement stmt, String name = rsJob.getString(3); long connectionId = rsJob.getLong(4); String stringType = rsJob.getString(5); - Date creationDate = rsJob.getTimestamp(6); - Date lastUpdateDate = rsJob.getTimestamp(7); - boolean enabled = rsJob.getBoolean(8); + boolean enabled = rsJob.getBoolean(6); + String createBy = rsJob.getString(7); + Date creationDate = rsJob.getTimestamp(8); + String updateBy = rsJob.getString(9); + Date lastUpdateDate = rsJob.getTimestamp(10); MJob.Type type = MJob.Type.valueOf(stringType); @@ -1699,7 +1722,9 @@ private List loadJobs(PreparedStatement stmt, job.setPersistenceId(id); job.setName(name); + job.setCreationUser(createBy); job.setCreationDate(creationDate); + job.setLastUpdateUser(updateBy); job.setLastUpdateDate(lastUpdateDate); job.setEnabled(enabled); diff --git a/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java b/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java index 49bf607a..fcbb475b 100644 --- a/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java +++ b/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaConstants.java @@ -119,8 +119,12 @@ public final class DerbySchemaConstants { public static final String COLUMN_SQN_CONNECTOR = "SQN_CONNECTOR"; + public static final String COLUMN_SQN_CREATION_USER = "SQN_CREATION_USER"; + public static final String COLUMN_SQN_CREATION_DATE = "SQN_CREATION_DATE"; + public static final String COLUMN_SQN_UPDATE_USER = "SQN_UPDATE_USER"; + public static final String COLUMN_SQN_UPDATE_DATE = "SQN_UPDATE_DATE"; public static final String COLUMN_SQN_ENABLED = "SQN_ENABLED"; @@ -144,8 +148,12 @@ public final class DerbySchemaConstants { public static final String COLUMN_SQB_CONNECTION = "SQB_CONNECTION"; + public static final String COLUMN_SQB_CREATION_USER = "SQB_CREATION_USER"; + public static final String COLUMN_SQB_CREATION_DATE = "SQB_CREATION_DATE"; + public static final String COLUMN_SQB_UPDATE_USER = "SQB_UPDATE_USER"; + public static final String COLUMN_SQB_UPDATE_DATE = "SQB_UPDATE_DATE"; public static final String COLUMN_SQB_ENABLED = "SQB_ENABLED"; @@ -212,8 +220,12 @@ public final class DerbySchemaConstants { public static final String COLUMN_SQS_STATUS = "SQS_STATUS"; + public static final String COLUMN_SQS_CREATION_USER = "SQS_CREATION_USER"; + public static final String COLUMN_SQS_CREATION_DATE = "SQS_CREATION_DATE"; + public static final String COLUMN_SQS_UPDATE_USER = "SQS_UPDATE_USER"; + public static final String COLUMN_SQS_UPDATE_DATE = "SQS_UPDATE_DATE"; public static final String COLUMN_SQS_EXTERNAL_ID = "SQS_EXTERNAL_ID"; diff --git a/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java b/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java index b08f7ab6..1bbba8a1 100644 --- a/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java +++ b/repository/repository-derby/src/main/java/org/apache/sqoop/repository/derby/DerbySchemaQuery.java @@ -82,32 +82,36 @@ *

* 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