761a0efab041baffcb2ae979f6174eb2541b9302
[people/mcb30/edk2.git] / edk2 / Tools / Java / Source / FrameworkTasks / org / tianocore / framework / tasks / Tool.java
1 /** @file\r
2 This file is to define nested element which is meant for specifying a tool\r
3 \r
4 Copyright (c) 2006, Intel Corporation\r
5 All rights reserved. This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution.  The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9 \r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 \r
13 **/\r
14 package org.tianocore.framework.tasks;\r
15 \r
16 import java.io.DataInputStream;\r
17 import java.io.DataOutputStream;\r
18 import java.io.File;\r
19 import java.io.FileInputStream;\r
20 import java.io.FileOutputStream;\r
21 import java.io.IOException;\r
22 import java.util.ArrayList;\r
23 import java.util.Iterator;\r
24 import java.util.List;\r
25 import java.util.Random;\r
26 \r
27 import org.apache.tools.ant.BuildException;\r
28 import org.tianocore.common.logger.EdkLog;\r
29 \r
30 /**\r
31  Class Tool is to define an external tool to be used for genffsfile\r
32  **/\r
33 public class Tool implements EfiDefine, Section {\r
34 \r
35     private String toolName     = "";\r
36     private ToolArg toolArgList = new ToolArg();\r
37     private Input inputFiles = new Input();\r
38     private Input tempInputFile = new Input();\r
39     private String outputPath;\r
40     private String outputFileName ;\r
41     private static Random ran = new Random(9999); \r
42     private List<Section>  gensectList = new ArrayList<Section>();\r
43     /**\r
44      Call extern tool\r
45 \r
46      @param     buffer  The buffer to put the result with alignment\r
47      **/\r
48     public void toBuffer (DataOutputStream buffer){\r
49         ///\r
50         /// call extern tool\r
51         ///\r
52         try {\r
53             executeTool ();\r
54         } catch (Exception e) {\r
55             throw new BuildException("Call to executeTool failed!\n" + e.getMessage());\r
56         }\r
57 \r
58         ///\r
59         /// check if file exist\r
60         ///\r
61         File outputFile = new File (this.outputFileName);\r
62         if (!outputFile.exists()) {\r
63             throw new BuildException("The file " + outputFile.getPath() + " does not exist!\n");\r
64         }\r
65 \r
66         ///\r
67         /// Read output file and write it's cotains to buffer\r
68         ///\r
69         FileInputStream fs = null;\r
70         DataInputStream in = null;\r
71         try {\r
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
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
88         } catch (Exception e) {\r
89             EdkLog.log(e.getMessage());\r
90             throw new BuildException("Tool call, toBuffer failed!\n");\r
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
99                 outputFile.delete(); \r
100             } catch (Exception e) {\r
101                 EdkLog.log("WARNING: Cannot close " + outputFile.getPath());\r
102             }\r
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
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
126                 File outputFile = File.createTempFile("temp", "sec1", new File(outputPath));\r
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
136                     EdkLog.log(e.getMessage());\r
137                     throw new BuildException ("GenSection failed at Tool!");\r
138                 } finally {\r
139                     if (Do != null){\r
140                         Do.close();    \r
141                     }\r
142                     \r
143                 } \r
144                 this.tempInputFile.insFile(outputFile.getPath());\r
145             }        \r
146         } catch (IOException e){\r
147             throw new BuildException ("Gensection failed at tool!");\r
148         } \r
149 \r
150         try {\r
151             this.outputFileName = "Temp" + getRand();\r
152             argument   = toolArgList + inputFiles.toStringWithSinglepPrefix(" -i ") \r
153                          + tempInputFile.toString(" ")+ " -o " + outputFileName;\r
154             EdkLog.log(this, EdkLog.EDK_VERBOSE, command + " " + argument);\r
155             ///\r
156             /// execute command line\r
157             ///\r
158             Process process = Runtime.getRuntime().exec(command + " " + argument);\r
159             process.waitFor();\r
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
167         } catch (Exception e) {\r
168             EdkLog.log(e.getMessage());\r
169             throw new BuildException("Execution of externalTool task failed!\n");\r
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
178     public void addConfiguredToolArg (ToolArg toolArg) {\r
179         toolArgList.insert(toolArg);\r
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
223     public void addConfiguredInput(Input file) {\r
224         inputFiles.insert(file);\r
225     }\r
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
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
250 }\r
251 \r
252 \r