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

prompto.codeserver.CodeServer Maven / Gradle / Ivy

The newest version!
package prompto.codeserver;

import java.net.URL;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import prompto.code.BaseCodeStore;
import prompto.code.Dependency;
import prompto.code.ICodeStore;
import prompto.code.ImmutableCodeStore;
import prompto.code.Library;
import prompto.code.Module;
import prompto.code.QueryableCodeStore;
import prompto.config.CodeServerConfiguration;
import prompto.config.IAuthenticationConfiguration;
import prompto.config.IAuthenticationSourceConfiguration;
import prompto.config.ICodeServerConfiguration;
import prompto.config.IConfigurationReader;
import prompto.config.IHttpConfiguration;
import prompto.config.IStoreConfiguration;
import prompto.config.IStoredAuthenticationSourceConfiguration;
import prompto.intrinsic.PromptoVersion;
import prompto.libraries.Libraries;
import prompto.memstore.MemStore;
import prompto.memstore.MemStoreFactory;
import prompto.runtime.Mode;
import prompto.runtime.Standalone;
import prompto.server.AppServer;
import prompto.server.DataServlet;
import prompto.store.IDataStore;
import prompto.store.IStore;
import prompto.store.IStoreFactory;
import prompto.utils.CmdLineParser;
import prompto.utils.Logger;
import prompto.utils.ResourceUtils;

public class CodeServer {

	static Logger logger = new Logger();
	static ICodeServerConfiguration config;
	
	public static void main(String[] args) throws Throwable {
		main(args, null);
	}
	
	public static void main(String[] args, Mode runtimeMode) throws Throwable {
		config = loadConfiguration(args);
		config = config.withServerAboutToStartMethod("serverAboutToStart")
					.withHttpConfiguration(config.getHttpConfiguration().withSendsXAuthorization(true))
					.withApplicationName("dev-center")
					.withApplicationVersion(PromptoVersion.parse("1.0.0"))
					.withResourceURLs(CodeServer.getResourceURLs());
		if(runtimeMode!=null)
			config = config.withRuntimeMode(runtimeMode);
		AppServer.main(config, CodeServer::initDataServletStores); 
	}
	
	public static ICodeServerConfiguration loadConfiguration(String[] args) throws Exception {
		Map argsMap = CmdLineParser.read(args);
		IConfigurationReader reader = Standalone.readerFromArgs(argsMap);
		ICodeServerConfiguration config = new CodeServerConfiguration(reader, argsMap);
		return config.withRuntimeLibs(()->Libraries.getPromptoLibraries(Libraries.class, AppServer.class));
	}

	
	private static void initDataServletStores(ICodeServerConfiguration config) {
		try {
			Map stores = new HashMap<>();
			IStore store = fetchLoginStore(config);
			if(store!=null)
				stores.put("LOGIN", store);
			store = IDataStore.getInstance();
			if(store!=null)
				stores.put("APPS", store);
			store = newStore(config.getTargetStoreConfiguration());
			if(store!=null)
				stores.put("DATA", store);
			DataServlet.setStores(stores);
		} catch(Throwable t) {
			throw new RuntimeException(t);
		}
	}

	private static IStore fetchLoginStore(ICodeServerConfiguration config) throws Throwable {
		IHttpConfiguration http = config.getHttpConfiguration();
		if(http==null)
			return null;
		IAuthenticationConfiguration auth = http.getAuthenticationConfiguration();
		if(auth==null)
			return null;
		IAuthenticationSourceConfiguration source = auth.getAuthenticationSourceConfiguration();
		if(source instanceof IStoredAuthenticationSourceConfiguration)
			return newStore(((IStoredAuthenticationSourceConfiguration)source).getStoreConfiguration());
		else
			return null;
	}

	private static IStore newStore(IStoreConfiguration config) throws Throwable {
		if(config==null)
			return null;
		else {
			IStoreFactory factory = IStoreFactory.newStoreFactory(config.getFactory());
			if(factory instanceof MemStoreFactory)
				return new MemStore();
			else 
				return factory.newStore(config);
		}
	}

	private static URL[] getResourceURLs() {
		Collection urls = Libraries.getPromptoLibraries(BaseCodeStore.class, CodeServer.class);
		return urls.toArray(new URL[urls.size()]);
	}

	public static void createThesaurus() {
		try {
			ICodeStore codeStore = codeStoreUsingDataStore();
			URL url = Thread.currentThread().getContextClassLoader().getResource("thesaurus/");
			doImportModule(codeStore, url);
			if(isToolsDataStore())
				createToolsLibraries(codeStore);
		} catch(Throwable t) {
			t.printStackTrace();
		}
	}
	
	
	private static ICodeStore codeStoreUsingDataStore() {
		ICodeStore runtime = ImmutableCodeStore.bootstrapRuntime(()->Libraries.getPromptoLibraries(Libraries.class, AppServer.class));
		return new QueryableCodeStore(IDataStore.getInstance(), runtime, null, null, null);
	}

	private static void doImportModule(ICodeStore codeStore, URL url) throws Exception {
		ModuleImporter importer = new ModuleImporter(url);
		importer.importModule(codeStore);
	}

	public static void importSamples() {
		try {
			ICodeStore codeStore = codeStoreUsingDataStore();
			Collection samples = ResourceUtils.listResourcesAt("samples/", null);
			for(URL sample : samples)
				doImportModule(codeStore, sample);
		} catch(Throwable t) {
			t.printStackTrace();
		}
	}

	private static void createToolsLibraries(ICodeStore codeStore) throws Exception {
		Module codeStoreLibrary = new Library();
		codeStoreLibrary.setName("CodeStore");
		codeStoreLibrary.setVersion(PromptoVersion.parse("1.0.0.0"));
		codeStoreLibrary.setDescription("Code store model");
		URL url = Thread.currentThread().getContextClassLoader().getResource("libraries/CodeStore.pec");
		ModuleImporter importer = new ModuleImporter(codeStoreLibrary, null, url);
		importer.importModule(codeStore);
		Module appStoreLibrary = new Library();
		appStoreLibrary.setName("AppStore");
		appStoreLibrary.setVersion(PromptoVersion.parse("1.0.0.0"));
		appStoreLibrary.setDescription("App store model");
		Dependency dependency = new Dependency();
		dependency.setName(codeStoreLibrary.getName());
		dependency.setVersion(codeStoreLibrary.getVersion());
		appStoreLibrary.setDependencies(Collections.singletonList(dependency));
		url = Thread.currentThread().getContextClassLoader().getResource("libraries/AppStore.pec");
		importer = new ModuleImporter(appStoreLibrary, null, url);
		importer.importModule(codeStore);
	}

	private static boolean isToolsDataStore() {
		return config.getDataStoreConfiguration().getDbName().toLowerCase().contains("tools");
	}


}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy