package example.client; import java.io.IOException; import org.eclipse.emf.common.util.Callback; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.emfjson.gwt.handlers.HttpHandler; import org.emfjson.gwt.resource.JsonResourceFactory; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.core.client.GWT; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.RootPanel; import example.shared.model.ModelFactory; import example.shared.model.ModelPackage; import example.shared.model.User; /** * GWT application demonstrating the use of the EMF GWT API * on top of a HTTP server delivering JSON data. The parsing * and serialization of JSON is achieved with EMFJSON for GWT. * */ public class App implements EntryPoint { private URI baseService = URI.createURI(GWT.getHostPageBaseURL() + "api/resources/"); public void onModuleLoad() { final View view = new View(); final ResourceSet resourceSet = createResourceSet(); RootPanel.get().add(view); view.handleCreate(new ClickHandler() { @Override public void onClick(ClickEvent event) { // HttpHandler.create method sends an empty POST request to the server. The // server should handle the creation of the resource and assign it an id. The // resource id is then returned by the server in the http header Location. // The method HttpHandler.create then creates an empty resource on the client and // assign it the id given by the server. HttpHandler.create(resourceSet, baseService, new Callback<Resource>() { @Override public void onFailure(Throwable caught) { GWT.log(caught.getMessage()); } @Override public void onSuccess(final Resource result) { // Once the resource created, we add it an element Entity. // User entity = ModelFactory.eINSTANCE.createUser(); result.getContents().add(entity); final ContentView contentView = new ContentView(); contentView.resourceLabel.setText(result.getURI().lastSegment()); contentView.nameTextBox.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { if (!result.getContents().isEmpty()) { User entity = (User) result.getContents().get(0); entity.setName(contentView.nameTextBox.getText()); } } }); contentView.saveButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { // Saving the resource sends a PUT request to the server containing // the JSON representation of the resource. // save(result, new Callback<Resource>() { @Override public void onFailure(Throwable caught) { GWT.log(caught.getMessage()); } @Override public void onSuccess(Resource result) { Window.alert("Successfully saved resource"); } }); } }); contentView.deleteButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { delete(result, new Callback<Resource>() { @Override public void onFailure(Throwable caught) { GWT.log(caught.getMessage()); } @Override public void onSuccess(Resource result) { view.content.remove(contentView); } }); } }); view.content.add(contentView); } }); } }); } private ResourceSet createResourceSet() { ResourceSet resourceSet = new ResourceSetImpl(); resourceSet.getPackageRegistry().put( EcorePackage.eNS_URI, EcorePackage.eINSTANCE); resourceSet.getPackageRegistry().put( ModelPackage.eNS_URI, ModelPackage.eINSTANCE); resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put( "*", new JsonResourceFactory()); resourceSet.getURIConverter().getURIHandlers().add(new HttpHandler()); resourceSet.getURIConverter().getURIMap().put( URI.createURI("http://resources/"), baseService); return resourceSet; } private void save(Resource resource, Callback<Resource> callback) { try { resource.save(null, callback); } catch (IOException e) { callback.onFailure(e); } } private void delete(Resource resource, Callback<Resource> callback) { try { resource.delete(null, callback); } catch (IOException e) { callback.onFailure(e); } } }