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

prompto.codeserver.ModuleImporter Maven / Gradle / Ivy

package prompto.codeserver;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import prompto.code.Dependency;
import prompto.code.WebSite;
import prompto.code.ICodeStore;
import prompto.code.ICodeStore.ModuleType;
import prompto.code.Module;
import prompto.code.ResourceCodeStore;
import prompto.code.Version;
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 {

	Module module;
	String imageResource;
	String codeResource;
	
	public ModuleImporter(String path) {
		try {
			JsonNode descriptor = readDescriptor(path);
			Module module = createModule(descriptor);
			populateModule(module, descriptor);
			populateResources(path, descriptor);
			// done
			this.module = module;
		} catch(Exception e) {
			e.printStackTrace(System.err);
		}
	}

	private void populateResources(String path, JsonNode descriptor) {
		if(descriptor.get("imageResource")!=null)
			this.imageResource = path + descriptor.get("imageResource").asText();
		if(descriptor.get("codeResource")!=null)
			this.codeResource = path + descriptor.get("codeResource").asText();
	}

	private void populateModule(Module module, JsonNode descriptor) {
		module.setName(readText(descriptor, "name"));
		module.setVersion(readText(descriptor, "version"));
		module.setDescription(readText(descriptor, "description"));
		if(module instanceof WebSite)
			((WebSite)module).setEntryPoint(readText(descriptor, "entryPoint"));
		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(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(String path) throws JsonProcessingException, IOException {
		String jsonPath = path + "module.json";
		InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream(jsonPath);
		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 void importModule(ICodeStore codeStore) throws Exception {
		String name = module.getName();
		Version version = Version.parse(module.getVersion());
		WebSite existing = codeStore.fetchApplication(name, version);
		if(existing!=null)
			return;
		if(imageResource!=null)
			module.setImage(Image.fromResource(imageResource).getStorableData());
		codeStore.storeModule(module);	
		if(codeResource!=null)
			storeAssociatedCode(codeStore);
	}

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

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy