blob: ad05057f7b30fe868ac1159843d2408e91521e21 [file] [log] [blame]
/**
* 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.json;
import static org.apache.sqoop.json.util.SchemaSerialization.extractSchema;
import static org.apache.sqoop.json.util.SchemaSerialization.restoreSchema;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.sqoop.classification.InterfaceAudience;
import org.apache.sqoop.classification.InterfaceStability;
import org.apache.sqoop.model.MSubmission;
import org.apache.sqoop.submission.SubmissionStatus;
import org.apache.sqoop.submission.counter.Counter;
import org.apache.sqoop.submission.counter.CounterGroup;
import org.apache.sqoop.submission.counter.Counters;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
/**
*
*/
@InterfaceAudience.Private
@InterfaceStability.Unstable
public class SubmissionBean implements JsonBean {
private static final String SUBMISSION = "submission";
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";
private static final String EXTERNAL_LINK = "external-link";
private static final String ERROR_SUMMARY = "error-summary";
private static final String ERROR_DETAILS = "error-details";
private static final String PROGRESS = "progress";
private static final String COUNTERS = "counters";
private static final String FROM_SCHEMA = "from-schema";
private static final String TO_SCHEMA = "to-schema";
private List<MSubmission> submissions;
public List<MSubmission> getSubmissions() {
return submissions;
}
// For "extract"
public SubmissionBean(MSubmission submission) {
this();
this.submissions = new ArrayList<MSubmission>();
this.submissions.add(submission);
}
public SubmissionBean(List<MSubmission> submissions) {
this();
this.submissions = submissions;
}
// For "restore"
public SubmissionBean() {
}
@Override
@SuppressWarnings("unchecked")
public JSONObject extract(boolean skipSensitive) {
JSONObject submission = new JSONObject();
submission.put(SUBMISSION, extractSubmission(submissions.get(0)));
return submission;
}
@SuppressWarnings("unchecked")
protected JSONArray extractSubmissions() {
JSONArray submissionsArray = new JSONArray();
for (MSubmission submission : submissions) {
submissionsArray.add(extractSubmission(submission));
}
return submissionsArray;
}
@SuppressWarnings("unchecked")
private JSONObject extractSubmission(MSubmission submission) {
JSONObject object = new JSONObject();
object.put(JOB, submission.getJobId());
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());
}
if (submission.getExternalJobId() != null) {
object.put(EXTERNAL_ID, submission.getExternalJobId());
}
if (submission.getExternalLink() != null) {
object.put(EXTERNAL_LINK, submission.getExternalLink());
}
if (submission.getError().getErrorSummary() != null) {
object.put(ERROR_SUMMARY, submission.getError().getErrorSummary());
}
if (submission.getError().getErrorDetails() != null) {
object.put(ERROR_DETAILS, submission.getError().getErrorDetails());
}
if (submission.getCounters() != null) {
object.put(COUNTERS, extractCounters(submission.getCounters()));
}
if (submission.getFromSchema() != null) {
object.put(FROM_SCHEMA, extractSchema(submission.getFromSchema()));
}
if (submission.getToSchema() != null) {
object.put(TO_SCHEMA, extractSchema(submission.getToSchema()));
}
return object;
}
@SuppressWarnings("unchecked")
private JSONObject extractCounters(Counters counters) {
JSONObject counterArray = new JSONObject();
for (CounterGroup group : counters) {
JSONObject counterGroup = new JSONObject();
for (Counter counter : group) {
counterGroup.put(counter.getName(), counter.getValue());
}
counterArray.put(group.getName(), counterGroup);
}
return counterArray;
}
@Override
public void restore(JSONObject json) {
submissions = new ArrayList<MSubmission>();
JSONObject obj = (JSONObject) json.get(SUBMISSION);
submissions.add(restoreSubmission(obj));
}
protected void restoreSubmissions(JSONArray array) {
submissions = new ArrayList<MSubmission>();
for (Object obj : array) {
submissions.add(restoreSubmission(obj));
}
}
private MSubmission restoreSubmission(Object obj) {
JSONObject object = (JSONObject) obj;
MSubmission submission = new MSubmission();
submission.setJobId((Long) object.get(JOB));
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)));
}
if (object.containsKey(EXTERNAL_ID)) {
submission.setExternalJobId((String) object.get(EXTERNAL_ID));
}
if (object.containsKey(EXTERNAL_LINK)) {
submission.setExternalLink((String) object.get(EXTERNAL_LINK));
}
if (object.containsKey(ERROR_SUMMARY)) {
submission.getError().setErrorSummary((String) object.get(ERROR_SUMMARY));
}
if (object.containsKey(ERROR_DETAILS)) {
submission.getError().setErrorDetails((String) object.get(ERROR_DETAILS));
}
if (object.containsKey(COUNTERS)) {
submission.setCounters(restoreCounters((JSONObject) object.get(COUNTERS)));
}
if (object.containsKey(FROM_SCHEMA)) {
submission.setFromSchema(restoreSchema((JSONObject) object.get(FROM_SCHEMA)));
}
if (object.containsKey(TO_SCHEMA)) {
submission.setToSchema(restoreSchema((JSONObject) object.get(TO_SCHEMA)));
}
return submission;
}
@SuppressWarnings("unchecked")
public Counters restoreCounters(JSONObject object) {
Set<Map.Entry<String, JSONObject>> groupSet = object.entrySet();
Counters counters = new Counters();
for (Map.Entry<String, JSONObject> groupEntry : groupSet) {
CounterGroup group = new CounterGroup(groupEntry.getKey());
Set<Map.Entry<String, Long>> counterSet = groupEntry.getValue().entrySet();
for (Map.Entry<String, Long> counterEntry : counterSet) {
Counter counter = new Counter(counterEntry.getKey(), counterEntry.getValue());
group.addCounter(counter);
}
counters.addCounterGroup(group);
}
return counters;
}
}