com.ikon.util.DatabaseMetadataUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.ikon.util.DatabaseMetadataUtils.java

Source

/**
 * openkm, Open Document Management System (http://www.openkm.com)
 * Copyright (c) 2006-2013 Paco Avila & Josep Llort
 * 
 * No bytes were intentionally harmed during the development of this application.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License along
 * with this program; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */

package com.ikon.util;

import java.lang.reflect.InvocationTargetException;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.BeanUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ikon.core.DatabaseException;
import com.ikon.dao.DatabaseMetadataDAO;
import com.ikon.dao.bean.DatabaseMetadataType;
import com.ikon.dao.bean.DatabaseMetadataValue;
import com.ikon.frontend.client.util.metadata.DatabaseMetadataMap;

/**
 * DatabaseMetadataUtils
 * 
 * @author pavila
 */
public class DatabaseMetadataUtils {
    private static Logger log = LoggerFactory.getLogger(DatabaseMetadataUtils.class);

    /**
     * Build a query
     */
    public static String buildQuery(String table, String filter, String order) throws DatabaseException {
        log.debug("buildQuery({}, {}, {})", new Object[] { table, filter, order });
        StringBuilder sb = new StringBuilder();
        String ret = null;

        sb.append("from DatabaseMetadataValue dmv where dmv.table='" + table + "'");

        if (filter != null && filter.length() > 0) {
            sb.append(" and ").append(replaceVirtual(table, filter));
        }

        if (order != null && order.length() > 0) {
            sb.append(" order by ").append(replaceVirtual(table, order));
        }

        ret = sb.toString();
        log.debug("buildQuery: {}", ret);
        return ret;
    }

    /**
     * Build a query
     */
    public static String buildQuery(String table, String filter) throws DatabaseException {
        log.debug("buildQuery({}, {})", new Object[] { table, filter });
        StringBuilder sb = new StringBuilder();
        String ret = null;

        sb.append("from DatabaseMetadataValue dmv where dmv.table='" + table + "'");

        if (filter != null && filter.length() > 0) {
            sb.append(" and ").append(replaceVirtual(table, filter));
        }

        ret = sb.toString();
        log.debug("buildQuery: {}", ret);
        return ret;
    }

    /**
     * Build a query
     */
    public static String buildUpdate(String table, String values, String filter) throws DatabaseException {
        log.debug("buildUpdate({}, {}, {})", new Object[] { table, values, filter });
        StringBuilder sb = new StringBuilder();
        String ret = null;

        sb.append("update DatabaseMetadataValue dmv set");

        if (values != null && values.length() > 0) {
            sb.append(" ").append(replaceVirtual(table, values));
        }

        sb.append(" where dmv.table='" + table + "'");

        if (filter != null && filter.length() > 0) {
            sb.append(" and ").append(replaceVirtual(table, filter));
        }

        ret = sb.toString();
        log.debug("buildUpdate: {}", ret);
        return ret;
    }

    /**
     * Build a query
     */
    public static String buildDelete(String table, String filter) throws DatabaseException {
        log.debug("buildDelete({}, {})", new Object[] { table, filter });
        StringBuilder sb = new StringBuilder();
        String ret = null;

        sb.append("delete from DatabaseMetadataValue dmv where dmv.table='" + table + "'");

        if (filter != null && filter.length() > 0) {
            sb.append(" and ").append(replaceVirtual(table, filter));
        }

        ret = sb.toString();
        log.debug("buildDelete: {}", ret);
        return ret;
    }

    /**
     * Get virtual column string value
     */
    public static String getString(DatabaseMetadataValue value, String column)
            throws DatabaseException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        List<DatabaseMetadataType> types = DatabaseMetadataDAO.findAllTypes(value.getTable());

        for (DatabaseMetadataType emt : types) {
            if (emt.getVirtualColumn().equals(column)) {
                return BeanUtils.getProperty(value, emt.getRealColumn());
            }
        }

