/******************************************************************************* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright (c) 2013,2014 by Peter Pilgrim, Addiscombe, Surrey, XeNoNiQUe UK * * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU GPL v3.0 * which accompanies this distribution, and is available at: * http://www.gnu.org/licenses/gpl-3.0.txt * * Developers: * Peter Pilgrim -- design, development and implementation * -- Blog: http://www.xenonique.co.uk/blog/ * -- Twitter: @peter_pilgrim * * Contributors: * *******************************************************************************/ package je7hb.intro.xentracker.control; import je7hb.intro.xentracker.boundary.ProjectTaskService; import je7hb.intro.xentracker.entity.*; import javax.annotation.Resource; import javax.ejb.Stateless; import javax.enterprise.concurrent.ManagedExecutorService; import javax.inject.Inject; import javax.json.*; import javax.json.stream.*; import javax.ws.rs.*; import javax.ws.rs.container.AsyncResponse; import javax.ws.rs.container.Suspended; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.io.StringWriter; import java.util.*; import static javax.ws.rs.core.MediaType.*; /** * The type ProjectRESTServerEndpoint * * @author Peter Pilgrim (peter) */ @Path("/projects/") @Stateless public class ProjectRESTServerEndpoint { static JsonGeneratorFactory jsonGeneratorFactory = Json.createGeneratorFactory( new HashMap<String, Object>() {{ put(JsonGenerator.PRETTY_PRINTING, true); }}); @Inject ProjectTaskService service; @GET @Path("/item") @Produces(APPLICATION_JSON) public String retrieveProject( @PathParam("id") @DefaultValue("0") int projectId ) { List<Project> projects = service.findProjectById(projectId); StringWriter swriter = new StringWriter(); JsonGenerator generator = jsonGeneratorFactory.createGenerator(swriter); ProjectHelper.generateProjectsAsJson(generator, projects).close(); return swriter.toString(); } @POST @Path("/item") @Consumes(APPLICATION_JSON) @Produces(APPLICATION_JSON) public String createProject( JsonObject projectObject ) throws Exception { Project project = new Project( projectObject.getString("name")); JsonArray tasksArray = projectObject.getJsonArray("tasks"); if ( tasksArray != null ) { for ( int j=0; j<tasksArray.size(); ++j ) { JsonObject taskObject = tasksArray.getJsonObject(j); Task task = new Task( taskObject.getString("name"), ( taskObject.containsKey("targetDate") ? ProjectHelper.FMT.parse(taskObject.getString("targetDate")) : null ), taskObject.getBoolean("completed")); project.addTask(task); } } service.saveProject(project); StringWriter swriter = new StringWriter(); JsonGenerator generator = jsonGeneratorFactory.createGenerator(swriter); ProjectHelper.writeProjectAsJson(generator, project).close(); return swriter.toString(); } @Resource(name="concurrent/LongRunningTasksExecutor") ManagedExecutorService executor; @GET @Produces(MediaType.APPLICATION_JSON) @Path("/list") public void getProjectList( @Suspended final AsyncResponse asyncResponse) { System.out.printf("=======> %s.getProjectList() %s asyncResponse=%s\n", getClass().getSimpleName(), Thread.currentThread(), asyncResponse ); executor.submit(new Runnable() { @Override public void run() { System.out.printf("========>> %s.getProjectList() Executable Task %s asyncResponse=%s\n", getClass().getSimpleName(), Thread.currentThread(), asyncResponse); List<Project> projects = service.findAllProjects(); StringWriter swriter = new StringWriter(); JsonGenerator generator = jsonGeneratorFactory.createGenerator(swriter); ProjectHelper.generateProjectsAsJson(generator, projects).close(); System.out.printf("========>> Sending swriter=[%s]\n", swriter.toString()); Response response = Response.ok(swriter.toString()).build(); asyncResponse.resume(response); } }); // We add this slight delay to ensure the Arquillian integration unit test receives the result. try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } }