@@ -31,13 +31,17 @@ class JSJAXBClass {
3131 private Map <String , JSJAXBField > fieldMap = new Hashtable <String , JSJAXBField >();
3232
3333 boolean isAnonymous ;
34+ boolean isXmlIDREF ;
35+
3436 JSJAXBField field ;
3537 QName qualifiedTypeName ;
3638
37- JSJAXBField valueField ;
39+ JSJAXBField xmlValueField , xmlIDField ;
40+
3841
39- JSJAXBClass (Class <?> javaClass , Object javaObject ) {
40- checkC$__ANN__ (this , javaClass , javaObject );
42+ JSJAXBClass (Class <?> javaClass , Object javaObject , boolean isXmlIDREF ) {
43+ checkC$__ANN__ (this , javaClass , javaObject , isXmlIDREF );
44+ this .isXmlIDREF = isXmlIDREF ;
4145 }
4246
4347 /**
@@ -48,7 +52,7 @@ class JSJAXBClass {
4852 * @return
4953 */
5054 @ SuppressWarnings ("unused" )
51- private static boolean checkC$__ANN__ (JSJAXBClass jsjaxbClass , Class <?> javaClass , Object javaObject ) {
55+ private static boolean checkC$__ANN__ (JSJAXBClass jsjaxbClass , Class <?> javaClass , Object javaObject , boolean isXmlIDREF ) {
5256 boolean isTop = true ;
5357 while (javaClass != null ) {
5458
@@ -57,15 +61,12 @@ class JSJAXBClass {
5761// ['cb','String',['@XmlAttribute(namespace="www.jalview.org2")']],
5862// ['bytes','[array]',['@XmlAttribute']]];
5963
60- Object clazz = (/** @j2sNative javaClass.$clazz$ || */
61- null );
64+ Object clazz = (/** @j2sNative javaClass.$clazz$ || */ null );
6265 if (clazz == null )
6366 break ;
64- Object [][][] jsdata = (/** @j2sNative clazz.__ANN__ || */
65- null );
66- String className = (/** @j2sNative clazz.__CLASS$NAME__ || clazz.__CLASS_NAME__ || */
67- null );
68-
67+ Object [][][] jsdata = (/** @j2sNative clazz.__ANN__ || */ null );
68+ String className = (/** @j2sNative clazz.__CLASS$NAME__ || clazz.__CLASS_NAME__ || */ null );
69+
6970 if (!isTop ) {
7071 className = null ;
7172 }
@@ -83,9 +84,8 @@ class JSJAXBClass {
8384 JSJAXBClass addTypeData (Object [][][] jsdata , String className , Object javaObject ) {
8485 for (int i = 0 ; i < jsdata .length ; i ++) {
8586 JSJAXBField field = new JSJAXBField (this , jsdata [i ], javaObject , fields .size (), propOrder );
86- addField (field );
87+ addField (field );
8788 }
88-
8989 for (int i = propOrder .size (); --i >= 0 ;) {
9090 String prop = propOrder .get (i );
9191 JSJAXBField field = fieldMap .get (prop );
@@ -95,7 +95,7 @@ JSJAXBClass addTypeData(Object[][][] jsdata, String className, Object javaObject
9595 new Object [][] { new Object [] { prop , null , null , null }, new Object [] { "@XmlElement" } },
9696 javaObject , fields .size (), null ));
9797 }
98- }
98+ }
9999 return this ;
100100 }
101101
@@ -105,7 +105,7 @@ private void addField(JSJAXBField field) {
105105 fieldMap .put (field .javaName , field );
106106 }
107107
108- JSJAXBField getFieldFromJavaName (String javaName ) {
108+ JSJAXBField getFieldFromJavaNameForMarshaller (String javaName ) {
109109 return fieldMap .get (javaName );
110110 }
111111
@@ -116,7 +116,6 @@ static String getXmlNameFromClassName(String className) {
116116 return className ;
117117 }
118118
119- final static Map <String , JSJAXBField > bindingMap = new Hashtable <String , JSJAXBField >();
120119 // private static boolean hasNull(Object[] list) {
121120 // for (int i = list.length; --i >= 0;)
122121 // if (list[i] == null)
@@ -131,48 +130,61 @@ static String getXmlNameFromClassName(String className) {
131130 // return false;
132131 // }
133132 //
134- public String defaultNamespace ;
133+ String defaultNamespace ;
135134 private String [] seeAlso ;
135+ final Map <String , JSJAXBField > bindingMap = new Hashtable <String , JSJAXBField >();
136+ final static Map <String , JSJAXBField > seeAlsoMap = new Hashtable <String , JSJAXBField >();
136137
137138 void prepareForUnmarshalling (String defaultNamespace ) {
138139 this .defaultNamespace = defaultNamespace ;
139140 if (seeAlso != null ) {
140141 for (int i = 0 ; i < seeAlso .length ; i ++) {
141142 try {
142- JSJAXBClass jaxbClass = new JSJAXBClass ( Class .forName (seeAlso [i ]), null );
143- bindQNamesForField ( jaxbClass . fields . get ( 0 ) );
143+ Class <?> cl = Class .forName (seeAlso [i ]);
144+ addSeeAlso ( cl );
144145 System .out .println ("JSJAXBClass seeAlso: " + seeAlso [i ]);
145146 } catch (ClassNotFoundException e ) {
146147 System .out .println ("JSJAXBClass[" + i + "] not found: " + seeAlso [i ]);
147148 }
148149 }
149150 }
150151 for (int i = 0 ; i < fields .size (); i ++) {
151- bindQNamesForField (fields .get (i ));
152+ JSJAXBField field = fields .get (i );
153+ bindQName (bindingMap , field .qualifiedName , field );
154+ bindQName (bindingMap , field .qualifiedWrapName , field );
155+ bindQName (bindingMap , field .qualifiedTypeName , field );
152156 }
153157 }
154158
155- private void bindQNamesForField (JSJAXBField field ) {
156- bindQName (field .qualifiedName , field );
157- bindQName (field .qualifiedWrapName , field );
158- bindQName (field .qualifiedTypeName , field );
159+ void addSeeAlso (Class <?> cl ) {
160+ JSJAXBClass jaxbClass = new JSJAXBClass (cl , null , false );
161+ JSJAXBField field = jaxbClass .fields .get (0 );
162+ bindQName (seeAlsoMap , field .qualifiedName , field );
163+ bindQName (seeAlsoMap , field .qualifiedWrapName , field );
164+ bindQName (seeAlsoMap , field .qualifiedTypeName , field );
159165 }
160-
161- private void bindQName (QName q , JSJAXBField field ) {
166+
167+ private void bindQName (Map < String , JSJAXBField > map , QName q , JSJAXBField field ) {
162168 if (q == null )
163169 return ;
164- bindingMap .put (q .getLocalPart (), field );
170+ map .put (q .getLocalPart (), field );
165171 String namespace = q .getNamespaceURI ();
166172 if (namespace .length () == 0 )
167173 namespace = defaultNamespace ;
168174 if (namespace != null )
169- bindingMap .put (namespace + ":" + q .getLocalPart (), field );
175+ map .put (namespace + ":" + q .getLocalPart (), field );
170176 //System.out.println("JSJAXBClass#binding " + namespace + ":" + q.getLocalPart() + "->" + field.javaName);
171177 }
172178
173179 JSJAXBField getFieldFromQName (QName qName ) {
174180 String key = qName .getNamespaceURI () + ":" + qName .getLocalPart ();
175181 JSJAXBField f = bindingMap .get (key );
182+ if (f == null )
183+ f = bindingMap .get (qName .getLocalPart ());
184+ if (f == null )
185+ f = seeAlsoMap .get (key );
186+ if (f == null )
187+ f = seeAlsoMap .get (qName .getLocalPart ());
176188 return f ;
177189 }
178190
@@ -201,7 +213,7 @@ static boolean isMarshallable(JSJAXBField field) {
201213 try {
202214 if (classMap .containsKey (javaClassName ))
203215 return classMap .get (javaClassName ).booleanValue ();
204- isMarshallable = (checkC$__ANN__ (null , Class .forName (javaClassName ), null ));
216+ isMarshallable = (checkC$__ANN__ (null , Class .forName (javaClassName ), null , false ));
205217 } catch (ClassNotFoundException e ) {
206218 System .out .println ("JSJAXBClass: class was not found: " + javaClassName );
207219 e .printStackTrace ();
@@ -213,11 +225,11 @@ static boolean isMarshallable(JSJAXBField field) {
213225
214226 static Map <String , JSJAXBClass > knownClasses = new Hashtable <>();
215227
216- static JSJAXBClass newInstance (Class <?> javaClass , Object javaObject ) {
228+ static JSJAXBClass newUnmarshalledInstance (Class <?> javaClass , Object javaObject ) {
217229 String name = javaClass .getCanonicalName ();
218230 JSJAXBClass jjc = knownClasses .get (name );
219231 if (jjc == null ) {
220- jjc = new JSJAXBClass (javaClass , javaObject );
232+ jjc = new JSJAXBClass (javaClass , javaObject , false );
221233 knownClasses .put (name , jjc );
222234 return jjc ;
223235 }
0 commit comments