        return null;
    }

    /**
     * Get virtual column date value
     */
    public static Calendar getDate(DatabaseMetadataValue value, String column)
            throws DatabaseException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        List<DatabaseMetadataType> types = DatabaseMetadataDAO.findAllTypes(value.getTable());

        for (DatabaseMetadataType emt : types) {
            if (emt.getVirtualColumn().equals(column)) {
                return ISO8601.parseBasic(BeanUtils.getProperty(value, emt.getRealColumn()));
            }
        }

        return null;
    }

    /**
     * Obtain a Map from a DatabaseMetadataValue.
     */
    public static Map<String, String> getDatabaseMetadataValueMap(DatabaseMetadataValue value)
            throws DatabaseException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Map<String, String> map = new HashMap<String, String>();
        List<DatabaseMetadataType> types = DatabaseMetadataDAO.findAllTypes(value.getTable());

        for (DatabaseMetadataType emt : types) {
            if (emt.getVirtualColumn().equals(DatabaseMetadataMap.MV_NAME_ID)
                    || emt.getVirtualColumn().equals(DatabaseMetadataMap.MV_NAME_TABLE)) {
                throw new DatabaseException("Virtual column name restriction violated "
                        + DatabaseMetadataMap.MV_NAME_ID + " or " + DatabaseMetadataMap.MV_NAME_TABLE);
            }

            map.put(emt.getVirtualColumn(), BeanUtils.getProperty(value, emt.getRealColumn()));
        }

        map.put(DatabaseMetadataMap.MV_NAME_TABLE, value.getTable());
        map.put(DatabaseMetadataMap.MV_NAME_ID, String.valueOf(value.getId()));

        return map;
    }

    /**
     * Obtain a DatabaseMetadataValue from a Map
     */
    public static DatabaseMetadataValue getDatabaseMetadataValueByMap(Map<String, String> map)
            throws DatabaseException, IllegalAccessException, InvocationTargetException {
        DatabaseMetadataValue dmv = new DatabaseMetadataValue();

        if (!map.isEmpty() && map.containsKey(DatabaseMetadataMap.MV_NAME_TABLE)) {
            dmv.setTable(map.get(DatabaseMetadataMap.MV_NAME_TABLE));

            if (map.containsKey(DatabaseMetadataMap.MV_NAME_ID)) {
                dmv.setId(new Double(map.get(DatabaseMetadataMap.MV_NAME_ID)).longValue());
            }

            List<DatabaseMetadataType> types = DatabaseMetadataDAO.findAllTypes(dmv.getTable());
            for (DatabaseMetadataType emt : types) {
                if (!emt.getVirtualColumn().equals(DatabaseMetadataMap.MV_NAME_ID)
                        && !emt.getVirtualColumn().equals(DatabaseMetadataMap.MV_NAME_TABLE)) {
                    if (map.keySet().contains(emt.getVirtualColumn())) {
                        BeanUtils.setProperty(dmv, emt.getRealColumn(), map.get(emt.getVirtualColumn()));
                    }
                }
            }
        }

        return dmv;
    }

    /**
     * Replace virtual columns by real ones
     */
    public static String replaceVirtual(List<String> tables, String query) throws DatabaseException {
        String ret = query;
        for (String table : tables) {
            ret = replaceVirtual(table, ret);
        }

        return ret;
    }

    /**
     * Replace virtual columns by real ones
     */
    private static String replaceVirtual(String table, String query) throws DatabaseException {
        log.debug("replaceVirtual({}, {})", new Object[] { table, query });
        String ret = "";

        if (query != null && query.length() > 0) {
            List<DatabaseMetadataType> types = DatabaseMetadataDAO.findAllTypes(table);
            Collections.sort(types, LenComparator.getInstance()); //avoid the case in which one of the virtual columns is a substring of another (ex. id and admin_id)
            for (DatabaseMetadataType emt : types) {
                String vcol = "\\$" + emt.getVirtualColumn().toLowerCase();
                query = query.replaceAll(vcol, emt.getRealColumn().toLowerCase());
            }

            ret = query;
        }

        log.debug("replaceVirtual: {}", ret);
        return ret;
    }

    /**
     * custom comparator for sorting strings by length (in descending order)
     * 
     * @author danilo
     */
    public static class LenComparator implements Comparator<DatabaseMetadataType> {
        public static LenComparator getInstance() {
            return new LenComparator();
        }

        public int compare(DatabaseMetadataType s1, DatabaseMetadataType s2) {
            return s2.getVirtualColumn().length() - s1.getVirtualColumn().length();
        }
    }
}