Нужна помощь в следующих ситуациях:
Пользователи могут создавать свои собственные структуры данных, которые хранятся как готовые JAXB-источники XSD, как показано ниже:
<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>
После появления новой или измененной схемы она автоматически анализируется компилятором схемы, генерируя java-источники, компилируя их и упаковывая в пользовательские файлы jar:
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
// ......
И все было в порядке, пока не было решено, что все пользовательские классы должны расширять один определенный известный класс, скажем UserRootObject
:
package user.abc;
public class Group extends com.mycompany.xml.UserRootObject {
//
}
и
package user.abc;
public class Parameter extends com.mycompany.xml.UserRootObject {
//
}
Все на лету, я не могу заставить пользователей изменять свои файлы схемы, но я могу преобразовать их до генерации кода.
Похоже, у меня есть два варианта, чтобы представить это UserRootObject
: каким-то образом через JCodeModel
или каким-то образом преобразовать файлы схемы перед созданием исходных кодов Java.