All Downloads are FREE. Search and download functionalities are using the official Maven repository.

goja.core.sqlinxml.SqlKit Maven / Gradle / Ivy

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2013-2014 sagyf Yang. The Four Group.
 */
package goja.core.sqlinxml;

import com.google.common.base.Charsets;
import com.google.common.base.Strings;
import com.google.common.collect.FluentIterable;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.io.Files;
import com.google.common.io.Resources;
import com.jfinal.kit.PathKit;
import goja.core.StringPool;
import goja.core.app.GojaConfig;
import goja.core.kits.JaxbKit;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.IOException;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;

public class SqlKit {
    /**
     * SQL XML file suffix
     */
    protected static final String CONFIG_SUFFIX = "sql.xml";


    private static final Logger logger = LoggerFactory.getLogger(SqlKit.class);

    /**
     * Management of SQL set
     */
    private static final Map SQL_MAP = Maps.newHashMap();

    private SqlKit() {
    }

    /**
     * To obtain a configuration of SQL.
     *
     * @param groupNameAndsqlId SQL id.
     * @return sql script.
     */
    public static String sql(String groupNameAndsqlId) {

        final Sql sql = SQL_MAP.get(groupNameAndsqlId);
        return sql == null ? StringPool.EMPTY : sql.sql;
    }

    public static Sql sqlO(String groupNameAndsqlId) {

        return SQL_MAP.get(groupNameAndsqlId);
    }

    static void clearSqlMap() {
        SQL_MAP.clear();
    }

    static void putOver(String name, Sql value) {
        SQL_MAP.put(name, value);
    }


    static void init() {
        final String resource = PathKit.getRootClassPath() + File.separator + "sqlconf";
        initScanFiles(resource);
        if (GojaConfig.getApplicationMode().isDev()) {
            // 启动文件监控
            runWatch();
        }
    }

    static void reload() {
//        SQL_MAP.clear();
        final String resource = PathKit.getRootClassPath() + File.separator + "sqlconf";
        initScanFiles(resource);
    }

    private static void initScanFiles(String resource) {
        FluentIterable iterable = Files.fileTreeTraverser().breadthFirstTraversal(new File(resource));
        final List files = Lists.newArrayList();
        for (File f : iterable) {
            if (f.getName().endsWith(CONFIG_SUFFIX)) {
                files.add(f);
            }
        }

        SqlGroup group;
        for (File xmlfile : files) {
            group = JaxbKit.unmarshal(xmlfile, SqlGroup.class);
            groupxmlfile(group, xmlfile.getName());
        }
        // Search Jar file xml config.
        List jarlist = GojaConfig.getAppJars();
        if (!(jarlist == null || jarlist.isEmpty())) {
            String lib_path = PathKit.getWebRootPath() + File.separator + "WEB-INF" + File.separator + "lib" + File.separator;

            JarFile jarFile;
            for (String jar : jarlist) {
                String jar_path = lib_path + jar;
                try {
                    jarFile = new JarFile(jar_path);
                } catch (IOException e) {
                    logger.error("Error in finding {} the SQL configuration file", jar_path);
                    continue;
                }
                Enumeration entrys = jarFile.entries();
                while (entrys.hasMoreElements()) {
                    JarEntry jarEntry = entrys.nextElement();
                    final String jar_file_name = jarEntry.getName();
                    if (jar_file_name.endsWith(CONFIG_SUFFIX)) {
                        try {
                            String xml_content = Resources.toString(Resources.getResource(jar_file_name), Charsets.UTF_8);
                            group = JaxbKit.unmarshal(xml_content, SqlGroup.class);
                            groupxmlfile(group, Files.getNameWithoutExtension(jar_file_name));
                        } catch (IOException e) {
                            logger.error("reade jar xml config has error!");
                        }
                    }
                }
            }
        }


    }

    private static void groupxmlfile(SqlGroup group, String file_name) {
        String name = group.name;
        if (StringUtils.isBlank(name)) {
            name = file_name;
        }
        for (SqlItem sqlItem : group.sqlItems) {
            final String sql_name = name + StringPool.DOT + sqlItem.id;
            if (SQL_MAP.containsKey(sql_name)) {
                logger.warn("In file {} SQL id in XML for {} has been loaded", file_name, sql_name);
                continue;
            }
            final String _val = sqlItem.value;
            if (Strings.isNullOrEmpty(_val)) {
                logger.warn("In file {} SQL id in XML for {} is empty", file_name, sql_name);
                continue;
            }
            final String clearSql = _val.replace('\r', ' ').replace('\n', ' ').replaceAll(" {2,}", " ");
            SQL_MAP.put(sql_name, new Sql(clearSql));
        }
    }

    static void initWithTest() {

        final String resource = PathKit.getRootClassPath();
        if (Strings.isNullOrEmpty(resource)) {
            throw new NullPointerException("the resources is null.");
        }

        initScanFiles(resource.replace("test-", StringPool.EMPTY));
    }

    private static void runWatch() {
        final String path = PathKit.getRootClassPath();
        logger.info("Start the SQL configuration file scanning monitoring mechanism! path is {}", path);
        long interval = TimeUnit.SECONDS.toMillis(2);

        File config_file = new File(path);
        List observerList = Lists.newArrayList();
        final File[] childrenfiles = config_file.listFiles();
        if (childrenfiles != null) {
            for (File child : childrenfiles) {
                if (child.isDirectory()) {
                    final FileAlterationObserver observer = new FileAlterationObserver(child.getAbsolutePath()
                            , FileFilterUtils.and(FileFilterUtils.fileFileFilter(), FileFilterUtils.suffixFileFilter(CONFIG_SUFFIX)
                    ), null);

                    observer.addListener(SqlXmlFileListener.me);
                    observerList.add(observer);

                }
            }
            final FileAlterationObserver observer = new FileAlterationObserver(config_file);
            observer.addListener(SqlXmlFileListener.me);
            observerList.add(observer);
        }
        // Monitoring the jar file

        List jarlist = GojaConfig.getAppJars();
        if (!(jarlist == null || jarlist.isEmpty())) {
            String jar_path = PathKit.getWebRootPath() + File.separator + "WEB-INF" + File.separator + "lib" + File.separator;
            final FileAlterationObserver observer = new FileAlterationObserver(jar_path);
            observer.addListener(SqlXmlFileListener.me);
            observerList.add(observer);

        }

        final FileAlterationObserver[] observers = observerList.toArray(new FileAlterationObserver[observerList.size()]);
        FileAlterationMonitor monitor = new FileAlterationMonitor(interval, observers);

        try {
            monitor.start();
        } catch (Exception e) {
            logger.error("file monitor is error!", e);
        }

    }

    static void remove(String s) {
        SQL_MAP.remove(s);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy