buildframework/helium/sf/java/metadata/src/com/nokia/helium/metadata/ORMFMPPLoader.java
author wbernard
Thu, 22 Jul 2010 17:08:43 +0300
branchhelium-9.0
changeset 618 df88fead2976
parent 587 85df38eb4012
permissions -rw-r--r--
helium_9.0.5-4399343f4f50
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     1
/*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     2
 * Copyright (c) 2007-2008 Nokia Corporation and/or its subsidiary(-ies).
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     3
 * All rights reserved.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     5
 * under the terms of the License "Eclipse Public License v1.0"
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     8
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
     9
 * Initial Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    10
 * Nokia Corporation - initial contribution.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    11
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    12
 * Contributors:
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    13
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    14
 * Description:  
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    15
 *
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    16
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    17
package com.nokia.helium.metadata;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    18
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    19
import java.io.File;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    20
import java.util.List;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    21
import java.util.Map;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    22
import java.util.ArrayList;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    23
import fmpp.Engine;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    24
import fmpp.ProgressListener;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    25
import fmpp.tdd.DataLoader;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    26
import freemarker.template.TemplateCollectionModel;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    27
import freemarker.template.TemplateModel;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    28
import freemarker.template.TemplateHashModel;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    29
import freemarker.template.TemplateSequenceModel;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    30
import freemarker.template.SimpleScalar;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    31
import freemarker.template.SimpleNumber;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    32
import freemarker.template.TemplateModelIterator;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    33
import com.nokia.helium.jpa.ORMReader;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    34
import org.apache.log4j.Logger;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    35
import freemarker.ext.beans.BeanModel;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    36
import freemarker.ext.beans.BeansWrapper;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    37
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    38
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    39
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    40
/**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    41
 * Utility class to access the data from the database and used by FMPP
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    42
 * templates.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    43
 */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    44
