OutputStore.java
package progen.output.outputers;
import java.util.ArrayList;
import java.util.List;
import progen.context.ProGenContext;
/**
* Clase que almacena todas las salidas disponibles en una ejecución concreta de
* ProGen. Está implementado con un Singleton, de tal forma que únicamente
* existe una instancia del almacén en toda la ejecución.
*
* @author jirsis
* @since 2.0
*
*/
public final class OutputStore {
/**
* Almacén que representa la única instancia del almacén a lo largo de la
* ejecución.
*/
private static OutputStore store;
/** Conjunto de salidas disponibles. */
private List<Outputer> outputers;
/**
* Constructor privado de la clase. Únicamente se ejecutará desde el método de
* crearción si no existe una instancia previa.
*/
private OutputStore() {
outputers = new ArrayList<Outputer>();
}
/**
* Método de creación de la instancia única. En caso de existir una
* previamente, se devolverá una referencia a ésta.
*
* @return La instancia única del almaacen de salidas.
*/
public static synchronized OutputStore makeInstance() {
if (store == null) {
store = new OutputStore();
store.init();
}
return store;
}
/**
* Método que carga en memoria todas las salidas disponibles en la ejecución
* de ProGen.
*
* Las salidas disponibles se definen con la propiedad
* <code> progen.outputers </code> y serparadas por comas (,).
*/
public void init() {
final String[] outputersName = ProGenContext.getOptionalProperty("progen.outputers", "NullOutputer").split(",[ ]*");
try {
for (String outputClass : outputersName) {
final Outputer output = (Outputer) Class.forName("progen.output.outputers." + outputClass).newInstance();
outputers.add(output);
}
} catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
throw new UnknowOutputerException(e.getMessage(), e);
}
}
/**
* Ejecuta el método correspondiente de todas las salidas disponibles.
*/
public void print() {
for (Outputer out : outputers) {
out.print();
}
}
/**
* Ejecuta el método correspondiente de cierre en todas las salidas
* disponibles.
*/
public void close() {
for (Outputer out : outputers) {
out.close();
}
}
}