5 Replies Latest reply: Mar 22, 2013 5:16 PM by Duc T Nguyen RSS

    How to extend and customize EarHcmAnalytics.ear for OTBI reporting

    Duc T Nguyen
      The requirement is to extend the ADF objects that's serving the OBIEE application for OTBI, see the line between OBIEE and BI VO's in [OTBI architecture |http://docs.oracle.com/cd/E15586_01/fusionapps.1111/e21363/frameset.htm?ch02s01s01s01.html] and [VO for OTBI|http://docs.oracle.com/cd/E15586_01/fusionapps.1111/e15524/adv_bi_vos.htm#BEICJFHA] . In this case, the EAR file is EarHcmAnalytics.ear. This EAR file does not have any class that provide customization. I've compared this EAR EarHcmAnalytics.ear vs the EarHcmCompensation.ear to verify that there is no Ext*.jar nor any customization classes in the adf-config.xml. Although I've updated the jdev.conf's ide.extension.extra.search.path to point to the exploded hcmAnalytics EAR, JDev didn't find any customization class in the adf-config.xml. Normally, if there's a customization class specified and not class found, the error message would indicate that customization is disabled because it could not load the customization class.

      In the adf-config.xml for the hcmAnalytics EAR, I try to find any class similar to this section in the adf-config.xml for hcmCompensation EAR but found none.

      Excerpted from adf-config.xml of hcmCompensation EAR
      <mds:customization-class name="oracle.apps.fnd.applcore.customization.GlobalCC"/>
      <mds:customization-class name="oracle.apps.fnd.applcore.customization.SiteCC"/>
      <mds:customization-class name="oracle.apps.fnd.applcore.customization.EnterpriseCC"/>
      <mds:customization-class name="oracle.apps.hcm.common.core.HcmCountryCC"/>
      <mds:customization-class name="oracle.apps.hcm.common.core.HcmOrganizationCC"/>
      <mds:customization-class name="oracle.apps.fnd.applcore.customization.UserCC"/>

      Logically, having no customization class might make sense because this hcmAnalytics application is not end-user facing, i.e. NO USER would login to this application. It's strictly an integration point as the data source/web service to be invoked from the RPD of the OBIEE application. It's not intended to support the usual personalization, and different layer customization for a Fusion transactional application. This hcmAnalytics EAR has no UI classes, only ADF BC ones.

      However, the question remain, if my company need to change the VO objects that are exposed to the OTBI reports, how could we extend (changing existing seeded VO's in EAR) or Customize (adding new VO object into EAR)? Here are business scenarios for each case:

      1. Extend existing VO: A OTBI report need to have new column which is missing from current VO. My company need to modify/extend the existing VO using customization class or some other method, then re-import/add the new VO column into RPD so report could pull data from new column. What is the solution to extend/modify existing VO that are in EarHcmAnalytics.ear file?

      2. Add new VO: A company-specific security requirement need to pull in OTBI report data from new table(s) that doesn't existing in seeded Fusion DB. New VO must be built, preferably in same EarHcmAnalytics.ear so we reuse the same ADF connection pool in RPD. I need to create new VO, AM and put the JAR file in the APP-INF/lib. But we also need to rebuild/repackage the whole EarHcmAnalytics.ear file. So what kind of project we should use so we could add new VO and repackage the EarHcmAnalytics.ear properly because a MAR deployment is not sufficient.

      Lastly is there Oracle document somewhere that explain this setup? We have seen information for extending/customizing Fusion transactional Application (EarHcmCompensation.ear), but not the ADF-BC analytics application (EarHcmAnalytics.ear) for the OTBI. If such info exists, please provide links or notes.

      Thanks
      -Duc
        • 1. Re: How to extend and customize EarHcmAnalytics.ear for OTBI reporting
          Jani Rautiainen-Oracle
          I am not an expert on Analytics so will reach out to colleagues regarding this. In your case the requirement is to customize the ADF Business Components for which customization layer restricted to the Global layer. As such the "ide.extension.extra.search.path" is a bit irrelevant as it is used to detect product specific customization layers which would not be used in your use case. When you start the JDeveloper with "Oracle Fusion Applications Administrator Customization" role can you confirm:
          <li>Are any errors written to the log / console regarding customization classes
          <li>Are any layers displayed in the Customization Context window
          <li>If you filter a VO from the customizable archive are you able to choose "Customize" from the right click menu ? (Note the entry will be disabled unless Global customization layer is selected)

          For reference here are few related documents, while you are likely familiar with these including for other readers of the thread:
          <li>[url http://docs.oracle.com/cd/E15586_01/fusionapps.1111/e16691/ext_busobjedit.htm#BABJGCHD]Editing Existing Business Components
          <li>[url http://docs.oracle.com/cd/E15586_01/fusionapps.1111/e16691/ext_bip.htm]Customizing Reports and Analytics

          --
          Jani Rautiainen
          Fusion Applications Developer Relations
          https://blogs.oracle.com/fadevrel/
          • 2. Re: How to extend and customize EarHcmAnalytics.ear for OTBI reporting
            Duc T Nguyen
            Hi Jani,

            After startup, in Customization Context window, I see it defaults to "View without Customizations" radio box checked; Grey-ed out option to "Edit with following Customization Context"; nothing listed in layer; Customization Context: None; and link to "Overide global layer values".

            I could filter to any ADFbc VO object, but customize menu in right click is disabled (make sense since nothing is listed in customization context, e.g. global). If I click on link to "Override global layer values", it would open an empty XML window but I'm not clear what to override.

            My understanding is to allow customization, a few things must be present and set
            * Enabled Seeded customization is selected in project properties' ADF view
            * Project should have CustomizationLayerValues.xml file to define which layer can be customized (what to show in customization context list of the "Customization Context" window)
            * List of ADF customization class names in adf-config.xml
            * Actual customization classes found and loaded from classpath by JDev

            I assume that the hcmAnalytics should still have the CustomizationLayerValues.xml to allow global layer customization for ADFbc components rather than forcing client to make up/override this file. How can I get "global layer" to be visible for customization context?

            Complete message lists in Jdev's Messages - log pane after startup
            ----
            Customizations are disabled for the node "JobPVO.xml" because it is not part of the project contentset.
            Mar 22, 2013 8:48:21 AM oracle.security.jps.internal.common.util.StrictValidationEventHandler handleEvent
            WARNING: Failed to validate the xml content. SchemaLocation: schemaLocation value = 'http://xmlns.oracle.com/oracleas/schema/11/jps-config-11_1.xsd' must have even number of URI's. Location: unavailable.
            Mar 22, 2013 8:48:24 AM oracle.adf.share.ADFContext isHighPerformanceEnvEnabled
            WARNING: Exception while querying ExalogicOptimizationsEnabled Attribute
            Mar 22, 2013 8:48:25 AM oracle.adf.share.ADFContext isHighPerformanceEnvEnabled
            WARNING: Exception while querying ExalogicOptimizationsEnabled Attribute
            Mar 22, 2013 8:48:27 AM oracle.adf.share.ADFContext getCurrent
            WARNING: Automatically initializing a DefaultContext for getCurrent.
            Caller should ensure that a DefaultContext is proper for this use.
            Memory leaks and/or unexpected behaviour may occur if the automatic initialization is performed improperly.
            This message may be avoided by performing initADFContext before using getCurrent().
            For more information please enable logging for oracle.adf.share.ADFContext at FINEST level.



            Excerpted from Windows's cmd console after startup. Many many similar warning about missing extension.xml in all jars from hcmAnalytics EAR before this excerpt.
            -----
            java.io.FileNotFoundException: file:/C:/JDeveloper/EarHcmAnalytics.ear/APP-INF/lib/HcmBatchProcessCoreProcess.jar!/meta-
            inf/extension.xml
            at oracle.ide.net.JarIndex.getLOCFromHash(JarIndex.java:1259)
            at oracle.ide.net.JarIndex.getLOC(JarIndex.java:1164)
            at oracle.ide.net.JarIndex.access$1000(JarIndex.java:62)
            at oracle.ide.net.JarIndex$12.run(JarIndex.java:583)
            at oracle.ide.net.JarIndex$12.run(JarIndex.java:579)
            at oracle.ide.net.JarIndex.runLocked(JarIndex.java:1565)
            at oracle.ide.net.JarIndex.run(JarIndex.java:1472)
            at oracle.ide.net.JarIndex.openInputStream(JarIndex.java:578)
            at oracle.ide.net.JarURLFileSystemHelper.openInputStream(JarURLFileSystemHelper.java:381)
            at oracle.ide.net.URLFileSystem.openInputStream(URLFileSystem.java:1321)
            at oracle.ideimpl.jsr198.VirtualFileSystemHelperImpl.openInputStream(VirtualFileSystemHelperImpl.java:170)
            at javax.ide.net.VirtualFileSystem.openInputStream(VirtualFileSystem.java:1239)
            at javax.ide.extension.spi.JARExtensionSource.getInputStream(JARExtensionSource.java:123)
            at javax.ide.extension.spi.DependencyTree.loadMinimal(DependencyTree.java:105)
            at javax.ide.extension.spi.DependencyTree.buildTree(DependencyTree.java:176)
            at javax.ide.extension.ExtensionRegistry.loadExtensions(ExtensionRegistry.java:155)
            at oracle.ideimpl.extension.ExtensionManagerImpl.loadExtensions(ExtensionManagerImpl.java:510)
            at javax.ide.extension.ExtensionRegistry.initialize(ExtensionRegistry.java:381)
            at oracle.ideimpl.extension.ExtensionManagerImpl.initialize(ExtensionManagerImpl.java:954)
            at javax.ide.Service.getService(Service.java:68)
            at javax.ide.extension.ExtensionRegistry.getExtensionRegistry(ExtensionRegistry.java:400)
            at oracle.ide.ExtensionRegistry.getExtensionRegistry(ExtensionRegistry.java:191)
            at oracle.ide.IdeCore.startupImpl(IdeCore.java:1385)
            at oracle.ide.Ide.startup(Ide.java:703)
            at oracle.ideimpl.DefaultIdeStarter.startIde(DefaultIdeStarter.java:35)
            at oracle.ideimpl.Main.start(Main.java:184)
            at oracle.ideimpl.Main.main(Main.java:146)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.ide.boot.PCLMain.callMain(PCLMain.java:62)
            at oracle.ide.boot.PCLMain.main(PCLMain.java:54)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.classloader.util.MainClass.invoke(MainClass.java:128)
            at oracle.ide.boot.IdeLauncher.bootClassLoadersAndMain(IdeLauncher.java:189)
            at oracle.ide.boot.IdeLauncher.launchImpl(IdeLauncher.java:89)
            at oracle.ide.boot.IdeLauncher.launch(IdeLauncher.java:65)
            at oracle.ide.boot.IdeLauncher.main(IdeLauncher.java:54)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.ide.boot.Launcher.invokeMain(Launcher.java:713)
            at oracle.ide.boot.Launcher.launchImpl(Launcher.java:115)
            at oracle.ide.boot.Launcher.launch(Launcher.java:68)
            at oracle.ide.boot.Launcher.main(Launcher.java:57)
            java.io.FileNotFoundException: file:/C:/JDeveloper/EarHcmAnalytics.ear/APP-INF/lib/HcmBatchProcessCorePublicProcess.jar!
            /meta-inf/extension.xml
            at oracle.ide.net.JarIndex.getLOCFromHash(JarIndex.java:1259)
            at oracle.ide.net.JarIndex.getLOC(JarIndex.java:1164)
            at oracle.ide.net.JarIndex.access$1000(JarIndex.java:62)
            at oracle.ide.net.JarIndex$12.run(JarIndex.java:583)
            at oracle.ide.net.JarIndex$12.run(JarIndex.java:579)
            at oracle.ide.net.JarIndex.runLocked(JarIndex.java:1565)
            at oracle.ide.net.JarIndex.run(JarIndex.java:1472)
            at oracle.ide.net.JarIndex.openInputStream(JarIndex.java:578)
            at oracle.ide.net.JarURLFileSystemHelper.openInputStream(JarURLFileSystemHelper.java:381)
            at oracle.ide.net.URLFileSystem.openInputStream(URLFileSystem.java:1321)
            at oracle.ideimpl.jsr198.VirtualFileSystemHelperImpl.openInputStream(VirtualFileSystemHelperImpl.java:170)
            at javax.ide.net.VirtualFileSystem.openInputStream(VirtualFileSystem.java:1239)
            at javax.ide.extension.spi.JARExtensionSource.getInputStream(JARExtensionSource.java:123)
            at javax.ide.extension.spi.DependencyTree.loadMinimal(DependencyTree.java:105)
            at javax.ide.extension.spi.DependencyTree.buildTree(DependencyTree.java:176)
            at javax.ide.extension.ExtensionRegistry.loadExtensions(ExtensionRegistry.java:155)
            at oracle.ideimpl.extension.ExtensionManagerImpl.loadExtensions(ExtensionManagerImpl.java:510)
            at javax.ide.extension.ExtensionRegistry.initialize(ExtensionRegistry.java:381)
            at oracle.ideimpl.extension.ExtensionManagerImpl.initialize(ExtensionManagerImpl.java:954)
            at javax.ide.Service.getService(Service.java:68)
            at javax.ide.extension.ExtensionRegistry.getExtensionRegistry(ExtensionRegistry.java:400)
            at oracle.ide.ExtensionRegistry.getExtensionRegistry(ExtensionRegistry.java:191)
            at oracle.ide.IdeCore.startupImpl(IdeCore.java:1385)
            at oracle.ide.Ide.startup(Ide.java:703)
            at oracle.ideimpl.DefaultIdeStarter.startIde(DefaultIdeStarter.java:35)
            at oracle.ideimpl.Main.start(Main.java:184)
            at oracle.ideimpl.Main.main(Main.java:146)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.ide.boot.PCLMain.callMain(PCLMain.java:62)
            at oracle.ide.boot.PCLMain.main(PCLMain.java:54)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.classloader.util.MainClass.invoke(MainClass.java:128)
            at oracle.ide.boot.IdeLauncher.bootClassLoadersAndMain(IdeLauncher.java:189)
            at oracle.ide.boot.IdeLauncher.launchImpl(IdeLauncher.java:89)
            at oracle.ide.boot.IdeLauncher.launch(IdeLauncher.java:65)
            at oracle.ide.boot.IdeLauncher.main(IdeLauncher.java:54)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.ide.boot.Launcher.invokeMain(Launcher.java:713)
            at oracle.ide.boot.Launcher.launchImpl(Launcher.java:115)
            at oracle.ide.boot.Launcher.launch(Launcher.java:68)
            at oracle.ide.boot.Launcher.main(Launcher.java:57)
            java.io.FileNotFoundException: file:/C:/JDeveloper/EarHcmAnalytics.ear/APP-INF/lib/SvcBenefitsCoreRelationService_Common
            .jar!/meta-inf/extension.xml
            at oracle.ide.net.JarIndex.getLOCFromHash(JarIndex.java:1259)
            at oracle.ide.net.JarIndex.getLOC(JarIndex.java:1164)
            at oracle.ide.net.JarIndex.access$1000(JarIndex.java:62)
            at oracle.ide.net.JarIndex$12.run(JarIndex.java:583)
            at oracle.ide.net.JarIndex$12.run(JarIndex.java:579)
            at oracle.ide.net.JarIndex.runLocked(JarIndex.java:1565)
            at oracle.ide.net.JarIndex.run(JarIndex.java:1472)
            at oracle.ide.net.JarIndex.openInputStream(JarIndex.java:578)
            at oracle.ide.net.JarURLFileSystemHelper.openInputStream(JarURLFileSystemHelper.java:381)
            at oracle.ide.net.URLFileSystem.openInputStream(URLFileSystem.java:1321)
            at oracle.ideimpl.jsr198.VirtualFileSystemHelperImpl.openInputStream(VirtualFileSystemHelperImpl.java:170)
            at javax.ide.net.VirtualFileSystem.openInputStream(VirtualFileSystem.java:1239)
            at javax.ide.extension.spi.JARExtensionSource.getInputStream(JARExtensionSource.java:123)
            at javax.ide.extension.spi.DependencyTree.loadMinimal(DependencyTree.java:105)
            at javax.ide.extension.spi.DependencyTree.buildTree(DependencyTree.java:176)
            at javax.ide.extension.ExtensionRegistry.loadExtensions(ExtensionRegistry.java:155)
            at oracle.ideimpl.extension.ExtensionManagerImpl.loadExtensions(ExtensionManagerImpl.java:510)
            at javax.ide.extension.ExtensionRegistry.initialize(ExtensionRegistry.java:381)
            at oracle.ideimpl.extension.ExtensionManagerImpl.initialize(ExtensionManagerImpl.java:954)
            at javax.ide.Service.getService(Service.java:68)
            at javax.ide.extension.ExtensionRegistry.getExtensionRegistry(ExtensionRegistry.java:400)
            at oracle.ide.ExtensionRegistry.getExtensionRegistry(ExtensionRegistry.java:191)
            at oracle.ide.IdeCore.startupImpl(IdeCore.java:1385)
            at oracle.ide.Ide.startup(Ide.java:703)
            at oracle.ideimpl.DefaultIdeStarter.startIde(DefaultIdeStarter.java:35)
            at oracle.ideimpl.Main.start(Main.java:184)
            at oracle.ideimpl.Main.main(Main.java:146)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.ide.boot.PCLMain.callMain(PCLMain.java:62)
            at oracle.ide.boot.PCLMain.main(PCLMain.java:54)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.classloader.util.MainClass.invoke(MainClass.java:128)
            at oracle.ide.boot.IdeLauncher.bootClassLoadersAndMain(IdeLauncher.java:189)
            at oracle.ide.boot.IdeLauncher.launchImpl(IdeLauncher.java:89)
            at oracle.ide.boot.IdeLauncher.launch(IdeLauncher.java:65)
            at oracle.ide.boot.IdeLauncher.main(IdeLauncher.java:54)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at oracle.ide.boot.Launcher.invokeMain(Launcher.java:713)
            at oracle.ide.boot.Launcher.launchImpl(Launcher.java:115)
            at oracle.ide.boot.Launcher.launch(Launcher.java:68)
            at oracle.ide.boot.Launcher.main(Launcher.java:57)
            Mar 22, 2013 8:48:21 AM oracle.security.jps.internal.common.util.StrictValidationEventHandler handleEvent
            WARNING: Failed to validate the xml content. SchemaLocation: schemaLocation value = 'http://xmlns.oracle.com/oracleas/sc
            hema/11/jps-config-11_1.xsd' must have even number of URI's. Location: unavailable.
            WLS ManagedService is not up running. Fall back to use system properties for configuration.
            Mar 22, 2013 8:48:24 AM oracle.adf.share.ADFContext isHighPerformanceEnvEnabled
            WARNING: Exception while querying ExalogicOptimizationsEnabled Attribute
            Mar 22, 2013 8:48:25 AM oracle.adf.share.ADFContext isHighPerformanceEnvEnabled
            WARNING: Exception while querying ExalogicOptimizationsEnabled Attribute
            Mar 22, 2013 8:48:27 AM oracle.adf.share.ADFContext getCurrent
            WARNING: Automatically initializing a DefaultContext for getCurrent.
            Caller should ensure that a DefaultContext is proper for this use.
            Memory leaks and/or unexpected behaviour may occur if the automatic initialization is performed improperly.
            This message may be avoided by performing initADFContext before using getCurrent().
            For more information please enable logging for oracle.adf.share.ADFContext at FINEST level.
            • 3. Re: How to extend and customize EarHcmAnalytics.ear for OTBI reporting
              Vik Kumar-Oracle
              the log messages you have posted are not related to your problem and can be ignored.

              Vik
              • 4. Re: How to extend and customize EarHcmAnalytics.ear for OTBI reporting
                264098
                Customizing OTBI VOs is supported through the Fusion customization functionality (MDS). This is documented in the [Fusion Applications Extensibility Guide|http://docs.oracle.com/cd/E15586_01/fusionapps.1111/e16691/toc.htm]. Refer to the Customizing Reports and Analytics for the specifics on customizing OTBI.
                • 5. Re: How to extend and customize EarHcmAnalytics.ear for OTBI reporting
                  Duc T Nguyen
                  Hi Prandall - could you advise the section # for the link to Oracle doc that specifies how to setup JDev to customize existing VO and to add new VO into an seeded analytics EAR? The section 8.3.3 only mention creating new VO in a new EAR (i.e. make new connection pool, make new ear, deploy new app and import that into RPD). The other section only discuss BIP, RPD/webcat customization so they don't satisfy my company's requirement. Per business cases my 1st post, my team would like to change existing VO and to add new VO into existing hcmAnalytics EAR so that we don't have to manage new custom Fusion application.

                  When I try to set up the project to customize the hcmAnalytics EAR, JDev consider this EAR to be not customizable, e.g. no customization context is available. If you have information to allow customization of the hcmAnalytics, fscmAnalytics, or crmAnalytics EAR, please share the steps.

                  Thanks in advance.
                  -Duc