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.property.processor;
017
018import java.util.Collections;
019import java.util.List;
020import java.util.Properties;
021
022import org.kuali.common.util.Mode;
023import org.kuali.common.util.PropertyUtils;
024import org.kuali.common.util.Version;
025import org.kuali.common.util.VersionUtils;
026import org.kuali.common.util.property.Constants;
027
028public class VersionProcessor implements PropertyProcessor {
029
030        public static final String SANITIZED_QUALIFIER = Constants.DEFAULT_QUALIFIER_VERSION_SUFFIX + ".sanitized";
031        public static final String SANITIZED_VERSION_KEY = "project.version.sanitized";
032
033        String majorSuffix = Constants.DEFAULT_MAJOR_VERSION_SUFFIX;
034        String minorSuffix = Constants.DEFAULT_MINOR_VERSION_SUFFIX;
035        String incrementalSuffix = Constants.DEFAULT_INCREMENTAL_VERSION_SUFFIX;
036        String qualifierSuffix = Constants.DEFAULT_QUALIFIER_VERSION_SUFFIX;
037        String sanitizedQualifierSuffix = SANITIZED_QUALIFIER;
038        String trimmedSuffix = Constants.DEFAULT_TRIMMED_VERSION_SUFFIX;
039        String snapshotSuffix = Constants.DEFAULT_SNAPSHOT_VERSION_SUFFIX;
040        boolean alwaysAddOrOverride;
041
042        List<String> includes;
043        List<String> excludes;
044        Mode propertyOverwriteMode = Constants.DEFAULT_PROPERTY_OVERWRITE_MODE;
045
046        public VersionProcessor() {
047                this(Collections.<String> emptyList());
048        }
049
050        public VersionProcessor(String include) {
051                this(Collections.singletonList(include));
052        }
053
054        public VersionProcessor(List<String> includes) {
055                this(includes, false);
056        }
057
058        public VersionProcessor(List<String> includes, boolean alwaysAddOrOverride) {
059                this.includes = includes;
060                this.alwaysAddOrOverride = alwaysAddOrOverride;
061        }
062
063        @Override
064        public void process(Properties properties) {
065                List<String> keys = PropertyUtils.getSortedKeys(properties, includes, excludes);
066                Properties versionProperties = new Properties();
067                for (String key : keys) {
068                        String version = properties.getProperty(key);
069                        Version v = VersionUtils.getVersion(version);
070                        versionProperties.putAll(getVersionProperties(key, v));
071                }
072                List<String> versionKeys = PropertyUtils.getSortedKeys(versionProperties);
073                for (String versionKey : versionKeys) {
074                        String versionValue = versionProperties.getProperty(versionKey);
075                        if (alwaysAddOrOverride) {
076                                properties.setProperty(versionKey, versionValue);
077                        } else {
078                                PropertyUtils.addOrOverrideProperty(properties, versionKey, versionValue, propertyOverwriteMode);
079                        }
080                }
081        }
082
083        public Properties getVersionProperties(String key, Version v) {
084                Properties properties = new Properties();
085                if (v.getMajor() != null) {
086                        String newKey = key + "." + majorSuffix;
087                        properties.setProperty(newKey, v.getMajor());
088                }
089                if (v.getMinor() != null) {
090                        String newKey = key + "." + minorSuffix;
091                        properties.setProperty(newKey, v.getMinor());
092                }
093                if (v.getIncremental() != null) {
094                        String newKey = key + "." + incrementalSuffix;
095                        properties.setProperty(newKey, v.getIncremental());
096                }
097                if (v.getQualifier() != null) {
098                        String newKey = key + "." + qualifierSuffix;
099                        properties.setProperty(newKey, v.getQualifier());
100                        String sanitizedKey = key + "." + sanitizedQualifierSuffix;
101                        String sanitizedValue = VersionUtils.getSanitizedQualifier(v.getQualifier());
102                        properties.setProperty(sanitizedKey, sanitizedValue);
103                }
104                if (v.getTrimmed() != null) {
105                        String newKey = key + "." + trimmedSuffix;
106                        properties.setProperty(newKey, v.getTrimmed());
107                }
108                String newKey = key + "." + snapshotSuffix;
109                properties.setProperty(newKey, Boolean.toString(v.isSnapshot()));
110                properties.setProperty(SANITIZED_VERSION_KEY, VersionUtils.asSanitizedString(v));
111                return properties;
112        }
113
114        public String getMajorSuffix() {
115                return majorSuffix;
116        }
117
118        public void setMajorSuffix(String majorSuffix) {
119                this.majorSuffix = majorSuffix;
120        }
121
122        public String getMinorSuffix() {
123                return minorSuffix;
124        }
125
126        public void setMinorSuffix(String minorSuffix) {
127                this.minorSuffix = minorSuffix;
128        }
129
130        public String getIncrementalSuffix() {
131                return incrementalSuffix;
132        }
133
134        public void setIncrementalSuffix(String incrementalSuffix) {
135                this.incrementalSuffix = incrementalSuffix;
136        }
137
138        public String getQualifierSuffix() {
139                return qualifierSuffix;
140        }
141
142        public void setQualifierSuffix(String qualifierSuffix) {
143                this.qualifierSuffix = qualifierSuffix;
144        }
145
146        public String getTrimmedSuffix() {
147                return trimmedSuffix;
148        }
149
150        public void setTrimmedSuffix(String trimmedSuffix) {
151                this.trimmedSuffix = trimmedSuffix;
152        }
153
154        public String getSnapshotSuffix() {
155                return snapshotSuffix;
156        }
157
158        public void setSnapshotSuffix(String snapshotSuffix) {
159                this.snapshotSuffix = snapshotSuffix;
160        }
161
162        public List<String> getIncludes() {
163                return includes;
164        }
165
166        public void setIncludes(List<String> includes) {
167                this.includes = includes;
168        }
169
170        public List<String> getExcludes() {
171                return excludes;
172        }
173
174        public void setExcludes(List<String> excludes) {
175                this.excludes = excludes;
176        }
177
178        public Mode getPropertyOverwriteMode() {
179                return propertyOverwriteMode;
180        }
181
182        public void setPropertyOverwriteMode(Mode propertyOverwriteMode) {
183                this.propertyOverwriteMode = propertyOverwriteMode;
184        }
185
186        public boolean isAlwaysAddOrOverride() {
187                return alwaysAddOrOverride;
188        }
189
190        public void setAlwaysAddOrOverride(boolean alwaysAddOrOverride) {
191                this.alwaysAddOrOverride = alwaysAddOrOverride;
192        }
193
194        public String getSanitizedQualifierSuffix() {
195                return sanitizedQualifierSuffix;
196        }
197
198        public void setSanitizedQualifierSuffix(String sanitizedQualifierSuffix) {
199                this.sanitizedQualifierSuffix = sanitizedQualifierSuffix;
200        }
201
202}