5
0
mirror of https://github.com/apache/sqoop.git synced 2025-05-10 22:13:07 +08:00

SQOOP-576 Implement command show framework

git-svn-id: https://svn.apache.org/repos/asf/sqoop/branches/sqoop2@1377755 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Bilung Lee 2012-08-27 17:17:37 +00:00
parent c1e44563d5
commit 9a77b4fff1
8 changed files with 644 additions and 0 deletions

View File

@ -0,0 +1,91 @@
/**
* 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.client.display;
import org.apache.sqoop.model.MForm;
import org.apache.sqoop.model.MFramework;
import org.apache.sqoop.model.MInput;
import org.apache.sqoop.model.MInputType;
import org.apache.sqoop.model.MJobForms;
import org.apache.sqoop.model.MStringInput;
import org.codehaus.groovy.tools.shell.IO;
import java.util.Iterator;
import java.util.List;
/**
* Convenience static methods for displaying form related information
*/
public class FormDisplayer {
public static void displayFormDetails(IO io, MFramework framework) {
io.out.print(" Supported job types: ");
io.out.println(framework.getAllJobsForms().keySet().toString());
displayForms(io, framework.getConnectionForms().getForms(), "Connection");
for (MJobForms jobForms : framework.getAllJobsForms().values()) {
io.out.print(" Forms for job type ");
io.out.print(jobForms.getType().name());
io.out.println(":");
displayForms(io, jobForms.getForms(), "Job");
}
}
public static void displayForms(IO io, List<MForm> forms, String type) {
Iterator<MForm> fiter = forms.iterator();
int findx = 1;
while (fiter.hasNext()) {
io.out.print(" ");
io.out.print(type);
io.out.print(" form ");
io.out.print(findx++);
io.out.println(":");
MForm form = fiter.next();
io.out.print(" Name: ");
io.out.println(form.getName());
List<MInput<?>> inputs = form.getInputs();
Iterator<MInput<?>> iiter = inputs.iterator();
int iindx = 1;
while (iiter.hasNext()) {
io.out.print(" Input ");
io.out.print(iindx++);
io.out.println(":");
MInput<?> input = iiter.next();
io.out.print(" Name: ");
io.out.println(input.getName());
io.out.print(" Type: ");
io.out.println(input.getType());
if (input.getType() == MInputType.STRING) {
io.out.print(" Mask: ");
io.out.println(((MStringInput)input).isMasked());
io.out.print(" Size: ");
io.out.println(((MStringInput)input).getMaxLength());
}
}
}
}
private FormDisplayer() {
// Do not instantiate
}
}

View File

@ -0,0 +1,38 @@
/**
* 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.client.request;
import org.apache.sqoop.json.FrameworkBean;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
/**
*
*/
public class FrameworkRequest extends Request {
public FrameworkBean doGet(String serverUrl) {
String response = null;
response = super.get(serverUrl + "v1/framework");
JSONObject jsonObject = (JSONObject) JSONValue.parse(response);
FrameworkBean frameworkBean = new FrameworkBean();
frameworkBean.restore(jsonObject);
return frameworkBean;
}
}

View File

@ -0,0 +1,80 @@
/**
* 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.client.shell;
import org.apache.sqoop.client.core.Environment;
import org.apache.sqoop.client.request.FrameworkRequest;
import org.apache.sqoop.json.FrameworkBean;
import org.apache.sqoop.model.MFramework;
import org.apache.sqoop.model.MJobForms;
import org.codehaus.groovy.tools.shell.IO;
import java.io.PrintWriter;
import java.util.List;
import static org.apache.sqoop.client.display.FormDisplayer.*;
/**
*
*/
public class ShowFrameworkFunction extends SqoopFunction {
private IO io;
private FrameworkRequest frameworkRequest;
@SuppressWarnings("static-access")
protected ShowFrameworkFunction(IO io) {
this.io = io;
}
public void printHelp(PrintWriter out) {
out.println("Usage: show framework");
super.printHelp(out);
}
public Object execute(List<String> args) {
if (args.size() != 1) {
printHelp(io.out);
io.out.println();
return null;
}
showFramework();
return null;
}
private void showFramework() {
if (frameworkRequest == null) {
frameworkRequest = new FrameworkRequest();
}
FrameworkBean frameworkBean =
frameworkRequest.doGet(Environment.getServerUrl());
MFramework framework = frameworkBean.getFramework();
io.out.println("@|bold Framework specific options: |@");
io.out.print("Persistent id: ");
io.out.println(framework.getPersistenceId());
displayFormDetails(io, framework);
io.out.println();
}
}

View File

