Skip to content

Commit

Permalink
getJavaObject, reflected_internal_object, and ReflectionRefuse annota…
Browse files Browse the repository at this point in the history
…tion
  • Loading branch information
mcmonkey4eva committed Aug 3, 2022
1 parent b361174 commit 503c57d
Show file tree
Hide file tree
Showing 12 changed files with 103 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -309,4 +309,11 @@ default boolean tryAdvancedMatcher(String matcher) {
default ObjectTag refreshState() {
return this;
}

/**
* Return the appropriate Java object for this Denizen object, if any.
*/
default Object getJavaObject() {
return CoreUtilities.objectTagToJavaForm(this, false, false);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,11 @@ public String toString() {
return identify();
}

@Override
public Object getJavaObject() {
return data;
}

public static void registerTags() {

// <--[tag]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,11 @@ public ObjectTag setPrefix(String prefix) {
return this;
}

@Override
public Object getJavaObject() {
return getSeconds();
}

public static void registerTags() {

/////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -397,6 +397,11 @@ public String toString() {
return identify();
}

@Override
public Object getJavaObject() {
return element;
}

@Override
public boolean isUnique() {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@
import com.denizenscript.denizencore.tags.Attribute;
import com.denizenscript.denizencore.tags.ObjectTagProcessor;
import com.denizenscript.denizencore.tags.TagContext;
import com.denizenscript.denizencore.utilities.AsciiMatcher;
import com.denizenscript.denizencore.utilities.CoreConfiguration;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.ReflectionHelper;
import com.denizenscript.denizencore.utilities.*;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
Expand Down Expand Up @@ -93,6 +90,12 @@ public static void clearOldRefs() {
public long lastIdentified;

public JavaReflectedObjectTag(Object object) {
if (object == null) {
throw new NullPointerException();
}
if (object.getClass().isAnnotationPresent(ReflectionRefuse.class)) {
throw new RuntimeException("Cannot reflect into object of class " + object.getClass().getName() + " as it has a reflection refusal marked.");
}
this.object = object;
id = UUID.randomUUID();
}
Expand Down Expand Up @@ -147,6 +150,11 @@ public String toString() {
return identify();
}

@Override
public Object getJavaObject() {
return object;
}

public static void registerTags() {

// <--[tag]
Expand Down Expand Up @@ -467,6 +475,10 @@ public Object readFieldForTag(Attribute attribute, String fieldName) {
if (field == null) {
return null;
}
if (field.isAnnotationPresent(ReflectionRefuse.class) || field.getType().isAnnotationPresent(ReflectionRefuse.class)) {
attribute.echoError("Cannot read field '" + field.getName() + "' in class '" + field.getDeclaringClass().getName() + "' because it is marked for reflection refusal.");
return null;
}
if (object instanceof Class && !Modifier.isStatic(field.getModifiers())) {
attribute.echoError("Cannot read field '" + field.getName() + "' in class '" + field.getDeclaringClass().getName() + "' because the field is not static.");
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,15 @@ public String toString() {
return identify();
}

@Override
public Object getJavaObject() {
ArrayList<Object> result = new ArrayList<>();
for (ObjectTag obj : objectForms) {
result.add(obj.getJavaObject());
}
return result;
}

//////////////////////////////
// DSCRIPT ARGUMENT METHODS
/////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,15 @@ public String toString() {
return identify();
}

@Override
public Object getJavaObject() {
LinkedHashMap<String, Object> result = new LinkedHashMap<>();
for (Map.Entry<StringHolder, ObjectTag> pair : map.entrySet()) {
result.put(pair.getKey().str, pair.getValue().getJavaObject());
}
return result;
}

public ObjectTag getDeepObject(String key) {
if (!CoreUtilities.contains(key, '.')) {
return getObject(key);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@
import com.denizenscript.denizencore.tags.ObjectTagProcessor;
import com.denizenscript.denizencore.tags.TagContext;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.ReflectionRefuse;
import com.denizenscript.denizencore.utilities.YamlConfiguration;
import com.denizenscript.denizencore.utilities.debugging.Debug;

import java.io.File;

@ReflectionRefuse
public class SecretTag implements ObjectTag {

@ReflectionRefuse
public static YamlConfiguration secretsFile;

public static void load() {
Expand Down Expand Up @@ -104,6 +107,7 @@ public boolean isValid() {
return getValue() != null;
}

@ReflectionRefuse
public String getValue() {
if (secretsFile == null) {
return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,11 @@ public String toString() {
return identify();
}

@Override
public Object getJavaObject() {
return instant;
}

public int year() {
return instant.get(ChronoField.YEAR);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,15 @@
import com.denizenscript.denizencore.objects.ObjectFetcher;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.core.JavaReflectedObjectTag;
import com.denizenscript.denizencore.objects.core.ListTag;
import com.denizenscript.denizencore.objects.core.ScriptTag;
import com.denizenscript.denizencore.scripts.commands.Comparable;
import com.denizenscript.denizencore.scripts.containers.core.ProcedureScriptContainer;
import com.denizenscript.denizencore.scripts.queues.ScriptQueue;
import com.denizenscript.denizencore.utilities.CoreConfiguration;
import com.denizenscript.denizencore.utilities.CoreUtilities;
import com.denizenscript.denizencore.utilities.ReflectionRefuse;
import com.denizenscript.denizencore.utilities.ScriptUtilities;
import com.denizenscript.denizencore.utilities.codegen.TagNamer;
import com.denizenscript.denizencore.utilities.debugging.Debug;
Expand Down Expand Up @@ -330,6 +332,27 @@ public void generateCoreTags() {
}
return new ElementTag(object.tryAdvancedMatcher(attribute.getParam()));
}, "advanced_matches_text");

// <--[tag]
// @attribute <ObjectTag.reflected_internal_object>
// @returns JavaReflectedObjectTag
// @description
// Returns the reflected internal Java object for a given ObjectTag.
// -->
registerTag(JavaReflectedObjectTag.class, "reflected_internal_object", (attribute, object) -> {
Object obj = object.getJavaObject();
if (!CoreConfiguration.allowReflectionFieldReads) {
return null;
}
if (obj == null) {
return null;
}
if (obj.getClass().isAnnotationPresent(ReflectionRefuse.class)) {
attribute.echoError("Cannot reflect object " + object + " as its type '" + obj.getClass().getName() + "' is marked as refused for reflection.");
return null;
}
return new JavaReflectedObjectTag(obj);
});
}

public void registerFutureTagDeprecation(String name, String... deprecatedVariants) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,10 @@ else if (obj instanceof Map) {
}
}


/**
* Gets a Java form of an object, for serialization API usage.
* For raw object forms, use {@link ObjectTag#getJavaObject}
*/
public static Object objectTagToJavaForm(ObjectTag obj, boolean stringHolder, boolean nativeTypes) {
if (obj == null) {
return null;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.denizenscript.denizencore.utilities;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
* Annotates that a field/method/class should not be reflected into with Denizen scripting reflection tools like {@link com.denizenscript.denizencore.objects.core.JavaReflectedObjectTag}
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface ReflectionRefuse {
}

0 comments on commit 503c57d

Please sign in to comment.