2929import org .mozilla .javascript .Wrapper ;
3030import org .mozilla .javascript .xml .XMLObject ;
3131
32+ import java .io .StringReader ;
33+
3234/**
3335 * JSObjectConvertor converts between OMElements and JavaScript E4X XML objects
3436 */
@@ -46,39 +48,82 @@ public JSOMElementConvertor() {
4648 }
4749
4850 public Object toScript (OMElement o ) {
49- XmlObject xml ;
5051 try {
51- xml = XmlObject .Factory .parse (o .getXMLStreamReader ());
52+ XmlObject xml = XmlObject .Factory .parse (o .getXMLStreamReader ());
53+
54+ Context cx = Context .enter ();
55+ try {
56+ // Enable E4X support
57+ cx .setLanguageVersion (Context .VERSION_1_6 );
58+ Scriptable tempScope = cx .initStandardObjects ();
59+
60+ // Wrap the XmlObject directly
61+ return cx .getWrapFactory ().wrap (cx , tempScope , xml , XmlObject .class );
62+
63+ } finally {
64+ Context .exit ();
65+ }
5266 } catch (Exception e ) {
5367 throw new RuntimeException ("exception getting message XML: " + e );
5468 }
55-
56- Context cx = Context .enter ();
57- try {
58-
59- Object wrappedXML = cx .getWrapFactory ().wrap (cx , scope , xml , XmlObject .class );
60- Scriptable jsXML = cx .newObject (scope , "XML" , new Object [] { wrappedXML });
61-
62- return jsXML ;
63-
64- } finally {
65- Context .exit ();
66- }
6769 }
6870
6971 public OMElement fromScript (Object o ) {
70- if (!(o instanceof XMLObject )) {
72+ if (!(o instanceof XMLObject ) && !( o instanceof Wrapper ) ) {
7173 return super .fromScript (o );
7274 }
7375
74- // TODO: E4X Bug? Shouldn't need this copy, but without it the outer element gets lost. See Mozilla bugzilla 361722
75- Scriptable jsXML = (Scriptable ) ScriptableObject .callMethod ((Scriptable ) o , "copy" , new Object [0 ]);
76- Wrapper wrapper = (Wrapper ) ScriptableObject .callMethod ((XMLObject )jsXML , "getXmlObject" , new Object [0 ]);
77- XmlObject xmlObject = (XmlObject )wrapper .unwrap ();
78- OMXMLParserWrapper builder = OMXMLBuilderFactory .createOMBuilder (xmlObject .newInputStream ());
79- OMElement omElement = builder .getDocumentElement ();
80-
81- return omElement ;
76+ try {
77+ XmlObject xmlObject = null ;
78+
79+ // Handle wrapped XmlObject
80+ if (o instanceof Wrapper ) {
81+ Object unwrapped = ((Wrapper ) o ).unwrap ();
82+ if (unwrapped instanceof XmlObject ) {
83+ xmlObject = (XmlObject ) unwrapped ;
84+ }
85+ }
86+
87+ // If we have an XMLObject but not a wrapped XmlObject, try the old approach
88+ if (xmlObject == null && o instanceof XMLObject ) {
89+ // TODO: E4X Bug? Shouldn't need this copy, but without it the outer element gets lost. See Mozilla bugzilla 361722
90+ Scriptable jsXML = (Scriptable ) ScriptableObject .callMethod ((Scriptable ) o , "copy" , new Object [0 ]);
91+
92+ try {
93+ // Try the old API first (getXmlObject)
94+ Wrapper wrapper = (Wrapper ) ScriptableObject .callMethod ((XMLObject )jsXML , "getXmlObject" , new Object [0 ]);
95+ xmlObject = (XmlObject )wrapper .unwrap ();
96+ } catch (Exception e ) {
97+ // Fallback for XMLBeans 5.x: use toXMLString() to get proper XML representation
98+ String xmlString = null ;
99+ try {
100+ // Try toXMLString() method first
101+ xmlString = (String ) ScriptableObject .callMethod ((XMLObject )jsXML , "toXMLString" , new Object [0 ]);
102+ } catch (Exception toXMLException ) {
103+ // If toXMLString() doesn't work, try toString()
104+ xmlString = ((XMLObject ) jsXML ).toString ();
105+ }
106+
107+ // Remove extra whitespace to match expected format
108+ String normalizedXML = xmlString .replaceAll (">\\ s+<" , "><" ).trim ();
109+ OMXMLParserWrapper builder = OMXMLBuilderFactory .createOMBuilder (
110+ new java .io .StringReader (normalizedXML ));
111+ OMElement omElement = builder .getDocumentElement ();
112+ return omElement ;
113+ }
114+ }
115+
116+ if (xmlObject != null ) {
117+ OMXMLParserWrapper builder = OMXMLBuilderFactory .createOMBuilder (xmlObject .newInputStream ());
118+ OMElement omElement = builder .getDocumentElement ();
119+ return omElement ;
120+ } else {
121+ throw new RuntimeException ("Unable to extract XmlObject from JavaScript object" );
122+ }
123+
124+ } catch (Exception e ) {
125+ throw new RuntimeException ("Failed to convert JavaScript XML to OMElement: " + e .getMessage (), e );
126+ }
82127 }
83128
84129}
0 commit comments