@ -0,0 +1,99 @@
/**
* 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 org.apache.sqoop.model.MConnectionForms;
import org.apache.sqoop.model.MForm;
import org.apache.sqoop.model.MFramework;
import org.apache.sqoop.model.MJob;
import org.apache.sqoop.model.MJobForms;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static org.apache.sqoop.json.util.FormSerialization.*;
/**
*
*/
public class FrameworkBean implements JsonBean {
private MFramework framework;
// for "extract"
public FrameworkBean(MFramework framework) {
this.framework = framework;
}
// for "restore"
public FrameworkBean() {
}
public MFramework getFramework() {
return framework;
}
@SuppressWarnings("unchecked")
@Override
public JSONObject extract() {
JSONArray conForms =
extractForms(framework.getConnectionForms().getForms());
JSONObject jobForms = new JSONObject();
for (MJobForms job : framework.getAllJobsForms().values()) {
jobForms.put(job.getType().name(), extractForms(job.getForms()));
}
JSONObject result = new JSONObject();
result.put(ID, framework.getPersistenceId());
result.put(CON_FORMS, conForms);
result.put(JOB_FORMS, jobForms);
return result;
}
@Override
@SuppressWarnings("unchecked")
public void restore(JSONObject jsonObject) {
long id = (Long) jsonObject.get(ID);
List<MForm> connForms = restoreForms((JSONArray) jsonObject.get(CON_FORMS));
JSONObject jobForms = (JSONObject) jsonObject.get(JOB_FORMS);
List<MJobForms> jobs = new ArrayList<MJobForms>();
for( Map.Entry entry : (Set<Map.Entry>) jobForms.entrySet()) {
//TODO(jarcec): Handle situation when server is supporting operation
// that client do not know (server do have newer version than client)
MJob.Type type = MJob.Type.valueOf((String) entry.getKey());
List<MForm> job = restoreForms((JSONArray) entry.getValue());
jobs.add(new MJobForms(type, job));
}
framework = new MFramework(new MConnectionForms(connForms), jobs);
framework.setPersistenceId(id);
}
}

View File

@ -0,0 +1,154 @@
/**
* 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.util;
import org.apache.sqoop.model.MForm;
import org.apache.sqoop.model.MFormType;
import org.apache.sqoop.model.MInput;
import org.apache.sqoop.model.MInputType;
import org.apache.sqoop.model.MMapInput;
import org.apache.sqoop.model.MStringInput;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* Convenient static methods for serializing forms.
*/
public class FormSerialization {
public static final String ID = "id";
public static final String NAME = "name";
public static final String CLASS = "class";
public static final String CON_FORMS = "con_forms";
public static final String JOB_FORMS = "job_forms";
public static final String FORM_NAME = "name";
public static final String FORM_TYPE = "type";
public static final String FORM_INPUTS = "inputs";
public static final String FORM_INPUT_NAME = "name";
public static final String FORM_INPUT_TYPE = "type";
public static final String FORM_INPUT_MASK = "mask";
public static final String FORM_INPUT_SIZE = "size";
/**
* Transform given list of forms to JSON Array object.
*
* @param mForms List of forms.
* @return JSON object with serialized form of the list.
*/
@SuppressWarnings("unchecked")
public static JSONArray extractForms(List<MForm> mForms) {
JSONArray forms = new JSONArray();
for (MForm mForm : mForms) {
forms.add(extractForm(mForm));
}
return forms;
}
/**
* Transform given form to JSON Object.
*
* @param mForm Given MForm instance
* @return Serialized JSON object.
*/
@SuppressWarnings("unchecked")
public static JSONObject extractForm(MForm mForm) {
JSONObject form = new JSONObject();
form.put(FORM_NAME, mForm.getName());
form.put(FORM_TYPE, MFormType.CONNECTION.toString());
JSONArray mInputs = new JSONArray();
form.put(FORM_INPUTS, mInputs);
for (MInput<?> mInput : mForm.getInputs()) {
JSONObject input = new JSONObject();
mInputs.add(input);
input.put(FORM_INPUT_NAME, mInput.getName());
input.put(FORM_INPUT_TYPE, mInput.getType().toString());
if (mInput.getType() == MInputType.STRING) {
input.put(FORM_INPUT_MASK,
((MStringInput)mInput).isMasked());
input.put(FORM_INPUT_SIZE,
((MStringInput)mInput).getMaxLength());
}
}
return form;
}
/**
* Restore List of MForms from JSON Array.
*
* @param forms JSON array representing list of MForms
* @return Restored list of MForms
*/
public static List<MForm> restoreForms(JSONArray forms) {
List<MForm> mForms = new ArrayList<MForm>();
for (int i = 0; i < forms.size(); i++) {
mForms.add(restoreForm((JSONObject) forms.get(i)));
}
return mForms;
}
/**
* Restore one MForm from JSON Object.
*
* @param form JSON representation of the MForm.
* @return Restored MForm.
*/
public static MForm restoreForm(JSONObject form) {
JSONArray inputs = (JSONArray) form.get(FORM_INPUTS);
List<MInput<?>> mInputs = new ArrayList<MInput<?>>();
for (int i = 0; i < inputs.size(); i++) {
JSONObject input = (JSONObject) inputs.get(i);
MInputType type =
MInputType.valueOf((String) input.get(FORM_INPUT_TYPE));
switch (type) {
case STRING: {
String name = (String) input.get(FORM_INPUT_NAME);
boolean mask = (Boolean) input.get(FORM_INPUT_MASK);
long size = (Long) input.get(FORM_INPUT_SIZE);
MInput<String> mInput = new MStringInput(name, mask, (short) size);
mInputs.add(mInput);
break;
}
case MAP: {
String name = (String) input.get(FORM_INPUT_NAME);
MInput<Map<String, String>> mInput = new MMapInput(name);
mInputs.add(mInput);
break;
}
}
}
return new MForm((String) form.get(FORM_NAME), mInputs);
}
private FormSerialization() {
// Do not instantiate
}
}

