de.vandermeer.skb.mvn.pm.ProjectManager Maven / Gradle / Ivy
/* Copyright 2016 Sven van der Meer
*
* 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;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
import org.apache.commons.lang3.Validate;
import de.vandermeer.skb.mvn.PmConstants;
import de.vandermeer.skb.mvn.pm.model.PM_Context;
import de.vandermeer.skb.mvn.pm.model.PM_Model;
import de.vandermeer.skb.mvn.pm.model.PomWriter;
/**
* Manages MVN projects.
*
* @author Sven van der Meer <[email protected]>
* @version v0.0.2 build 160304 (04-Mar-16) for Java 1.8
* @since v0.0.1
*/
public class ProjectManager {
/** The configuration directory, home of all files with properties. */
private final File configDir;
/** The directory where the projects store their properties and configurations. */
private final String projectPmDir;
/** Model context, everything the model needs to know. */
protected final PM_Context mc;
/** The projects found in the main projects file. */
Properties projects;
/** The PM model. */
protected PM_Model model;
/**
* Creates a new project manager.
* @param configDir the project manager configuration directory
* @param projectPmDir the standard directory for project configurations
* @throws NullPointerException if any argument was null or if any load operation did run into null pointers
* @throws IllegalArgumentException if any argument was blank or if any load operation did run into illegal arguments
*/
public ProjectManager(File configDir, String projectPmDir){
Validate.notNull(configDir);
Validate.notBlank(projectPmDir);
this.configDir = configDir;
this.projectPmDir = projectPmDir;
this.testConfigDir();
this.projects = this.loadProjectDirectories();
this.mc = new PM_Context(this.projectPmDir);
this.loadBuildVersions();
}
/**
* Tests the configuration directory.
* @throws IllegalArgumentException if any test operation failed
*/
protected void testConfigDir(){
//check if configuration directory exists
if(!this.configDir.isDirectory()){
throw new IllegalArgumentException("configuration directory not a directory - <" + this.configDir + ">");
}
if(!this.configDir.canRead()){
throw new IllegalArgumentException("cannot read from configuration directory <" + this.configDir + ">");
}
}
/**
* Loads project properties from their project directory.
* @return the loaded properties
* @throws IllegalArgumentException if any load operation failed (for instance file not found, IO error)
*/
protected Properties loadProjectDirectories(){
//check for the main configure file
File projectsFile = new File(this.configDir.toString() + File.separator + PmConstants.PROJECTS_FILE);
this.projects = new Properties();
try {
projects.load(new FileReader(projectsFile));
}
catch (FileNotFoundException e) {
throw new IllegalArgumentException("did not find projects file, tried <" + projectsFile + ">");
}
catch (IOException ioex) {
throw new IllegalArgumentException("could not read projects file, got IOException <" + ioex.getMessage() + ">");
}
if(projects.isEmpty()){
throw new IllegalArgumentException("empty projects file <" + projectsFile + ">");
}
return projects;
}
/**
* Loads the build version file of the main project.
* @throws IllegalArgumentException if any load operation failed (for instance file not found, IO error)
*/
protected void loadBuildVersions(){
//if build versions are defined, load them
File buildVersionFile = new File(this.configDir.toString() + File.separator + PmConstants.BUILD_VERSIONS_FILE);
try {
Properties buildVersions = new Properties();
// getLog().info("build versions file: " + buildVersionFile);
buildVersions.load(new FileReader(buildVersionFile));
if(buildVersions.size()>0){
this.mc.setBuildVersions(buildVersions);
}
}
catch (FileNotFoundException e) {
// getLog().warn("- cannot do dependency coordination, build-versions file does not exist: <" + buildVersionFile + ">");
}
catch (IOException ioex) {
throw new IllegalArgumentException("could not read existing build-versions file, got IOException <" + ioex.getMessage() + ">");
}
catch(Exception ex){
throw new IllegalArgumentException(ex.getMessage());
}
}
/**
* Loads the actual model with all projects and all their properties.
* @throws NullPointerException if any load operation did run into a null pointer problem
* @throws IllegalArgumentException if any load operation failed (for instance file not found, IO error)
*/
public void loadModel(){
this.model = new PM_Model(this.mc);
try{
this.model.loadModel(projects.values());
this.model.updateProjectDependencies();
}
catch(Exception ex){
ex.printStackTrace();
throw new IllegalArgumentException(ex.getMessage());
}
}
/**
* Writes the model to generated POM files, then checks if the actual POM file needs an update.
* @return information about what POM files where written, empty if none where written (in that case, w/o exceptions, the new generated POM files did not differ from the existing POM files)
* @throws NullPointerException if any null pointer happened
* @throws IllegalArgumentException if any problems happened with creating, writing, copying POM files
*/
public String writeModel(){
try{
PomWriter pw = new PomWriter();
return pw.writePoms(this.model.getManagedProjects());
}
catch(Exception ex){
throw new IllegalArgumentException(ex.getMessage());
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy