buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ORMFMPPLoader.java
changeset 587 85df38eb4012
child 588 c7c26511138f
child 618 df88fead2976
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ORMFMPPLoader.java	Tue Apr 27 08:33:08 2010 +0300
@@ -0,0 +1,291 @@
+/*
+ * 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;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.ArrayList;
+import fmpp.Engine;
+import fmpp.ProgressListener;
+import fmpp.tdd.DataLoader;
+import freemarker.template.TemplateCollectionModel;
+import freemarker.template.TemplateModel;
+import freemarker.template.TemplateHashModel;
+import freemarker.template.TemplateSequenceModel;
+import freemarker.template.SimpleScalar;
+import freemarker.template.SimpleNumber;
+import freemarker.template.TemplateModelIterator;
+import com.nokia.helium.jpa.ORMReader;
+import com.nokia.helium.jpa.ORMUtil;
+
+import org.apache.log4j.Logger;
+import freemarker.ext.beans.BeanModel;
+import freemarker.ext.beans.BeansWrapper;
+
+
+
+/**
+ * Utility class to access the data from the database and used by FMPP
+ * templates.
+ */
+public class ORMFMPPLoader implements DataLoader {
+    //private ResultSet rs;
+    private static final int READ_LIMIT = 20000;
+
+    private static Logger log = Logger.getLogger(ORMFMPPLoader.class);
+
+    private ORMReader reader;
+
+
+    /**
+     * @see fmpp.tdd.DataLoader#load(fmpp.Engine, java.util.List)
+     */
+    public Object load(Engine engine, List args) throws Exception {
+        //log.debug("args.size:" + args.size());
+        java.util.ListIterator iter = args.listIterator();
+        int argsSize = args.size();
+        if (argsSize < 1) {
+            throw new Exception("Input DB path should be provided to load into FMPP.");
+        }        
+        ORMQueryModeModel model = new ORMQueryModeModel((String) (args.get(0)));
+        engine.setAttribute(this.getClass().toString(), model);
+        return model;
+    }
+
+    /**
+     * QueryModel (which supports hash, sequence, containers)
+     * arg[0] - dbpath
+     *  
+     */
+    private class ORMQueryModeModel implements TemplateHashModel, ProgressListener {
+
+        private String dbPath;
+        public ORMQueryModeModel(String path) {
+            File actualPath = new File(path);
+            String fileName = actualPath.getName();
+            dbPath = new File(actualPath.getParent(), fileName.toLowerCase()).getPath();
+        }
+        
+        /*
+         * Gets the template model for the corresponding query
+         * @param query for which the model is returned.
+         * @return returns the template model for the query 
+         */
+        public QueryTemplateModel get(String mode) {
+            String retType = null;
+            String actualMode = mode;
+            //log.debug("mode: " + mode);
+            if (mode.startsWith("native")) {
+                String [] splitString = mode.split(":");
+                if (splitString.length == 2 ) {
+                    actualMode = splitString[0]; 
+                    retType = splitString[1];
+                    //log.debug("actualMode " + actualMode);
+                    //log.debug("retType " + retType);
+                }
+            }
+            
+            return new QueryTemplateModel(dbPath, actualMode, retType);
+        }
+        
+        public boolean isEmpty() {
+            return false;
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @Override
+        public void notifyProgressEvent(Engine engine, int event, File src,
+                int pMode, Throwable error, Object param) throws Exception {
+            if (event == ProgressListener.EVENT_END_PROCESSING_SESSION) {
+                log.debug("notifyProgressEvent - finalizeORM");
+                ORMUtil.finalizeORM(dbPath);
+            }  
+         }
+    }
+
+    /*
+     * Internal class to handle the sql query and returns the data in either
+     * hash or sequence or containers.
+     */
+    private class QueryTemplateModel implements TemplateHashModel {
+
+        private String dbPath;
+        
+        private String queryMode;
+        
+        private String returnType;
+        
+        private TemplateModel resultObject;
+        
+        public QueryTemplateModel(String path, String mode, String retType) {
+            dbPath = path;
+            queryMode = mode;
+            returnType = retType;
+        }
+
+        public TemplateModel get(String query) {
+            //log.debug("QueryTemplateModel: query" + query);
+            if (queryMode.equals("jpasingle")) {
+                //log.debug("query executing with single result mode");
+                resultObject = getModel((new ORMReader(dbPath)).executeSingleResult(query, returnType));
+            } else {
+                //log.debug("query executing with multiple result mode");
+                resultObject = new ORMQueryModel(new ORMReader(dbPath), query, queryMode, returnType); 
+            }
+            return resultObject;
+        }
+        
+        private TemplateModel getModel(Object result) {
+            return new ORMSequenceModel(result);
+        }
+
+        public boolean isEmpty() {
+            //log.debug("query hash isempty:");
+            return false;
+        }
+    }
+    
+    private class ORMSequenceModel implements TemplateSequenceModel {
+        private List ormList = new ArrayList();
+
+        @SuppressWarnings("unchecked")
+        public ORMSequenceModel(Object obj) {
+            ormList.add(obj);
+        }
+        public int size() {
+            return ormList.size();
+        }
+
+        public TemplateModel get(int index) {
+            //log.debug("ORMSequenceModel.get: index: " + index);
+            if (index < ormList.size()) {
+                Object obj = ormList.get(index);
+                if (obj instanceof String) {
+                    return new SimpleScalar((String)obj);
+                } else if (obj instanceof Number) {
+                    return new SimpleNumber((Number)obj);
+                } else if (obj == null) {
+                    return null;
+                } else {
+                    return new ORMObjectModel(obj);
+                }
+            }
+            return null;
+        }
+    }
+    
+    private class ORMQueryModel implements TemplateCollectionModel 
+         {
+        
+        private ORMReader ormReader;
+        private String queryType;
+        private String query;
+        private String returnType;
+
+        public ORMQueryModel (ORMReader reader, String queryString, String type, String retType) {
+            ormReader = reader;
+            queryType = type;
+            query = queryString;
+            returnType = retType;
+            //log.debug("ORMQueryModel: query" + query);
+        }
+        
+        /*
+         * Provides data via collection interface.
+         * @return the iterator model from which the data is accessed.
+         */
+        public TemplateModelIterator iterator() {
+            //log.debug("iterator constructor called");
+            return new ORMTemplateModelIterator(ormReader, query, queryType, returnType);
+        }
+        
+    }
+
+    /*
+     * Internal Iterator class which provides data as collection. 
+     */
+    private class ORMTemplateModelIterator implements TemplateModelIterator {
+        
+        private String query;
+        private List<Map<String, Object>> rowList;
+        private int currentOffsetIndex;
+        private boolean finished;
+        private String returnType;
+        private boolean nativeQuery;
+        private ORMReader ormReader;
+        
+        public ORMTemplateModelIterator(ORMReader reader, String queryString, String type, String retType) {
+            ormReader = reader;
+            query = queryString;
+            returnType = retType;
+            if (type.startsWith("native")) {
+                nativeQuery = true;
+            }
+            //log.debug("ORMTemplateModelIterator: query" + query);
+        }
+
+        /**
+         * {@inheritDoc}
+         */
+        @SuppressWarnings("unchecked")
+        public TemplateModel next() {
+            //log.debug("ORMTemplateModelIterator: next");
+            Object toRet = null;
+                if (rowList != null) {
+                    toRet = rowList.remove(0);
+                }
+                if (nativeQuery && returnType.equals("java.lang.String")) {
+                    return new SimpleScalar((java.lang.String)toRet);
+                }
+                return new ORMObjectModel(toRet);
+        }
+        
+        /**
+         * {@inheritDoc}
+         */
+        @SuppressWarnings("unchecked")
+        public boolean hasNext() {
+            if (rowList == null  || rowList.size() == 0) {
+                if (!finished) {
+                    if (nativeQuery) {
+                        if (returnType.equals("java.lang.String")) {
+                            rowList = ormReader.executeNativeQuery(query, null);
+                        } else {
+                            rowList = ormReader.executeNativeQuery(query, returnType);
+                        }
+                    } else {
+                        rowList = ormReader.executeQuery(query);
+                    }
+                    if (rowList == null || rowList.size() == 0) {
+                        finished = true;
+                    }
+                }
+            }
+            return !finished;
+        }
+    }
+    
+    private class ORMObjectModel extends BeanModel {
+        public ORMObjectModel(Object obj) {
+            super(obj, new BeansWrapper());
+        }
+        
+    }
+}
\ No newline at end of file