View File

@ -0,0 +1,98 @@
/**
* 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 org.apache.sqoop.model.MConnectionForms;
import org.apache.sqoop.model.MForm;
import org.apache.sqoop.model.MFramework;
import org.apache.sqoop.model.MInput;
import org.apache.sqoop.model.MJob;
import org.apache.sqoop.model.MJobForms;
import org.apache.sqoop.model.MMapInput;
import org.apache.sqoop.model.MStringInput;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
/**
*
*/
public class TestFrameworkBean {
/**
* Test that by JSON serialization followed by deserialization we will get
* equal framework object.
*/
@Test
public void testSerialization() {
MFramework framework = getFramework("1");
// Serialize it to JSON object
FrameworkBean bean = new FrameworkBean(framework);
JSONObject json = bean.extract();
// "Move" it across network in text form
String string = json.toJSONString();
// Retrieved transferred object
JSONObject retrievedJson = (JSONObject) JSONValue.parse(string);
FrameworkBean retrievedBean = new FrameworkBean();
retrievedBean.restore(retrievedJson);
assertEquals(framework, retrievedBean.getFramework());
}
public MFramework getFramework(String parameter) {
List<MInput<?>> inputs;
List<MForm> connectionForms = new ArrayList<MForm>();
inputs = new ArrayList<MInput<?>>();
inputs.add(new MStringInput("url", false, (short) 10));
inputs.add(new MStringInput("username", false, (short) 10));
inputs.add(new MStringInput("password", false, (short) 10));
connectionForms.add(new MForm("connection", inputs));
inputs = new ArrayList<MInput<?>>();
inputs.add(new MMapInput("properties"));
connectionForms.add(new MForm("properties", inputs));
MConnectionForms connection = new MConnectionForms(connectionForms);
List<MForm> jobForms = new ArrayList<MForm>();
inputs = new ArrayList<MInput<?>>();
inputs.add(new MStringInput("A", false, (short) 10));
inputs.add(new MStringInput("B", false, (short) 10));
inputs.add(new MStringInput("C", false, (short) 10));
jobForms.add((new MForm("D", inputs)));
inputs = new ArrayList<MInput<?>>();
inputs.add(new MStringInput("Z", false, (short) 10));
inputs.add(new MStringInput("X", false, (short) 10));
inputs.add(new MStringInput("Y", false, (short) 10));
jobForms.add(new MForm("D", inputs));
List<MJobForms> jobs = new ArrayList<MJobForms>();
jobs.add(new MJobForms(MJob.Type.IMPORT, jobForms));
return new MFramework(connection, jobs);
}
}

View File

@ -0,0 +1,44 @@
/**
* 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.handler;
import org.apache.log4j.Logger;
import org.apache.sqoop.common.SqoopException;
import org.apache.sqoop.framework.FrameworkManager;
import org.apache.sqoop.json.FrameworkBean;
import org.apache.sqoop.json.JsonBean;
import org.apache.sqoop.server.RequestContext;
import org.apache.sqoop.server.RequestHandler;
/**
*
*/
public class FrameworkRequestHandler implements RequestHandler {
private static final Logger LOG =
Logger.getLogger(ConnectorRequestHandler.class);
public FrameworkRequestHandler() {
LOG.info("FrameworkRequestHandler initialized");
}
@Override
public JsonBean handleEvent(RequestContext ctx) throws SqoopException {
return new FrameworkBean(FrameworkManager.getFramework());
}
}

View File

@ -0,0 +1,40 @@
/**
* 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.server.v1;
import org.apache.sqoop.handler.FrameworkRequestHandler;
import org.apache.sqoop.json.JsonBean;
import org.apache.sqoop.server.RequestContext;
import org.apache.sqoop.server.RequestHandler;
import org.apache.sqoop.server.SqoopProtocolServlet;
/**
* Get framework metadata
*/
public class FrameworkServlet extends SqoopProtocolServlet {
private RequestHandler frameworkRequestHandler;
public FrameworkServlet() {
frameworkRequestHandler = new FrameworkRequestHandler();
}
@Override
protected JsonBean handleGetRequest(RequestContext ctx) throws Exception {
return frameworkRequestHandler.handleEvent(ctx);
}
}