buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/SysdefMetaDataInput.java
changeset 628 7c4a911dc066
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ant/types/SysdefMetaDataInput.java	Fri Aug 13 14:59:05 2010 +0300
@@ -0,0 +1,220 @@
+/*
+ * 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;
+
+import java.io.File;
+import java.io.IOException;
+
+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.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.DataType;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import com.nokia.helium.metadata.MetaDataInput;
+import com.nokia.helium.metadata.MetadataException;
+import com.nokia.helium.metadata.model.metadata.SysdefCollection;
+import com.nokia.helium.metadata.model.metadata.SysdefCollectionDAO;
+import com.nokia.helium.metadata.model.metadata.SysdefComponent;
+import com.nokia.helium.metadata.model.metadata.SysdefComponentDAO;
+import com.nokia.helium.metadata.model.metadata.SysdefPackage;
+import com.nokia.helium.metadata.model.metadata.SysdefPackageDAO;
+import com.nokia.helium.metadata.model.metadata.SysdefUnit;
+import com.nokia.helium.metadata.model.metadata.SysdefUnitDAO;
+
+/**
+ * The sysdefMetadataInput allows you to record a the current build
+ * model in the database. Packages, collection, component and units
+ * will be saved.
+ *
+ * @ant.type name="sysdefmetadatainput" category="Metadata"
+ */
+public class SysdefMetaDataInput extends DataType implements MetaDataInput {
+    private File file;
+    private File epocroot;
+    
+    @Override
+    public void extract(Task task, EntityManagerFactory factory)
+        throws MetadataException {
+        if (file == null) {
+            throw new MetadataException("file attribute is not defined.");
+        }
+        getEpocroot();
+        SAXParserFactory saxFactory = SAXParserFactory.newInstance();
+        SAXParser parser;
+        EntityManager entityManager = factory.createEntityManager();
+        try {
+            task.log("Extracting data from " + file);
+            parser = saxFactory.newSAXParser();
+            parser.parse(file, new SysdefParserHandler(entityManager));
+        } catch (ParserConfigurationException e) {
+            throw new MetadataException(e.getMessage(), e);
+        } catch (SAXException e) {
+            throw new MetadataException(e.getMessage(), e);
+        } catch (IOException e) {
+            throw new MetadataException(e.getMessage(), e);
+        } finally {
+            entityManager.close();
+        }
+    }
+
+    /**
+     * 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.
+     */
+    protected File getEpocroot() {
+        if (epocroot != null) {
+            return epocroot;
+        } else if (System.getenv("EPOCROOT") != null) {
+            return (new File(System.getenv("EPOCROOT") )).getAbsoluteFile();
+        }
+        throw new BuildException("EPOCROOT environment variable or epocroot attribute is not defined.");
+    }
+    
+    /**
+     * Define the location of the system definition file.
+     * @param file
+     * @ant.required
+     */
+    public void setFile(File file) {
+        this.file = file;
+    }
+    
+    /**
+     * Internal Handler to parse the sysdef file 
+     * using the SAX interface. 
+     *
+     */
+    class SysdefParserHandler extends DefaultHandler {
+
+        private static final String PACKAGE_TAG = "package";
+        private static final String COLLECTION_TAG = "collection";
+        private static final String COMPONENT_TAG = "component";
+        private static final String UNIT_TAG = "unit";
+        private static final String ID_ATTR = "id";
+        private static final String NAME_ATTR = "name";
+        private static final String BLDFILE_ATTR = "bldFile";
+        private SysdefPackage currentPackage;
+        private SysdefCollection currentCollection;
+        private SysdefComponent currentComponent;
+        private EntityManager entityManager;
+        private SysdefPackageDAO packageDAO;
+        private SysdefCollectionDAO collectionDAO;
+        private SysdefComponentDAO componentDAO;
+        private SysdefUnitDAO unitDAO;
+        
+        public SysdefParserHandler(EntityManager entityManager) {
+            this.entityManager = entityManager;
+            packageDAO = new SysdefPackageDAO();
+            packageDAO.setEntityManager(entityManager);
+            collectionDAO = new SysdefCollectionDAO();
+            collectionDAO.setEntityManager(entityManager);
+            componentDAO = new SysdefComponentDAO();
+            componentDAO.setEntityManager(entityManager);
+            unitDAO = new SysdefUnitDAO();
+            unitDAO.setEntityManager(entityManager);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void startElement(String uri, String localName, String qName,
+                Attributes attributes) throws SAXException {
+            if (PACKAGE_TAG.equals(qName)) {
+                currentPackage = packageDAO.getPackageById(attributes.getValue(ID_ATTR));
+                if (currentPackage == null) {
+                    entityManager.getTransaction().begin();
+                    currentPackage = new SysdefPackage();
+                    currentPackage.setPackageId(attributes.getValue(ID_ATTR));
+                    currentPackage.setName(attributes.getValue(NAME_ATTR));
+                    entityManager.persist(currentPackage);
+                    entityManager.getTransaction().commit();
+                }
+            } else if (currentPackage != null && COLLECTION_TAG.equals(qName)) {
+                currentCollection = collectionDAO.getCollectionById(attributes.getValue(ID_ATTR));
+                if (currentCollection == null) {
+                    entityManager.getTransaction().begin();
+                    currentCollection = new SysdefCollection();
+                    currentCollection.setCollectionId(attributes.getValue(ID_ATTR));
+                    currentCollection.setName(attributes.getValue(NAME_ATTR));
+                    currentCollection.setSysdefPackage(currentPackage);
+                    entityManager.persist(currentCollection);
+                    entityManager.getTransaction().commit();
+                }
+            } else if (currentCollection != null && COMPONENT_TAG.equals(qName)) {
+                currentComponent = componentDAO.getComponentById(attributes.getValue(ID_ATTR));
+                if (currentComponent == null) {
+                    entityManager.getTransaction().begin();
+                    currentComponent = new SysdefComponent();
+                    currentComponent.setComponentId(attributes.getValue(ID_ATTR));
+                    currentComponent.setName(attributes.getValue(NAME_ATTR));
+                    currentComponent.setSysdefCollection(currentCollection);
+                    entityManager.persist(currentComponent);
+                    entityManager.getTransaction().commit();
+                }
+            } else if (currentComponent != null && UNIT_TAG.equals(qName) && attributes.getValue(BLDFILE_ATTR) != null) {
+                SysdefUnit unit = unitDAO.getUnitByLocation(getEpocroot(), new File(attributes.getValue(BLDFILE_ATTR)));
+                if (unit == null) {
+                    entityManager.getTransaction().begin();
+                    unit = new SysdefUnit();
+                    // Location will be relative to epocroot.
+                    unit.setLocation(getEpocroot().toURI().relativize((new File(attributes.getValue(BLDFILE_ATTR))).getAbsoluteFile().toURI()).getPath());
+                    unit.setSysdefComponent(currentComponent);
+                    entityManager.persist(unit);
+                    entityManager.getTransaction().commit();
+                }
+            }
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void endElement(String uri, String localName, String qName)
+            throws SAXException {
+            super.endElement(uri, localName, qName);
+            if (PACKAGE_TAG.equals(qName)) {
+                currentPackage = null;
+            } else if (COLLECTION_TAG.equals(qName)) {
+                currentCollection = null;
+            } else if (COMPONENT_TAG.equals(qName)) {
+                currentComponent = null;
+            }
+        }
+        
+    }
+
+}