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

prompto.codeserver.ModuleImporter Maven / Gradle / Ivy

The newest version!
package prompto.codeserver;

import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import prompto.code.Batch;
import prompto.code.Dependency;
import prompto.code.Service;
import prompto.code.ICodeStore;
import prompto.code.ICodeStore.ModuleType;
import prompto.code.Module;
import prompto.code.ImmutableCodeStore;
import prompto.intrinsic.PromptoVersion;
import prompto.utils.Logger;
import prompto.value.Image;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ModuleImporter {

	static Logger logger = new Logger();

	Module module;
	URL imageResource;
	URL codeResource;
	
	public ModuleImporter(Module module, URL imageResource, URL codeResource) {
		this.module = module;
		this.imageResource = imageResource;
		this.codeResource = codeResource;
	}
	
	public ModuleImporter(String resourcePath) {
		this(Thread.currentThread().getContextClassLoader().getResource(resourcePath));
	}
	
	public ModuleImporter(URL url) {
		try {
			JsonNode descriptor = readDescriptor(url);
			Module module = createModule(descriptor);
			populateModule(module, descriptor);
			populateResources(url, descriptor);
			// done
			this.module = module;
		} catch(Exception e) {
			e.printStackTrace(System.err);
		}
	}

	private void populateResources(URL url, JsonNode descriptor) throws MalformedURLException {
		if(descriptor.get("imageResource")!=null)
			this.imageResource = new URL(url, descriptor.get("imageResource").asText());
		if(descriptor.get("codeResource")!=null)
			this.codeResource = new URL(url, descriptor.get("codeResource").asText());
	}

	private void populateModule(Module module, JsonNode descriptor) {
		module.setName(readText(descriptor, "name"));
		module.setVersion(PromptoVersion.parse(readText(descriptor, "version")));
		module.setDescription(readText(descriptor, "description"));
		if(module instanceof Service)
			((Service)module).setServerAboutToStartMethod(readText(descriptor, "serverAboutToStartMethod"));
		else if(module instanceof Batch)
			((Batch)module).setStartMethod(readText(descriptor, "startMethod"));
		JsonNode dependencies = descriptor.get("dependencies");
		if(dependencies!=null)
			module.setDependencies(populateDependencies(dependencies));
	}

	private List populateDependencies(JsonNode descriptor) {
		List items = new ArrayList<>();
		for(JsonNode node : descriptor) {
			Dependency item = new Dependency();
			item.setName(readText(node, "name"));
			item.setVersion(PromptoVersion.parse(readText(node, "version")));
			items.add(item);
		}
		return items;
	}

	private Module createModule(JsonNode descriptor) throws InstantiationException, IllegalAccessException {
		ModuleType type = ModuleType.valueOf(readText(descriptor, "type"));
		return type.getModuleClass().newInstance();
	}

	private JsonNode readDescriptor(URL path) throws JsonProcessingException, IOException {
		URL json = new URL(path, "module.json");
		try(InputStream input = json.openStream()) {
			return new ObjectMapper().readTree(input);
		}
	}

	private String readText(JsonNode descriptor, String fieldName) {
		JsonNode child = descriptor.get(fieldName);
		if(child==null)
			return null;
		else
			return child.asText();
	}

	public boolean importModule(ICodeStore codeStore) throws Exception {
		Module existing = codeStore.fetchModule(module.getType(), module.getName(), module.getVersion());
		if(existing!=null)
			return false;
		logger.info(()->"Importing module: " + module.getName() + " - " + module.getVersion());
		if(imageResource!=null)
			module.setImage(Image.fromURL(imageResource).getStorableData());
		codeStore.storeModule(module);	
		if(codeResource!=null)
			storeAssociatedCode(codeStore, codeResource);
		return true;
	}

	private void storeAssociatedCode(ICodeStore codeStore, URL codeResource) throws Exception {
		ImmutableCodeStore rcs = new ImmutableCodeStore(null, module.getType(), codeResource, module.getVersion());
		codeStore.storeDeclarations(rcs.getDeclarations(), rcs.getModuleDialect(), module.getVersion(), module.getDbId());
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy