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

org.unix4j.codegen.loader.ResourceDataLoader Maven / Gradle / Ivy

There is a newer version: 0.6
Show newest version
package org.unix4j.codegen.loader;

import java.io.File;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import fmpp.Engine;
import fmpp.tdd.DataLoader;
import freemarker.template.SimpleSequence;
import freemarker.template.TemplateModel;

/**
 * A {@link DataLoader} for the fmpp/freemarker codegenerator passing existing
 * resources to a {@link ResourceBasedDataLoader} for further analysis. The
 * resource paths as defined by {@link Class#getResourceAsStream(String)} are
 * expected as input parameters in the arguments list of
 * {@link #load(Engine, List)}.
 */
public class ResourceDataLoader implements DataLoader {

	private final ResourceBasedDataLoader templateLoader;

	public ResourceDataLoader(ResourceBasedDataLoader templateLoader) {
		this.templateLoader = templateLoader;
	}

	@SuppressWarnings("rawtypes")
	@Override
	public SimpleSequence load(Engine engine, List args) throws Exception {
		return loadDataModel(engine, args);
	}

	private SimpleSequence loadDataModel(Engine engine, List args) throws Exception {
		final List templateModels = new ArrayList();
		for (int i = 0; i < args.size(); i++) {
			final String resourceName = args.get(i).toString();
			final URL resource = loadResource(engine, resourceName);
			if (resource != null) {
				final TemplateModel templateModel = templateLoader.load(resource);
				if (templateModel != null) {
					templateModels.add(templateModel);
				}
			} else {
				throw new IllegalArgumentException("resource[" + i + "] not found: " + resourceName);
			}
		}
		return new SimpleSequence(templateModels);
	}

	public static URL loadResource(Engine engine, String resourceName) throws URISyntaxException, MalformedURLException {
		if (resourceName != null) {
			final URL url = ResourceDataLoader.class.getResource(resourceName);
			if (url != null) {
				return url;
			} else {
				File file = new File(resourceName);
				if (file.canRead()) {
					return file.toURI().toURL();
				}
				file = new File(engine.getDataRoot(), resourceName);
				if (file.canRead()) {
					return file.toURI().toURL();
				}
			}
		}
		return null;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy