Рефакторинг XSD и/или генерация кода Java

Мне дали устаревший набор XSD для сервисов, предоставляемых моим приложением, которые остро нуждаются в рефакторинге. Поскольку у некоторых потребительских приложений нет команды разработчиков, я не могу изменить результат и схему. Однако я могу делать с реальными файлами все, что захочу.

Вот моя настройка каталога:

  • root
    • subdir1
      • common
      • разработка
    • subdir2
      • common
      • разработка

Предположим для простоты, что приращение версии между файлами добавляет элемент в комплексный тип, так что предыдущую версию можно повторно применить как базовый/суперкласс.

Теперь в subdir1/common у меня могут быть Include_v01.xsd и Include_v02.xsd. В subdir1/development у меня может быть svc1_v01.xsd, который использует Include_v01.xsd, и svc1_v02.xsd, который использует Include_v02.xsd.

В Subdir2/common у меня могут быть Include_v02.xsd и Include_v03.xsd. В subdir2/developmen у меня могут быть svc2_v01.xsd, который использует Include_v02.xsd, и svc2_v02.xsd, который использует include_v03.xsd.

У меня ~20 таких подкаталогов. У меня около 1500 файлов XSD в этих каталогах. Каждый xsd может иметь несколько включений, которые сами могут иметь несколько включений, которые сами могут иметь несколько включений и т. д.

В конечном счете, я хотел бы реорганизовать их в их наиболее простую форму, где у меня будет, например, только одна копия Include_v02.xsd, и где Include_v02.xsd фактически строится на основе Include_v01.xsd, а не является полностью отдельной копией. . Да какой-то придурок просто скопировал файл, переименовал его и добавил одно поле. Затем он скопировал его в каждый подкаталог, в котором он будет использоваться.

Еще более важно иметь возможность генерировать классы Java в аналогичной структуре.

Прямо сейчас лучшее, что я могу сделать, это запустить xjc для каталогов и скомпилировать схему каждой службы в отдельный пакет, поэтому теперь у меня есть тонны копий объекта Include_v02 в различных пакетах Java. Я должен сделать это таким образом, потому что схема не версионировалась и не изменялась между версиями. Тот же идиот просто скопировал файл, переименовал его и добавил новый элемент, сохранив корневой элемент и никаких других отличительных признаков.

Это сложная задача, и я бы согласился на какой-то способ легко копировать/объединять объекты Java или даже просто копировать между идентичными объектами Java в разных пакетах.

Файлы эпизодов, как указано в здесь, не похоже, что это было бы лучше, чем скрипт, который я использую для генерации вещей сейчас, поскольку мне пришлось бы очень тщательно вычислять каждый корневой элемент, учитывая используемую многоуровневую вложенность.

РЕДАКТИРОВАТЬ ============================= Если бы у меня было в Include_v01.xsd следующее:

<complexType name="cmplxtp">
    <complexContent><sequence>
         <element name="st1" type="string"/>
     </complexContent></sequence>
</complexType>

а в Include_v02.xsd у меня было что-то вроде

<complexType name="cmplxtp">
    <complexContent><sequence>
         <element name="st1" type="string"/>
         <element name="st2" type="string"/>
     </complexContent></sequence>
</complexType>

хотелось бы какую-нибудь комбинацию

либо XSD рефакторинг, чтобы быть

Include_v01.xsd тот же Include_v02.xsd

OR

Все отдельные элементы (сложные или простые), оставленные в Include_v01.xsd Include_v02 для включения Include_v01.xsd, с добавлением только новых элементов

OR

два класса Java

package pack1;
class cmplxtp {
    public String st1;
}

а также

package pack2;
class cmplxtp extends pack1.cmplxtp  {
    public String st2;
}

Классы Java являются для меня наиболее важными, но все, что помогает достичь этого, было бы выдающимся.

Если все это невозможно, просто или того стоит, я также был бы более чем благодарен за какой-то простой способ копирования идентичных объектов из одного в другой, если они существуют в разных пакетах. Я просто очень хочу упростить свою кодовую базу, у меня около 160 сервисов, каждый со многими версиями, и каждый versoin может включать ОДИНАКОВЫЙ ТОЧНЫЙ файл. Это означает, что в моем сгенерированном коде у меня может быть 300 или более определений одного и того же класса, но в разных пакетах из-за скопированных включений.


person Josh Winkler    schedule 14.05.2012    source источник
comment
Не могли бы вы уточнить, идентичны ли файлы с одинаковыми именами, независимо от пути к папке? Можете ли вы описать, что вы видите в рефакторинге набора? Например, весь контент в одном и том же пространстве имен помещается в один XSD, что я бы назвал самой простой формой, см. это в качестве отправной точки. Рефакторинг, подобный описанному вами, возможен с помощью QTAssistant - я связан с ним; тем не менее, я ожидаю, что какой-нибудь пользовательский скрипт...   -  person Petru Gardea    schedule 14.05.2012
comment
Для этих целей можно предположить, что одноименные файлы идентичны. Для рефакторинга я готов принять практически любое форматирование. Помещение их в XSD с одним пространством имен не сработает, поскольку Include_v02.xsd совпадает с Include_v01.xsd, но с дополнительным элементом в v02. Если бы все они были в одном XSD, между версиями 1 и 2 возникло бы противоречие, и обе они использовали бы одно и то же имя для элементов. Лучшим решением было бы по существу оставить XSD версии 1, а XSD версии 2 использовать элементы версии 1 в качестве расширений, а затем добавить соответствующие новые подэлементы.   -  person Josh Winkler    schedule 14.05.2012
comment
В качестве примера: Include_v01.xsd может определить ‹имя элемента=cmpl1›‹complexType›‹имя элемента=st1 type=string/›‹/complexType›‹/element› В качестве примера: Include_v02.xsd может определить ‹имя элемента=cmpl1 ›‹complexType›‹element name=st1 type=string/›‹element name=str2 type=string›‹/complexType›‹/element› Таким образом, вы можете увидеть коллизию, и почему я не могу просто указать все на последнюю версия каждого XSD   -  person Josh Winkler    schedule 14.05.2012
comment
До сих пор не ясно, как вы будете это делать: каким будет новое имя для расширенного типа; что тогда будет ссылаться на новый тип? Это вызывает цепную реакцию, которую вам нужно тщательно определить. Я заинтересован в том, чтобы узнать больше о вашей проблеме и о том, нужно ли что-то с ней делать, взамен я предлагаю вам использовать мой инструмент для того, что вам нужно. Если вы заинтересованы, пожалуйста, свяжитесь со мной напрямую, используя электронную почту поддержки на моем веб-сайте. Если выйдет что-то хорошее, я опубликую решение в качестве ответа здесь.   -  person Petru Gardea    schedule 15.05.2012
comment
Я бы с удовольствием использовал QTAssistant, но у нас нет бюджета на новые инструменты. Мне не хватает места в одном комментарии, поэтому вместо этого я отредактирую вопрос, чтобы добавить разъяснения.   -  person Josh Winkler    schedule 15.05.2012
comment
Если вы в конечном итоге будете использовать его на основе этого сотрудничества, я предложу бесплатную лицензию, так что, надеюсь, это снизит бюджетное ограничение.   -  person Petru Gardea    schedule 15.05.2012
comment
Liquid XML Studio позволяет проводить рефакторинг XSD, изменения имени и типа отраженные там ссылки и элементы могут быть преобразованы в сложные типы. Вы также можете легко вырезать и вставлять элементы между схемами. Он также имеет средство просмотра XSD-зависимостей, которое отображает дерево включения. .   -  person Sprotty    schedule 29.05.2012