| /** |
| * 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; |
| } |
| } |