Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions gradle/common.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ repositories {
jcenter()
mavenCentral()

// Used for gestalt 7 - Android annotations
google()

// Terasology Artifactory instance for libs not readily available elsewhere plus our own libs
maven {
def repoViaEnv = System.getenv()["RESOLUTION_REPO"]
Expand Down
19 changes: 19 additions & 0 deletions nui-gestalt5/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
plugins {
id 'java-library'
id 'maven-publish'
}

apply from: "$rootDir/gradle/common.gradle"

dependencies {
api group: 'org.terasology', name: 'gestalt-module', version: '5.1.5'
api group: 'org.terasology', name: 'gestalt-asset-core', version: '5.1.5'

implementation "org.slf4j:slf4j-api:1.7.30"
implementation group: 'org.reflections', name: 'reflections', version: '0.9.10'
implementation group: 'com.google.code.gson', name: 'gson', version: '2.6.2'
implementation group: 'com.google.guava', name: 'guava', version: '23.0'

api project(':nui')
api project(':nui-reflect')
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@
import org.terasology.assets.ResourceUrn;
import org.terasology.module.ModuleEnvironment;
import org.terasology.reflection.copy.CopyStrategyLibrary;
import org.terasology.reflection.metadata.AbstractClassLibrary;
import org.terasology.reflection.metadata.ClassMetadata;
import org.terasology.reflection.metadata.ModuleClassLibrary;
import org.terasology.reflection.reflect.ReflectFactory;
import org.terasology.nui.UIWidget;

/**
*/
public class WidgetLibrary extends AbstractClassLibrary<UIWidget> {
public class WidgetLibrary extends ModuleClassLibrary<UIWidget> {

private static final Logger logger = LoggerFactory.getLogger(WidgetLibrary.class);

Expand All @@ -38,7 +38,7 @@ public WidgetLibrary(ModuleEnvironment environment, ReflectFactory reflectFactor
@Override
protected <C extends UIWidget> ClassMetadata<C, ?> createMetadata(Class<C> type, ReflectFactory factory, CopyStrategyLibrary copyStrategies, ResourceUrn name) {
try {
return new WidgetMetadata<>(name, type, factory, copyStrategies);
return new WidgetMetadata<>(name.toString(), type, factory, copyStrategies);
} catch (NoSuchMethodException e) {
logger.error("Unable to register class {}: Default Constructor Required", type.getSimpleName(), e);
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
package org.terasology.nui.reflection;

import com.google.common.base.Predicate;
import org.terasology.assets.ResourceUrn;
import org.terasology.nui.LayoutConfig;
import org.terasology.nui.UIWidget;
import org.terasology.reflection.copy.CopyStrategyLibrary;
Expand All @@ -41,7 +40,7 @@ public class WidgetMetadata<T extends UIWidget> extends ClassMetadata<T, FieldMe
* @param copyStrategyLibrary A copy strategy library
* @throws NoSuchMethodException If the class has no default constructor
*/
public WidgetMetadata(ResourceUrn uri, Class<T> type, ReflectFactory factory,
public WidgetMetadata(String uri, Class<T> type, ReflectFactory factory,
CopyStrategyLibrary copyStrategyLibrary) throws NoSuchMethodException {
super(uri, type, factory, copyStrategyLibrary, IsConfigField.INSTANCE);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package org.terasology.nui.skin;

import org.terasology.assets.Asset;
import org.terasology.assets.AssetType;
import org.terasology.assets.ResourceUrn;
import org.terasology.assets.format.AssetDataFile;
import org.terasology.nui.UIWidget;

public class UISkinAsset extends Asset<UISkinData> {
private UISkinData skinData;

private transient AssetDataFile source;

public UISkinAsset(ResourceUrn urn, AssetType<?, UISkinData> assetType, UISkinData data) {
super(urn, assetType);
reload(data);
}

@Override
protected void doReload(UISkinData data) {
this.skinData = data;
this.source = data.getSource();
}

public UIStyle getDefaultStyle() {
return getFamily("").getBaseStyle();
}

public UIStyle getDefaultStyleFor(String family) {
return getFamily(family).getBaseStyle();
}

public UIStyle getDefaultStyleFor(Class<? extends UIWidget> element, String mode) {
return getStyleFor("", element, mode);
}

public UIStyle getDefaultStyleFor(Class<? extends UIWidget> element, String part, String mode) {
return getStyleFor("", element, part, mode);
}

public UIStyle getStyleFor(String family, Class<? extends UIWidget> element, String mode) {
UIStyleFamily styleFamily = getFamily(family);
if (element == null) {
return styleFamily.getBaseStyle();
}
return styleFamily.getElementStyle(element, "", mode);
}

public UIStyle getStyleFor(String family, Class<? extends UIWidget> element, String part, String mode) {
UIStyleFamily styleFamily = getFamily(family);
if (element == null) {
return styleFamily.getBaseStyle();
}
return styleFamily.getElementStyle(element, part, mode);
}

public UIStyleFamily getFamily(String family) {
UIStyleFamily styleFamily = skinData.getFamily(family);
if (styleFamily == null) {
return skinData.getFamily("");
}
return styleFamily;
}

public Iterable<? extends String> getFamilies() {
return skinData.getUiSkin().getFamilies();
}

public AssetDataFile getSource() {
return source;
}

public UISkin getSkin() {
return skinData.getUiSkin();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,26 @@
*/
package org.terasology.nui.skin;

import com.google.common.collect.Maps;
import org.terasology.assets.AssetData;
import org.terasology.assets.format.AssetDataFile;

import java.util.Map;

/**
*/
public class UISkinData implements AssetData {
Map<String, UIStyleFamily> skinFamilies;
private UISkin uiSkin;

private transient AssetDataFile source;

public UISkinData(Map<String, UIStyleFamily> families) {
skinFamilies = Maps.newHashMap(families);
public UISkinData(UISkin uiSkin) {
this.uiSkin = uiSkin;
}

public UIStyleFamily getFamily(String familyName) {
return skinFamilies.get(familyName);
return uiSkin.getFamily(familyName);
}

public UISkin getUiSkin() {
return uiSkin;
}

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.terasology.reflection;

import org.terasology.module.Module;
import org.terasology.module.ModuleEnvironment;
import org.terasology.module.sandbox.ModuleClassLoader;

public class ModuleTypeRegistry extends TypeRegistry {
public ModuleTypeRegistry() {
super();
}

public ModuleTypeRegistry(ModuleEnvironment environment) {
super();
reload(environment);
}

public void reload(ModuleEnvironment environment) {
// FIXME: Reflection -- may break with updates to gestalt-module
ClassLoader finalClassLoader = (ClassLoader) ReflectionUtil.readField(environment, "finalClassLoader");
initializeReflections(finalClassLoader, environment);
}

private void initializeReflections(ClassLoader classLoader, ModuleEnvironment environment) {
initializeReflections(classLoader, loader -> !(loader instanceof ModuleClassLoader));

for (Module module : environment.getModulesOrderedByDependencies()) {
if (!module.isCodeModule()) {
continue;
}

reflections.merge(module.getReflectionsFragment());
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// Copyright 2021 The Terasology Foundation
// SPDX-License-Identifier: Apache-2.0

package org.terasology.reflection.metadata;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.assets.ResourceUrn;
import org.terasology.module.ModuleEnvironment;
import org.terasology.reflection.copy.CopyStrategyLibrary;
import org.terasology.reflection.reflect.ReflectFactory;

public class DefaultModuleClassLibrary<T> extends ModuleClassLibrary<T> {
private static final Logger logger = LoggerFactory.getLogger(DefaultModuleClassLibrary.class);

public DefaultModuleClassLibrary(ModuleEnvironment environment, ReflectFactory reflectFactory, CopyStrategyLibrary copyStrategyLibrary) {
super(environment, reflectFactory, copyStrategyLibrary);
}

@Override
protected <C extends T> ClassMetadata<C, ?> createMetadata(Class<C> type, ReflectFactory factory, CopyStrategyLibrary copyStrategies, ResourceUrn uri) {
try {
return new DefaultClassMetadata<>(uri.toString(), type, factory, copyStrategies);
} catch (NoSuchMethodException e) {
logger.error("Unable to register class {}: Default Constructor Required", type.getSimpleName(), e);
return null;

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Table;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.terasology.assets.ResourceUrn;
Expand All @@ -39,38 +38,38 @@
* Abstract base implement of ClassLibrary.
*
*/
public abstract class AbstractClassLibrary<T> implements ClassLibrary<T> {
public abstract class ModuleClassLibrary<T> implements ClassLibrary<T> {

private static final Logger logger = LoggerFactory.getLogger(AbstractClassLibrary.class);
private static final Logger logger = LoggerFactory.getLogger(ModuleClassLibrary.class);

protected final CopyStrategyLibrary copyStrategyLibrary;

private ReflectFactory reflectFactory;
private ModuleEnvironment environment;

private Map<Class<? extends T>, ClassMetadata<? extends T, ?>> classLookup = Maps.newHashMap();
private Table<Name, Name, ClassMetadata<? extends T, ?>> uriLookup = HashBasedTable.create();
private Table<Name, Name, ClassMetadata<? extends T, ?>> urnLookup = HashBasedTable.create();

public AbstractClassLibrary(ModuleEnvironment environment, ReflectFactory reflectFactory, CopyStrategyLibrary copyStrategyLibrary) {
public ModuleClassLibrary(ModuleEnvironment environment, ReflectFactory reflectFactory, CopyStrategyLibrary copyStrategyLibrary) {
this.environment = environment;
this.reflectFactory = reflectFactory;
this.copyStrategyLibrary = copyStrategyLibrary;
}

public AbstractClassLibrary(AbstractClassLibrary<T> factory, CopyStrategyLibrary copyStrategies) {
public ModuleClassLibrary(ModuleClassLibrary<T> factory, CopyStrategyLibrary copyStrategies) {
this.reflectFactory = factory.reflectFactory;
this.copyStrategyLibrary = copyStrategies;
for (Table.Cell<Name, Name, ClassMetadata<? extends T, ?>> cell: factory.uriLookup.cellSet()) {
for (Table.Cell<Name, Name, ClassMetadata<? extends T, ?>> cell: factory.urnLookup.cellSet()) {
Name objectName = cell.getRowKey();
Name moduleName = cell.getColumnKey();
ClassMetadata<? extends T, ?> oldMetaData = cell.getValue();
Class<? extends T> clazz = oldMetaData.getType();
ResourceUrn uri = oldMetaData.getUri();
ClassMetadata<? extends T, ?> metadata = createMetadata(clazz, factory.reflectFactory, copyStrategies, uri);
ResourceUrn urn = new ResourceUrn(oldMetaData.getId());
ClassMetadata<? extends T, ?> metadata = createMetadata(clazz, factory.reflectFactory, copyStrategies, urn);

if (metadata != null) {
classLookup.put(clazz, metadata);
uriLookup.put(objectName, moduleName, metadata);
urnLookup.put(objectName, moduleName, metadata);
} else {
throw new RuntimeException("Failed to create copy of class library");
}
Expand All @@ -86,14 +85,18 @@ public AbstractClassLibrary(AbstractClassLibrary<T> factory, CopyStrategyLibrary
protected abstract <C extends T> ClassMetadata<C, ?> createMetadata(Class<C> type, ReflectFactory factory, CopyStrategyLibrary copyStrategies, ResourceUrn name);

@Override
public void register(ResourceUrn uri, Class<? extends T> clazz) {
ClassMetadata<? extends T, ?> metadata = createMetadata(clazz, reflectFactory, copyStrategyLibrary, uri);
public void register(String uri, Class<? extends T> clazz) {
register(new ResourceUrn(uri), clazz);
}

public void register(ResourceUrn urn, Class<? extends T> clazz) {
ClassMetadata<? extends T, ?> metadata = createMetadata(clazz, reflectFactory, copyStrategyLibrary, urn);

if (metadata != null) {
classLookup.put(clazz, metadata);
ClassMetadata<? extends T, ?> prev = uriLookup.put(uri.getResourceName(), uri.getModuleName(), metadata);
ClassMetadata<? extends T, ?> prev = urnLookup.put(urn.getResourceName(), urn.getModuleName(), metadata);
if (prev != null && !prev.equals(metadata)) {
logger.warn("Duplicate entry for '{}': {} and {}", uri, prev.getType(), metadata.getType());
logger.warn("Duplicate entry for '{}': {} and {}", urn, prev.getType(), metadata.getType());
}
}
}
Expand Down Expand Up @@ -126,26 +129,23 @@ public <TYPE extends T> TYPE copy(TYPE object) {
}

@Override
public ClassMetadata<? extends T, ?> getMetadata(ResourceUrn uri) {
return uriLookup.get(uri.getResourceName(), uri.getModuleName());
public ClassMetadata<? extends T, ?> getMetadata(String urn) {
return getMetadata(new ResourceUrn(urn));
}

@Override
public Iterator<ClassMetadata<? extends T, ?>> iterator() {
return classLookup.values().iterator();
public ClassMetadata<? extends T, ?> getMetadata(ResourceUrn urn) {
return urnLookup.get(urn.getResourceName(), urn.getModuleName());
}

@Override
public List<ClassMetadata<? extends T, ?>> getMetadata(String name) {
return getMetadata(new Name(name));
public Iterator<ClassMetadata<? extends T, ?>> iterator() {
return classLookup.values().iterator();
}

@Override
public List<ClassMetadata<? extends T, ?>> getMetadata(Name name) {
return Lists.newArrayList(uriLookup.row(name).values());
return Lists.newArrayList(urnLookup.row(name).values());
}

@Override
public ClassMetadata<? extends T, ?> resolve(String name, Name context) {
Module moduleContext = environment.get(context);
if (moduleContext != null) {
Expand All @@ -159,19 +159,18 @@ public <TYPE extends T> TYPE copy(TYPE object) {
if (ResourceUrn.isValid(name)) {
return getMetadata(new ResourceUrn(name));
}
List<ClassMetadata<? extends T, ?>> possibilities = getMetadata(name);
List<ClassMetadata<? extends T, ?>> possibilities = getMetadata(new Name(name));
if (possibilities.size() == 1) {
return possibilities.get(0);
}
return null;
}

@Override
public ClassMetadata<? extends T, ?> resolve(String name, Module context) {
if (ResourceUrn.isValid(name)) {
return getMetadata(new ResourceUrn(name));
}
List<ClassMetadata<? extends T, ?>> possibilities = getMetadata(name);
List<ClassMetadata<? extends T, ?>> possibilities = getMetadata(new Name(name));
switch (possibilities.size()) {
case 0:
return null;
Expand All @@ -184,10 +183,11 @@ public <TYPE extends T> TYPE copy(TYPE object) {
Iterator<ClassMetadata<? extends T, ?>> iterator = possibilities.iterator();
while (iterator.hasNext()) {
ClassMetadata<? extends T, ?> metadata = iterator.next();
if (context.getId().equals(metadata.getUri().getModuleName())) {
ResourceUrn urn = new ResourceUrn(metadata.getId());
if (context.getId().equals(urn.getModuleName())) {
return metadata;
}
if (!dependencies.contains(metadata.getUri().getModuleName())) {
if (!dependencies.contains(urn.getModuleName())) {
iterator.remove();
}
}
Expand Down
Loading