001package org.kuali.common.util.metainf.spring;
002
003import java.io.File;
004import java.util.ArrayList;
005import java.util.HashMap;
006import java.util.List;
007import java.util.Map;
008
009import org.kuali.common.util.metainf.model.MetaInfContext;
010import org.kuali.common.util.metainf.service.MetaInfUtils;
011import org.kuali.common.util.nullify.NullUtils;
012import org.kuali.common.util.project.model.Build;
013import org.kuali.common.util.project.model.Project;
014import org.kuali.common.util.project.spring.AutowiredProjectConfig;
015import org.kuali.common.util.spring.SpringUtils;
016import org.kuali.common.util.spring.env.EnvironmentService;
017import org.kuali.common.util.spring.service.SpringServiceConfig;
018import org.springframework.beans.factory.annotation.Autowired;
019import org.springframework.context.annotation.Bean;
020import org.springframework.context.annotation.Configuration;
021import org.springframework.context.annotation.Import;
022
023@Configuration
024@Import({ AutowiredProjectConfig.class, MetaInfExecutableConfig.class, SpringServiceConfig.class })
025public class SqlConfig implements MetaInfContextsConfig {
026
027        private static final boolean DEFAULT_GENERATE_RELATIVE_PATHS = true;
028        private static final String RELATIVE_KEY = MetaInfUtils.PROPERTY_PREFIX + ".sql.relative";
029        private static final String DB_VENDOR_KEY = "db.vendor";
030        private static final String PREFIX = "sql";
031
032        @Autowired
033        EnvironmentService env;
034
035        @Autowired
036        Project project;
037
038        @Autowired
039        Build build;
040
041        @Override
042        @Bean
043        public List<MetaInfContext> metaInfContexts() {
044                Map<MetaInfGroup, String> defaultIncludes = getDefaultIncludes();
045                List<MetaInfContext> contexts = new ArrayList<MetaInfContext>();
046                for (MetaInfGroup group : MetaInfGroup.values()) {
047                        MetaInfContext context = getMetaInfContext(group, defaultIncludes);
048                        contexts.add(context);
049                }
050                return contexts;
051        }
052
053        protected MetaInfContext getMetaInfContext(MetaInfGroup group, Map<MetaInfGroup, String> defaultIncludes) {
054                String databaseVendor = env.getString(DB_VENDOR_KEY);
055                boolean relativePaths = env.getBoolean(RELATIVE_KEY, DEFAULT_GENERATE_RELATIVE_PATHS);
056                File outputFile = MetaInfUtils.getOutputFile(project, build, databaseVendor, group);
057                String includesKey = MetaInfConfigUtils.getIncludesKey(group, PREFIX);
058                String excludesKey = MetaInfConfigUtils.getExcludesKey(group, PREFIX);
059                List<String> includes = SpringUtils.getNoneSensitiveListFromCSV(env, includesKey, defaultIncludes.get(group));
060                List<String> excludes = SpringUtils.getNoneSensitiveListFromCSV(env, excludesKey, NullUtils.NONE);
061                File scanDir = build.getOutputDir();
062                String encoding = build.getEncoding();
063                return new MetaInfContext.Builder(outputFile, encoding, scanDir).includes(includes).excludes(excludes).relativePaths(relativePaths).build();
064        }
065
066        protected Map<MetaInfGroup, String> getDefaultIncludes() {
067                Map<MetaInfGroup, String> map = new HashMap<MetaInfGroup, String>();
068                map.put(MetaInfGroup.SCHEMA, "**/initial-db/**/*create-schema.sql");
069                map.put(MetaInfGroup.DATA, "**/initial-db/**/data/*.sql");
070                map.put(MetaInfGroup.CONSTRAINTS, "**/initial-db/**/*constraints.sql");
071                map.put(MetaInfGroup.OTHER, "**/upgrades/**/*.sql");
072                return map;
073        }
074}