diff --git a/gradle/common.gradle b/gradle/common.gradle index 4966de2eff..6d86e578d4 100644 --- a/gradle/common.gradle +++ b/gradle/common.gradle @@ -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"] diff --git a/nui-gestalt5/build.gradle b/nui-gestalt5/build.gradle new file mode 100644 index 0000000000..8a789834c1 --- /dev/null +++ b/nui-gestalt5/build.gradle @@ -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') +} \ No newline at end of file diff --git a/nui/src/main/java/org/terasology/nui/asset/UIData.java b/nui-gestalt5/src/main/java/org/terasology/nui/asset/UIData.java similarity index 100% rename from nui/src/main/java/org/terasology/nui/asset/UIData.java rename to nui-gestalt5/src/main/java/org/terasology/nui/asset/UIData.java diff --git a/nui/src/main/java/org/terasology/nui/asset/UIElement.java b/nui-gestalt5/src/main/java/org/terasology/nui/asset/UIElement.java similarity index 100% rename from nui/src/main/java/org/terasology/nui/asset/UIElement.java rename to nui-gestalt5/src/main/java/org/terasology/nui/asset/UIElement.java diff --git a/nui/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java b/nui-gestalt5/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java similarity index 88% rename from nui/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java rename to nui-gestalt5/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java index ed9dd8aada..a15164082d 100644 --- a/nui/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java +++ b/nui-gestalt5/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java @@ -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 { +public class WidgetLibrary extends ModuleClassLibrary { private static final Logger logger = LoggerFactory.getLogger(WidgetLibrary.class); @@ -38,7 +38,7 @@ public WidgetLibrary(ModuleEnvironment environment, ReflectFactory reflectFactor @Override protected ClassMetadata createMetadata(Class 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; diff --git a/nui/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java b/nui-gestalt5/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java similarity index 95% rename from nui/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java rename to nui-gestalt5/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java index f31d894756..8c0c149857 100644 --- a/nui/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java +++ b/nui-gestalt5/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java @@ -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; @@ -41,7 +40,7 @@ public class WidgetMetadata extends ClassMetadata type, ReflectFactory factory, + public WidgetMetadata(String uri, Class type, ReflectFactory factory, CopyStrategyLibrary copyStrategyLibrary) throws NoSuchMethodException { super(uri, type, factory, copyStrategyLibrary, IsConfigField.INSTANCE); } diff --git a/nui-gestalt5/src/main/java/org/terasology/nui/skin/UISkinAsset.java b/nui-gestalt5/src/main/java/org/terasology/nui/skin/UISkinAsset.java new file mode 100644 index 0000000000..46d5891599 --- /dev/null +++ b/nui-gestalt5/src/main/java/org/terasology/nui/skin/UISkinAsset.java @@ -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 { + private UISkinData skinData; + + private transient AssetDataFile source; + + public UISkinAsset(ResourceUrn urn, AssetType 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 element, String mode) { + return getStyleFor("", element, mode); + } + + public UIStyle getDefaultStyleFor(Class element, String part, String mode) { + return getStyleFor("", element, part, mode); + } + + public UIStyle getStyleFor(String family, Class element, String mode) { + UIStyleFamily styleFamily = getFamily(family); + if (element == null) { + return styleFamily.getBaseStyle(); + } + return styleFamily.getElementStyle(element, "", mode); + } + + public UIStyle getStyleFor(String family, Class 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 getFamilies() { + return skinData.getUiSkin().getFamilies(); + } + + public AssetDataFile getSource() { + return source; + } + + public UISkin getSkin() { + return skinData.getUiSkin(); + } +} diff --git a/nui/src/main/java/org/terasology/nui/skin/UISkinData.java b/nui-gestalt5/src/main/java/org/terasology/nui/skin/UISkinData.java similarity index 82% rename from nui/src/main/java/org/terasology/nui/skin/UISkinData.java rename to nui-gestalt5/src/main/java/org/terasology/nui/skin/UISkinData.java index 27b75ae65c..637e2c071c 100644 --- a/nui/src/main/java/org/terasology/nui/skin/UISkinData.java +++ b/nui-gestalt5/src/main/java/org/terasology/nui/skin/UISkinData.java @@ -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 skinFamilies; + private UISkin uiSkin; private transient AssetDataFile source; - public UISkinData(Map 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; } /** diff --git a/nui-gestalt5/src/main/java/org/terasology/reflection/ModuleTypeRegistry.java b/nui-gestalt5/src/main/java/org/terasology/reflection/ModuleTypeRegistry.java new file mode 100644 index 0000000000..a644baa1d0 --- /dev/null +++ b/nui-gestalt5/src/main/java/org/terasology/reflection/ModuleTypeRegistry.java @@ -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()); + } + } +} diff --git a/nui-gestalt5/src/main/java/org/terasology/reflection/metadata/DefaultModuleClassLibrary.java b/nui-gestalt5/src/main/java/org/terasology/reflection/metadata/DefaultModuleClassLibrary.java new file mode 100644 index 0000000000..ee08ccf320 --- /dev/null +++ b/nui-gestalt5/src/main/java/org/terasology/reflection/metadata/DefaultModuleClassLibrary.java @@ -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 extends ModuleClassLibrary { + private static final Logger logger = LoggerFactory.getLogger(DefaultModuleClassLibrary.class); + + public DefaultModuleClassLibrary(ModuleEnvironment environment, ReflectFactory reflectFactory, CopyStrategyLibrary copyStrategyLibrary) { + super(environment, reflectFactory, copyStrategyLibrary); + } + + @Override + protected ClassMetadata createMetadata(Class 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; + + } + } +} diff --git a/nui-reflect/src/main/java/org/terasology/reflection/metadata/AbstractClassLibrary.java b/nui-gestalt5/src/main/java/org/terasology/reflection/metadata/ModuleClassLibrary.java similarity index 79% rename from nui-reflect/src/main/java/org/terasology/reflection/metadata/AbstractClassLibrary.java rename to nui-gestalt5/src/main/java/org/terasology/reflection/metadata/ModuleClassLibrary.java index 494f0c021d..16dec9d982 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/metadata/AbstractClassLibrary.java +++ b/nui-gestalt5/src/main/java/org/terasology/reflection/metadata/ModuleClassLibrary.java @@ -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; @@ -39,9 +38,9 @@ * Abstract base implement of ClassLibrary. * */ -public abstract class AbstractClassLibrary implements ClassLibrary { +public abstract class ModuleClassLibrary implements ClassLibrary { - private static final Logger logger = LoggerFactory.getLogger(AbstractClassLibrary.class); + private static final Logger logger = LoggerFactory.getLogger(ModuleClassLibrary.class); protected final CopyStrategyLibrary copyStrategyLibrary; @@ -49,28 +48,28 @@ public abstract class AbstractClassLibrary implements ClassLibrary { private ModuleEnvironment environment; private Map, ClassMetadata> classLookup = Maps.newHashMap(); - private Table> uriLookup = HashBasedTable.create(); + private Table> 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 factory, CopyStrategyLibrary copyStrategies) { + public ModuleClassLibrary(ModuleClassLibrary factory, CopyStrategyLibrary copyStrategies) { this.reflectFactory = factory.reflectFactory; this.copyStrategyLibrary = copyStrategies; - for (Table.Cell> cell: factory.uriLookup.cellSet()) { + for (Table.Cell> cell: factory.urnLookup.cellSet()) { Name objectName = cell.getRowKey(); Name moduleName = cell.getColumnKey(); ClassMetadata oldMetaData = cell.getValue(); Class clazz = oldMetaData.getType(); - ResourceUrn uri = oldMetaData.getUri(); - ClassMetadata metadata = createMetadata(clazz, factory.reflectFactory, copyStrategies, uri); + ResourceUrn urn = new ResourceUrn(oldMetaData.getId()); + ClassMetadata 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"); } @@ -86,14 +85,18 @@ public AbstractClassLibrary(AbstractClassLibrary factory, CopyStrategyLibrary protected abstract ClassMetadata createMetadata(Class type, ReflectFactory factory, CopyStrategyLibrary copyStrategies, ResourceUrn name); @Override - public void register(ResourceUrn uri, Class clazz) { - ClassMetadata metadata = createMetadata(clazz, reflectFactory, copyStrategyLibrary, uri); + public void register(String uri, Class clazz) { + register(new ResourceUrn(uri), clazz); + } + + public void register(ResourceUrn urn, Class clazz) { + ClassMetadata metadata = createMetadata(clazz, reflectFactory, copyStrategyLibrary, urn); if (metadata != null) { classLookup.put(clazz, metadata); - ClassMetadata prev = uriLookup.put(uri.getResourceName(), uri.getModuleName(), metadata); + ClassMetadata 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()); } } } @@ -126,26 +129,23 @@ public TYPE copy(TYPE object) { } @Override - public ClassMetadata getMetadata(ResourceUrn uri) { - return uriLookup.get(uri.getResourceName(), uri.getModuleName()); + public ClassMetadata getMetadata(String urn) { + return getMetadata(new ResourceUrn(urn)); } - @Override - public Iterator> iterator() { - return classLookup.values().iterator(); + public ClassMetadata getMetadata(ResourceUrn urn) { + return urnLookup.get(urn.getResourceName(), urn.getModuleName()); } @Override - public List> getMetadata(String name) { - return getMetadata(new Name(name)); + public Iterator> iterator() { + return classLookup.values().iterator(); } - @Override public List> getMetadata(Name name) { - return Lists.newArrayList(uriLookup.row(name).values()); + return Lists.newArrayList(urnLookup.row(name).values()); } - @Override public ClassMetadata resolve(String name, Name context) { Module moduleContext = environment.get(context); if (moduleContext != null) { @@ -159,19 +159,18 @@ public TYPE copy(TYPE object) { if (ResourceUrn.isValid(name)) { return getMetadata(new ResourceUrn(name)); } - List> possibilities = getMetadata(name); + List> possibilities = getMetadata(new Name(name)); if (possibilities.size() == 1) { return possibilities.get(0); } return null; } - @Override public ClassMetadata resolve(String name, Module context) { if (ResourceUrn.isValid(name)) { return getMetadata(new ResourceUrn(name)); } - List> possibilities = getMetadata(name); + List> possibilities = getMetadata(new Name(name)); switch (possibilities.size()) { case 0: return null; @@ -184,10 +183,11 @@ public TYPE copy(TYPE object) { Iterator> iterator = possibilities.iterator(); while (iterator.hasNext()) { ClassMetadata 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(); } } diff --git a/nui-gestalt7/build.gradle b/nui-gestalt7/build.gradle new file mode 100644 index 0000000000..5acef28831 --- /dev/null +++ b/nui-gestalt7/build.gradle @@ -0,0 +1,23 @@ +plugins { + id 'java-library' + id 'maven-publish' +} + +apply from: "$rootDir/gradle/common.gradle" + +repositories { + google() +} + +dependencies { + api group: 'org.terasology.gestalt', name: 'gestalt-module', version: '7.0.6-SNAPSHOT' + api group: 'org.terasology.gestalt', name: 'gestalt-asset-core', version: '7.0.6-SNAPSHOT' + + 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') +} \ No newline at end of file diff --git a/nui-gestalt7/src/main/java/org/terasology/nui/asset/UIData.java b/nui-gestalt7/src/main/java/org/terasology/nui/asset/UIData.java new file mode 100644 index 0000000000..1406bddb97 --- /dev/null +++ b/nui-gestalt7/src/main/java/org/terasology/nui/asset/UIData.java @@ -0,0 +1,56 @@ +/* + * Copyright 2016 MovingBlocks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.terasology.nui.asset; + +import org.terasology.gestalt.assets.AssetData; +import org.terasology.gestalt.assets.format.AssetDataFile; +import org.terasology.gestalt.module.sandbox.API; +import org.terasology.nui.UIWidget; + +/** + * UIData contains a UI widget that has been loaded from a UI asset. + */ +@API +public class UIData implements AssetData { + private UIWidget rootWidget; + + private transient AssetDataFile source; + + public UIData(UIWidget rootWidget) { + this.rootWidget = rootWidget; + } + + /** + * @return The root widget loaded from the UI asset. + */ + public UIWidget getRootWidget() { + return rootWidget; + } + + /** + * @param source The {@link AssetDataFile} this asset has been loaded from. + */ + public void setSource(AssetDataFile source) { + this.source = source; + } + + /** + * @return The {@link AssetDataFile} this asset has been loaded from. + */ + public AssetDataFile getSource() { + return source; + } +} diff --git a/nui-gestalt7/src/main/java/org/terasology/nui/asset/UIElement.java b/nui-gestalt7/src/main/java/org/terasology/nui/asset/UIElement.java new file mode 100644 index 0000000000..4359d5e59a --- /dev/null +++ b/nui-gestalt7/src/main/java/org/terasology/nui/asset/UIElement.java @@ -0,0 +1,77 @@ +/* + * Copyright 2016 MovingBlocks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.terasology.nui.asset; + +import org.terasology.gestalt.assets.Asset; +import org.terasology.gestalt.assets.AssetType; +import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.assets.format.AssetDataFile; +import org.terasology.gestalt.module.sandbox.API; +import org.terasology.nui.UIWidget; + +import java.util.List; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; + +@API +public class UIElement extends Asset { + + private UIWidget rootWidget; + + private transient AssetDataFile source; + + private final List> reloadListeners = new CopyOnWriteArrayList<>(); + + public UIElement(ResourceUrn urn, AssetType assetType, UIData data) { + super(urn, assetType); + reload(data); + } + + /** + * Subscribe to reload events. + * + * @param reloadListener the listener to add + */ + public void subscribe(Consumer reloadListener) { + reloadListeners.add(reloadListener); + } + + /** + * Unsubscribe from reload events. + * + * @param reloadListener the listener to remove. Non-existing entries will be ignored. + */ + public void unsubscribe(Consumer reloadListener) { + reloadListeners.remove(reloadListener); + } + + @Override + protected void doReload(UIData data) { + rootWidget = data.getRootWidget(); + source = data.getSource(); + for (Consumer listener : reloadListeners) { + listener.accept(this); + } + } + + public UIWidget getRootWidget() { + return rootWidget; + } + + public AssetDataFile getSource() { + return source; + } +} diff --git a/nui-reflect/src/main/java/org/terasology/reflection/metadata/DefaultClassLibrary.java b/nui-gestalt7/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java similarity index 56% rename from nui-reflect/src/main/java/org/terasology/reflection/metadata/DefaultClassLibrary.java rename to nui-gestalt7/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java index f888d7136c..efd2cb088b 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/metadata/DefaultClassLibrary.java +++ b/nui-gestalt7/src/main/java/org/terasology/nui/reflection/WidgetLibrary.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 MovingBlocks + * Copyright 2014 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,31 +13,32 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.terasology.reflection.metadata; +package org.terasology.nui.reflection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.assets.ResourceUrn; -import org.terasology.module.ModuleEnvironment; +import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.module.ModuleEnvironment; import org.terasology.reflection.copy.CopyStrategyLibrary; +import org.terasology.reflection.metadata.ClassMetadata; +import org.terasology.reflection.metadata.ModuleClassLibrary; import org.terasology.reflection.reflect.ReflectFactory; +import org.terasology.nui.UIWidget; /** - * A simple implementation of ClassLibrary. It provides ClassMetadata for a type of class. These classes are identified through their simple name. - * - * @param The base type of classes that can be registered in this library */ -public final class DefaultClassLibrary extends AbstractClassLibrary { - private static final Logger logger = LoggerFactory.getLogger(DefaultClassLibrary.class); +public class WidgetLibrary extends ModuleClassLibrary { + + private static final Logger logger = LoggerFactory.getLogger(WidgetLibrary.class); - public DefaultClassLibrary(ModuleEnvironment environment, ReflectFactory reflectFactory, CopyStrategyLibrary copyStrategyLibrary) { + public WidgetLibrary(ModuleEnvironment environment, ReflectFactory reflectFactory, CopyStrategyLibrary copyStrategyLibrary) { super(environment, reflectFactory, copyStrategyLibrary); } @Override - protected ClassMetadata createMetadata(Class type, ReflectFactory factory, CopyStrategyLibrary copyStrategies, ResourceUrn uri) { + protected ClassMetadata createMetadata(Class type, ReflectFactory factory, CopyStrategyLibrary copyStrategies, ResourceUrn name) { try { - return new DefaultClassMetadata<>(uri, 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; diff --git a/nui-gestalt7/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java b/nui-gestalt7/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java new file mode 100644 index 0000000000..8c0c149857 --- /dev/null +++ b/nui-gestalt7/src/main/java/org/terasology/nui/reflection/WidgetMetadata.java @@ -0,0 +1,63 @@ +/* + * Copyright 2014 MovingBlocks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.terasology.nui.reflection; + +import com.google.common.base.Predicate; +import org.terasology.nui.LayoutConfig; +import org.terasology.nui.UIWidget; +import org.terasology.reflection.copy.CopyStrategyLibrary; +import org.terasology.reflection.metadata.ClassMetadata; +import org.terasology.reflection.metadata.FieldMetadata; +import org.terasology.reflection.reflect.InaccessibleFieldException; +import org.terasology.reflection.reflect.ReflectFactory; + +import java.lang.reflect.Field; + +/** + * + */ +public class WidgetMetadata extends ClassMetadata> { + + /** + * Creates a class metatdata + * + * @param uri The uri that identifies this type + * @param type The type to create the metadata for + * @param factory A reflection library to provide class construction and field get/set functionality + * @param copyStrategyLibrary A copy strategy library + * @throws NoSuchMethodException If the class has no default constructor + */ + public WidgetMetadata(String uri, Class type, ReflectFactory factory, + CopyStrategyLibrary copyStrategyLibrary) throws NoSuchMethodException { + super(uri, type, factory, copyStrategyLibrary, IsConfigField.INSTANCE); + } + + @Override + protected FieldMetadata createField(Field field, CopyStrategyLibrary copyStrategyLibrary, + ReflectFactory factory) throws InaccessibleFieldException { + return new FieldMetadata<>(this, field, copyStrategyLibrary, factory); + } + + private static class IsConfigField implements Predicate { + + private static final IsConfigField INSTANCE = new IsConfigField(); + + @Override + public boolean apply(Field input) { + return input.getAnnotation(LayoutConfig.class) != null; + } + } +} diff --git a/nui-gestalt7/src/main/java/org/terasology/nui/skin/UISkinAsset.java b/nui-gestalt7/src/main/java/org/terasology/nui/skin/UISkinAsset.java new file mode 100644 index 0000000000..e7b29cdcd6 --- /dev/null +++ b/nui-gestalt7/src/main/java/org/terasology/nui/skin/UISkinAsset.java @@ -0,0 +1,76 @@ +package org.terasology.nui.skin; + +import org.terasology.gestalt.assets.Asset; +import org.terasology.gestalt.assets.AssetType; +import org.terasology.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.assets.format.AssetDataFile; +import org.terasology.nui.UIWidget; + +public class UISkinAsset extends Asset { + private UISkinData skinData; + + private transient AssetDataFile source; + + public UISkinAsset(ResourceUrn urn, AssetType 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 element, String mode) { + return getStyleFor("", element, mode); + } + + public UIStyle getDefaultStyleFor(Class element, String part, String mode) { + return getStyleFor("", element, part, mode); + } + + public UIStyle getStyleFor(String family, Class element, String mode) { + UIStyleFamily styleFamily = getFamily(family); + if (element == null) { + return styleFamily.getBaseStyle(); + } + return styleFamily.getElementStyle(element, "", mode); + } + + public UIStyle getStyleFor(String family, Class 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 getFamilies() { + return skinData.getUiSkin().getFamilies(); + } + + public AssetDataFile getSource() { + return source; + } + + public UISkin getSkin() { + return skinData.getUiSkin(); + } +} diff --git a/nui-gestalt7/src/main/java/org/terasology/nui/skin/UISkinData.java b/nui-gestalt7/src/main/java/org/terasology/nui/skin/UISkinData.java new file mode 100644 index 0000000000..fbb3296dc3 --- /dev/null +++ b/nui-gestalt7/src/main/java/org/terasology/nui/skin/UISkinData.java @@ -0,0 +1,56 @@ +/* + * Copyright 2014 MovingBlocks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.terasology.nui.skin; + +import com.google.common.collect.Maps; +import org.terasology.gestalt.assets.AssetData; +import org.terasology.gestalt.assets.format.AssetDataFile; + +import java.util.Map; + +/** + */ +public class UISkinData implements AssetData { + private UISkin uiSkin; + + private transient AssetDataFile source; + + public UISkinData(UISkin uiSkin) { + this.uiSkin = uiSkin; + } + + public UIStyleFamily getFamily(String familyName) { + return uiSkin.getFamily(familyName); + } + + public UISkin getUiSkin() { + return uiSkin; + } + + /** + * @param source The {@link AssetDataFile} this asset has been loaded from. + */ + public void setSource(AssetDataFile source) { + this.source = source; + } + + /** + * @return The {@link AssetDataFile} this asset has been loaded from. + */ + public AssetDataFile getSource() { + return source; + } +} diff --git a/nui-gestalt7/src/main/java/org/terasology/reflection/ModuleTypeRegistry.java b/nui-gestalt7/src/main/java/org/terasology/reflection/ModuleTypeRegistry.java new file mode 100644 index 0000000000..b48cdd4590 --- /dev/null +++ b/nui-gestalt7/src/main/java/org/terasology/reflection/ModuleTypeRegistry.java @@ -0,0 +1,30 @@ +package org.terasology.reflection; + +import org.terasology.gestalt.module.Module; +import org.terasology.gestalt.module.ModuleEnvironment; +import org.terasology.gestalt.module.sandbox.ModuleClassLoader; + +public class ModuleTypeRegistry extends TypeRegistry { + 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); + } + + protected void initializeReflections(ClassLoader classLoader, ModuleEnvironment environment) { + initializeReflections(classLoader, loader -> !(loader instanceof ModuleClassLoader)); + + for (Module module : environment.getModulesOrderedByDependencies()) { + if (module.getClasspaths().size() == 0) { + continue; + } + + reflections.merge(module.getModuleManifest()); + } + } +} diff --git a/nui-gestalt7/src/main/java/org/terasology/reflection/metadata/DefaultModuleClassLibrary.java b/nui-gestalt7/src/main/java/org/terasology/reflection/metadata/DefaultModuleClassLibrary.java new file mode 100644 index 0000000000..3805c18754 --- /dev/null +++ b/nui-gestalt7/src/main/java/org/terasology/reflection/metadata/DefaultModuleClassLibrary.java @@ -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.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.module.ModuleEnvironment; +import org.terasology.reflection.copy.CopyStrategyLibrary; +import org.terasology.reflection.reflect.ReflectFactory; + +public class DefaultModuleClassLibrary extends ModuleClassLibrary { + private static final Logger logger = LoggerFactory.getLogger(DefaultModuleClassLibrary.class); + + public DefaultModuleClassLibrary(ModuleEnvironment environment, ReflectFactory reflectFactory, CopyStrategyLibrary copyStrategyLibrary) { + super(environment, reflectFactory, copyStrategyLibrary); + } + + @Override + protected ClassMetadata createMetadata(Class 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; + + } + } +} diff --git a/nui-gestalt7/src/main/java/org/terasology/reflection/metadata/ModuleClassLibrary.java b/nui-gestalt7/src/main/java/org/terasology/reflection/metadata/ModuleClassLibrary.java new file mode 100644 index 0000000000..92c38cd5af --- /dev/null +++ b/nui-gestalt7/src/main/java/org/terasology/reflection/metadata/ModuleClassLibrary.java @@ -0,0 +1,205 @@ +/* + * Copyright 2013 MovingBlocks + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.terasology.reflection.metadata; + +import com.google.common.collect.HashBasedTable; +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.gestalt.assets.ResourceUrn; +import org.terasology.gestalt.module.Module; +import org.terasology.gestalt.module.ModuleEnvironment; +import org.terasology.gestalt.naming.Name; +import org.terasology.reflection.copy.CopyStrategyLibrary; +import org.terasology.reflection.reflect.ReflectFactory; + +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * Abstract base implement of ClassLibrary. + * + */ +public abstract class ModuleClassLibrary implements ClassLibrary { + + private static final Logger logger = LoggerFactory.getLogger(ModuleClassLibrary.class); + + protected final CopyStrategyLibrary copyStrategyLibrary; + + private ReflectFactory reflectFactory; + private ModuleEnvironment environment; + + private Map, ClassMetadata> classLookup = Maps.newHashMap(); + private Table> urnLookup = HashBasedTable.create(); + + public ModuleClassLibrary(ModuleEnvironment environment, ReflectFactory reflectFactory, CopyStrategyLibrary copyStrategyLibrary) { + this.environment = environment; + this.reflectFactory = reflectFactory; + this.copyStrategyLibrary = copyStrategyLibrary; + } + + public ModuleClassLibrary(ModuleClassLibrary factory, CopyStrategyLibrary copyStrategies) { + this.reflectFactory = factory.reflectFactory; + this.copyStrategyLibrary = copyStrategies; + for (Table.Cell> cell: factory.urnLookup.cellSet()) { + Name objectName = cell.getRowKey(); + Name moduleName = cell.getColumnKey(); + ClassMetadata oldMetaData = cell.getValue(); + Class clazz = oldMetaData.getType(); + ResourceUrn urn = new ResourceUrn(oldMetaData.getId()); + ClassMetadata metadata = createMetadata(clazz, factory.reflectFactory, copyStrategies, urn); + + if (metadata != null) { + classLookup.put(clazz, metadata); + urnLookup.put(objectName, moduleName, metadata); + } else { + throw new RuntimeException("Failed to create copy of class library"); + } + } + } + + /** + * @param type A type being registered into the library + * @param name The name for the type + * @param The class of the type + * @return An instance of ClassMetadata (or a subtype) providing metadata for the given type + */ + protected abstract ClassMetadata createMetadata(Class type, ReflectFactory factory, CopyStrategyLibrary copyStrategies, ResourceUrn name); + + @Override + public void register(String uri, Class clazz) { + register(new ResourceUrn(uri), clazz); + } + + public void register(ResourceUrn urn, Class clazz) { + ClassMetadata metadata = createMetadata(clazz, reflectFactory, copyStrategyLibrary, urn); + + if (metadata != null) { + classLookup.put(clazz, metadata); + ClassMetadata prev = urnLookup.put(urn.getResourceName(), urn.getModuleName(), metadata); + if (prev != null && !prev.equals(metadata)) { + logger.warn("Duplicate entry for '{}': {} and {}", urn, prev.getType(), metadata.getType()); + } + } + } + + @Override + @SuppressWarnings("unchecked") + public ClassMetadata getMetadata(Class clazz) { + if (clazz == null) { + return null; + } + return (ClassMetadata) classLookup.get(clazz); + } + + @Override + @SuppressWarnings("unchecked") + public ClassMetadata getMetadata(U object) { + if (object != null) { + return getMetadata((Class) (object.getClass())); + } + return null; + } + + @Override + public TYPE copy(TYPE object) { + ClassMetadata info = getMetadata(object); + if (info != null) { + return info.copy(object); + } + return null; + } + + @Override + public ClassMetadata getMetadata(String urn) { + return getMetadata(new ResourceUrn(urn)); + } + + public ClassMetadata getMetadata(ResourceUrn urn) { + return urnLookup.get(urn.getResourceName(), urn.getModuleName()); + } + + @Override + public Iterator> iterator() { + return classLookup.values().iterator(); + } + + public List> getMetadata(Name name) { + return Lists.newArrayList(urnLookup.row(name).values()); + } + + public ClassMetadata resolve(String name, Name context) { + Module moduleContext = environment.get(context); + if (moduleContext != null) { + return resolve(name, moduleContext); + } + return null; + } + + @Override + public ClassMetadata resolve(String name) { + if (ResourceUrn.isValid(name)) { + return getMetadata(new ResourceUrn(name)); + } + List> possibilities = getMetadata(new Name(name)); + if (possibilities.size() == 1) { + return possibilities.get(0); + } + return null; + } + + public ClassMetadata resolve(String name, Module context) { + if (ResourceUrn.isValid(name)) { + return getMetadata(new ResourceUrn(name)); + } + List> possibilities = getMetadata(new Name(name)); + switch (possibilities.size()) { + case 0: + return null; + case 1: + return possibilities.get(0); + default: + + if (context != null) { + Set dependencies = environment.getDependencyNamesOf(context.getId()); + Iterator> iterator = possibilities.iterator(); + while (iterator.hasNext()) { + ClassMetadata metadata = iterator.next(); + ResourceUrn urn = new ResourceUrn(metadata.getId()); + if (context.getId().equals(urn.getModuleName())) { + return metadata; + } + if (!dependencies.contains(urn.getModuleName())) { + iterator.remove(); + } + } + if (possibilities.size() == 1) { + return possibilities.get(0); + } + } + return null; + } + } + + public Map, ClassMetadata> getClassLookup() { + return this.classLookup; + } +} diff --git a/nui-input/build.gradle b/nui-input/build.gradle index 6538bbd72e..ed4d570e83 100644 --- a/nui-input/build.gradle +++ b/nui-input/build.gradle @@ -6,9 +6,6 @@ plugins { 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' - api ('org.joml:joml') { version { require jomlVersion diff --git a/nui-input/src/main/java/org/terasology/input/device/InputDevice.java b/nui-input/src/main/java/org/terasology/input/device/InputDevice.java index 15cdb5c113..9a5d9e4d98 100644 --- a/nui-input/src/main/java/org/terasology/input/device/InputDevice.java +++ b/nui-input/src/main/java/org/terasology/input/device/InputDevice.java @@ -15,11 +15,8 @@ */ package org.terasology.input.device; -import org.terasology.module.sandbox.API; - import java.util.Queue; -@API @FunctionalInterface public interface InputDevice { diff --git a/nui-input/src/main/java/org/terasology/input/device/KeyboardDevice.java b/nui-input/src/main/java/org/terasology/input/device/KeyboardDevice.java index 80a1d43706..5ff4f4e082 100644 --- a/nui-input/src/main/java/org/terasology/input/device/KeyboardDevice.java +++ b/nui-input/src/main/java/org/terasology/input/device/KeyboardDevice.java @@ -4,11 +4,8 @@ import java.util.Queue; -import org.terasology.module.sandbox.API; - /** */ -@API public interface KeyboardDevice extends InputDevice { @Override diff --git a/nui-input/src/main/java/org/terasology/input/device/MouseDevice.java b/nui-input/src/main/java/org/terasology/input/device/MouseDevice.java index da75a60421..bb661690b8 100644 --- a/nui-input/src/main/java/org/terasology/input/device/MouseDevice.java +++ b/nui-input/src/main/java/org/terasology/input/device/MouseDevice.java @@ -18,12 +18,10 @@ import java.util.Queue; import org.joml.Vector2d; -import org.terasology.module.sandbox.API; import org.joml.Vector2i; /** */ -@API public interface MouseDevice extends InputDevice { /** diff --git a/nui-input/src/main/java/org/terasology/input/package-info.java b/nui-input/src/main/java/org/terasology/input/package-info.java deleted file mode 100644 index 9b0dcf36e9..0000000000 --- a/nui-input/src/main/java/org/terasology/input/package-info.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright 2013 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -@API package org.terasology.input; - -import org.terasology.module.sandbox.API; \ No newline at end of file diff --git a/nui-libgdx/build.gradle b/nui-libgdx/build.gradle index dcb2e6513e..bb73e7e4b9 100644 --- a/nui-libgdx/build.gradle +++ b/nui-libgdx/build.gradle @@ -13,6 +13,7 @@ ext { dependencies { api project(':nui') api project(':nui-input') + api project(':nui-gestalt7') - implementation "com.badlogicgames.gdx:gdx:$gdxVersion" + api "com.badlogicgames.gdx:gdx:$gdxVersion" } diff --git a/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/LibGDXFont.java b/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/LibGDXFont.java index 9dae00294b..14b50101b2 100644 --- a/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/LibGDXFont.java +++ b/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/LibGDXFont.java @@ -17,7 +17,7 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.GlyphLayout; -import org.terasology.assets.AssetData; +import org.terasology.gestalt.assets.AssetData; import org.joml.Vector2i; import org.terasology.nui.asset.font.Font; diff --git a/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/LibGDXTexture.java b/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/LibGDXTexture.java index f2ceefd8f5..f5722eef73 100644 --- a/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/LibGDXTexture.java +++ b/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/LibGDXTexture.java @@ -16,7 +16,7 @@ package org.terasology.nui.backends.libgdx; import com.badlogic.gdx.graphics.g2d.TextureRegion; -import org.terasology.assets.AssetData; +import org.terasology.gestalt.assets.AssetData; import org.terasology.joml.geom.Rectanglef; import org.terasology.joml.geom.Rectanglei; import org.joml.Vector2i; diff --git a/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/NUIInputProcessor.java b/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/NUIInputProcessor.java index 9034f00a3d..09b974e442 100644 --- a/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/NUIInputProcessor.java +++ b/nui-libgdx/src/main/java/org/terasology/nui/backends/libgdx/NUIInputProcessor.java @@ -73,7 +73,7 @@ public Queue getKeyboardInputQueue() { public Queue getKeyboardCharQueue() { Queue copy = new LinkedList<>(keyboardCharQueue); - keyboardActionQueue.clear(); + keyboardCharQueue.clear(); return copy; } diff --git a/nui-reflect/build.gradle b/nui-reflect/build.gradle index 8bf4a800a7..7bb15d5baf 100644 --- a/nui-reflect/build.gradle +++ b/nui-reflect/build.gradle @@ -10,9 +10,6 @@ dependencies { implementation group: 'org.reflections', name: 'reflections', version: '0.9.10' implementation group: 'com.google.code.gson', name: 'gson', version: '2.6.2' - implementation group: 'org.terasology', name: 'gestalt-module', version: '5.1.5' - implementation group: 'org.terasology', name: 'gestalt-asset-core', version: '5.1.5' - implementation group: 'com.google.guava', name: 'guava', version: '23.0' api ('org.joml:joml') { version { diff --git a/nui-reflect/src/main/java/org/terasology/reflection/MappedContainer.java b/nui-reflect/src/main/java/org/terasology/reflection/MappedContainer.java index a925f0a71d..f89e12273e 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/MappedContainer.java +++ b/nui-reflect/src/main/java/org/terasology/reflection/MappedContainer.java @@ -16,8 +16,6 @@ package org.terasology.reflection; -import org.terasology.module.sandbox.API; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -31,7 +29,6 @@ * and must not depend on objects appearing multiple times in their structure * being the same object - when deserialized each object will be a separate instance. */ -@API @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface MappedContainer { diff --git a/nui-reflect/src/main/java/org/terasology/reflection/TypeInfo.java b/nui-reflect/src/main/java/org/terasology/reflection/TypeInfo.java index f5a4a37ed8..3e53de8926 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/TypeInfo.java +++ b/nui-reflect/src/main/java/org/terasology/reflection/TypeInfo.java @@ -15,7 +15,6 @@ */ package org.terasology.reflection; -import org.terasology.module.sandbox.API; import org.terasology.reflection.ReflectionUtil; import java.lang.reflect.Type; @@ -45,7 +44,6 @@ * * @param The type for which type information is to be generated. */ -@API public abstract class TypeInfo { private final Class rawType; private final Type type; diff --git a/nui-reflect/src/main/java/org/terasology/reflection/TypeRegistry.java b/nui-reflect/src/main/java/org/terasology/reflection/TypeRegistry.java index bf507ea17a..0c673ccf9f 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/TypeRegistry.java +++ b/nui-reflect/src/main/java/org/terasology/reflection/TypeRegistry.java @@ -22,9 +22,6 @@ import org.reflections.scanners.TypeAnnotationsScanner; import org.reflections.util.ClasspathHelper; import org.reflections.util.ConfigurationBuilder; -import org.terasology.module.Module; -import org.terasology.module.ModuleEnvironment; -import org.terasology.module.sandbox.ModuleClassLoader; import org.terasology.reflection.ReflectionUtil; import java.lang.annotation.Annotation; @@ -33,14 +30,15 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; public class TypeRegistry { public static Set WHITELISTED_CLASSES = new HashSet<>(); public static Set WHITELISTED_PACKAGES = new HashSet<>(); - private Reflections reflections; - private ClassLoader[] classLoaders; + protected Reflections reflections; + protected ClassLoader[] classLoaders; /** * Creates an empty {@link TypeRegistry}. No types are loaded when this constructor @@ -50,15 +48,15 @@ public TypeRegistry() {} public TypeRegistry(ClassLoader classLoader) { this(); - initializeReflections(classLoader); + initializeReflections(classLoader, loader -> true); } - public TypeRegistry(ModuleEnvironment environment) { + public TypeRegistry(ClassLoader classLoader, Predicate classLoaderFilter) { this(); - reload(environment); + initializeReflections(classLoader, classLoaderFilter); } - private static boolean filterWhitelistedTypes(String typeName) { + protected static boolean filterWhitelistedTypes(String typeName) { if (typeName == null) { return false; } @@ -75,13 +73,7 @@ private static boolean filterWhitelistedTypes(String typeName) { return WHITELISTED_PACKAGES.contains(packageName) || WHITELISTED_CLASSES.contains(typeName); } - 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) { + protected void initializeReflections(ClassLoader classLoader, Predicate classLoaderFilter) { List allClassLoaders = Lists.newArrayList(); while (classLoader != null) { @@ -106,7 +98,7 @@ private void initializeReflections(ClassLoader classLoader) { .addClassLoaders(allClassLoaders) .addUrls(ClasspathHelper.forClassLoader( allClassLoaders.stream() - .filter(loader -> !(loader instanceof ModuleClassLoader)) + .filter(classLoaderFilter) .toArray(ClassLoader[]::new) )) .filterInputsBy(TypeRegistry::filterWhitelistedTypes) @@ -114,18 +106,6 @@ private void initializeReflections(ClassLoader classLoader) { } - private void initializeReflections(ClassLoader classLoader, ModuleEnvironment environment) { - initializeReflections(classLoader); - - for (Module module : environment.getModulesOrderedByDependencies()) { - if (!module.isCodeModule()) { - continue; - } - - reflections.merge(module.getReflectionsFragment()); - } - } - public Set> getSubtypesOf(Class type) { Iterable subTypes = reflections.getStore().getAll(SubTypesScanner.class.getSimpleName(), type.getName()); return ReflectionUtil.loadClasses(subTypes, reflections.getConfiguration().getClassLoaders()); diff --git a/nui-reflect/src/main/java/org/terasology/reflection/copy/CopyStrategyLibrary.java b/nui-reflect/src/main/java/org/terasology/reflection/copy/CopyStrategyLibrary.java index 702cc45b4e..5615ab56fc 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/copy/CopyStrategyLibrary.java +++ b/nui-reflect/src/main/java/org/terasology/reflection/copy/CopyStrategyLibrary.java @@ -18,7 +18,6 @@ import com.google.common.collect.Maps; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.assets.ResourceUrn; import org.terasology.reflection.metadata.ClassMetadata; import org.terasology.reflection.metadata.DefaultClassMetadata; import org.terasology.reflection.MappedContainer; diff --git a/nui-reflect/src/main/java/org/terasology/reflection/metadata/ClassLibrary.java b/nui-reflect/src/main/java/org/terasology/reflection/metadata/ClassLibrary.java index 673fd437bf..8bbc60c329 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/metadata/ClassLibrary.java +++ b/nui-reflect/src/main/java/org/terasology/reflection/metadata/ClassLibrary.java @@ -16,12 +16,6 @@ package org.terasology.reflection.metadata; -import org.terasology.assets.ResourceUrn; -import org.terasology.module.Module; -import org.terasology.naming.Name; - -import java.util.List; - /** * The interface for a class library. These store metadata on a type of class, and provide the ability to copy them. * @@ -35,7 +29,7 @@ public interface ClassLibrary extends Iterable> * @param uri The uri to use to find this class * @param clazz The class to register with this library */ - void register(ResourceUrn uri, Class clazz); + void register(String uri, Class clazz); /** * @param clazz The class to retrieve metadata for @@ -61,16 +55,10 @@ public interface ClassLibrary extends Iterable> TYPE copy(TYPE object); /** - * @param uri The uri identifying the class to look up + * @param id The id identifying the class to look up * @return The metadata for the given class, or null if not registered. */ - ClassMetadata getMetadata(ResourceUrn uri); - - /** - * @param name The object name of the class to look up - * @return A list of ClassMetadata identified by this name. - */ - List> getMetadata(String name); + ClassMetadata getMetadata(String id); /** * Resolves metadata for a class given a string that may either be a uri or just a name. T @@ -81,36 +69,4 @@ public interface ClassLibrary extends Iterable> */ ClassMetadata resolve(String name); - List> getMetadata(Name name); - - /** - * Resolves a name referring to a component. This may be a uri ('engine:component') or just the name ('component'). - * The process used for resolution is: - *
    - *
  1. If the name is a uri, return the component metadata linked to that uri
  2. - *
  3. Find within the context module
  4. - *
  5. Find within the context module's dependencies
  6. - *
- * - * @param name The name of the component. This may be the full uri, or just part of it. - * @param context The module from which it has been referred - * @return The resolved component metadata, or null if it could not be resolve (or multiple matches were found) - */ - ClassMetadata resolve(String name, Name context); - - /** - * Resolves a name referring to a component. This may be a uri ('engine:component') or just the component name ('component'). - * The process used for resolution is: - *
    - *
  1. If the name is a uri, return the component metadata linked to that uri
  2. - *
  3. Find within the context module
  4. - *
  5. Find within the context module's dependencies
  6. - *
- * - * @param name The name of the component. This may be the full uri, or just part of it. - * @param context The module from which it has been referred - * @return The resolved component metadata, or null if it could not be resolve (or multiple matches were found) - */ - ClassMetadata resolve(String name, Module context); - } diff --git a/nui-reflect/src/main/java/org/terasology/reflection/metadata/ClassMetadata.java b/nui-reflect/src/main/java/org/terasology/reflection/metadata/ClassMetadata.java index 7dc4c02859..e9bc9ed2e1 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/metadata/ClassMetadata.java +++ b/nui-reflect/src/main/java/org/terasology/reflection/metadata/ClassMetadata.java @@ -23,7 +23,6 @@ import org.reflections.ReflectionUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.assets.ResourceUrn; import org.terasology.reflection.copy.CopyStrategyLibrary; import org.terasology.reflection.reflect.InaccessibleFieldException; import org.terasology.reflection.reflect.ObjectConstructor; @@ -52,7 +51,7 @@ public abstract class ClassMetadata> { private static final Logger logger = LoggerFactory.getLogger(ClassMetadata.class); private static final Permission CREATE_CLASS_METADATA = new RuntimePermission("createClassMetadata"); - private final ResourceUrn uri; + private final String classId; private final Class clazz; protected final ObjectConstructor constructor; protected Map fields = Maps.newHashMap(); @@ -61,20 +60,20 @@ public abstract class ClassMetadata> { /** * Creates a class metatdata * - * @param uri The uri that identifies this type + * @param id The id that identifies this type * @param type The type to create the metadata for * @param factory A reflection library to provide class construction and field get/set functionality * @param copyStrategyLibrary A copy strategy library * @throws NoSuchMethodException If the class has no default constructor */ - public ClassMetadata(ResourceUrn uri, Class type, ReflectFactory factory, + public ClassMetadata(String id, Class type, ReflectFactory factory, CopyStrategyLibrary copyStrategyLibrary, Predicate includedFieldPredicate) throws NoSuchMethodException { if (System.getSecurityManager() != null) { System.getSecurityManager().checkPermission(CREATE_CLASS_METADATA); } - this.uri = uri; + this.classId = id; this.clazz = type; if (!type.isInterface() && !Modifier.isAbstract(type.getModifiers())) { this.constructor = factory.createConstructor(type); @@ -85,8 +84,22 @@ public ClassMetadata(ResourceUrn uri, Class type, ReflectFactory factory, addFields(copyStrategyLibrary, factory, includedFieldPredicate); } - public final ResourceUrn getUri() { - return uri; + /** + * @deprecated Renamed to {@link #getId()} + * @return The id that identifies this type + */ + @Deprecated + public final String getUri() { + return classId; + } + + /** + * Returns the id that identifies this type. + * + * @return The id that identifies this type + */ + public final String getId() { + return classId; } /** @@ -232,8 +245,8 @@ public int hashCode() { @Override public String toString() { - if (ResourceUrn.isValid(uri.toString())) { - return uri.toString(); + if (!classId.isEmpty()) { + return classId; } return getType().toString(); } diff --git a/nui-reflect/src/main/java/org/terasology/reflection/metadata/DefaultClassMetadata.java b/nui-reflect/src/main/java/org/terasology/reflection/metadata/DefaultClassMetadata.java index 22ef6bebc9..6235e7e8c4 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/metadata/DefaultClassMetadata.java +++ b/nui-reflect/src/main/java/org/terasology/reflection/metadata/DefaultClassMetadata.java @@ -16,7 +16,6 @@ package org.terasology.reflection.metadata; import com.google.common.base.Predicates; -import org.terasology.assets.ResourceUrn; import org.terasology.reflection.copy.CopyStrategyLibrary; import org.terasology.reflection.reflect.InaccessibleFieldException; import org.terasology.reflection.reflect.ReflectFactory; @@ -31,15 +30,15 @@ public class DefaultClassMetadata extends ClassMetadata type, ReflectFactory factory, + public DefaultClassMetadata(String id, Class type, ReflectFactory factory, CopyStrategyLibrary copyStrategyLibrary) throws NoSuchMethodException { - super(uri, type, factory, copyStrategyLibrary, Predicates.alwaysTrue()); + super(id, type, factory, copyStrategyLibrary, Predicates.alwaysTrue()); } @Override diff --git a/nui-reflect/src/main/java/org/terasology/reflection/metadata/package-info.java b/nui-reflect/src/main/java/org/terasology/reflection/metadata/package-info.java index 67c8b66ec4..e7e2d6f9aa 100644 --- a/nui-reflect/src/main/java/org/terasology/reflection/metadata/package-info.java +++ b/nui-reflect/src/main/java/org/terasology/reflection/metadata/package-info.java @@ -27,7 +27,5 @@ *

* Additionally, ReflectFactory is used to provide support for construction and field access, to allow for alternate implementations. */ -@API package org.terasology.reflection.metadata; -import org.terasology.module.sandbox.API; diff --git a/nui/build.gradle b/nui/build.gradle index 56b0af9caf..b6575d30f4 100644 --- a/nui/build.gradle +++ b/nui/build.gradle @@ -6,9 +6,6 @@ plugins { 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' - api group: 'org.abego.treelayout', name: 'org.abego.treelayout.core', version: '1.0.3' api group: 'com.miglayout', name: 'miglayout-core', version: '5.0' diff --git a/nui/src/main/java/org/terasology/nui/Color.java b/nui/src/main/java/org/terasology/nui/Color.java index d5214d90d7..0f79de0b7f 100644 --- a/nui/src/main/java/org/terasology/nui/Color.java +++ b/nui/src/main/java/org/terasology/nui/Color.java @@ -8,7 +8,6 @@ import org.joml.Vector3ic; import org.joml.Vector4fc; import org.joml.Vector4ic; -import org.terasology.module.sandbox.API; import java.nio.ByteBuffer; import java.util.Locale; @@ -29,7 +28,6 @@ * * */ -@API public class Color implements Colorc { @Deprecated diff --git a/nui/src/main/java/org/terasology/nui/FontColor.java b/nui/src/main/java/org/terasology/nui/FontColor.java index 92064fe1f6..01e2a992b2 100644 --- a/nui/src/main/java/org/terasology/nui/FontColor.java +++ b/nui/src/main/java/org/terasology/nui/FontColor.java @@ -16,7 +16,6 @@ package org.terasology.nui; -import org.terasology.module.sandbox.API; import org.terasology.nui.Color; /** @@ -26,7 +25,6 @@ *
* Note: The resolution is only 4 bit per channel (not 8 as usual). */ -@API public final class FontColor { private static final char FIRST_COLOR = 0xE000; // Unicode 6 specs: "Private Use Area: U+E000 -- U+F8FF" private static final char LAST_COLOR = 0xEFFF; diff --git a/nui/src/main/java/org/terasology/nui/FontUnderline.java b/nui/src/main/java/org/terasology/nui/FontUnderline.java index a42dd8cbf0..dc57735147 100644 --- a/nui/src/main/java/org/terasology/nui/FontUnderline.java +++ b/nui/src/main/java/org/terasology/nui/FontUnderline.java @@ -16,12 +16,9 @@ package org.terasology.nui; -import org.terasology.module.sandbox.API; - /** * Defines a set of special characters that mark contents of a string to be underlined */ -@API public final class FontUnderline { private static final char START_UNDERLINE = 0xF001; private static final char END_UNDERLINE = 0xF002; diff --git a/nui/src/main/java/org/terasology/nui/asset/Sound.java b/nui/src/main/java/org/terasology/nui/asset/Sound.java index 5729a3a6ef..6f23b0badc 100644 --- a/nui/src/main/java/org/terasology/nui/asset/Sound.java +++ b/nui/src/main/java/org/terasology/nui/asset/Sound.java @@ -18,9 +18,6 @@ package org.terasology.nui.asset; -import org.terasology.module.sandbox.API; - -@API public interface Sound { void play(float volume); } diff --git a/nui/src/main/java/org/terasology/nui/asset/font/Font.java b/nui/src/main/java/org/terasology/nui/asset/font/Font.java index c77cf304bd..34e26a1190 100644 --- a/nui/src/main/java/org/terasology/nui/asset/font/Font.java +++ b/nui/src/main/java/org/terasology/nui/asset/font/Font.java @@ -16,30 +16,28 @@ package org.terasology.nui.asset.font; -import org.terasology.module.sandbox.API; import org.joml.Vector2i; import java.util.List; /** */ -@API public interface Font { - public abstract int getWidth(String text); + int getWidth(String text); - public abstract int getWidth(Character c); + int getWidth(Character c); - public abstract int getHeight(String text); + int getHeight(String text); - public abstract int getLineHeight(); + int getLineHeight(); - public abstract int getBaseHeight(); + int getBaseHeight(); - public abstract Vector2i getSize(List lines); + Vector2i getSize(List lines); - public abstract boolean hasCharacter(Character c); + boolean hasCharacter(Character c); - public abstract int getUnderlineOffset(); + int getUnderlineOffset(); - public abstract int getUnderlineThickness(); + int getUnderlineThickness(); } diff --git a/nui/src/main/java/org/terasology/nui/asset/font/FontCharacter.java b/nui/src/main/java/org/terasology/nui/asset/font/FontCharacter.java index 967e1204b7..e567a82c0a 100644 --- a/nui/src/main/java/org/terasology/nui/asset/font/FontCharacter.java +++ b/nui/src/main/java/org/terasology/nui/asset/font/FontCharacter.java @@ -16,12 +16,10 @@ package org.terasology.nui.asset.font; -import org.terasology.module.sandbox.API; import org.terasology.nui.UITextureRegion; /** */ -@API public class FontCharacter { private float x; private float y; diff --git a/nui/src/main/java/org/terasology/nui/databinding/package-info.java b/nui/src/main/java/org/terasology/nui/databinding/package-info.java index 01333858f5..258f507aa3 100644 --- a/nui/src/main/java/org/terasology/nui/databinding/package-info.java +++ b/nui/src/main/java/org/terasology/nui/databinding/package-info.java @@ -17,6 +17,5 @@ /** * This package contains a simple data binding framework for use in nui (or elsewhere). */ -@API package org.terasology.nui.databinding; +package org.terasology.nui.databinding; -import org.terasology.module.sandbox.API; diff --git a/nui/src/main/java/org/terasology/nui/events/NUIBindButtonEvent.java b/nui/src/main/java/org/terasology/nui/events/NUIBindButtonEvent.java index b6fabb0b45..08d74ee446 100644 --- a/nui/src/main/java/org/terasology/nui/events/NUIBindButtonEvent.java +++ b/nui/src/main/java/org/terasology/nui/events/NUIBindButtonEvent.java @@ -16,7 +16,6 @@ package org.terasology.nui.events; -import org.terasology.assets.ResourceUrn; import org.terasology.input.ButtonState; import org.terasology.input.device.KeyboardDevice; import org.terasology.input.device.MouseDevice; @@ -25,17 +24,17 @@ */ public class NUIBindButtonEvent extends NUIInputEvent { - private ResourceUrn id; + private String id; private ButtonState state; - public NUIBindButtonEvent(MouseDevice mouseDevice, KeyboardDevice keyboardDevice, ResourceUrn buttonId, ButtonState newState) { + public NUIBindButtonEvent(MouseDevice mouseDevice, KeyboardDevice keyboardDevice, String buttonId, ButtonState newState) { super(mouseDevice, keyboardDevice); this.id = buttonId; this.state = newState; } - public ResourceUrn getId() { + public String getId() { return id; } diff --git a/nui/src/main/java/org/terasology/nui/events/package-info.java b/nui/src/main/java/org/terasology/nui/events/package-info.java index f2d3373b41..c646520ad9 100644 --- a/nui/src/main/java/org/terasology/nui/events/package-info.java +++ b/nui/src/main/java/org/terasology/nui/events/package-info.java @@ -15,8 +15,6 @@ */ /** - * See javadoc of {@link org.terasology.rendering.nui.events.NUIInputEvent}. + * See javadoc of {@link org.terasology.nui.events.NUIInputEvent}. */ -@API package org.terasology.nui.events; - -import org.terasology.module.sandbox.API; +package org.terasology.nui.events; \ No newline at end of file diff --git a/nui/src/main/java/org/terasology/nui/itemRendering/package-info.java b/nui/src/main/java/org/terasology/nui/itemRendering/package-info.java index 61dbd06c85..7db189782f 100644 --- a/nui/src/main/java/org/terasology/nui/itemRendering/package-info.java +++ b/nui/src/main/java/org/terasology/nui/itemRendering/package-info.java @@ -17,6 +17,4 @@ /** * This package contains classes for defining how to render an item */ -@API package org.terasology.nui.itemRendering; - -import org.terasology.module.sandbox.API; +package org.terasology.nui.itemRendering; \ No newline at end of file diff --git a/nui/src/main/java/org/terasology/nui/layouts/miglayout/package-info.java b/nui/src/main/java/org/terasology/nui/layouts/miglayout/package-info.java deleted file mode 100644 index e4aa54987b..0000000000 --- a/nui/src/main/java/org/terasology/nui/layouts/miglayout/package-info.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2014 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@API package org.terasology.nui.layouts.miglayout; - -import org.terasology.module.sandbox.API; diff --git a/nui/src/main/java/org/terasology/nui/layouts/package-info.java b/nui/src/main/java/org/terasology/nui/layouts/package-info.java index 3cf15db306..0617c2be11 100644 --- a/nui/src/main/java/org/terasology/nui/layouts/package-info.java +++ b/nui/src/main/java/org/terasology/nui/layouts/package-info.java @@ -17,6 +17,4 @@ /** * A selection of basic layouts. Each layout can be used to describe how to position a set of nested widgets. */ -@API package org.terasology.nui.layouts; - -import org.terasology.module.sandbox.API; +package org.terasology.nui.layouts; \ No newline at end of file diff --git a/nui/src/main/java/org/terasology/nui/layouts/relative/package-info.java b/nui/src/main/java/org/terasology/nui/layouts/relative/package-info.java index a68c137683..78e6c3561a 100644 --- a/nui/src/main/java/org/terasology/nui/layouts/relative/package-info.java +++ b/nui/src/main/java/org/terasology/nui/layouts/relative/package-info.java @@ -17,6 +17,4 @@ /** * This package contains the RelativeLayout and related classes. This layout allows contents to be positioned relative to each other or the area in which it is rendered. */ -@API package org.terasology.nui.layouts.relative; - -import org.terasology.module.sandbox.API; +package org.terasology.nui.layouts.relative; \ No newline at end of file diff --git a/nui/src/main/java/org/terasology/nui/package-info.java b/nui/src/main/java/org/terasology/nui/package-info.java index ddebfe9021..65e75c31a6 100644 --- a/nui/src/main/java/org/terasology/nui/package-info.java +++ b/nui/src/main/java/org/terasology/nui/package-info.java @@ -27,6 +27,5 @@ *
  • Databinding support
  • * */ -@API package org.terasology.nui; +package org.terasology.nui; -import org.terasology.module.sandbox.API; diff --git a/nui/src/main/java/org/terasology/nui/properties/Checkbox.java b/nui/src/main/java/org/terasology/nui/properties/Checkbox.java index 47a95d62fa..9c1909a635 100644 --- a/nui/src/main/java/org/terasology/nui/properties/Checkbox.java +++ b/nui/src/main/java/org/terasology/nui/properties/Checkbox.java @@ -15,14 +15,11 @@ */ package org.terasology.nui.properties; -import org.terasology.module.sandbox.API; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -@API @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Checkbox { diff --git a/nui/src/main/java/org/terasology/nui/properties/OneOf.java b/nui/src/main/java/org/terasology/nui/properties/OneOf.java index aa6ecc9817..8eb833837c 100644 --- a/nui/src/main/java/org/terasology/nui/properties/OneOf.java +++ b/nui/src/main/java/org/terasology/nui/properties/OneOf.java @@ -15,18 +15,14 @@ */ package org.terasology.nui.properties; -import org.terasology.module.sandbox.API; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -@API public interface OneOf { @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) - @API public @interface Enum { String label() default ""; @@ -35,7 +31,6 @@ public interface OneOf { @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) - @API public @interface List { String label() default ""; @@ -46,7 +41,6 @@ public interface OneOf { @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) - @API public @interface Provider { String label() default ""; diff --git a/nui/src/main/java/org/terasology/nui/properties/OneOfProviderFactory.java b/nui/src/main/java/org/terasology/nui/properties/OneOfProviderFactory.java index e4b4ed75c5..9883bae990 100644 --- a/nui/src/main/java/org/terasology/nui/properties/OneOfProviderFactory.java +++ b/nui/src/main/java/org/terasology/nui/properties/OneOfProviderFactory.java @@ -16,14 +16,12 @@ package org.terasology.nui.properties; import com.google.common.collect.Maps; -import org.terasology.module.sandbox.API; import org.terasology.nui.databinding.Binding; import org.terasology.nui.itemRendering.ItemRenderer; import java.util.List; import java.util.Map; -@API public class OneOfProviderFactory { private Map> provider = Maps.newHashMap(); private Map> itemRenderers = Maps.newHashMap(); diff --git a/nui/src/main/java/org/terasology/nui/properties/PropertyProvider.java b/nui/src/main/java/org/terasology/nui/properties/PropertyProvider.java index 0fac5c9b65..063a51df9f 100644 --- a/nui/src/main/java/org/terasology/nui/properties/PropertyProvider.java +++ b/nui/src/main/java/org/terasology/nui/properties/PropertyProvider.java @@ -18,7 +18,6 @@ import com.google.common.base.Strings; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.terasology.assets.ResourceUrn; import org.joml.Vector3f; import org.terasology.nui.databinding.Binding; import org.terasology.nui.databinding.DefaultBinding; @@ -41,7 +40,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.reflections.ReflectionUtils.getAllFields; +import org.reflections.ReflectionUtils; /** * @@ -84,8 +83,8 @@ public PropertyProvider(ReflectFactory reflectFactory, OneOfProviderFactory oneO Class type = target.getClass(); CopyStrategyLibrary copyStrategies = new CopyStrategyLibrary(reflectFactory); - ClassMetadata classMetadata = new DefaultClassMetadata<>(new ResourceUrn("engine:empty"), type, reflectFactory, copyStrategies); - for (Field field : getAllFields(type)) { + ClassMetadata classMetadata = new DefaultClassMetadata<>("engine:empty", type, reflectFactory, copyStrategies); + for (Field field : ReflectionUtils.getAllFields(type)) { Annotation annotation = getFactory(field); if (annotation != null) { FieldMetadata fieldMetadata = (FieldMetadata) classMetadata.getField(field.getName()); diff --git a/nui/src/main/java/org/terasology/nui/properties/Range.java b/nui/src/main/java/org/terasology/nui/properties/Range.java index 733b4dba88..75f8cc193e 100644 --- a/nui/src/main/java/org/terasology/nui/properties/Range.java +++ b/nui/src/main/java/org/terasology/nui/properties/Range.java @@ -15,8 +15,6 @@ */ package org.terasology.nui.properties; -import org.terasology.module.sandbox.API; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -24,7 +22,6 @@ /** */ -@API @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Range { diff --git a/nui/src/main/java/org/terasology/nui/properties/TextField.java b/nui/src/main/java/org/terasology/nui/properties/TextField.java index a26a0f8176..87e7f04f11 100644 --- a/nui/src/main/java/org/terasology/nui/properties/TextField.java +++ b/nui/src/main/java/org/terasology/nui/properties/TextField.java @@ -15,14 +15,11 @@ */ package org.terasology.nui.properties; -import org.terasology.module.sandbox.API; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -@API @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface TextField { diff --git a/nui/src/main/java/org/terasology/nui/properties/package-info.java b/nui/src/main/java/org/terasology/nui/properties/package-info.java deleted file mode 100644 index c825bfa456..0000000000 --- a/nui/src/main/java/org/terasology/nui/properties/package-info.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright 2014 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@API package org.terasology.nui.properties; - -import org.terasology.module.sandbox.API; diff --git a/nui/src/main/java/org/terasology/nui/skin/UISkin.java b/nui/src/main/java/org/terasology/nui/skin/UISkin.java index 0f1938d3ff..5726b5aaf1 100644 --- a/nui/src/main/java/org/terasology/nui/skin/UISkin.java +++ b/nui/src/main/java/org/terasology/nui/skin/UISkin.java @@ -15,29 +15,18 @@ */ 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; +import java.util.Map; + /** */ -public class UISkin extends Asset { - - private UISkinData skinData; - - private transient AssetDataFile source; +public class UISkin { - public UISkin(ResourceUrn urn, AssetType assetType, UISkinData data) { - super(urn, assetType); - reload(data); - } + private Map skinFamilies; - @Override - protected void doReload(UISkinData data) { - this.skinData = data; - this.source = data.getSource(); + public UISkin(Map skinFamilies) { + this.skinFamilies = skinFamilies; } public UIStyle getDefaultStyle() { @@ -73,18 +62,14 @@ public UIStyle getStyleFor(String family, Class element, Str } public UIStyleFamily getFamily(String family) { - UIStyleFamily styleFamily = skinData.getFamily(family); + UIStyleFamily styleFamily = skinFamilies.get(family); if (styleFamily == null) { - return skinData.getFamily(""); + return skinFamilies.get(""); } return styleFamily; } public Iterable getFamilies() { - return skinData.skinFamilies.keySet(); - } - - public AssetDataFile getSource() { - return source; + return skinFamilies.keySet(); } } diff --git a/nui/src/main/java/org/terasology/nui/skin/UISkinBuilder.java b/nui/src/main/java/org/terasology/nui/skin/UISkinBuilder.java index f61db7f59c..4c2c5ddb52 100644 --- a/nui/src/main/java/org/terasology/nui/skin/UISkinBuilder.java +++ b/nui/src/main/java/org/terasology/nui/skin/UISkinBuilder.java @@ -190,7 +190,7 @@ public UISkinBuilder setStyleFragment(UIStyleFragment fragment) { return this; } - public UISkinData build() { + public UISkin build() { saveStyle(); Map skinFamilies = Maps.newHashMap(); @@ -206,7 +206,7 @@ public UISkinData build() { skinFamilies.put(family, baseSkin.getFamily(family)); } } - return new UISkinData(skinFamilies); + return new UISkin(skinFamilies); } else { UIStyle rootStyle = new UIStyle(currentStyle.getFont()); baseStyles.get("").applyTo(rootStyle); @@ -214,7 +214,7 @@ public UISkinData build() { for (String family : families) { skinFamilies.put(family, buildFamily(family, rootStyle)); } - return new UISkinData(skinFamilies); + return new UISkin(skinFamilies); } } diff --git a/nui/src/main/java/org/terasology/nui/skin/package-info.java b/nui/src/main/java/org/terasology/nui/skin/package-info.java index 9989d42131..35dbbb9517 100644 --- a/nui/src/main/java/org/terasology/nui/skin/package-info.java +++ b/nui/src/main/java/org/terasology/nui/skin/package-info.java @@ -17,6 +17,5 @@ /** * This package contains support for skinning nui - a UIStyle provides generic information on how to draw a widget, and a UISkin provides a hierarchy of styles. */ -@API package org.terasology.nui.skin; +package org.terasology.nui.skin; -import org.terasology.module.sandbox.API; diff --git a/nui/src/main/java/org/terasology/nui/translate/Translator.java b/nui/src/main/java/org/terasology/nui/translate/Translator.java index fc8bdfa0f0..6d92174d77 100644 --- a/nui/src/main/java/org/terasology/nui/translate/Translator.java +++ b/nui/src/main/java/org/terasology/nui/translate/Translator.java @@ -16,15 +16,12 @@ package org.terasology.nui.translate; -import org.terasology.module.sandbox.API; - import java.util.Locale; /** * A translation system that consists of different projects. An i18n string can either * contain a project URI or be used directly in a project. */ -@API public interface Translator { /** * If no perfect match is found for the default locale, fallback strategies will attempt to find the closest match. diff --git a/nui/src/main/java/org/terasology/nui/util/package-info.java b/nui/src/main/java/org/terasology/nui/util/package-info.java deleted file mode 100644 index b8cb298f2f..0000000000 --- a/nui/src/main/java/org/terasology/nui/util/package-info.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright 2020 MovingBlocks - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@API package org.terasology.nui.util; - -import org.terasology.module.sandbox.API; \ No newline at end of file diff --git a/nui/src/main/java/org/terasology/nui/widgets/package-info.java b/nui/src/main/java/org/terasology/nui/widgets/package-info.java index 1862b008c2..9942e609ff 100644 --- a/nui/src/main/java/org/terasology/nui/widgets/package-info.java +++ b/nui/src/main/java/org/terasology/nui/widgets/package-info.java @@ -17,6 +17,5 @@ /** * This package contains a collection of basic UIWidgets */ -@API package org.terasology.nui.widgets; +package org.terasology.nui.widgets; -import org.terasology.module.sandbox.API; diff --git a/nui/src/main/java/org/terasology/nui/widgets/treeView/Tree.java b/nui/src/main/java/org/terasology/nui/widgets/treeView/Tree.java index 858648b9e9..6eb35cdf0c 100644 --- a/nui/src/main/java/org/terasology/nui/widgets/treeView/Tree.java +++ b/nui/src/main/java/org/terasology/nui/widgets/treeView/Tree.java @@ -17,7 +17,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Lists; -import org.terasology.module.sandbox.API; import java.util.ArrayDeque; import java.util.Collection; @@ -33,7 +32,6 @@ * * @param Type of objects stored in the tree. */ -@API public abstract class Tree { private static final String NULL_NODE_ARGUMENT = "node argument is null"; private static final String NODE_ARGUMENT_INVALID_PARENT = "node argument is not a child of this tree"; diff --git a/nui/src/main/java/org/terasology/nui/widgets/treeView/TreeModel.java b/nui/src/main/java/org/terasology/nui/widgets/treeView/TreeModel.java index d5b8dae5bc..ae9bfaec2f 100644 --- a/nui/src/main/java/org/terasology/nui/widgets/treeView/TreeModel.java +++ b/nui/src/main/java/org/terasology/nui/widgets/treeView/TreeModel.java @@ -16,7 +16,6 @@ package org.terasology.nui.widgets.treeView; import com.google.common.collect.Lists; -import org.terasology.module.sandbox.API; import java.util.Iterator; import java.util.List; @@ -26,7 +25,6 @@ * @param Type of objects stored in the underlying tree. */ @SuppressWarnings("unchecked") -@API public class TreeModel { /** * A list of nodes, fetched from a {@code Tree} iterator. diff --git a/nui/src/main/java/org/terasology/nui/widgets/treeView/TreeMouseClickListener.java b/nui/src/main/java/org/terasology/nui/widgets/treeView/TreeMouseClickListener.java index a25f528243..663c92bcaf 100644 --- a/nui/src/main/java/org/terasology/nui/widgets/treeView/TreeMouseClickListener.java +++ b/nui/src/main/java/org/terasology/nui/widgets/treeView/TreeMouseClickListener.java @@ -15,12 +15,10 @@ */ package org.terasology.nui.widgets.treeView; -import org.terasology.module.sandbox.API; import org.terasology.nui.events.NUIMouseClickEvent; @FunctionalInterface -@API public interface TreeMouseClickListener { void onMouseClick(NUIMouseClickEvent event, Tree node); } diff --git a/nui/src/main/java/org/terasology/nui/widgets/treeView/package-info.java b/nui/src/main/java/org/terasology/nui/widgets/treeView/package-info.java index 86afa9f8c2..2f4af94911 100644 --- a/nui/src/main/java/org/terasology/nui/widgets/treeView/package-info.java +++ b/nui/src/main/java/org/terasology/nui/widgets/treeView/package-info.java @@ -17,6 +17,5 @@ /** * This package contains a collection of basic UIWidgets */ -@API package org.terasology.nui.widgets.treeView; +package org.terasology.nui.widgets.treeView; -import org.terasology.module.sandbox.API; diff --git a/settings.gradle b/settings.gradle index 4cea8bb38b..379024ac49 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,2 +1,2 @@ rootProject.name = 'TeraNUI' -include 'nui-input', 'nui', 'nui-reflect', 'nui-libgdx' +include 'nui-reflect', 'nui-input', 'nui', 'nui-gestalt5', 'nui-gestalt7', 'nui-libgdx'