Был написан DSL для сохранения жаба объектов в текстовый формат, и восстановления их из него. На сферических JavaBean он работает отлично. Но вот досада например при сохранении java.util.Date() и некоторых других кривых объектов оно косячит. Как поступить? Пытаться определять deprecated properties или разрабатывать систему костылей и подпорок или есть третий путь?
@Test
public void singlesTest() {
System.out.println("parse singles");
ArrayList<Integer> al = new ArrayList<Integer>();
al.add(1);
Pair singles[] = new Pair[]{
new Pair("true", true),
new Pair("false", false),
new Pair("null", null),
new Pair("'null'", "null"),
new Pair("1", 1),
new Pair("[1]", al),
new Pair("1.4", 1.4f),
new Pair("1.4e4", 1.4e4f),
new Pair("-1.4e4", -1.4e4f),
new Pair("{}", new HashMap<Object, Object>()),
new Pair("java.awt.Dimension{}", new Dimension()),
new Pair("java.awt.Dimension[]", new Dimension()),
new Pair("java.awt.Dimension[]{}", new Dimension()),
new Pair("[]", new ArrayList<Object>())
};
for(Pair p: singles) {
System.out.println("Parse: " + p.s);
Object res = JDL.read(p.s);
System.out.println("\t res: " + res
+ " (" + (res==null?null:res.getClass()) + ")");
assertEquals(p.o, res);
}
}
/**
* Test of read method, of class JDL.
*/
@Test
public void simpleTestParse() {
System.out.println("parse");
String src = "{\n" +
"'set':{'\\'d':1, 'c':'ddas\\'da'},\n" +
"'key':[\n" +
" java.awt.Dimension[10, 330],\n" +
" java.awt.Dimension{width:20, height:160},\n" +
" java.awt.Dimension{width:30, height:80},\n" +
" java.awt.Dimension{width:40, height:40},\n" +
" java.awt.Dimension{width:50, height:20},\n" +
" java.awt.Rectangle{x:-23, y: 34, width:50, height:20}],\n" +
"'set1':{'\\'d':1, 'c':'ddas\\'da'},\n" +
"'key1':[\n" +
" java.awt.Dimension[10, 330],\n" +
" java.awt.Dimension{width:20, height:160},\n" +
" java.awt.Dimension{width:30, height:80},\n" +
" java.awt.Dimension{width:40, height:40},\n" +
" java.awt.Dimension{width:50, height:20},\n" +
" java.awt.Rectangle{x:-23, y: 34, width:50, height:20}]\n" +
"}\n";
Map<Object, Object> o = new HashMap<Object, Object>();
o.put("check", new Integer(14));
JDL.read(src, o);
HashMap<Object, Object> orig = new HashMap<Object, Object>();
orig.put("check", new Integer(14));
HashMap<Object, Object> subMap = new HashMap<Object, Object>();
subMap.put("'d", 1);
subMap.put("c", "ddas'da");
ArrayList<Object> subList = new ArrayList<Object>();
subList.add(new Dimension(10, 330));
subList.add(new Dimension(20, 160));
subList.add(new Dimension(30, 80));
subList.add(new Dimension(40, 40));
subList.add(new Dimension(50, 20));
subList.add(new Rectangle(-23, 34, 50, 20));
orig.put("set", subMap);
orig.put("set1", subMap);
orig.put("key", subList);
orig.put("key1", subList);
assertEquals(orig, o);
}
@Test
public void objectCreationTestParse() {
System.out.println("parseAndCreate");
String src = "javax.swing.JButton{" +
" preferredSize:java.awt.Dimension{" +
" width:10,height:100" +
" }," +
" text:\"some button\",\n" +
" visible:true" +
"}";
JButton b = JDL.read(src);
assertEquals(new Dimension(10,100), b.getPreferredSize());
assertEquals("some button", b.getText());
}
@Test
public void writeTest() {
System.out.println("read & write");
HashMap<Object, Object> orig = new HashMap<Object, Object>();
HashMap<Object, Object> subMap = new HashMap<Object, Object>();
Dimension d = new Dimension(200, -39);
T t = new T();
t.thiz = t;
t.aaa = d;
subMap.put(3, t);
ArrayList<Object> subList = new ArrayList<Object>();
subList.add(new Dimension(10, 330));
subList.add(t);
subList.add(new Empty());
subMap.put(34.5e35f, subList);
subMap.put("\u0000", t);
orig.put("aa", subMap);
orig.put("z'", d);
orig.put("rel", subList);
StringBuilder sb = new StringBuilder();
JDL.write(orig, sb);
System.out.println(sb);
Object res = JDL.read(sb);
assertEquals(orig, res);
}
Эта хрень используется для сохранения настроек (чтобы в ручную не ковырятся с каждым сложным объектов), для конфигов, для декларативного описания фильтров:
И еще для многих «штучек», потому кабы допилить его очень надо.