Need help with following situation:
Users can generate their own data structures which are stored as JAXB-ready XSD sources like below:
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Group" type="Group"/>
<xs:element name="Parameter" type="Parameter"/>
<xs:complexType name="Group">
<xs:sequence>
<xs:element name="caption" type="xs:string" minOccurs="0"/>
<xs:element name="parameters" type="Parameter" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Parameter">
<xs:sequence>
<xs:element name="key" type="xs:string" minOccurs="0"/>
<xs:element name="group" type="Group" minOccurs="0"/>
<xs:element name="value" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
After new or modified schema appears it is automatically parsed by Schema compiler, java sources being generated, compiled and packaged into user jars:
SchemaCompiler sc = XJC.createSchemaCompiler();
// Input source for schema
InputSource is = new InputSource(new StringInputStream(objectPackage.getObjectSchema()));
// Parse
sc.parseSchema(is);
S2JJAXBModel model = sc.bind();
// Generate source
JCodeModel jCodeModel = model.generateCode(null, null);
jCodeModel.build(packageSourceDirectory);
// Compile and package
// ......
And everything was ok until it was decided that all user-generated classes must extend one specific known class, say UserRootObject
:
package user.abc;
public class Group extends com.mycompany.xml.UserRootObject {
//
}
and
package user.abc;
public class Parameter extends com.mycompany.xml.UserRootObject {
//
}
Everything is on the fly, I can not force users to modify their schema files but I can transform them prior to code generation.
Looks like I have two options to introduce that UserRootObject
: somehow via JCodeModel
or somehow transforming schema files before building Java sources.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…