001 package org.kuali.common.deploy.spring;
002
003 import java.util.ArrayList;
004 import java.util.List;
005 import java.util.Properties;
006
007 import org.codehaus.plexus.util.StringUtils;
008 import org.kuali.common.deploy.DeployContext;
009 import org.kuali.common.deploy.Deployable;
010 import org.kuali.common.deploy.channel.spring.DefaultSecureChannelConfig;
011 import org.kuali.common.deploy.env.model.DeployEnvironment;
012 import org.kuali.common.deploy.env.spring.DefaultDeployEnvironmentConfig;
013 import org.kuali.common.deploy.env.spring.DeployEnvironmentConfig;
014 import org.kuali.common.util.PropertyUtils;
015 import org.kuali.common.util.maven.model.Artifact;
016 import org.kuali.common.util.nullify.NullUtils;
017 import org.kuali.common.util.secure.channel.SecureChannel;
018 import org.kuali.common.util.secure.channel.spring.SecureChannelConfig;
019 import org.kuali.common.util.spring.PropertySourceUtils;
020 import org.kuali.common.util.spring.env.EnvironmentService;
021 import org.kuali.common.util.spring.service.SpringServiceConfig;
022 import org.springframework.beans.factory.annotation.Autowired;
023 import org.springframework.context.annotation.Bean;
024 import org.springframework.context.annotation.Configuration;
025 import org.springframework.context.annotation.Import;
026 import org.springframework.core.env.ConfigurableEnvironment;
027
028 import com.google.common.base.Optional;
029
030 @Configuration
031 @Import({ SpringServiceConfig.class, DefaultDeployEnvironmentConfig.class, DefaultSecureChannelConfig.class })
032 public class DefaultDeployContextConfig implements DeployContextConfig {
033
034 @Autowired
035 EnvironmentService env;
036
037 @Autowired
038 ConfigurableEnvironment configurableEnvironment;
039
040 @Autowired
041 DeployEnvironmentConfig deployEnvConfig;
042
043 @Autowired
044 SecureChannelConfig channelConfig;
045
046 @Override
047 @Bean
048 public DeployContext deployContext() {
049 return getDeployContext();
050 }
051
052 protected List<Deployable> getApplicationConfig() {
053 Properties properties = PropertySourceUtils.getAllEnumerableProperties(configurableEnvironment);
054 Properties configProperties = PropertyUtils.getProperties(properties, "kdo.config.*.local", null);
055 List<String> keys = PropertyUtils.getSortedKeys(configProperties);
056 List<Deployable> deployables = new ArrayList<Deployable>();
057 for (String key : keys) {
058 Deployable deployable = getApplicationConfig(key);
059 if (deployable.isExists()) {
060 deployables.add(deployable);
061 }
062 }
063 return deployables;
064 }
065
066 protected Deployable getApplicationConfig(String localKey) {
067 // kdo.config.1.local
068 String[] tokens = StringUtils.split(localKey, ".");
069
070 // Should always be 4 tokens
071 if (tokens.length != 4) {
072 throw new IllegalStateException("Expected 4 tokens [" + localKey + "]");
073 }
074
075 // Third token is a unique identifier for this config file
076 String identifier = tokens[2];
077
078 // Assemble property keys
079 String remoteKey = "kdo.config." + identifier + ".remote";
080 String filterKey = "kdo.config." + identifier + ".filter";
081 String requiredKey = "kdo.config." + identifier + ".required";
082
083 // Extract information using the property keys
084 String local = env.getString(localKey);
085 String remote = env.getString(remoteKey);
086 boolean filter = env.getBoolean(filterKey, true); // Config files are filtered by default
087 boolean required = env.getBoolean(requiredKey, true); // Config files are required by default
088
089 // Create a new deployable from the information we gathered from the environment
090 return new Deployable.Builder(local, remote).filter(filter).required(required).build();
091 }
092
093 // This isn't really optional because all supported vendor specific drivers are declared as dependencies in the KDO profile
094 // of the top level kuali pom, and thus must exist and be downloadable.
095 protected Optional<Artifact> getJdbcDriverArtifact() {
096 Artifact driver = getVendorJdbcDriver();
097 String groupId = env.getString("jdbc.driver.groupId", driver.getGroupId());
098 String artifactId = env.getString("jdbc.driver.artifactId", driver.getArtifactId());
099 String version = env.getString("jdbc.driver.version", driver.getVersion());
100 Artifact artifact = new Artifact.Builder(groupId, artifactId, version).build();
101 return Optional.of(artifact);
102 }
103
104 // This isn't because all supported vendor specific drivers are declared as dependencies in the KDO profile
105 // of the top level kuali pom, and thus must exist and be downloadable.
106 protected Artifact getVendorJdbcDriver() {
107 String vendor = env.getString("db.vendor");
108 String groupIdKey = vendor + ".groupId";
109 String artifactIdKey = vendor + ".artifactId";
110 String versionKey = vendor + ".version";
111 String groupId = env.getString(groupIdKey);
112 String artifactId = env.getString(artifactIdKey);
113 String version = env.getString(versionKey);
114 return new Artifact.Builder(groupId, artifactId, version).build();
115 }
116
117 protected Artifact getApplicationArtifact() {
118 // TODO This only works because deploy.groupId is set inside the top level kuali-pom
119 // TODO This won't work on process not launched from the Maven CLI
120 // TODO Come up with something better here
121 String groupId = env.getString("deploy.groupId");
122 String artifactId = env.getString("project.artifactId");
123 String version = env.getString("project.version");
124 String classifier = env.getString("project.classifier", NullUtils.NONE);
125 String type = env.getString("project.packaging");
126 return new Artifact.Builder(groupId, artifactId, version).classifier(classifier).type(type).build();
127 }
128
129 protected DeployContext getDeployContext() {
130 Optional<Artifact> jdbcDriver = getJdbcDriverArtifact();
131 Artifact application = getApplicationArtifact();
132 List<Deployable> configFiles = getApplicationConfig();
133 SecureChannel channel = channelConfig.secureChannel();
134 DeployEnvironment environment = deployEnvConfig.deployEnvironment();
135 return new DeployContext.Builder(environment, channel, application).jdbcDriver(jdbcDriver).configFiles(configFiles).build();
136 }
137
138 }