blob: 137d6ac214e18c82497fbcf91d388292d2a0e82c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 RCP Vision (http://www.rcp-vision.com) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Vincenzo Caselli - Initial contribution and API
*******************************************************************************/
package org.eclipse.emf.parsley.web.servlets;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.parsley.composite.DialogControlFactory;
import org.eclipse.emf.parsley.config.Configurator;
import org.eclipse.emf.parsley.runtime.util.PolymorphicDispatcher;
import org.eclipse.emf.parsley.ui.provider.FeaturesProvider;
import org.eclipse.emf.parsley.ui.provider.FormFeatureCaptionProvider;
import org.eclipse.emf.parsley.ui.provider.ViewerLabelProvider;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DateTime;
import org.eclipse.swt.widgets.Text;
import com.google.inject.Injector;
/**
* Servlet for handling generation of JSON output to represent the detail of a
* given EMF object
*
* @author Vincenzo Caselli
*
*/
public class JsonDetailsServlet extends JsonParsleyServlet {
private static final long serialVersionUID = 1L;
protected void doGet(final HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Injector injector = Application.getInstance(request).getInjector();
Configurator configurator = Application.getInstance(request).getConfigurator();
final PrintWriter out = prepareOutput(response);
String id = request.getParameter(OBJECT_ID_PARAMETER);
String entity = request.getParameter(SWITCH_PARAMETER);
if (id != null) {
out.write("{ ");
Object element = Application.getInstance(request).get(id);
EObject eObject = (EObject) element;
ViewerLabelProvider labelProvider = (ViewerLabelProvider) injector.getInstance(ILabelProvider.class);
final DialogControlFactory dialogControlFactory = injector.getInstance(DialogControlFactory.class);
FormFeatureCaptionProvider formFeatureCaptionProvider = injector
.getInstance(FormFeatureCaptionProvider.class);
PolymorphicDispatcher<Object> imageDispatcher = PolymorphicDispatcher.createForSingleTarget("image", 1, 1,
labelProvider);
EClass clazz;
List<EStructuralFeature> features;
String imagePath;
String label;
if (eObject != null) {
clazz = eObject.eClass();
imagePath = (String) imageDispatcher.invoke(element);
label = labelProvider.getText(eObject);
} else {
clazz = configurator.getEClass(entity);
imagePath = "";
label = "";
}
features = injector.getInstance(FeaturesProvider.class).getFeatures(clazz);
out.write("\"icon\" : \"" + (imagePath != null ? imagePath : "") + "\" ");
out.write(", \"label\" : \"" + label + "\" ");
if (eObject == null) {
// Case NEW: TODO refactor and avoid repetition of this
// block in JsonSaveServlet!
eObject = EcoreUtil.create(clazz);
Resource resource = Application.getInstance(request).getResource(entity);
resource.getContents().add(eObject);
id = Application.getInstance(request).put(eObject);
}
final EObject eObject1 = eObject;
// Application.getInstance(request).getDisplay().syncExec(new
// Runnable() {
// @Override
// public void run() {
// }
// });
new DefaultRealm();
dialogControlFactory.init(null, eObject1, Application.getInstance(request).getShell());
out.write(", \"" + OBJECT_ID_PARAMETER + "\" : \"" + id + "\" ");
for (final EStructuralFeature eStructuralFeature : features) {
out.write(",");
String featureName = eStructuralFeature.getName(); // not used
// since
// FeatureCaptionProvider
// override
// it
String featureCaption = formFeatureCaptionProvider.getText(clazz, eStructuralFeature);
out.write("\"" + featureName + "\" : {" + "\"caption\": \"" + featureCaption + "\",");
// final Wrapper<Control> wrapper =
// Wrapper.forType(Control.class);
final String value = labelProvider.getText(eObject.eGet(eStructuralFeature));
// Application.getInstance(request).getDisplay().syncExec(new
// Runnable() {
// @Override
// public void run() {}
// });
new DefaultRealm();
Control control = dialogControlFactory.create(eStructuralFeature);
// wrapper.set(control);
// System.out.println(control);
// Control control = wrapper.get();
if (control instanceof Text) {
Text text = (Text) control;
// value = text.getText();
boolean multiLine = (text.getStyle() & SWT.MULTI) > 0;
String type = multiLine ? "textarea" : "text";
out.write(" \"type\": \"" + type + "\",");
} else if (control instanceof Combo) {
String proposalsList = "";
Combo combo = (Combo) control;
String[] proposals = combo.getItems();
// value = combo.getText();
boolean first = true;
for (Object proposal : proposals) {
if (!first) {
proposalsList += ",";
}
proposalsList += "\"" + proposal + "\"";
first = false;
}
out.write(" \"type\": \"combo\",");
out.write(" \"proposals\": [" + proposalsList + "],");
} else if (control instanceof Button) {
// Button button = (Button) control;
// value = "" + button.getSelection();
out.write(" \"type\": \"button\",");
} else if (control instanceof DateTime) {
out.write(" \"type\": \"datetime\",");
}
out.write(" \"value\": \"" + (value == null ? "" : value) + "\"" + "} ");
}
out.write("} ");
}
closeOutput(out);
}
}