Jaxb質問の元の理由 JaxB参照が解決される
単純なフレームワークで同じ問題を処理することができなかったということでした:
http://old.nabble.com/Two-Phase-support-for-CycleStrategy--td34802791.html
今日、パーシスターコールで機能するものを、Jaxbの質問と同じポイントに戻しました。参照ではなくコピーを取得します。繰り返しになりますが、適切なリファレンスを備えたソリューションを探しています。今回はSimpleXMLフレームワークです。
この例には、他の質問のようにPersonではなく基本クラス「ModelElement」があります。それ以外の場合、問題は同じです。
ここでも、アンマーシャリングを2回呼び出して、PASS 1のすべてのIDを取得し、PASS2で作成されたルックアップHashMapから収集された結果を使用します。
適切な参照を取得するための解決策は何でしょうか?私の仮定では、呼び出された関数がアンマーシャリングの結果を実際に変更できるようにするコールバックを追加すると(ラッピングアプローチについては、Javaで出力パラメーターを使用する方法を参照)、トリックが実行されます(その間に投稿したJaxBソリューションと比較して) )。
Persister serializer = new Persister();
ModelElementSimpleXmlImpl.lookup.clear();
serializer.read(result, xml);
System.err.println("PASS 2");
serializer.read(result, xml);
このコードは、ModelElementSimpleXmlImpl基本クラスからのものです:..。
protected String ref;
/**
* getter for xsd:string/String id
* @return id
*/
@org.simpleframework.xml.Attribute(name="ref",required=false)
public String getRef() {
return ref;
}
/**
* setter for xsd:string/String id
* @param pid - new value for id
*/
@org.simpleframework.xml.Attribute(name="ref",required=false)
public void setRef(String pRef) {
ref=pRef;
}
private boolean debug=true;
/**
* show debug information
* @param title
* @param key
* @param me
* @param found
*/
public void showDebug(String title,String key,ModelElementSimpleXmlImpl me, ModelElementSimpleXmlImpl found) {
String deref="?";
if (found!=null)
deref="->"+found.getId()+"("+found.getClass().getSimpleName()+")";
if (debug)
System.err.println(title+": "+key+"("+me.getClass().getSimpleName()+")"+deref+" - "+this);
}
/**
* keep track of the elements already seen
*/
public static Map<String,ModelElementSimpleXmlImpl> lookup=new HashMap<String,ModelElementSimpleXmlImpl>();
@Validate
public void validate() {
ModelElementSimpleXmlImpl me=this;
String key=me.getId();
if (key!=null) {
showDebug("id",key,me,null);
lookup.put(key, me);
}
key=me.getRef();
if (key!=null) {
if (lookup.containsKey(key)) {
ModelElementSimpleXmlImpl meRef=lookup.get(key);
showDebug("ref",key,me,meRef);
me.setRef(null);
me.copyFrom(meRef);
} else {
if (debug)
showDebug("ref",me.getRef(),me,null);
}
}
}