use of org.terasology.engine.SimpleUri in project Terasology by MovingBlocks.
the class TypeSerializationLibrary method getHandlerFor.
// TODO: Refactor
@SuppressWarnings("unchecked")
public TypeHandler<?> getHandlerFor(Type genericType) {
Class<?> typeClass = ReflectionUtil.getClassOfType(genericType);
if (typeClass == null) {
logger.error("Unabled to get class from type {}", genericType);
return null;
}
if (Enum.class.isAssignableFrom(typeClass)) {
return new EnumTypeHandler(typeClass);
} else if (List.class.isAssignableFrom(typeClass)) {
// For lists, createEntityRef the handler for the contained type and wrap in a list type handler
Type parameter = ReflectionUtil.getTypeParameter(genericType, 0);
if (parameter != null) {
TypeHandler<?> innerHandler = getHandlerFor(parameter);
if (innerHandler != null) {
return new ListTypeHandler<>(innerHandler);
}
}
logger.error("List field is not parametrized, or holds unsupported type");
return null;
} else if (Set.class.isAssignableFrom(typeClass)) {
// For sets:
Type parameter = ReflectionUtil.getTypeParameter(genericType, 0);
if (parameter != null) {
TypeHandler<?> innerHandler = getHandlerFor(parameter);
if (innerHandler != null) {
return new SetTypeHandler<>(innerHandler);
}
}
logger.error("Set field is not parametrized, or holds unsupported type");
return null;
} else if (Map.class.isAssignableFrom(typeClass)) {
// For Maps, createEntityRef the handler for the value type (and maybe key too?)
Type keyParameter = ReflectionUtil.getTypeParameter(genericType, 0);
Type contentsParameter = ReflectionUtil.getTypeParameter(genericType, 1);
if (keyParameter != null && contentsParameter != null && String.class == keyParameter) {
TypeHandler<?> valueHandler = getHandlerFor(contentsParameter);
if (valueHandler != null) {
return new StringMapTypeHandler<>(valueHandler);
}
}
logger.error("Map field is not parametrized, does not have a String key, or holds unsupported values");
} else if (typeHandlers.containsKey(typeClass)) {
// For known types, just use the handler
return typeHandlers.get(typeClass);
} else if (typeClass.getAnnotation(MappedContainer.class) != null && !Modifier.isAbstract(typeClass.getModifiers()) && !typeClass.isLocalClass() && !(typeClass.isMemberClass() && !Modifier.isStatic(typeClass.getModifiers()))) {
try {
ClassMetadata<?, ?> metadata = new DefaultClassMetadata<>(new SimpleUri(), typeClass, reflectFactory, copyStrategies);
MappedContainerTypeHandler<?> mappedHandler = new MappedContainerTypeHandler(typeClass, getFieldHandlerMap(metadata));
typeHandlers.put(typeClass, mappedHandler);
return mappedHandler;
} catch (NoSuchMethodException e) {
logger.error("Unable to register field of type {}: no publicly accessible default constructor", typeClass.getSimpleName());
return null;
}
} else {
logger.error("Unable to register field of type {}: not a supported type or MappedContainer", typeClass.getSimpleName());
}
return null;
}
use of org.terasology.engine.SimpleUri in project Terasology by MovingBlocks.
the class WorldGeneratorManager method refresh.
public void refresh() {
ModuleManager moduleManager = context.get(ModuleManager.class);
List<WorldGeneratorInfo> infos = Lists.newArrayList();
for (Name moduleId : moduleManager.getRegistry().getModuleIds()) {
Module module = moduleManager.getRegistry().getLatestModuleVersion(moduleId);
if (module.isCodeModule()) {
DependencyResolver resolver = new DependencyResolver(moduleManager.getRegistry());
ResolutionResult resolutionResult = resolver.resolve(module.getId());
if (resolutionResult.isSuccess()) {
try (ModuleEnvironment tempEnvironment = moduleManager.loadEnvironment(resolutionResult.getModules(), false)) {
for (Class<?> generatorClass : tempEnvironment.getTypesAnnotatedWith(RegisterWorldGenerator.class)) {
if (tempEnvironment.getModuleProviding(generatorClass).equals(module.getId())) {
RegisterWorldGenerator annotation = generatorClass.getAnnotation(RegisterWorldGenerator.class);
if (isValidWorldGenerator(generatorClass)) {
SimpleUri uri = new SimpleUri(moduleId, annotation.id());
infos.add(new WorldGeneratorInfo(uri, annotation.displayName(), annotation.description()));
} else {
logger.error("{} marked to be registered as a World Generator, but is not a subclass of WorldGenerator or lacks the correct constructor", generatorClass);
}
}
}
} catch (Exception e) {
logger.error("Error loading world generator in module {}, skipping", module.getId(), e);
}
} else {
logger.warn("Could not resolve dependencies for module: {}", module);
}
}
}
Collections.sort(infos);
generatorInfo = ImmutableList.copyOf(infos);
}
use of org.terasology.engine.SimpleUri in project Terasology by MovingBlocks.
the class AbstractClassLibrary method resolve.
@Override
public ClassMetadata<? extends T, ?> resolve(String name) {
SimpleUri uri = new SimpleUri(name);
if (uri.isValid()) {
return getMetadata(uri);
}
List<ClassMetadata<? extends T, ?>> possibilities = getMetadata(name);
if (possibilities.size() == 1) {
return possibilities.get(0);
}
return null;
}
use of org.terasology.engine.SimpleUri in project Terasology by MovingBlocks.
the class AbstractClassLibrary method resolve.
@Override
public ClassMetadata<? extends T, ?> resolve(String name, Module context) {
SimpleUri uri = new SimpleUri(name);
if (uri.isValid()) {
return getMetadata(uri);
}
List<ClassMetadata<? extends T, ?>> possibilities = getMetadata(name);
switch(possibilities.size()) {
case 0:
return null;
case 1:
return possibilities.get(0);
default:
if (context != null) {
Set<Name> dependencies = moduleManager.getEnvironment().getDependencyNamesOf(context.getId());
Iterator<ClassMetadata<? extends T, ?>> iterator = possibilities.iterator();
while (iterator.hasNext()) {
ClassMetadata<? extends T, ?> metadata = iterator.next();
if (context.getId().equals(metadata.getUri().getModuleName())) {
return metadata;
}
if (!dependencies.contains(metadata.getUri().getModuleName())) {
iterator.remove();
}
}
if (possibilities.size() == 1) {
return possibilities.get(0);
}
}
return null;
}
}
use of org.terasology.engine.SimpleUri in project Terasology by MovingBlocks.
the class BindsSubsystem method addAxisDefaultsFor.
private void addAxisDefaultsFor(Name moduleId, Iterable<Class<?>> classes, BindsConfiguration config) {
for (Class<?> axisEvent : classes) {
if (AxisEvent.class.isAssignableFrom(axisEvent)) {
RegisterRealBindAxis info = axisEvent.getAnnotation(RegisterRealBindAxis.class);
SimpleUri bindUri = new SimpleUri(moduleId, info.id());
if (!config.hasBinds(bindUri)) {
addDefaultBindings(bindUri, axisEvent, config);
}
}
}
}
Aggregations