diff options
Diffstat (limited to 'src/main/java/fossee/xcos/on/web/SciExec.java')
-rw-r--r-- | src/main/java/fossee/xcos/on/web/SciExec.java | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/src/main/java/fossee/xcos/on/web/SciExec.java b/src/main/java/fossee/xcos/on/web/SciExec.java new file mode 100644 index 0000000..994d1cd --- /dev/null +++ b/src/main/java/fossee/xcos/on/web/SciExec.java @@ -0,0 +1,127 @@ +package fossee.xcos.on.web; + +/** + * Servlet code for xcos-on-web Authors: Maverick and Adhitya Description: The + * following servlet creates a shell command to run Scilab without any + * GUI/simulation window. The diagram sent from client is stored in a + * usr-xxx.xcos file and is then simulated. The result is a .png file which is + * then sent back to the client. + */ +import java.io.*; +import javax.servlet.*; +import java.util.*; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import org.apache.commons.io.IOUtils; +import org.apache.commons.io.FilenameUtils; + +public class SciExec extends GenericServlet { + + public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { + + InputStream is = null; + ByteArrayOutputStream baos = null; + List<String> commands = new ArrayList<String>(); + /** + * Maverick and Srikant: Creating a shell command to run Scilab without + * any GUI so that the simulation window doesn't appear. + */ + commands.add("scilab-adv-cli"); + commands.add("-noatomsautoload"); + commands.add("-nogui"); + commands.add("-nb"); + commands.add("-e"); + + String imagePath = ""; + String fileNameWithoutExt = ""; + + /** + * Maverick: Ignore the following block. + * + * commands.add("plot3d();xs2png(gcf(),'img2.png');exit();"); String + * data=request.getParameter("name"); pw.println(data); + * commands.add("echo "+data+" > + * /home/saarang/Softwares/apache-tomcat-8.0.36/webapps/sci/servlet/file.xcos"); + * commands.add("driver('PNG');xinit('/home/saarang/apache-tomcat-8.0.36/webapps/worknogui/servlet/ans"+k+".png');loadXcosLibs();importXcosDiagram('/home/saarang/apache-tomcat-8.0.36/file.xcos');xcos_simulate(scs_m,4);mode(2);xend();quit();"); + */ + ProcessBuilder pb = new ProcessBuilder(commands); + try { + InputStream inputStream = request.getInputStream(); + /** + * Adhitya: Creating a temporary file in the directory containing + * tomcat. This is the .xcos file which will be executed by the + * Scilab engine. + */ + File xcosFile = File.createTempFile("usr-", ".xcos"); + OutputStream outputStream = new FileOutputStream(xcosFile); + IOUtils.copy(inputStream, outputStream); + outputStream.close(); + + String tempPath = xcosFile.getAbsolutePath(); + + String parentPath = xcosFile.getParent(); + fileNameWithoutExt = FilenameUtils.removeExtension(xcosFile.getName()); + + /** + * Maverick: The resultant .svg file which is produced as a result + * of simulation is stored in a different folder inside the + * respective webapp directory. The path of the folder is + * /path/to/webapp/servlet. + * + * @ToDo: Modify the following path. + */ + imagePath = parentPath + File.separator + fileNameWithoutExt + ".svg"; + + /** + * Maverick: Creating the command which is to be executed using + * terminal. + */ + commands.add("driver('SVG');xinit('" + imagePath + "');loadXcosLibs();importXcosDiagram('" + tempPath + "');xcos_simulate(scs_m,4);mode(2);xend();quit();"); + + /** + * Maverick: Reference: + * http://stackoverflow.com/questions/23086778/how-to-access-unix-shell-special-variables-using-java + * Starting a process to execute the created command. + */ + Process prs = pb.start(); + is = prs.getInputStream(); + byte[] b = new byte[1024]; + int size = 0; + baos = new ByteArrayOutputStream(); + while ((size = is.read(b)) != -1) { + baos.write(b, 0, size); + } + System.out.println(new String(baos.toByteArray())); + + } catch (IOException e) { + e.printStackTrace(); + } catch (Exception e) { + System.out.println("Exception"); + } finally { + try { + if (is != null) { + is.close(); + } + if (baos != null) { + baos.close(); + } + } catch (Exception ex) { + } + } + /** + * Adhitya: Accessing the .svg file and sending it to the client. + */ + OutputStream out = response.getOutputStream(); + FileInputStream in = new FileInputStream(imagePath); + byte[] buffer = new byte[4096]; + int length; + while ((length = in.read(buffer)) > 0) { + out.write(buffer, 0, length); + } + in.close(); + out.flush(); + } +} |