buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/IMakerLogMetaDataInput.java
changeset 628 7c4a911dc066
parent 588 c7c26511138f
child 645 b8d81fa19e7d
equal deleted inserted replaced
588:c7c26511138f 628:7c4a911dc066
    15  *
    15  *
    16  */
    16  */
    17 
    17 
    18 package com.nokia.helium.metadata.ant.types;
    18 package com.nokia.helium.metadata.ant.types;
    19 
    19 
    20 import java.io.*;
    20 import java.io.BufferedReader;
    21 import org.apache.tools.ant.BuildException;
    21 import java.io.File;
    22 import java.util.*;
    22 import java.io.FileNotFoundException;
       
    23 import java.io.FileReader;
       
    24 import java.io.IOException;
       
    25 import java.util.ArrayList;
       
    26 import java.util.List;
       
    27 import java.util.Map;
       
    28 import java.util.regex.Matcher;
       
    29 import java.util.regex.Pattern;
    23 
    30 
    24 import org.apache.log4j.Logger;
    31 import javax.persistence.EntityManager;
    25 import java.util.regex.Pattern;
    32 import javax.persistence.EntityManagerFactory;
    26 import java.util.regex.Matcher;
    33 
       
    34 import org.apache.tools.ant.Project;
       
    35 
       
    36 import com.nokia.helium.metadata.MetadataException;
       
    37 import com.nokia.helium.metadata.model.metadata.Component;
       
    38 import com.nokia.helium.metadata.model.metadata.LogFile;
       
    39 import com.nokia.helium.metadata.model.metadata.MetadataEntry;
       
    40 import com.nokia.helium.metadata.model.metadata.Severity;
       
    41 import com.nokia.helium.metadata.model.metadata.SeverityDAO;
       
    42 
    27 
    43 
    28 /**
    44 /**
    29  * This Type is to specify and use the abld logparser type to parse and store
    45  * This Type is to specify and use the abld logparser type to parse and store
    30  * the data.
    46  * the data.
    31  * 
    47  * 
    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 }