Преобразование (автоматически сгенерированного?) EJB-кода из Websphere в Glassfish - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть унаследованное Java-приложение, созданное для работы в среде Websphere 7.0.Мы уходим от Websphere к Glassfish.Первоначальный разработчик этого кода не существует, и, как ожидается, нет документации.

Большинство преобразований просты.Однако код EJB 2.1 проблематичен;Сами определения bean-компонентов хороши, но есть много вспомогательного кода, который очень и очень тесно связан с библиотеками IBM Websphere и, похоже, не сможет выполнить преобразование без полного переписывания.

Пример:

/**
 * MyBeanAdaptorBinding_ebb6f53f
 */
public class MyBeanAdaptorBinding_ebb6f53f implements com.ibm.ws.ejbpersistence.beanextensions.EJBAdapterBinding {
    /**
     * getExtractor
     */
    public com.ibm.ws.ejbpersistence.dataaccess.EJBExtractor getExtractor() {
        // extractor for mypackage.entity.websphere_deploy.ORACLE_V11_1.MyBeanExtractor_ebb6f53f
        com.ibm.ws.ejbpersistence.dataaccess.AbstractEJBExtractor extractor =  new mypackage.entity.websphere_deploy.ORACLE_V11_1.MyBeanExtractor_ebb6f53f();
        extractor.setPrimaryKeyColumns(new int[] {1});
        extractor.setDataColumns(new int[] {1,2});
        return extractor;
    }
    /**
     * getInjector
     */
    public com.ibm.ws.ejbpersistence.beanextensions.EJBInjector getInjector() {
        return new mypackage.entity.websphere_deploy.ORACLE_V11_1.MyBeanInjectorImpl_ebb6f53f();
    }
    /**
     * getAdapter
     */
    public com.ibm.websphere.ejbpersistence.EJBToRAAdapter getAdapter() {
        return com.ibm.ws.rsadapter.cci.WSRelationalRAAdapter.createAdapter();
    }
    /**
     * getMetadata
     */
    public Object[] getMetadata() {

        java.lang.String[] primarykey, subhomes, composedObjs, composedObjImpls;
        com.ibm.ObjectQuery.metadata.OSQLExternalCatalogEntry[] cat;
        com.ibm.ObjectQuery.metadata.OSQLExternalColumnDef[] fields;
        cat = new com.ibm.ObjectQuery.metadata.OSQLExternalCatalogEntry[5];

        //-------------------------------------Alias-------------------------------------
        cat[0] = new com.ibm.ObjectQuery.metadata.OSQLExternalCatalogRDBAlias("My", "My1_Alias", "ORACLE", "MYSCHEMA.My", "My_My1_Table", 11, 0, 0);


        //-----------------------------------Table Type-----------------------------------
        fields = new com.ibm.ObjectQuery.metadata.OSQLExternalColumnDef[2];

        fields[0] = new com.ibm.ObjectQuery.metadata.OSQLExternalColumnDef("MyID", new String(), com.ibm.ObjectQuery.engine.OSQLConstants.NOT_APPLICABLE, new String(), com.ibm.ObjectQuery.engine.OSQLConstants.NOT_APPLICABLE, true, com.ibm.ObjectQuery.engine.OSQLSymbols._CHARACTER, 250, com.ibm.ObjectQuery.engine.OSQLConstants.NO_TYPE, true, 0, -1, 0, false);
        fields[1] = new com.ibm.ObjectQuery.metadata.OSQLExternalColumnDef("MyNM", new String(), com.ibm.ObjectQuery.engine.OSQLConstants.NOT_APPLICABLE, new String(), com.ibm.ObjectQuery.engine.OSQLConstants.NOT_APPLICABLE, true, com.ibm.ObjectQuery.engine.OSQLSymbols._CHARACTER, 250, com.ibm.ObjectQuery.engine.OSQLConstants.NO_TYPE, false, 0, -1, 0, false);
        primarykey = new String[1];
        primarykey[0] = "MyID";
        cat[1] = new com.ibm.ObjectQuery.metadata.OSQLExternalCatalogType("My", "My1_Table", null, fields, primarykey);


        //-----------------------------------Bean Type-----------------------------------
        fields = new com.ibm.ObjectQuery.metadata.OSQLExternalColumnDef[2];

        fields[0] = new com.ibm.ObjectQuery.metadata.OSQLExternalColumnDef("MyId", new String(), com.ibm.ObjectQuery.engine.OSQLConstants.NOT_APPLICABLE, new String(), com.ibm.ObjectQuery.engine.OSQLConstants.NOT_APPLICABLE, true, com.ibm.ObjectQuery.engine.OSQLSymbols._CHARACTER, 0, com.ibm.ObjectQuery.engine.OSQLConstants.NO_TYPE, false, 0, -1, 0, false);
        fields[1] = new com.ibm.ObjectQuery.metadata.OSQLExternalColumnDef("MyNm", new String(), com.ibm.ObjectQuery.engine.OSQLConstants.NOT_APPLICABLE, new String(), com.ibm.ObjectQuery.engine.OSQLConstants.NOT_APPLICABLE, true, com.ibm.ObjectQuery.engine.OSQLSymbols._CHARACTER, 0, com.ibm.ObjectQuery.engine.OSQLConstants.NO_TYPE, false, 0, -1, 0, false);
        primarykey = new String[1];
        primarykey[0] = "MyId";
        cat[2] = new com.ibm.ObjectQuery.metadata.OSQLExternalCatalogType("My", "My_BO", "mypackage.entity.MyBean", fields, primarykey);


        //--------------------------------------View--------------------------------------
        composedObjs = null;
        composedObjImpls = null;
        subhomes = null;
        cat[3] = new com.ibm.ObjectQuery.metadata.OSQLExternalCatalogView("My", "My_My_BO", "My_My1_Alias", composedObjs, composedObjImpls, 
        "select t1.MyID,t1.MyNM from _this t1", 
        null, subhomes, 
        0, null);



        cat[4] = new com.ibm.ObjectQuery.metadata.OSQLExternalSysApplOptions(14, false);

        return cat;
    }
    /**
     * createDataAccessSpecs
     */
    public java.util.Collection createDataAccessSpecs() throws javax.resource.ResourceException {
        <snipped long implementation of find/create/delete logic using com.ibm.ws.* classes>
    }
    /**
     * getProperties
     */
    public java.util.HashMap getProperties() {
        properties.put("USING_DB_AUTO_OCC_COLLISION_DETECTION", Boolean.FALSE);
        properties.put("NEED_REFRESH_AFTER_PERSISTENCE", Boolean.FALSE);
        return properties;
    }
    /**
     * MyBeanAdaptorBinding_ebb6f53f
     */
    public MyBeanAdaptorBinding_ebb6f53f() {
        properties = new java.util.HashMap();
        properties.put("VERSION", "7.0.0.0");
    }
    private java.util.HashMap properties;
}

