Java tutorial
/* Copyright 2016 Sven van der Meer <vdmeer.sven@mykolab.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.vandermeer.skb.mvn.pm.model; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.Collection; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Properties; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.apache.commons.lang3.text.StrBuilder; import de.vandermeer.skb.mvn.Licenses; import de.vandermeer.skb.mvn.ProjectFiles; import de.vandermeer.skb.mvn.ProjectProperties; /** * Managed project object for the model. * * @author Sven van der Meer <vdmeer.sven@mykolab.com> * @version v0.0.2 build 160304 (04-Mar-16) for Java 1.8 * @since v0.0.1 */ public class Model_ManagedProject { /** Model context, everything the model needs to know. */ protected final PM_Context mc; /** The project base directory. */ protected final File baseDir; /** The project PM directory. */ protected final File pmDir; /** The project property file. */ protected final File projectPropertyFile; /** The PM identifier of the project. */ protected final String pmId; /** THe project properties as read from the PM configuration file. */ protected Properties properties; // /** A map view of the properties. */ // protected final Map<Object, Object> propertyMap; /** Set of dependencies that are defined by the project and for which we have found build version definitions. */ protected final Set<Model_Dependency> dependencies; /** Project licenses. */ protected final Set<Licenses> licenses; /** Files with more project configuration. */ protected final Map<ProjectFiles, File> otherProjectFiles; /** Plugin definitions files of the project. */ protected final Set<File> plugins; /** Profile definitions files of the project. */ protected final Set<File> profiles; /** * Creates a new Managed Project object. * @param mc the model context * @param baseDir project base directory * @param pmDir the project PM directory * @param propertyFile the project property file * @throws NullPointerException if any argument was null * @throws IllegalArgumentException if any sub-method experienced an illegal argument * @throws FileNotFoundException if any file (property file) was not found * @throws IOException if reading the property file caused an IO exception */ Model_ManagedProject(PM_Context mc, File baseDir, File pmDir, File propertyFile) throws FileNotFoundException, IOException { Validate.notNull(mc); Validate.notNull(baseDir); Validate.notNull(pmDir); Validate.notNull(propertyFile); this.mc = mc; this.baseDir = baseDir; this.pmDir = pmDir; this.projectPropertyFile = propertyFile; // this.propertyMap = new HashMap<>(); this.loadProperties(); this.pmId = this.properties.getProperty(ProjectProperties.PM_ID.getPropName()); this.mc.getBuildVersions().put(this.getPmId(), new Ctxt_BuildVersion(this.pmId, this.getMvnGroupId() + " " + this.getMvnArtifactId() + " " + this.getMvnVersion())); this.dependencies = new LinkedHashSet<>(); this.licenses = new LinkedHashSet<>(); if (this.properties.getProperty(ProjectProperties.PM_LICENSES.getPropName()) != null) { for (String l : StringUtils .split(this.properties.getProperty(ProjectProperties.PM_LICENSES.getPropName()))) { try { this.licenses.add(Licenses.valueOf(l)); } catch (Exception ex) { throw new IllegalArgumentException( "project <" + this.pmId + "> requires unknown license <" + l + ">"); } } } //get all other files from the pm directory this.otherProjectFiles = new LinkedHashMap<>(); for (ProjectFiles pf : ProjectFiles.values()) { if (pf != ProjectFiles.MANAGED_PROJECT_PROPERTIES) { File f = new File(this.pmDir + File.separator + pf.getFileName()); if (f.exists() && f.canRead()) { this.otherProjectFiles.put(pf, f); } } } //get all plugin files requires this.plugins = new LinkedHashSet<>(); if (this.properties.getProperty(ProjectProperties.PM_PLUGINS.getPropName()) != null) { for (String fn : StringUtils .split(this.properties.getProperty(ProjectProperties.PM_PLUGINS.getPropName()))) { File f = new File(this.pmDir + File.separator + fn); if (f.exists() && f.canRead()) { this.plugins.add(f); } else { throw new IllegalArgumentException( "project <" + this.pmId + "> required plugin file <" + f + ">"); } } } //get all profiles requires this.profiles = new LinkedHashSet<>(); if (this.properties.getProperty(ProjectProperties.PM_PROFILES.getPropName()) != null) { for (String fn : StringUtils .split(this.properties.getProperty(ProjectProperties.PM_PROFILES.getPropName()))) { File f = new File(this.pmDir + File.separator + fn); if (f.exists() && f.canRead()) { this.profiles.add(f); } else { throw new IllegalArgumentException( "project <" + this.pmId + "> required profile file <" + f + ">"); } } } } /** * Returns the identifier of the managed project as used by the project manager. * @return managed project identifier */ public String getPmId() { return this.pmId; } /** * Checks a list of properties for containing all required properties * @return true on success (exceptions on error) * @throws IOException if read from property file {@link #projectPropertyFile} failed * @throws FileNotFoundException if property file property file {@link #projectPropertyFile} was not found * @throws NullPointerException if required property not in list or value null * @throws IllegalArgumentException if required property in list but value blank */ protected boolean loadProperties() throws FileNotFoundException, IOException { this.properties = new Properties(); // this.getModelContext().log.info(this.projectPropertyFile.toString()); this.properties.load(new FileReader(this.projectPropertyFile)); for (ProjectProperties pp : ProjectProperties.getRequried()) { Validate.notBlank(this.properties.getProperty(pp.getPropName()), "<" + this.projectPropertyFile + "> -> required property does not exist or is blank: <" + pp.getPropName() + ">"); } // for(Entry<Object, Object> s : this.properties.entrySet()){ // if(s.getKey()!=null && s.getValue()!=null){ // this.propertyMap.put(s.getKey(), s.getValue()); // } // } return true; } /** * Updates the dependencies, should be called once all projects are loaded. * @return errors, empty if none occurred */ protected StrBuilder updateDependencies() { StrBuilder ret = new StrBuilder(); String deps = this.properties.getProperty(ProjectProperties.PM_DEPENDENCIES.getPropName()); if (deps != null) { for (String dep : StringUtils.split(deps)) { String[] actual = StringUtils.split(dep, "/"); String scope = (actual.length == 2) ? actual[1] : null; if (this.mc.getBuildVersions().get(actual[0]) == null) { ret.append("project <" + this.pmId + "> uses unkown dependency <" + dep + "> - check project's '" + ProjectProperties.PM_DEPENDENCIES.getPropName() + "'"); ret.appendNewLine(); } else { Model_Dependency md = new Model_Dependency(this.mc.getBuildVersions().get(actual[0]), scope); this.dependencies.add(md); } } } return ret; } /** * Returns the model context. * @return model context */ public PM_Context getModelContext() { return this.mc; } /** * Returns the MVN groupID * @return MVN groupID */ public String getMvnGroupId() { return this.properties.getProperty(ProjectProperties.MVN_GROUP_ID.getPropName()); } /** * Returns the MVN artifactID * @return MVN artifactID */ public String getMvnArtifactId() { return this.properties.getProperty(ProjectProperties.MVN_ARTIFACT_ID.getPropName()); } /** * Returns the MVN version * @return MVN version */ public String getMvnVersion() { return this.properties.getProperty(ProjectProperties.MVN_VERSION.getPropName()); } /** * Returns the MVN packaging * @return MVN packaging, default value as defined in {@link ProjectProperties#MVN_PACKAGING} */ public String getMvnPackaging() { return this.properties.getProperty(ProjectProperties.MVN_PACKAGING.getPropName(), ProjectProperties.MVN_PACKAGING.getDefaultValue()); } /** * Returns the MVN name * @return MVN name */ public String getMvnName() { return this.properties.getProperty(ProjectProperties.MVN_NAME.getPropName()); } /** * Returns the MVN description * @return MVN description */ public String getMvnDescription() { return this.properties.getProperty(ProjectProperties.MVN_DESCRIPTION.getPropName()); } /** * Returns the MVN url * @return MVN url */ public String getMvnUrl() { return this.properties.getProperty(ProjectProperties.MVN_URL.getPropName()); } /** * Returns the MVN inceptionYear * @return MVN inceptionYear */ public String getMvnInceptionYear() { return this.properties.getProperty(ProjectProperties.MVN_INCEPTION_YEAR.getPropName()); } /** * Returns the project dependencies that have been coordinated with other managed projects or build version of the master project * @return project dependencies */ public Collection<Model_Dependency> getDependencies() { return this.dependencies; } /** * Returns the MVN organization name * @return MVN organization name */ public String getMvnOrgName() { return this.properties.getProperty(ProjectProperties.MVN_ORGANIZATION_NAME.getPropName()); } /** * Returns the MVN organization url * @return MVN organization url */ public String getMvnOrgUrl() { return this.properties.getProperty(ProjectProperties.MVN_ORGANIZATION_URL.getPropName()); } public boolean doesBundleDocs() { return (this.properties.getProperty(ProjectProperties.PM_DO_BUNDLE_DOC.getPropName()) != null) ? true : false; } /** * Returns the MVN property for compiler source * @return compiler source property */ public String getMvnCompilerSource() { return this.properties.getProperty(ProjectProperties.MVN_PROPERTIES_COMPILER_SOURCE.getPropName()); } /** * Returns the MVN property for compiler target * @return compiler target property */ public String getMvnCompilerTarget() { return this.properties.getProperty(ProjectProperties.MVN_PROPERTIES_COMPILER_TARGET.getPropName()); } /** * Returns the MVN property for encoding * @return encoding property */ public String getMvnEncoding() { return this.properties.getProperty(ProjectProperties.MVN_PROPERTIES_ENCODING.getPropName()); } /** * Returns the registered licenses of the project * @return project licenses */ public Set<Licenses> getLicenses() { return this.licenses; } /** * Returns other project files found in the pm direcotry * @return other project files */ public Map<ProjectFiles, File> getOtherProjectFiles() { return this.otherProjectFiles; } /** * Returns the validated plugin files of the project. * @return validated plugin files */ public Set<File> getPlugins() { return this.plugins; } /** * Returns the validated profile files of the project. * @return validated profile files */ public Set<File> getProfiles() { return this.profiles; } /** * Returns the MVN property for issue management -url. * @return issue management -url */ public String getMvnIssueMgmtUrl() { return this.properties.getProperty(ProjectProperties.MVN_ISSUE_MANAGEMENT_URL.getPropName()); } /** * Returns the MVN property for issue management -system. * @return issue management -system */ public String getMvnIssueMgmtSystem() { return this.properties.getProperty(ProjectProperties.MVN_ISSUE_MANAGEMENT_SYSTEM.getPropName()); } /** * Returns the MVN property for SCM developer connection. * @return SCM developer connection */ public String getMvnScmDeveloperConnection() { return this.properties.getProperty(ProjectProperties.MVN_SCM_DEVELOPER_CONNECTION.getPropName()); } /** * Returns the MVN property for SCM connection. * @return SCM connection */ public String getMvnScmConnection() { return this.properties.getProperty(ProjectProperties.MVN_SCM_CONNECTION.getPropName()); } /** * Returns the MVN property for SCM url. * @return SCM url */ public String getMvnScmUrl() { return this.properties.getProperty(ProjectProperties.MVN_SCM_URL.getPropName()); } /** * Flag for requiring the jar plugin. * @return true if required, false otherwise */ public boolean wantsJarPLugin() { return (this.properties.getProperty(ProjectProperties.PM_USE_JAR_PLUGIN.getPropName()) != null) ? true : false; } /** * Flag for requiring the source plugin. * @return true if required, false otherwise */ public boolean wantsSourcePlugin() { return (this.properties.getProperty(ProjectProperties.PM_USE_SRC_PLUGIN.getPropName()) != null) ? true : false; } /** * Flag for requiring the compiler plugin. * @return true if required, false otherwise */ public boolean wantsCompilerPlugin() { return (this.properties.getProperty(ProjectProperties.PM_USE_COMPILER_PLUGIN.getPropName()) != null) ? true : false; } /** * Flag for requiring the Javadoc plugin. * @return true if required, false otherwise */ public boolean wantsJavadocPlugin() { return (this.properties.getProperty(ProjectProperties.PM_USE_JAVADOC_PLUGIN.getPropName()) != null) ? true : false; } }