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

jcommon.extract.VariableProcessorFactory Maven / Gradle / Ivy

Go to download

Java library for simple extracting and processing of embedded resources at runtime.

The newest version!

package jcommon.extract;

import jcommon.core.Path;
import jcommon.core.StringUtil;
import jcommon.core.Sys;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Factory for creating variable processors that evaluate variables when 
 * extracting resources.
 * 
 * @author David Hoyt 
 */
public class VariableProcessorFactory {
	//
	public static final String
		  SYSTEM_PROPERTY_NAME_DEFAULT_VARIABLE_PROCESSOR_CLASS = "resources.resources.extract.defaultProcessorClass"
	;

	public static final String
		  VAR_PID                   = "pid"
		, VAR_CWD                   = "cwd"
		, VAR_TMP                   = "tmp"
		, VAR_HOME                  = "home"
		, VAR_PATH				    = "env_PATH"
		, VAR_PATH_SEP              = "pathSep"
		, VAR_ORIG_CWD              = "origcwd"
		, VAR_ORIG_ENV_PATH		    = "origenv_PATH"

		, VAR_DIR                   = "dir"
		, VAR_PKG                   = "pkg"
		, VAR_NATIVE_RESOURCES_DIR  = "nativeResDir"
	;

	public static final Pattern
		  REGEX_VAR = Pattern.compile("\\$\\{([^\\}]*)\\}", Pattern.CASE_INSENSITIVE | Pattern.DOTALL | Pattern.CANON_EQ)
	;
	//

	//
	private static Map defaultVars;
	//

	//
	static {
		defaultVars = new HashMap(8, 0.5f);

		saveDefaultVariable(VAR_ORIG_CWD, Path.workingDirectory);
		saveDefaultVariable(VAR_ORIG_ENV_PATH, Sys.querySystemPath());

		saveDefaultVariable(VAR_PID, Sys.getPID() + "");
		saveDefaultVariable(VAR_CWD, Path.workingDirectory);
		saveDefaultVariable(VAR_TMP, Path.tempDirectory);
		saveDefaultVariable(VAR_HOME, Path.homeDirectory);
		saveDefaultVariable(VAR_PATH, Sys.querySystemPath());
		saveDefaultVariable(VAR_PATH_SEP, Path.pathSeparator);

		saveDefaultVariable(VAR_NATIVE_RESOURCES_DIR, Path.nativeResourcesDirectory);
	}
	//

	//
	public static boolean saveDefaultVariable(final String Name, String Value) {
		if (Value == null)
			Value = StringUtil.empty;
		defaultVars.put(Name, Matcher.quoteReplacement(Value));
		return true;
	}

	public static boolean removeDefaultVariable(final String Name) {
		if (defaultVars.isEmpty() || !defaultVars.containsKey(Name))
			return false;
		defaultVars.remove(Name);
		return true;
	}

	public static boolean clearDefaultVariables() {
		defaultVars.clear();
		return true;
	}

	public static IVariableProcessor newInstance() {
		return newInstance(true);
	}

	public static IVariableProcessor newInstance(final boolean AddDefaultVariables) {
		return newInstance(AddDefaultVariables, System.getProperty(SYSTEM_PROPERTY_NAME_DEFAULT_VARIABLE_PROCESSOR_CLASS, DefaultVariableProcessor.class.getName()));
	}

	public static IVariableProcessor newInstance(final boolean AddDefaultVariables, final String VariableProcessorClassName) {
		if (StringUtil.isNullOrEmpty(VariableProcessorClassName))
			throw new NullPointerException("Missing parameter");

		final Class cls;
		try {
			cls = Class.forName(VariableProcessorClassName, true, Thread.currentThread().getContextClassLoader());
		} catch(Throwable t) {
			throw new IllegalArgumentException("Unable to locate the class " + VariableProcessorClassName + ". Please be sure the current thread's class loader can find and initialize it.");
		}
		
		return newInstance(AddDefaultVariables, cls);
	}

	public static IVariableProcessor newInstance(final boolean AddDefaultVariables, final Class VariableProcessorClass) {
		if (VariableProcessorClass == null)
			throw new NullPointerException("Missing parameter");
		if (!IVariableProcessor.class.isAssignableFrom(VariableProcessorClass))
			throw new IllegalArgumentException("Invalid class: " + VariableProcessorClass.getSimpleName() + ". It must implement the " + IVariableProcessor.class.getSimpleName() + " interface.");

		final IVariableProcessor vp;
		try {
			vp = (IVariableProcessor)VariableProcessorClass.newInstance();
		} catch(Throwable t) {
			throw new IllegalArgumentException("Unable to create a new instance of " + VariableProcessorClass.getSimpleName() + ". Please be sure it has a default constructor.");
		}

		if (AddDefaultVariables)
			if (!vp.addVariables(defaultVars))
				throw new IllegalStateException("Unable to add default variables to " + VariableProcessorClass.getSimpleName());
		
		return vp;
	}
	//
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy