blob: 5f83cb8d6bc2623b326d8953c36c792db645315f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/**
* Servlet code for xcos-on-web
* Authors: Maverick and Adhitya
* Description: Thefollowing 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 {
PrintWriter pw = response.getWriter();
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 .png 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 = "/path/to/webapps/xcos-on-web/servlet" + File.separator + fileNameWithoutExt + ".png";
/**
* Maverick:
* Creating the command which is to be executed using terminal.
*/
commands.add("driver('PNG');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) {
pw.println("Exception");
}
finally {
try {
if (is != null) {
is.close();
}
if (baos != null) {
baos.close();
}
}
catch (Exception ex) {
}
}
/**
* Maverick:
* Accessing the .png file and sending it to the client.
*/
pw.println("servlet/" + fileNameWithoutExt + ".png");
pw.close();
}
}
|