org.apache.usergrid.query.validator.SqliteRunner.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.usergrid.query.validator.SqliteRunner.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.usergrid.query.validator;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.apache.usergrid.persistence.Entity;
import org.apache.usergrid.persistence.Schema;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

/**
 * @author Sungju Jin
 */
@Component
public class SqliteRunner implements QueryRunner {

    private Logger logger = Logger.getLogger(SqliteRunner.class.getName());

    @Autowired
    private JdbcTemplate jdbcTemplate;
    private String collection;
    private List<Entity> entities;

    @Override
    public boolean setup() {
        createTable();
        insertDatas();

        return true;
    }

    private void insertDatas() {
        for (Entity entity : entities) {
            insertData(entity);
        }
    }

    private void insertData(Entity entity) {
        StringBuilder feilds = new StringBuilder();
        StringBuilder values = new StringBuilder();
        Map<String, Object> properties = Schema.getDefaultSchema().getEntityProperties(entity);
        for (String key : properties.keySet()) {
            feilds.append(key);
            feilds.append(",");

            Class type = null;
            try {
                type = entity.getProperty(key).getClass();
            } catch (NullPointerException ne) {
                type = entity.getDynamicProperties().get(key).getClass();
            }

            Object value = null;
            if (StringUtils.equals("name", key)) {
                value = entity.getName();
            } else {
                value = entity.getProperty(key);
            }
            if (type == Boolean.class) {
                if ((Boolean) value) {
                    value = 1;
                } else {
                    value = 0;
                }
            }

            String sqlType = getSqlDatatype(type);
            if (StringUtils.equals("TEXT", sqlType)) {
                values.append("'");
                values.append(value);
                values.append("'");
            } else {
                values.append(value);
            }
            values.append(",");
        }
        feilds.deleteCharAt(feilds.length() - 1);
        values.deleteCharAt(values.length() - 1);

        StringBuilder builder = new StringBuilder();
        builder.append("INSERT INTO ");
        builder.append(collection);
        builder.append("(");
        builder.append(feilds);
        builder.append(")");
        builder.append(" VALUES(");
        builder.append(values);
        builder.append(")");
        logger.info(builder.toString());
        jdbcTemplate.execute(builder.toString());
    }

    private void createTable() {
        Entity entity = entities.get(0);
        StringBuilder builder = new StringBuilder();
        builder.append("CREATE TABLE ");
        builder.append(collection);
        builder.append("(");
        Map<String, Object> properties = Schema.getDefaultSchema().getEntityProperties(entity);
        for (String key : properties.keySet()) {
            builder.append(key);
            builder.append(" ");

            Class type = null;
            try {
                type = entity.getProperty(key).getClass();
            } catch (NullPointerException ne) {
                type = entity.getDynamicProperties().get(key).getClass();
            }

            String sqlType = getSqlDatatype(type);
            builder.append(sqlType);
            builder.append(",");
        }
        builder.deleteCharAt(builder.length() - 1);
        builder.append(")");

        jdbcTemplate.execute("DROP TABLE IF EXISTS " + collection);
        logger.info(builder.toString());
        jdbcTemplate.execute(builder.toString());
    }

    @Override
    public List<Entity> execute(String query) {
        List<Entity> entities = jdbcTemplate.query(query, new RowMapper<Entity>() {
            @Override
            public Entity mapRow(ResultSet rs, int i) throws SQLException {
                ResultSetMetaData rsmd = rs.getMetaData();
                Entity entity = new QueryEntity();
                for (int j = 1; j <= rsmd.getColumnCount(); j++) {
                    entity.setProperty(rsmd.getColumnName(j), rs.getObject(j));
                }
                return entity;
            }
        });
        return entities;
    }

    @Override
    public List<Entity> execute(String query, int limit) {
        return execute(query);
    }

    // based on sqlite (http://www.sqlite.org/datatype3.html)
    private String getSqlDatatype(Class clz) {
        if (clz == null)
            return "TEXT";

        if (clz == Integer.class || clz == Long.class || clz == Boolean.class) {
            return "INTEGER";
        } else if (clz == Double.class) {
            return "REAL";
        } else if (clz == Byte.class) {
            return "BLOB";
        }
        return "TEXT";
    }

    public void setCollection(String collection) {
        this.collection = collection;
    }

    public void setEntities(List<Entity> entities) {
        this.entities = entities;
    }
}