001/**
002 * Copyright 2010-2014 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.common.util.metainf.spring;
017
018import java.io.File;
019import java.util.ArrayList;
020import java.util.HashMap;
021import java.util.List;
022import java.util.Map;
023
024import org.kuali.common.util.metainf.model.MetaInfContext;
025import org.kuali.common.util.metainf.service.MetaInfUtils;
026import org.kuali.common.util.nullify.NullUtils;
027import org.kuali.common.util.project.model.Build;
028import org.kuali.common.util.project.model.Project;
029import org.kuali.common.util.project.spring.AutowiredProjectConfig;
030import org.kuali.common.util.spring.SpringUtils;
031import org.kuali.common.util.spring.env.EnvironmentService;
032import org.kuali.common.util.spring.service.SpringServiceConfig;
033import org.springframework.beans.factory.annotation.Autowired;
034import org.springframework.context.annotation.Bean;
035import org.springframework.context.annotation.Configuration;
036import org.springframework.context.annotation.Import;
037
038@Configuration
039@Import({ AutowiredProjectConfig.class, MetaInfExecutableConfig.class, SpringServiceConfig.class })
040public class SqlConfig implements MetaInfContextsConfig {
041
042        private static final boolean DEFAULT_GENERATE_RELATIVE_PATHS = true;
043        private static final String RELATIVE_KEY = MetaInfUtils.PROPERTY_PREFIX + ".sql.relative";
044        private static final String DB_VENDOR_KEY = "db.vendor";
045        private static final String PREFIX = "sql";
046
047        @Autowired
048        EnvironmentService env;
049
050        @Autowired
051        Project project;
052
053        @Autowired
054        Build build;
055
056        @Override
057        @Bean
058        public List<MetaInfContext> metaInfContexts() {
059                Map<MetaInfGroup, String> defaultIncludes = getDefaultIncludes();
060                List<MetaInfContext> contexts = new ArrayList<MetaInfContext>();
061                for (MetaInfGroup group : MetaInfGroup.values()) {
062                        MetaInfContext context = getMetaInfContext(group, defaultIncludes);
063                        contexts.add(context);
064                }
065                return contexts;
066        }
067
068        protected MetaInfContext getMetaInfContext(MetaInfGroup group, Map<MetaInfGroup, String> defaultIncludes) {
069                String databaseVendor = env.getString(DB_VENDOR_KEY);
070                boolean relativePaths = env.getBoolean(RELATIVE_KEY, DEFAULT_GENERATE_RELATIVE_PATHS);
071                File outputFile = MetaInfUtils.getOutputFile(project, build, databaseVendor, group);
072                String includesKey = MetaInfConfigUtils.getIncludesKey(group, PREFIX);
073                String excludesKey = MetaInfConfigUtils.getExcludesKey(group, PREFIX);
074                List<String> includes = SpringUtils.getNoneSensitiveListFromCSV(env, includesKey, defaultIncludes.get(group));
075                List<String> excludes = SpringUtils.getNoneSensitiveListFromCSV(env, excludesKey, NullUtils.NONE);
076                File scanDir = build.getOutputDir();
077                String encoding = build.getEncoding();
078                return new MetaInfContext.Builder(outputFile, encoding, scanDir).includes(includes).excludes(excludes).relativePaths(relativePaths).build();
079        }
080
081        protected Map<MetaInfGroup, String> getDefaultIncludes() {
082                Map<MetaInfGroup, String> map = new HashMap<MetaInfGroup, String>();
083                map.put(MetaInfGroup.SCHEMA, "**/initial-db/**/*create-schema.sql");
084                map.put(MetaInfGroup.DATA, "**/initial-db/**/data/*.sql");
085                map.put(MetaInfGroup.CONSTRAINTS, "**/initial-db/**/*constraints.sql");
086                map.put(MetaInfGroup.OTHER, "**/upgrades/**/*.sql");
087                return map;
088        }
089}