42 * </hlm:imakermetadatainput> |
58 * </hlm:imakermetadatainput> |
43 * </pre> |
59 * </pre> |
44 * |
60 * |
45 * @ant.task name="imakermetadatainput" category="Metadata" |
61 * @ant.task name="imakermetadatainput" category="Metadata" |
46 */ |
62 */ |
47 public class IMakerLogMetaDataInput extends TextLogMetaDataInput { |
63 public class IMakerLogMetaDataInput extends AbstractComponentBaseMetadataInput { |
|
64 public static final String DEFAULT_COMPONENT_NAME = "General"; |
|
65 private Pattern iMakerFpsxPattern = Pattern.compile("/([^/]*?\\.fpsx)"); |
|
66 private EntityManager entityManager; |
48 |
67 |
49 /** Internal data storage. */ |
68 /** |
50 private class Entry { |
69 * {@inheritDoc} |
|
70 */ |
|
71 @Override |
|
72 public void extract(EntityManagerFactory factory, File file) |
|
73 throws MetadataException { |
|
74 entityManager = factory.createEntityManager(); |
|
75 List<MetadataEntry> entries = new ArrayList<MetadataEntry>(); |
|
76 String currentComponent = null; |
|
77 try { |
|
78 // Creating the filename |
|
79 LogFile logFile = getLogFile(entityManager, file); |
51 |
80 |
52 private String fileName; |
81 // Loading the available priorities |
53 private int lineNumber; |
82 SeverityDAO severityDao = new SeverityDAO(); |
54 private String text; |
83 severityDao.setEntityManager(entityManager); |
55 private String severity; |
84 Map<String, Severity> priorities = severityDao.getSeverities(); |
56 |
85 |
57 public Entry(String fileName, int lineNumber, String text, String severity) { |
86 // Parsing the log file |
58 super(); |
87 BufferedReader reader = new BufferedReader(new FileReader(file)); |
59 this.text = text; |
88 String line = null; |
60 this.lineNumber = lineNumber; |
89 int lineNumber = 0; |
61 this.fileName = fileName; |
90 while ((line = reader.readLine()) != null) { |
62 this.severity = severity; |
91 lineNumber++; |
|
92 Matcher matcher = iMakerFpsxPattern.matcher(line); |
|
93 if (matcher.find()) { |
|
94 currentComponent = matcher.group(1); |
|
95 log("Matched component: " + currentComponent, Project.MSG_DEBUG); |
|
96 } |
|
97 if (line.startsWith("++ Started at")) { |
|
98 currentComponent = null; |
|
99 } else if (line.startsWith("++ Finished at")) { |
|
100 if (currentComponent == null) { |
|
101 currentComponent = DEFAULT_COMPONENT_NAME; |
|
102 } |
|
103 Component component = getComponent(currentComponent, logFile); |
|
104 entityManager.getTransaction().begin(); |
|
105 for (MetadataEntry entry : entries) { |
|
106 entry.setComponent(component); |
|
107 entityManager.persist(entry); |
|
108 } |
|
109 entityManager.getTransaction().commit(); |
|
110 entityManager.clear(); |
|
111 entries.clear(); |
|
112 } else { |
|
113 SeverityEnum.Severity severity = getSeverity(line); |
|
114 if (severity != SeverityEnum.Severity.NONE) { |
|
115 MetadataEntry entry = new MetadataEntry(); |
|
116 entry.setLogFile(logFile); |
|
117 entry.setLineNumber(lineNumber); |
|
118 entry.setSeverity(priorities.get(severity.toString())); |
|
119 entry.setText(line); |
|
120 entries.add(entry); |
|
121 } |
|
122 } |
|
123 } |
|
124 reader.close(); |
|
125 } catch (FileNotFoundException ex) { |
|
126 throw new MetadataException(ex.getMessage(), ex); |
|
127 } catch (IOException ex) { |
|
128 throw new MetadataException(ex.getMessage(), ex); |
|
129 } finally { |
|
130 if (entityManager != null) { |
|
131 entityManager.close(); |
|
132 } |
|
133 clear(); |
63 } |
134 } |
64 |
135 |
65 public String getText() { |
|
66 return text; |
|
67 } |
|
68 |
|
69 public int getLineNumber() { |
|
70 return lineNumber; |
|
71 } |
|
72 |
|
73 public String getFileName() { |
|
74 return fileName; |
|
75 } |
|
76 |
|
77 public String getSeverity() { |
|
78 return severity; |
|
79 } |
|
80 |
|
81 } |
|
82 |
|
83 private Logger log = Logger.getLogger(AbldLogMetaDataInput.class); |
|
84 |
|
85 private Pattern iMakerFpsxPattern = Pattern.compile("/([^/]*?\\.fpsx)"); |
|
86 |
|
87 private String currentComponent; |
|
88 |
|
89 private boolean entryCreated; |
|
90 |
|
91 private boolean isRecordingIssues; |
|
92 |
|
93 public IMakerLogMetaDataInput() { |
|
94 } |
136 } |
95 |
137 |
96 /** |
138 /** |
97 * Function to check from the input stream if is there any entries |
139 * {@inheritDoc} |
98 * available. |
|
99 * |
|
100 * @return true if there are any entry available otherwise false. |
|
101 */ |
140 */ |
102 public boolean isEntryCreated(File currentFile) { |
141 @Override |
103 String exceptions = ""; |
142 protected EntityManager getEntityManager() { |
104 entryCreated = false; |
143 return entityManager; |
105 int lineNumber = getLineNumber(); |
144 } |
106 BufferedReader currentReader = getCurrentReader(); |
|
107 log.debug("Getting next set of log entries for iMaker input"); |
|
108 try { |
|
109 if (currentReader == null) { |
|
110 lineNumber = 0; |
|
111 setLineNumber(lineNumber); |
|
112 log.debug("Processing iMaker log file name: " + currentFile); |
|
113 currentReader = new BufferedReader(new FileReader(currentFile)); |
|
114 setCurrentReader(currentReader); |
|
115 } |
|
116 |
145 |
117 List<Entry> entriesCache = new ArrayList<Entry>(); |
|
118 String logText = null; |
|
119 while ((logText = currentReader.readLine()) != null) { |
|
120 lineNumber++; |
|
121 setLineNumber(lineNumber); |
|
122 |
|
123 // Remove Ant task comment text, e.g. "[imaker]" |
|
124 logText = logText.replaceFirst("'^\\s*\\[.+?\\]\\s*", ""); |
|
125 // log.debug("Parsing log line: " + logText); |
|
126 |
|
127 // See if the line should be captured |
|
128 if (isRecordingIssues) { |
|
129 // Check for a line with an issue |
|
130 String severity = getSeverity(logText); |
|
131 if (severity != null) { |
|
132 Entry entry = new Entry(currentFile.toString(), lineNumber, logText, severity); |
|
133 entriesCache.add(entry); |
|
134 } |
|
135 |
|
136 // Check if the iMaker FPSX image name is on this line, to |
|
137 // get the component |
|
138 if (currentComponent == null) { |
|
139 Matcher componentMatch = iMakerFpsxPattern.matcher(logText); |
|
140 if (componentMatch.find()) { |
|
141 currentComponent = componentMatch.group(1); |
|
142 log.debug("Matched component: " + currentComponent); |
|
143 } |
|
144 } |
|
145 |
|
146 // See if the component log block has ended |
|
147 if (logText.startsWith("++ Finished at")) { |
|
148 // Add all cached issues |
|
149 if (currentComponent != null && entriesCache.size() > 0) { |
|
150 for (int i = 0; i < entriesCache.size(); i++) { |
|
151 Entry entry = entriesCache.get(i); |
|
152 addEntry(entry.getSeverity(), currentComponent, entry.getFileName(), entry.getLineNumber(), entry.getText()); |
|
153 } |
|
154 entryCreated = true; |
|
155 currentComponent = null; |
|
156 return true; |
|
157 } |
|
158 // Or add a default entry to record the logfile |
|
159 else { |
|
160 addEntry("DEFAULT", currentComponent, currentFile.toString(), lineNumber, ""); |
|
161 entryCreated = true; |
|
162 currentComponent = null; |
|
163 return true; |
|
164 } |
|
165 } |
|
166 } |
|
167 else { |
|
168 // Check for the start of a block |
|
169 if (logText.startsWith("++ Started at")) { |
|
170 isRecordingIssues = true; |
|
171 } |
|
172 } |
|
173 } |
|
174 currentReader.close(); |
|
175 currentReader = null; |
|
176 setCurrentReader(currentReader); |
|
177 } |
|
178 catch (FileNotFoundException ex) { |
|
179 log.debug("FileNotFoundException in AbldLogMetadata", ex); |
|
180 try { |
|
181 if (currentReader != null) { |
|
182 currentReader.close(); |
|
183 } |
|
184 } |
|
185 catch (IOException iex) { |
|
186 // We are Ignoring the errors as no need to fail the build. |
|
187 log.debug("Exception in closing reader", iex); |
|
188 } |
|
189 currentReader = null; |
|
190 setCurrentReader(null); |
|
191 exceptions = exceptions + ex.getMessage() + "\n"; |
|
192 return false; |
|
193 } |
|
194 catch (IOException ex) { |
|
195 log.debug("IOException in AbldLogMetadata", ex); |
|
196 try { |
|
197 if (currentReader != null) { |
|
198 currentReader.close(); |
|
199 } |
|
200 } |
|
201 catch (IOException iex) { |
|
202 // We are Ignoring the errors as no need to fail the build. |
|
203 log.debug("IOException in closing reader", iex); |
|
204 } |
|
205 currentReader = null; |
|
206 setCurrentReader(null); |
|
207 exceptions = exceptions + ex.getMessage() + "\n"; |
|
208 return false; |
|
209 } |
|
210 if (!exceptions.equals("")) { |
|
211 throw new BuildException(exceptions); |
|
212 } |
|
213 return entryCreated; |
|
214 } |
|
215 } |
146 } |