diff --git a/pom.xml b/pom.xml index 9c95e85..5e54f64 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ com.alterdekim.game actionScriptDecompiler - 0.0.5 + 0.0.6 jar SWFDissect diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashClass.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashClass.java new file mode 100644 index 0000000..1b9f827 --- /dev/null +++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashClass.java @@ -0,0 +1,12 @@ +package com.alterdekim.flash.decompiler.mapper; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface FlashClass { + String name() default ""; +} diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashMapper.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashMapper.java index cb6513c..ee925b2 100644 --- a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashMapper.java +++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashMapper.java @@ -1,12 +1,16 @@ package com.alterdekim.flash.decompiler.mapper; +import lombok.AllArgsConstructor; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; +import java.util.List; import java.util.Map; +import java.util.Optional; @Slf4j public class FlashMapper { @@ -38,4 +42,58 @@ public class FlashMapper { } return null; } + + public static void mapToObj(Map o, List objs) { + for( OutputObject object : objs ) { + String entryName = object.getObjectClass().getAnnotation(FlashClass.class).name(); + Map m = (Map) o.get(entryName); + if( object.getIsSimple() ) { + m.keySet().forEach(k -> { + try { + Object entry = object.getObjectClass().getDeclaredConstructor().newInstance(); + + Arrays.stream(object.getObjectClass().getDeclaredFields()) + .filter(f -> f.isAnnotationPresent(FlashValue.class)) + .forEach(f -> { + try { + f.setAccessible(true); + switch (f.getAnnotation(FlashValue.class).type()) { + case Id -> f.set(entry, Long.parseLong(k)); + case Value -> f.set(entry, m.get(k)); + } + } catch (IllegalAccessException e) { + log.error("FlashMapper valueSet error: {}", e); + } + }); + object.getCallback().onOutputObjectReady(entry); + } catch (InstantiationException | IllegalAccessException | InvocationTargetException | + NoSuchMethodException e) { + log.error("FlashMapper class error: {}", e.getMessage()); + } + }); + continue; + } + + m.keySet().forEach(k -> { + Long id = Long.parseLong(k); + Map obj = (Map) m.get(k); + Object entity = FlashMapper.mapToObj(obj, object.getObjectClass()); + Optional f1 = Arrays.stream(object.getObjectClass().getDeclaredFields()) + .filter(f -> f.isAnnotationPresent(FlashValue.class) && f.getAnnotation(FlashValue.class).type() == FlashValueType.Id) + .findFirst(); + if( f1.isEmpty() ) { + log.error("FlashMapper valueSet error; can't find Id field for object."); + return; + } + f1.get().setAccessible(true); + try { + f1.get().set(entity, id); + } catch (IllegalAccessException e) { + log.error("FlashMapper valueSet error: {}", e); + return; + } + object.getCallback().onOutputObjectReady(entity); + }); + } + } } diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashValue.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashValue.java new file mode 100644 index 0000000..b672d52 --- /dev/null +++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashValue.java @@ -0,0 +1,12 @@ +package com.alterdekim.flash.decompiler.mapper; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface FlashValue { + FlashValueType type() default FlashValueType.Value; +} diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashValueType.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashValueType.java new file mode 100644 index 0000000..cc69b58 --- /dev/null +++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/FlashValueType.java @@ -0,0 +1,6 @@ +package com.alterdekim.flash.decompiler.mapper; + +public enum FlashValueType { + Id, + Value; +} diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/OutputObject.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/OutputObject.java new file mode 100644 index 0000000..2e8e5a9 --- /dev/null +++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/OutputObject.java @@ -0,0 +1,12 @@ +package com.alterdekim.flash.decompiler.mapper; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class OutputObject { + private final Class objectClass; + private final Boolean isSimple; + private final OutputObjectCallback callback; +} \ No newline at end of file diff --git a/src/main/java/com/alterdekim/flash/decompiler/mapper/OutputObjectCallback.java b/src/main/java/com/alterdekim/flash/decompiler/mapper/OutputObjectCallback.java new file mode 100644 index 0000000..651328f --- /dev/null +++ b/src/main/java/com/alterdekim/flash/decompiler/mapper/OutputObjectCallback.java @@ -0,0 +1,5 @@ +package com.alterdekim.flash.decompiler.mapper; + +public interface OutputObjectCallback { + void onOutputObjectReady(Object entity); +}