Этот код (и большая часть остального) кажется автоматически сгенерированным: суффикс _ebb6f53f, полностью определенные имена классов и т. Д. Кроме того, это также MyBeanCacheEntry_ebb6f53f, MyBeanExtractor_ebb6f53f, MyBeanFunction6BeBeBeBeBeBeInBeject_Beet_Beject_Setплюс соответствующие реализации для тех, которые являются интерфейсами).Набор вспомогательных классов каждого компонента имеет свой суффикс шестнадцатеричной строки.

Соответствующий раздел файла ejb-jar.xml:

    <entity id="My">
        <ejb-name>My</ejb-name>
        <local-home>mypackage.entity.MyLocalHome</local-home>
        <local>mypackage.entity.MyLocal</local>
        <ejb-class>mypackage.entity.MyBean</ejb-class>
        <persistence-type>Container</persistence-type>
        <prim-key-class>java.lang.String</prim-key-class>
        <reentrant>false</reentrant>
        <cmp-version>2.x</cmp-version>
        <abstract-schema-name>My</abstract-schema-name>
        <cmp-field id="CMPAttribute_1133536288497">
            <field-name>MyId</field-name>
        </cmp-field>
        <cmp-field id="CMPAttribute_1133536292665">
            <field-name>MyNm</field-name>
        </cmp-field>
        <primkey-field>MyId</primkey-field>
    </entity>

Идентификаторы поля cmp взяты из OracleФайл Map.mapxmi.Ни ejb-jar.xml, ни Map.mapxmi, кажется, не связаны с Websphere, поэтому я не верю, что они требуют модификации, но если бы они сделали , я бы предположил, что они также автоматически генерируются.

Этоэто не мавен или муравей проект;процедура сборки выполняется непосредственно через Eclipse и не изменяет / автоматически генерирует код как часть сборки;он просто компилирует JAR, а затем упаковывает WAR и EAR.

Я не очень разбираюсь в EJB или Websphere.За последние несколько дней я много занимался поиском и чтением, но не смог удовлетворительно ответить на следующие вопросы:

  1. Как создавался этот код (инструмент Eclipse или Rational Application Developer, конкретная Websphere)инструмент и т. д.)?
  2. Как могли бы быть созданы файлы ejb-jar.xml и Map.mapxmi?
  3. Можно ли выполнить регенерацию для Glassfish без зависимостей com.ibm. *(желательно только с javax. * зависимостями)?
  4. Требуется ли этот тип кода даже для развертывания без Websphere?
...