xapi.server.model.ModelModuleLoader Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of xapi-dev Show documentation
Show all versions of xapi-dev Show documentation
Everything needed to run a comprehensive dev environment.
Just type X_ and pick a service from autocomplete;
new dev modules will be added as they are built.
The only dev service not included in the uber jar is xapi-dev-maven,
as it includes all runtime dependencies of maven, adding ~4 seconds to build time,
and 6 megabytes to the final output jar size (without xapi-dev-maven, it's ~1MB).
The newest version!
/**
*
*/
package xapi.server.model;
import java.io.InputStream;
import javax.inject.Provider;
import javax.servlet.ServletContext;
import xapi.collect.X_Collect;
import xapi.collect.api.StringTo;
import xapi.io.X_IO;
import xapi.model.X_Model;
import xapi.model.api.ModelModule;
import xapi.model.service.ModelService;
import xapi.source.api.CharIterator;
import xapi.source.impl.StringCharIterator;
import xapi.time.X_Time;
import xapi.util.X_Debug;
import xapi.util.impl.LazyProvider;
/**
* @author James X. Nelson ([email protected], @james)
*
*/
public class ModelModuleLoader {
private static class ModuleLoader extends LazyProvider implements Runnable {
public ModuleLoader(final ServletContext context, final String moduleName) {
super(new Provider() {
@Override
public ModelModule get() {
try (
InputStream stream = context.getResourceAsStream("/WEB-INF/deploy/"+moduleName+"/XapiModelLinker/xapi.rpc");
){
final CharIterator policy = new StringCharIterator(X_IO.toStringUtf8(stream));
final ModelService modelService = X_Model.getService();
return ModelModule.deserialize(policy, modelService.primitiveSerializer());
} catch (final Throwable e) {
throw X_Debug.rethrow(e);
}
}
});
}
@Override
public void run() {
get();
}
}
private static final ModelModuleLoader LOADER = new ModelModuleLoader();
private final StringTo loaders;
public static ModelModuleLoader get() {
return LOADER;
}
private ModelModuleLoader() {
loaders = X_Collect.newStringMap(ModuleLoader.class);
}
public void preloadModule(final ServletContext context, final String moduleName) {
if (!loaders.containsKey(moduleName)) {
X_Time.runLater(getOrMakeLoader(context, moduleName));
}
}
public ModelModule loadModule(final ServletContext context, final String moduleName) {
return getOrMakeLoader(context, moduleName).get();
}
private synchronized ModuleLoader getOrMakeLoader(final ServletContext context, final String moduleName) {
if (loaders.containsKey(moduleName)) {
return loaders.get(moduleName);
}
final ModuleLoader loader = new ModuleLoader(context, moduleName);
loaders.put(moduleName, loader);
return loader;
}
}