Added "synchronized" method to create random number in case of multi-thread issue
[mirror_edk2.git] / Tools / Java / Source / FrameworkTasks / org / tianocore / framework / tasks / Tool.java
CommitLineData
878ddf1f 1/** @file\r
2This file is to define nested element which is meant for specifying a tool\r
3\r
4Copyright (c) 2006, Intel Corporation\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14package org.tianocore.framework.tasks;\r
15\r
16import java.io.DataInputStream;\r
17import java.io.DataOutputStream;\r
18import java.io.File;\r
19import java.io.FileInputStream;\r
a1ffb10f 20import java.io.FileOutputStream;\r
21import java.io.IOException;\r
878ddf1f 22import java.util.ArrayList;\r
23import java.util.Iterator;\r
24import java.util.List;\r
c493be6c 25import java.util.Random;\r
878ddf1f 26\r
27import org.apache.tools.ant.BuildException;\r
a1ffb10f 28import org.tianocore.common.logger.EdkLog;\r
878ddf1f 29\r
30/**\r
31 Class Tool is to define an external tool to be used for genffsfile\r
32 **/\r
33public class Tool implements EfiDefine, Section {\r
34\r
93f5dd0a 35 private String toolName = "";\r
36 private ToolArg toolArgList = new ToolArg();\r
37 private Input inputFiles = new Input();\r
34a0c844 38 private Input tempInputFile = new Input();\r
93f5dd0a 39 private String outputPath;\r
c493be6c 40 private String outputFileName ;\r
4a557ace 41 private static Random ran = new Random(9999); \r
93f5dd0a 42 private List<Section> gensectList = new ArrayList<Section>();\r
878ddf1f 43 /**\r
44 Call extern tool\r
45\r
46 @param buffer The buffer to put the result with alignment\r
47 **/\r
87379bbe 48 public void toBuffer (DataOutputStream buffer){\r
878ddf1f 49 ///\r
50 /// call extern tool\r
51 ///\r
52 try {\r
53 executeTool ();\r
54 } catch (Exception e) {\r
0fdb42ac 55 throw new BuildException("Call to executeTool failed!\n" + e.getMessage());\r
878ddf1f 56 }\r
57\r
58 ///\r
59 /// check if file exist\r
60 ///\r
c493be6c 61 File outputFile = new File (this.outputFileName);\r
82810f3b 62 if (!outputFile.exists()) {\r
63 throw new BuildException("The file " + outputFile.getPath() + " does not exist!\n");\r
878ddf1f 64 }\r
65\r
66 ///\r
67 /// Read output file and write it's cotains to buffer\r
68 ///\r
82810f3b 69 FileInputStream fs = null;\r
70 DataInputStream in = null;\r
878ddf1f 71 try {\r
82810f3b 72 fs = new FileInputStream (outputFile);\r
73 in = new DataInputStream (fs);\r
74\r
75\r
76 int fileLen = (int)outputFile.length();\r
77 byte[] data = new byte[fileLen];\r
78 in.read(data);\r
79 buffer.write(data, 0, fileLen);\r
878ddf1f 80\r
81 ///\r
82 /// 4 byte alignment\r
83 ///\r
84 while ((fileLen & 0x03) != 0) {\r
85 fileLen++;\r
86 buffer.writeByte(0);\r
87 }\r
878ddf1f 88 } catch (Exception e) {\r
0fdb42ac 89 EdkLog.log(e.getMessage());\r
3f7b510e 90 throw new BuildException("Tool call, toBuffer failed!\n");\r
82810f3b 91 } finally {\r
92 try {\r
93 if (in != null) {\r
94 in.close();\r
95 }\r
96 if (fs != null) {\r
97 fs.close();\r
98 }\r
34a0c844 99 outputFile.delete(); \r
82810f3b 100 } catch (Exception e) {\r
0fdb42ac 101 EdkLog.log("WARNING: Cannot close " + outputFile.getPath());\r
82810f3b 102 }\r
878ddf1f 103 }\r
104 }\r
105\r
106 ///\r
107 /// execute external tool for genffsfile\r
108 ///\r
109 private void executeTool () {\r
110 String command = "";\r
111 String argument = "";\r
112 command = toolName;\r
a1ffb10f 113 \r
114 //\r
115 // Get each section which under the compress {};\r
116 // And add it is contains to File;\r
117 //\r
118 Section sect;\r
119 try{\r
120 Iterator SectionIter = this.gensectList.iterator();\r
121 while (SectionIter.hasNext()){\r
122 sect = (Section)SectionIter.next();\r
123 //\r
124 // Parse <genSection> element\r
125 //\r
93f5dd0a 126 File outputFile = File.createTempFile("temp", "sec1", new File(outputPath));\r
a1ffb10f 127 FileOutputStream bo = new FileOutputStream(outputFile);\r
128 DataOutputStream Do = new DataOutputStream (bo);\r
129 //\r
130 // Call each section class's toBuffer function.\r
131 //\r
132 try {\r
133 sect.toBuffer(Do);\r
134 }\r
135 catch (BuildException e) {\r
0fdb42ac 136 EdkLog.log(e.getMessage());\r
a1ffb10f 137 throw new BuildException ("GenSection failed at Tool!");\r
c493be6c 138 } finally {\r
139 if (Do != null){\r
140 Do.close(); \r
141 }\r
142 \r
143 } \r
34a0c844 144 this.tempInputFile.insFile(outputFile.getPath());\r
a1ffb10f 145 } \r
146 } catch (IOException e){\r
147 throw new BuildException ("Gensection failed at tool!");\r
c493be6c 148 } \r
878ddf1f 149\r
878ddf1f 150 try {\r
2320bb14 151 this.outputFileName = "Temp" + getRand();\r
93f5dd0a 152 argument = toolArgList + inputFiles.toStringWithSinglepPrefix(" -i ") \r
c493be6c 153 + tempInputFile.toString(" ")+ " -o " + outputFileName;\r
93f5dd0a 154 EdkLog.log(this, EdkLog.EDK_VERBOSE, command + " " + argument);\r
878ddf1f 155 ///\r
156 /// execute command line\r
157 ///\r
a1ffb10f 158 Process process = Runtime.getRuntime().exec(command + " " + argument);\r
159 process.waitFor();\r
34a0c844 160 Iterator tempFile = tempInputFile.getNameList().iterator();\r
161 while (tempFile.hasNext()){\r
162 File file = new File((String)tempFile.next());\r
163 if (file.exists()) {\r
164 file.delete();\r
165 }\r
166 }\r
2320bb14 167 } catch (Exception e) {\r
168 EdkLog.log(e.getMessage());\r
3f7b510e 169 throw new BuildException("Execution of externalTool task failed!\n");\r
878ddf1f 170 }\r
171 }\r
172\r
173 /**\r
174 Add method of ANT task/datatype for nested ToolArg type of element\r
175\r
176 @param toolArg The ToolArg object containing arguments for the tool\r
177 **/\r
93f5dd0a 178 public void addConfiguredToolArg (ToolArg toolArg) {\r
179 toolArgList.insert(toolArg);\r
878ddf1f 180 }\r
181\r
182 /**\r
183 Get method of ANT task/datatype for attribute "OutputPath"\r
184\r
185 @returns The name of output path\r
186 **/\r
187 public String getOutputPath() {\r
188 return outputPath;\r
189 }\r
190\r
191 /**\r
192 Set method of ANT task/datatype for attribute "OutputPath"\r
193\r
194 @param outputPath The name of output path\r
195 **/\r
196 public void setOutputPath(String outPutPath) {\r
197 this.outputPath = outPutPath;\r
198 }\r
199\r
200 /**\r
201 Get method of ANT task/datatype for attribute "ToolName"\r
202\r
203 @returns The name of the tool.\r
204 **/\r
205 public String getToolName() {\r
206 return toolName;\r
207 }\r
208\r
209 /**\r
210 Set method of ANT task/datatype for attribute "ToolName"\r
211\r
212 @param toolName The name of the tool\r
213 **/\r
214 public void setToolName(String toolName) {\r
215 this.toolName = toolName;\r
216 }\r
217\r
218 /**\r
219 Add method of ANT task/datatype for nested Input type of element\r
220\r
221 @param file The Input objec which represents a file\r
222 **/\r
93f5dd0a 223 public void addConfiguredInput(Input file) {\r
224 inputFiles.insert(file);\r
878ddf1f 225 }\r
a1ffb10f 226 \r
227// /**\r
228// addTool\r
229// \r
230// This function is to add instance of Tool to list.\r
231// \r
232// @param tool instance of Tool.\r
233// **/\r
234// public void addTool(Tool tool){\r
235// this.toolList.add(tool);\r
236// }\r
237 \r
238 public void addGenSection(GenSectionTask genSect){\r
239 this.gensectList.add(genSect);\r
2320bb14 240 }\r
241\r
242 /**\r
243 Get random number.\r
244\r
245 @returns The random integer.\r
246 **/\r
247 public synchronized int getRand() {\r
248 return ran.nextInt();\r
249 }\r
878ddf1f 250}\r
251\r
252\r