как заставить классы, скомпилированные схемой, расширять определенный класс за пределы схемы

Нужна помощь в следующей ситуации: Пользователи могут создавать свои собственные структуры данных, которые хранятся в виде источников XSD с поддержкой JAXB, как показано ниже:

<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.

6
задан tshepang 5 May 2014 в 17:47
поделиться