Skip to content

Commit

Permalink
div. improvements
Browse files Browse the repository at this point in the history
---
 Signed-off-by: Peter Kriens <[email protected]>

Signed-off-by: Peter Kriens <[email protected]>
  • Loading branch information
pkriens committed Feb 7, 2024
1 parent d6505e3 commit b0c7459
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 9 deletions.
19 changes: 17 additions & 2 deletions aQute.libg/src/aQute/lib/json/EnumHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,40 @@

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;

public class EnumHandler extends Handler {
@SuppressWarnings("rawtypes")
final Class type;
final Map<String, Object> mapping = new HashMap<>();

public EnumHandler(Class<?> type) {
this.type = type;
for ( Object constant : type.getEnumConstants()) {
String s = JSONCodec.keyword(constant.toString().toLowerCase());
mapping.put(s, constant);
}
}

@Override
public void encode(Encoder app, Object object, Map<Object, Type> visited) throws IOException, Exception {
StringHandler.string(app, object.toString());
StringHandler.string(app, JSONCodec.keyword(object.toString()));
}

@Override
@SuppressWarnings("unchecked")
public Object decode(Decoder dec, String s) throws Exception {
return Enum.valueOf(type, s);
try {
return Enum.valueOf(type, s);
} catch (IllegalArgumentException e) {
Object result = mapping.get(s);
if (result != null) {
throw new IllegalArgumentException(
"enum constant " + s + " not found for " + type.getSimpleName() + " " + mapping.values());
}
return result;
}
}

}
7 changes: 7 additions & 0 deletions aQute.libg/src/aQute/lib/json/JSONCodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -570,4 +570,11 @@ public static String keyword(String name) {
return name;
}

public static String name(String key) {
if (keywords.contains(key)) {
return key + KEYWORD_SUFFIX;
}
return key;
}

}
12 changes: 6 additions & 6 deletions aQute.libg/src/aQute/lib/json/ObjectHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,14 @@ public Object decodeObject(Decoder r) throws Exception {
}

private Field getField(String key) {
if (JSONCodec.keywords.contains(key))
key = key + JSONCodec.KEYWORD_SUFFIX;
for (Field field : fields) {
int n = key.compareTo(field.getName());
if (n == 0)
if (key.equals(field.getName()))
return field;
}
String fixup = JSONCodec.name(key);
for (Field field : fields) {
if (fixup.equals(field.getName()))
return field;
if (n < 0)
return null;
}
return null;
}
Expand Down
2 changes: 1 addition & 1 deletion aQute.libg/src/aQute/lib/json/RecordHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ public void encode(Encoder enc, Object object, Map<Object, Type> visited) throws
if (!del.isEmpty())
enc.linebreak();

StringHandler.string(enc, a.name);
StringHandler.string(enc, JSONCodec.keyword(a.name));
enc.append(":");
enc.encode(value, a.type, visited);
del = ",";
Expand Down

0 comments on commit b0c7459

Please sign in to comment.