// Path: javalab/src/main/java/com/smorales/javalab/business/processor/boundary/WorkspaceProcessor.java
// @Stateless
// @Interceptors({TimeLogger.class})
// public class WorkspaceProcessor {
// 
// //    @PersistenceContext
// //    EntityManager em;
// 
//     @Inject
//     ProjectCache projectCache;
// 
//     @Inject
//     BuildToolFactory factory;
// 
//     @Inject
//     Logger tracer;
// 
//     public JsonObject initialize(String lang) {
//         return projectCache.get(lang);
//     }
// 
//     public JsonObject getById(Integer labId) {
//         try {
// //            Workspace workspace = em.find(Workspace.class, labId);
// //            return Json.createReader(new StringReader(workspace.getJson())).readObject();
//             throw new UnsupportedOperationException();
//         } catch (NoResultException ex) {
//             return Json.createObjectBuilder().add("output", "no workspace available").build();
//         }
//     }
// 
//     public String runCode(Request req) {
//         BuildTool buildTool = factory.get(req);
//         tracer.info("RUN CODE >>> \n" + req.toString());
//         return buildTool.runCode(req.getFilesTree(), req.getConfig());
//     }
// 
//     public String runTests(Request req) {
//         BuildTool buildTool = factory.get(req);
//         tracer.info("RUN TEST >>> \n" + req.toString());
//         return buildTool.testCode(req.getFilesTree(), req.getConfig());
//     }
// 
//     public Integer save(String data) {
//         Workspace workspace = new Workspace();
//         workspace.setId(null);
//         workspace.setJson(data);
// 
//         workspace.setDescription(getStringFromJson("description", data));
// //        workspace.setUserid(em.getReference(User.class, 1));
//         workspace.setTags(createTags(getStringFromJson("tags", data)));
// //        em.persist(workspace);
//         return workspace.getId();
//     }
// 
//     private String getStringFromJson(String toFind, String json) {
//         String script = "Java.asJSONCompatible(" + json + ")";
//         ScriptEngineManager sem = new ScriptEngineManager();
//         ScriptEngine engine = sem.getEngineByName("javascript");
//         Map result;
//         try {
//             result = (Map) engine.eval(script);
//         } catch (ScriptException e) {
//             throw new IllegalStateException("Exception executing script engine", e);
//         }
// 
//         return (String) result.get(toFind);
//     }
// 
//     private Set<Tag> createTags(String tagsAsString) {
//         HashSet<String> split = new HashSet<>(Arrays.asList(tagsAsString.split(",")));
//         HashSet<Tag> tags = new HashSet<>();
//         for (String tagName : split) {
//             Tag tag = new Tag(tagName);
//             tags.add(tag);
// //            em.persist(tag);
//         }
//         return tags;
//     }
// 
// 
//     public byte[] download(Request req) {
//         BuildTool buildTool = factory.get(req);
//         return buildTool.createZip(req.getFilesTree(), req.getConfig());
//     }
// }
// 
// Path: javalab/src/main/java/com/smorales/javalab/business/processor/boundary/rest/request/Request.java
// public class Request {
// 
//     private List<TreeNode> filesTree;
//     private Config config;
//     private String terminal;
//     private String description;
//     private List<String> tags;
// 
//     private RunnableNode runnableNode;
// 
//     public List<TreeNode> getFilesTree() {
//         return filesTree;
//     }
// 
//     public void setFilesTree(List<TreeNode> filesTree) {
//         this.filesTree = filesTree;
//     }
// 
//     public Config getConfig() {
//         return config;
//     }
// 
//     public void setConfig(Config config) {
//         this.config = config;
//     }
// 
//     public String getTerminal() {
//         return terminal;
//     }
// 
//     public void setTerminal(String terminal) {
//         this.terminal = terminal;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public void setDescription(String description) {
//         this.description = description;
//     }
// 
//     public List<String> getTags() {
//         return tags;
//     }
// 
//     public void setTags(List<String> tags) {
//         this.tags = tags;
//     }
// 
// 
//     public RunnableNode getRunnableNode() {
//         return runnableNode;
//     }
// 
//     public void setRunnableNode(RunnableNode runnableNode) {
//         this.runnableNode = runnableNode;
//     }
// 
//     @Override
//     public String toString() {
//         return "Request{" +
//                 "filesTree=" + filesTree +
//                 ", config=" + config +
//                 ", terminal=" + terminal +
//                 ", description='" + description + '\'' +
//                 ", tags='" + tags + '\'' +
//                 '}';
//     }
// }


import com.smorales.javalab.business.processor.boundary.WorkspaceProcessor;
import com.smorales.javalab.business.processor.boundary.rest.request.Request;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.json.Json;
import javax.json.JsonObject;
import javax.validation.constraints.NotNull;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.logging.Logger;
package com.smorales.javalab.business.processor.boundary.rest;