public class ORMFMPPLoader implements DataLoader {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    45
    //private ResultSet rs;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    46
    private static final int READ_LIMIT = 20000;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    47
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    48
    private static Logger log = Logger.getLogger(ORMFMPPLoader.class);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    49
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    50
    private ORMReader reader;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    51
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    52
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    53
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    54
     * @see fmpp.tdd.DataLoader#load(fmpp.Engine, java.util.List)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    55
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    56
    public Object load(Engine engine, List args) throws Exception {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    57
        //log.debug("args.size:" + args.size());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    58
        java.util.ListIterator iter = args.listIterator();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    59
        int argsSize = args.size();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    60
        if (argsSize < 1) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    61
            throw new Exception("Input DB path should be provided to load into FMPP.");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    62
        }        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    63
        ORMQueryModeModel model = new ORMQueryModeModel((String) (args.get(0)));
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    64
        engine.setAttribute(this.getClass().toString(), model);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    65
        return model;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    66
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    67
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    68
    /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    69
     * QueryModel (which supports hash, sequence, containers)
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    70
     * arg[0] - dbpath
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    71
     *  
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    72
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    73
    private class ORMQueryModeModel implements TemplateHashModel, ProgressListener {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    74
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    75
        private String dbPath;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    76
        public ORMQueryModeModel(String path) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    77
            File actualPath = new File(path);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    78
            String fileName = actualPath.getName();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    79
            dbPath = new File(actualPath.getParent(), fileName.toLowerCase()).getPath();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    80
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    81
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    82
        /*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    83
         * Gets the template model for the corresponding query
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    84
         * @param query for which the model is returned.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    85
         * @return returns the template model for the query 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    86
         */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    87
        public QueryTemplateModel get(String mode) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    88
            String retType = null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    89
            String actualMode = mode;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    90
            //log.debug("mode: " + mode);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    91
            if (mode.startsWith("native")) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    92
                String [] splitString = mode.split(":");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    93
                if (splitString.length == 2 ) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    94
                    actualMode = splitString[0]; 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    95
                    retType = splitString[1];
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    96
                    //log.debug("actualMode " + actualMode);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    97
                    //log.debug("retType " + retType);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    98
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
    99
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   100
            
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   101
            return new QueryTemplateModel(dbPath, actualMode, retType);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   102
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   103
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   104
        public boolean isEmpty() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   105
            return false;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   106
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   107
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   108
        /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   109
         * {@inheritDoc}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   110
         */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   111
        @Override
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   112
        public void notifyProgressEvent(Engine engine, int event, File src,
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   113
                int pMode, Throwable error, Object param) throws Exception {
618
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   114
            //if (event == ProgressListener.EVENT_END_PROCESSING_SESSION) {
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   115
            //    log.debug("notifyProgressEvent - finalizeORM");
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   116
            //    ORMUtil.finalizeORM(dbPath);
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   117
            //}  
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   118
         }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   119
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   120
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   121
    /*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   122
     * Internal class to handle the sql query and returns the data in either
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   123
     * hash or sequence or containers.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   124
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   125
    private class QueryTemplateModel implements TemplateHashModel {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   126
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   127
        private String dbPath;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   128
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   129
        private String queryMode;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   130
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   131
        private String returnType;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   132
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   133
        private TemplateModel resultObject;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   134
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   135
        public QueryTemplateModel(String path, String mode, String retType) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   136
            dbPath = path;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   137
            queryMode = mode;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   138
            returnType = retType;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   139
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   140
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   141
        public TemplateModel get(String query) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   142
            //log.debug("QueryTemplateModel: query" + query);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   143
            if (queryMode.equals("jpasingle")) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   144
                //log.debug("query executing with single result mode");
618
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   145
                resultObject = getModel(dbPath, query, returnType);
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   146
                
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   147
            } else {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   148
                //log.debug("query executing with multiple result mode");
618
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   149
                resultObject = new ORMQueryModel(dbPath, query, queryMode, returnType); 
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   150
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   151
            return resultObject;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   152
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   153
        
618
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   154
        private TemplateModel getModel(String dbPath, String query, 
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   155
                String returnType) {
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   156
            ORMReader reader = new ORMReader(dbPath);
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   157
            ORMSequenceModel model = new ORMSequenceModel(reader.executeSingleResult(query, returnType));
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   158
            reader.close();
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   159
            return model;
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   160
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   161
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   162
        public boolean isEmpty() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   163
            //log.debug("query hash isempty:");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   164
            return false;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   165
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   166
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   167
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   168
    private class ORMSequenceModel implements TemplateSequenceModel {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   169
        private List ormList = new ArrayList();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   170
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   171
        @SuppressWarnings("unchecked")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   172
        public ORMSequenceModel(Object obj) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   173
            ormList.add(obj);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   174
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   175
        public int size() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   176
            return ormList.size();
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   177
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   178
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   179
        public TemplateModel get(int index) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   180
            //log.debug("ORMSequenceModel.get: index: " + index);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   181
            if (index < ormList.size()) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   182
                Object obj = ormList.get(index);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   183
                if (obj instanceof String) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   184
                    return new SimpleScalar((String)obj);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   185
                } else if (obj instanceof Number) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   186
                    return new SimpleNumber((Number)obj);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   187
                } else if (obj == null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   188
                    return null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   189
                } else {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   190
                    return new ORMObjectModel(obj);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   191
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   192
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   193
            return null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   194
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   195
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   196
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   197
    private class ORMQueryModel implements TemplateCollectionModel 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   198
         {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   199
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   200
        private ORMReader ormReader;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   201
        private String queryType;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   202
        private String query;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   203
        private String returnType;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   204
618
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   205
        public ORMQueryModel (String dbPath, String queryString, String type, String retType) {
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   206
            ormReader = new ORMReader(dbPath);
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   207
            queryType = type;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   208
            query = queryString;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   209
            returnType = retType;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   210
            //log.debug("ORMQueryModel: query" + query);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   211
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   212
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   213
        /*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   214
         * Provides data via collection interface.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   215
         * @return the iterator model from which the data is accessed.
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   216
         */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   217
        public TemplateModelIterator iterator() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   218
            //log.debug("iterator constructor called");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   219
            return new ORMTemplateModelIterator(ormReader, query, queryType, returnType);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   220
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   221
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   222
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   223
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   224
    /*
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   225
     * Internal Iterator class which provides data as collection. 
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   226
     */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   227
    private class ORMTemplateModelIterator implements TemplateModelIterator {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   228
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   229
        private String query;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   230
        private List<Map<String, Object>> rowList;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   231
        private int currentOffsetIndex;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   232
        private boolean finished;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   233
        private String returnType;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   234
        private boolean nativeQuery;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   235
        private ORMReader ormReader;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   236
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   237
        public ORMTemplateModelIterator(ORMReader reader, String queryString, String type, String retType) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   238
            ormReader = reader;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   239
            query = queryString;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   240
            returnType = retType;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   241
            if (type.startsWith("native")) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   242
                nativeQuery = true;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   243
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   244
            //log.debug("ORMTemplateModelIterator: query" + query);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   245
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   246
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   247
        /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   248
         * {@inheritDoc}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   249
         */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   250
        @SuppressWarnings("unchecked")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   251
        public TemplateModel next() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   252
            //log.debug("ORMTemplateModelIterator: next");
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   253
            Object toRet = null;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   254
                if (rowList != null) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   255
                    toRet = rowList.remove(0);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   256
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   257
                if (nativeQuery && returnType.equals("java.lang.String")) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   258
                    return new SimpleScalar((java.lang.String)toRet);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   259
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   260
                return new ORMObjectModel(toRet);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   261
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   262
        
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   263
        /**
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   264
         * {@inheritDoc}
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   265
         */
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   266
        @SuppressWarnings("unchecked")
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   267
        public boolean hasNext() {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   268
            if (rowList == null  || rowList.size() == 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   269
                if (!finished) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   270
                    if (nativeQuery) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   271
                        if (returnType.equals("java.lang.String")) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   272
                            rowList = ormReader.executeNativeQuery(query, null);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   273
                        } else {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   274
                            rowList = ormReader.executeNativeQuery(query, returnType);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   275
                        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   276
                    } else {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   277
                        rowList = ormReader.executeQuery(query);
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   278
                    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   279
                    if (rowList == null || rowList.size() == 0) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   280
                        finished = true;
618
df88fead2976 helium_9.0.5-4399343f4f50
wbernard
parents: 587
diff changeset
   281
                        ormReader.close();
587
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   282
                    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   283
                }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   284
            }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   285
            return !finished;
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   286
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   287
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   288
    
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   289
    private class ORMObjectModel extends BeanModel {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   290
        public ORMObjectModel(Object obj) {
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   291
            super(obj, new BeansWrapper());
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   292
        }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   293
    }
85df38eb4012 helium_9.0-a7879c935424
wbernard
parents:
diff changeset
   294
}