CommonLibraryExecutorLoader.java

package edu.udel.cis.vsl.civl.library;

import java.lang.reflect.Constructor;
import java.util.LinkedHashMap;
import java.util.Map;

import edu.udel.cis.vsl.civl.semantics.Executor;
import edu.udel.cis.vsl.civl.semantics.IF.LibraryExecutor;
import edu.udel.cis.vsl.civl.semantics.IF.LibraryExecutorLoader;

public class CommonLibraryExecutorLoader implements LibraryExecutorLoader {

	private Map<String, LibraryExecutor> libraryExecutorCache = new LinkedHashMap<String, LibraryExecutor>();

	private static String classPrefix = "edu.udel.cis.vsl.civl.library.";

	public CommonLibraryExecutorLoader() {
		// TODO Auto-generated constructor stub
	}

	@SuppressWarnings("unchecked")
	@Override
	public LibraryExecutor getLibraryExecutor(String name,
			Executor primaryExecutor) {
		LibraryExecutor result = libraryExecutorCache.get(name);

		if (result == null) {
			String aClassName = classPrefix + name + "."
					+ capitalizeFirstLetter(name) + "Executor";

			try {
				Class<? extends LibraryExecutor> aClass = (Class<? extends LibraryExecutor>) Class
						.forName(aClassName);
				Constructor<? extends LibraryExecutor> constructor = aClass
						.getConstructor(Executor.class);

				result = constructor.newInstance(primaryExecutor);
			} catch (Exception e) {
				throw new RuntimeException("Unable to load library: " + name
						+ "\n" + e.getMessage());
			}
		}
		return result;
	}

	/**
	 * Returns string identical to given string except that first letter is
	 * capitalized.
	 * 
	 * @throws RuntimeException
	 *             if the string is empty
	 * */
	public static String capitalizeFirstLetter(String string) {
		if (string.length() < 1) {
			throw new RuntimeException("Empty name");
		} else {
			String first = string.substring(0, 1).toUpperCase();
			String rest = string.substring(1);
			String result = first.concat(rest);

			return result;
		}
	}

}