buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/sbs/SBSLogMetaDataInput.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/sbs/SBSLogMetaDataInput.java Fri Aug 13 14:59:05 2010 +0300
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of the License "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+package com.nokia.helium.metadata.ant.types.sbs;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.xml.sax.SAXException;
+
+import com.nokia.helium.metadata.AutoCommitEntityManager;
+import com.nokia.helium.metadata.MetadataException;
+import com.nokia.helium.metadata.ant.types.AbstractComponentBaseMetadataInput;
+import com.nokia.helium.metadata.ant.types.SeverityEnum;
+import com.nokia.helium.metadata.model.metadata.Component;
+import com.nokia.helium.metadata.model.metadata.ComponentTime;
+import com.nokia.helium.metadata.model.metadata.ExecutionTime;
+import com.nokia.helium.metadata.model.metadata.LogFile;
+import com.nokia.helium.metadata.model.metadata.MetadataEntry;
+import com.nokia.helium.metadata.model.metadata.Severity;
+import com.nokia.helium.metadata.model.metadata.SeverityDAO;
+import com.nokia.helium.metadata.model.metadata.SysdefUnitDAO;
+import com.nokia.helium.metadata.model.metadata.WhatLogEntry;
+
+
+/**
+ * This metadata input will parse SBSv2 log and collect
+ * data into the database.
+ * <pre>
+ *
+ * <hlm:sbsmetadatainput >
+ * <fileset dir="${project.dir}/../data/">
+ * <include name="*_compile.log"/>
+ * </fileset>
+ * <hlm:metadatafilterset id="sbs.metadata.filter">
+ * <metadatafilterset filterfile="common.csv" />
+ * </hlm:metadatafilterset>
+ * </hlm:sbsmetadatainput>
+ * </pre>
+ *
+ * @ant.task name="sbsmetadatainput" category="Metadata"
+ */
+public class SBSLogMetaDataInput extends AbstractComponentBaseMetadataInput implements SBSLogEvents {
+ private static final String DEFAULT_COMPONENT_NAME = "general";
+ private EntityManager entityManager;
+ private AutoCommitEntityManager autoCommitEM;
+ private LogFile logFile;
+ private File epocroot;
+ private SysdefUnitDAO unitDAO;
+ private boolean checkMissing = true;
+
+ private Map<String, Severity> priorities;
+ private Pattern buildTimeMatcher = Pattern.compile("^Run time\\s+(\\d+)\\s+seconds$");
+ private boolean failOnInvalidXml = true;
+ private Map<String, ComponentTime> componentTimes = new Hashtable<String, ComponentTime>();
+
+ /**
+ * Defines if XML format error should be fatal, or treated as build error.
+ * @param failOnXmlError
+ */
+ public void setFailOnInvalidXml(boolean failOnInvalidXml) {
+ this.failOnInvalidXml = failOnInvalidXml;
+ }
+
+
+ /**
+ * Defines epocroot.
+ * @param epocroot
+ * @ant.not-required Default to EPOCROOT.
+ */
+ public void setEpocroot(File epocroot) {
+ this.epocroot = epocroot;
+ }
+
+ /**
+ * Get epocroot.
+ * @return a File object representing epocroot, or throw a BuildException
+ * if epocroot attribute and EPOCROOT environment variable
+ * are not defined.
+ */
+ public File getEpocroot() {
+ return epocroot;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void extract(EntityManagerFactory factory, File file)
+ throws MetadataException {
+ SAXParserFactory saxFactory = SAXParserFactory.newInstance();
+ entityManager = factory.createEntityManager();
+ autoCommitEM = new AutoCommitEntityManager(factory);
+ unitDAO = new SysdefUnitDAO();
+ unitDAO.setEntityManager(this.getEntityManager());
+ try {
+ logFile = getLogFile(entityManager, file);
+
+ SeverityDAO pdao = new SeverityDAO();
+ pdao.setEntityManager(entityManager);
+ priorities = pdao.getSeverities();
+
+ // always create the default component and associated time.
+ this.getDefaultComponent(logFile);
+ this.addElapsedTime(this.getDefaultComponentName(), 0.0);
+
+ SAXParser parser = saxFactory.newSAXParser();
+ parser.parse(file, new SBSLogHandler(this, file));
+
+ // Pushing component times into the database.
+ entityManager.getTransaction().begin();
+ for (Entry<String, ComponentTime> entry : componentTimes.entrySet()) {
+ ComponentTime ct = entry.getValue();
+ ct.setComponent(entityManager.merge(getComponent(entry.getKey(), logFile)));
+ entityManager.persist(ct);
+ }
+ entityManager.getTransaction().commit();
+ } catch (SAXException e) {
+ if (failOnInvalidXml) {
+ throw new MetadataException(e.getMessage(), e);
+ }
+ } catch (IOException e) {
+ throw new MetadataException(e.getMessage(), e);
+ } catch (ParserConfigurationException e) {
+ throw new MetadataException(e.getMessage(), e);
+ } finally {
+ logFile = null;
+ autoCommitEM.close();
+ autoCommitEM = null;
+ entityManager.close();
+ entityManager = null;
+ unitDAO = null;
+ priorities = null;
+ clear();
+ componentTimes.clear();
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected EntityManager getEntityManager() {
+ return entityManager;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void add(SeverityEnum.Severity severity,
+ String text, int lineNumber) {
+ add(severity, this.getDefaultComponentName(), text, lineNumber);
+
+ // Searching for build time.
+ Matcher matcher = buildTimeMatcher.matcher(text);
+ if (matcher.matches()) {
+ ExecutionTime entry = new ExecutionTime();
+ entry.setLogFile(autoCommitEM.merge(logFile));
+ entry.setTime(new Integer(matcher.group(1)).intValue());
+ autoCommitEM.persist(entry);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void add(SeverityEnum.Severity severity,
+ String component, String text, int lineNumber) {
+ if (severity != SeverityEnum.Severity.INFO) {
+ MetadataEntry entry = new MetadataEntry();
+ entry.setComponent(autoCommitEM.merge(getComponent(component, logFile)));
+ entry.setLineNumber(lineNumber);
+ entry.setText(text);
+ entry.setLogFile(logFile);
+ entry.setSeverity(priorities.get(severity.toString()));
+ autoCommitEM.persist(entry);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void addWhatEntry(String component, String location, int lineNumber) {
+ boolean fileExists = (new File(location)).exists();
+ WhatLogEntry entry = new WhatLogEntry();
+ entry.setComponent(autoCommitEM.merge(getComponent(component, logFile)));
+ entry.setMember(location);
+ entry.setMissing(!fileExists);
+ autoCommitEM.persist(entry);
+ if (checkMissing && !fileExists) {
+ MetadataEntry mentry = new MetadataEntry();
+ mentry.setComponent(autoCommitEM.merge(getComponent(component, logFile)));
+ mentry.setLineNumber(lineNumber);
+ mentry.setText("Missing: " + location);
+ mentry.setLogFile(logFile);
+ mentry.setSeverity(priorities.get(SeverityEnum.Severity.ERROR.toString()));
+ autoCommitEM.persist(mentry);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SeverityEnum.Severity check(String text, int lineNumber) {
+ check(getDefaultComponentName(), text, lineNumber);
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public SeverityEnum.Severity check(
+ String component, String text, int lineNumber) {
+ SeverityEnum.Severity severity = this.getSeverity(text);
+ if (severity != SeverityEnum.Severity.NONE) {
+ MetadataEntry entry = new MetadataEntry();
+ entry.setComponent(autoCommitEM.merge(getComponent(component, logFile)));
+ entry.setLineNumber(lineNumber);
+ entry.setText(text);
+ entry.setLogFile(logFile);
+ entry.setSeverity(priorities.get(severity.toString()));
+ autoCommitEM.persist(entry);
+ }
+ return severity;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void declareComponent(String component) {
+ getComponent(component, logFile);
+ }
+
+ /**
+ * Define if we need to treat add error entries
+ * for missing files.
+ * @param checkMissing
+ */
+ public void setCheckMissing(boolean checkMissing) {
+ this.checkMissing = checkMissing;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public String getDefaultComponentName() {
+ return DEFAULT_COMPONENT_NAME;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Component createComponent(String name, LogFile logFile) {
+ Component component = new Component();
+ component.setComponent(name);
+ component.setLogFile(logFile);
+ component.setSysdefUnit(unitDAO.getUnitByLocation(name));
+ getEntityManager().getTransaction().begin();
+ getEntityManager().persist(component);
+ getEntityManager().getTransaction().commit();
+ return component;
+ }
+
+
+ @Override
+ public void addElapsedTime(String name, double duration) {
+ if (!componentTimes.containsKey(name)) {
+ ComponentTime ct = new ComponentTime();
+ componentTimes.put(name, ct);
+ }
+ ComponentTime ct = componentTimes.get(name);
+ ct.setDuration(ct.getDuration() + duration);
+ }
+
+}