All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.vandermeer.skb.mvn.pm.model.ModelLoader 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.model;

import java.io.File;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.lang3.Validate;
import org.apache.commons.lang3.text.StrBuilder;
import org.apache.commons.lang3.tuple.Pair;

import de.vandermeer.skb.mvn.ProjectFiles;

/**
 * Loads settings and information into a project model.
 *
 * @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 ModelLoader {

	/** Model context, everything the model needs to know. */
	protected final PM_Context mc;

	/** The loaded (checked) map of project directory to a pair with project PM directory and main configuration file. */
	protected final Map> projectFiles;

	/**
	 * Creates a new model loader.
	 * @param mc model context
	 * @param folders collection of project folders
	 * @throws NullPointerException if the collection or any member was null
	 * @throws IllegalArgumentException if any collection member resulted in a was a blank string or pointed to an unreadable/unwritable directory
	 */
	public ModelLoader(PM_Context mc, Collection folders){
		Validate.notNull(mc);
		this.mc = mc;

		this.projectFiles = new LinkedHashMap<>();

		StrBuilder errors = new StrBuilder();
		StrBuilder _err;
		for(Object o : folders){
			File prjDir = new File(o.toString());

			//set the loaded map entry
			this.projectFiles.put(prjDir,
					Pair.of(new File(
							prjDir + File.separator + this.mc.getProjectPmDir()),
							new File(prjDir + File.separator + this.mc.getProjectPmDir() + File.separator + ProjectFiles.MANAGED_PROJECT_PROPERTIES.getFileName())
					)
			);

			_err = this.testProjectDirectory(prjDir);
			errors.append(_err);
			if(_err.size()==0){
				_err = this.testProjectPmDirectory(this.projectFiles.get(prjDir).getKey());
				errors.append(_err);
				if(_err.size()==0){
					_err = this.testProjectPmFiles(this.projectFiles.get(prjDir).getValue());
					errors.append(_err);
				}
			}
		}

		if(errors.size()>0){
			throw new IllegalArgumentException("pm loader: problems with one or more directories, see below\n" + errors.toString());
		}
	}

	/**
	 * Tests the project directory.
	 * @param prjDir the project directory to test
	 * @return errors if any occurred, empty if all was ok
	 */
	protected StrBuilder testProjectDirectory(File prjDir){
		StrBuilder errors = new StrBuilder();

		//do individual texts to provide specific error messages (is there are better way to do that?)
		if(!prjDir.exists()){
			errors.append("project directory does not exist: <").append(prjDir).append('>').appendNewLine();
		}
		else if(!prjDir.isDirectory()){
			errors.append("project directory is not a directory: <").append(prjDir).append('>').appendNewLine();
		}
		else if(!prjDir.canRead()){
			errors.append("project directory not readable: <").append(prjDir).append('>').appendNewLine();
		}
		else if(!prjDir.canWrite()){
			errors.append("project directory not writable: <").append(prjDir).append('>').appendNewLine();
		}

		return errors;
	}

	/**
	 * Tests the PM directory in the project.
	 * @param pmDir PM directory to test
	 * @return errors if any occurred, empty if all was ok
	 */
	protected StrBuilder testProjectPmDirectory(File pmDir){
		StrBuilder errors = new StrBuilder();

		//do individual texts to provide specific error messages (is there are better way to do that?)
		if(!pmDir.exists()){
			errors.append("PM directory does not exist: <").append(pmDir).append('>').appendNewLine();
		}
		else if(!pmDir.isDirectory()){
			errors.append("PM directory is not a directory: <").append(pmDir).append('>').appendNewLine();
		}
		else if(!pmDir.canRead()){
			errors.append("PM directory not readable: <").append(pmDir).append('>').appendNewLine();
		}

		return errors;
	}

	/**
	 * Tests a PM project property file.
	 * @param pp the file to test
	 * @return errors if any occurred, empty if all was ok
	 */
	protected StrBuilder testProjectPmFiles(File pp){
		StrBuilder errors = new StrBuilder();

		if(!pp.exists()){
			errors.append("project property file does not exist: <").append(pp).append('>').appendNewLine();
		}
		else if(!pp.canRead()){
			errors.append("cannot read project property file: <").append(pp).append('>').appendNewLine();
		}

		return errors;
	}

	/**
	 * Returns the map of loaded project files
	 * @return loaded project files map
	 */
	public Map> getProjectFiles(){
		return this.projectFiles;
	}
}