@Stateless
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
// Path: javalab/src/main/java/com/smorales/javalab/business/processor/boundary/WorkspaceProcessor.java
// @Stateless
// @Interceptors({TimeLogger.class})
// public class WorkspaceProcessor {
// 
// //    @PersistenceContext
// //    EntityManager em;
// 
//     @Inject
//     ProjectCache projectCache;
// 
//     @Inject
//     BuildToolFactory factory;
// 
//     @Inject
//     Logger tracer;
// 
//     public JsonObject initialize(String lang) {
//         return projectCache.get(lang);
//     }
// 
//     public JsonObject getById(Integer labId) {
//         try {
// //            Workspace workspace = em.find(Workspace.class, labId);
// //            return Json.createReader(new StringReader(workspace.getJson())).readObject();
//             throw new UnsupportedOperationException();
//         } catch (NoResultException ex) {
//             return Json.createObjectBuilder().add("output", "no workspace available").build();
//         }
//     }
// 
//     public String runCode(Request req) {
//         BuildTool buildTool = factory.get(req);
//         tracer.info("RUN CODE >>> \n" + req.toString());
//         return buildTool.runCode(req.getFilesTree(), req.getConfig());
//     }
// 
//     public String runTests(Request req) {
//         BuildTool buildTool = factory.get(req);
//         tracer.info("RUN TEST >>> \n" + req.toString());
//         return buildTool.testCode(req.getFilesTree(), req.getConfig());
//     }
// 
//     public Integer save(String data) {
//         Workspace workspace = new Workspace();
//         workspace.setId(null);
//         workspace.setJson(data);
// 
//         workspace.setDescription(getStringFromJson("description", data));
// //        workspace.setUserid(em.getReference(User.class, 1));
//         workspace.setTags(createTags(getStringFromJson("tags", data)));
// //        em.persist(workspace);
//         return workspace.getId();
//     }
// 
//     private String getStringFromJson(String toFind, String json) {
//         String script = "Java.asJSONCompatible(" + json + ")";
//         ScriptEngineManager sem = new ScriptEngineManager();
//         ScriptEngine engine = sem.getEngineByName("javascript");
//         Map result;
//         try {
//             result = (Map) engine.eval(script);
//         } catch (ScriptException e) {
//             throw new IllegalStateException("Exception executing script engine", e);
//         }
// 
//         return (String) result.get(toFind);
//     }
// 
//     private Set<Tag> createTags(String tagsAsString) {
//         HashSet<String> split = new HashSet<>(Arrays.asList(tagsAsString.split(",")));
//         HashSet<Tag> tags = new HashSet<>();
//         for (String tagName : split) {
//             Tag tag = new Tag(tagName);
//             tags.add(tag);
// //            em.persist(tag);
//         }
//         return tags;
//     }
// 
// 
//     public byte[] download(Request req) {
//         BuildTool buildTool = factory.get(req);
//         return buildTool.createZip(req.getFilesTree(), req.getConfig());
//     }
// }
// 
// Path: javalab/src/main/java/com/smorales/javalab/business/processor/boundary/rest/request/Request.java
// public class Request {
// 
//     private List<TreeNode> filesTree;
//     private Config config;
//     private String terminal;
//     private String description;
//     private List<String> tags;
// 
//     private RunnableNode runnableNode;
// 
//     public List<TreeNode> getFilesTree() {
//         return filesTree;
//     }
// 
//     public void setFilesTree(List<TreeNode> filesTree) {
//         this.filesTree = filesTree;
//     }
// 
//     public Config getConfig() {
//         return config;
//     }
// 
//     public void setConfig(Config config) {
//         this.config = config;
//     }
// 
//     public String getTerminal() {
//         return terminal;
//     }
// 
//     public void setTerminal(String terminal) {
//         this.terminal = terminal;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public void setDescription(String description) {
//         this.description = description;
//     }
// 
//     public List<String> getTags() {
//         return tags;
//     }
// 
//     public void setTags(List<String> tags) {
//         this.tags = tags;
//     }
// 
// 
//     public RunnableNode getRunnableNode() {
//         return runnableNode;
//     }
// 
//     public void setRunnableNode(RunnableNode runnableNode) {
//         this.runnableNode = runnableNode;
//     }
// 
//     @Override
//     public String toString() {
//         return "Request{" +
//                 "filesTree=" + filesTree +
//                 ", config=" + config +
//                 ", terminal=" + terminal +
//                 ", description='" + description + '\'' +
//                 ", tags='" + tags + '\'' +
//                 '}';
//     }
// }


// Path: javalab/src/main/java/com/smorales/javalab/business/processor/boundary/rest/WorkspaceProcessorResource.java
import com.smorales.javalab.business.processor.boundary.WorkspaceProcessor;
import com.smorales.javalab.business.processor.boundary.rest.request.Request;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.json.Json;
import javax.json.JsonObject;
import javax.validation.constraints.NotNull;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.util.logging.Logger;

package com.smorales.javalab.business.processor.boundary.rest;



@Stateless
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
@Path("/process")