Planning Integration with the FDMEE Built-In Agent

When using the FDMEE integrated agent resolving the "java.lang.NoSuchMethodError: com.hyperion.planning.HspHALBean.endLoad()" error message may require adding HspJS.jar to the classpath...

Planning Integration with the FDMEE Built-In Agent

During a recent migration I was tasked with migrating some of my prior integration work that involved extracting metadata from Oracle DRM and loading it into Planning via the Oracle Data Integrator (ODI) Planning knowledge modules. In the prior environment the installer had setup a separate standalone agent, actually about 5 of them.  In the new environment I was asked if we could get by with just the FDMEE agent and without setting up separate standalone agents. I figured it would be a pretty easy task as the only thing that was not running from the FDMEE server in the prior environment was the DRM Batch Client, which could easily be placed on the FDMEE server being a .NET application and FDMEE was running on Windows.

As we began the migration things moved quite easy and my prior development methodology of creating all the artifacts in the Temp folders worked without issue. Within hours I was able to run the ASO build which would extract from DRM, update the dimension metadata, update several alias tables, validate the build and provide a report of changes to the cube versus the prior cube. Things seemed almost too good to be true, and they were...

When I ran one of the similar planning metadata update processes I immediately ran into the following error: java.lang.NoSuchMethodError: com.hyperion.planning.HspHALBean.endLoad().

org.apache.bsf.BSFException: exception from Jython:
Traceback (most recent call last):
  File "<string>", line 27, in <module>
	at com.hyperion.odi.planning.wrapper.PlanningWrapper.endLoadDimension(Unknown Source)

	at com.hyperion.odi.planning.ODIPlanningWriter.loadData(Unknown Source)

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

	at java.lang.reflect.Method.invoke(Method.java:606)


java.lang.NoSuchMethodError: java.lang.NoSuchMethodError: com.hyperion.planning.HspHALBean.endLoad()V

	at org.apache.bsf.engines.jython.JythonEngine.exec(JythonEngine.java:146)
	at com.sunopsis.dwg.codeinterpretor.SnpScriptingInterpretor.execInBSFEngine(SnpScriptingInterpretor.java:322)
	at com.sunopsis.dwg.codeinterpretor.SnpScriptingInterpretor.exec(SnpScriptingInterpretor.java:170)
	at com.sunopsis.dwg.dbobj.SnpSessTaskSql.scripting(SnpSessTaskSql.java:2472)
	at oracle.odi.runtime.agent.execution.cmd.ScriptingExecutor.execute(ScriptingExecutor.java:47)
	at oracle.odi.runtime.agent.execution.cmd.ScriptingExecutor.execute(ScriptingExecutor.java:1)
	at oracle.odi.runtime.agent.execution.TaskExecutionHandler.handleTask(TaskExecutionHandler.java:50)
	at com.sunopsis.dwg.dbobj.SnpSessTaskSql.processTask(SnpSessTaskSql.java:2913)
	at com.sunopsis.dwg.dbobj.SnpSessTaskSql.treatTask(SnpSessTaskSql.java:2625)
	at com.sunopsis.dwg.dbobj.SnpSessStep.treatAttachedTasks(SnpSessStep.java:577)
	at com.sunopsis.dwg.dbobj.SnpSessStep.treatSessStep(SnpSessStep.java:468)
	at com.sunopsis.dwg.dbobj.SnpSession.treatSession(SnpSession.java:2128)
	at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$2.doAction(StartSessRequestProcessor.java:366)
	at oracle.odi.core.persistence.dwgobject.DwgObjectTemplate.execute(DwgObjectTemplate.java:216)
	at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.doProcessStartSessTask(StartSessRequestProcessor.java:300)
	at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor.access$0(StartSessRequestProcessor.java:292)
	at oracle.odi.runtime.agent.processor.impl.StartSessRequestProcessor$StartSessTask.doExecute(StartSessRequestProcessor.java:855)
	at oracle.odi.runtime.agent.processor.task.AgentTask.execute(AgentTask.java:126)
	at oracle.odi.runtime.agent.support.DefaultAgentTaskExecutor$2.run(DefaultAgentTaskExecutor.java:82)
	at java.lang.Thread.run(Thread.java:745)
Caused by: Traceback (most recent call last):
  File "<string>", line 27, in <module>
	at com.hyperion.odi.planning.wrapper.PlanningWrapper.endLoadDimension(Unknown Source)

	at com.hyperion.odi.planning.ODIPlanningWriter.loadData(Unknown Source)

	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)

	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

	at java.lang.reflect.Method.invoke(Method.java:606)


java.lang.NoSuchMethodError: java.lang.NoSuchMethodError: com.hyperion.planning.HspHALBean.endLoad()V

	at org.python.core.Py.JavaError(Py.java:455)
	at org.python.core.Py.JavaError(Py.java:448)
	at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:177)
	at org.python.core.PyObject.__call__(PyObject.java:355)
	at org.python.core.PyMethod.__call__(PyMethod.java:215)
	at org.python.core.PyMethod.instancemethod___call__(PyMethod.java:221)
	at org.python.core.PyMethod.__call__(PyMethod.java:206)
	at org.python.core.PyObject.__call__(PyObject.java:397)
	at org.python.core.PyObject.__call__(PyObject.java:401)
	at org.python.pycode._pyx1.f$0(<string>:31)
	at org.python.pycode._pyx1.call_function(<string>)
	at org.python.core.PyTableCode.call(PyTableCode.java:165)
	at org.python.core.PyCode.call(PyCode.java:18)
	at org.python.core.Py.runCode(Py.java:1204)
	at org.python.core.Py.exec(Py.java:1248)
	at org.python.util.PythonInterpreter.exec(PythonInterpreter.java:172)
	at org.apache.bsf.engines.jython.JythonEngine.exec(JythonEngine.java:144)
	... 19 more
Caused by: java.lang.NoSuchMethodError: com.hyperion.planning.HspHALBean.endLoad()V
	at com.hyperion.odi.planning.wrapper.PlanningWrapper.endLoadDimension(Unknown Source)
	at com.hyperion.odi.planning.ODIPlanningWriter.loadData(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:606)
	at org.python.core.PyReflectedFunction.__call__(PyReflectedFunction.java:175)
	... 33 more

Following a little research I found the error message in some patch notes on Oracle support. Surely I thought FDMEE couldn't be missing the Planning JAR, and it must be a version mismatch or something. For longer than I would like to admit, I tried adding various versions of HspJS.jar to the odi_misc folder and modifying the java classpath to add the odi_misc folder in the Registry and other places with no success. Finally I tried executing the ODI Scenario via Local (No Agent) and was surprised that it immediately worked!?

Execution via Local (No Agent)
ODI Graphical User Interface (GUI) Libraries

After a while I came to the conclusion that FDMEE must not know where the planning JAR is and for some reason its not loading the files in the odi_misc folder. I'm fairly certain the standalone agent doesn't require this and maybe there is a way to get the FDMEE integrated agent to read the entire folder but I couldn't figure it out. I was forced to explicitly add the Planning JAR (HspJS.jar) to the classpath.

Changing the registry setting form:

-Djava.class.path=E:\Oracle\Middleware\oracle_common\modules\oracle.jdbc_11.1.1\ojdbc6dms.jar;E:\Oracle\Middleware\patch_wls1036\profiles\default\sys_manifest_classpath\weblogic_patch.jar;E:\Oracle\Middleware\jrockit_160_37\lib\tools.jar;E:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic_sp.jar;E:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic.jar;E:\Oracle\Middleware\modules\features\weblogic.server.modules_10.3.6.0.jar;E:\Oracle\Middleware\wlserver_10.3\server\lib\webservices.jar;E:\Oracle\Middleware\modules\org.apache.ant_1.7.1/lib/ant-all.jar;E:\Oracle\Middleware\modules\net.sf.antcontrib_1.1.0.0_1-0b2/lib/ant-contrib.jar;E:\Oracle\Middleware\oracle_common\soa\modules\commons-cli-1.1.jar;E:\Oracle\Middleware\oracle_common\soa\modules\oracle.soa.mgmt_11.1.1\soa-infra-mgmt.jar;E:\Oracle\Middleware\oracle_common\modules\oracle.jrf_11.1.1\jrf.jar;E:\Oracle\Middleware\wlserver_10.3\common\derby\lib\derbyclient.jar;E:\Oracle\Middleware\wlserver_10.3\server\lib\xqrl.jar;E:\Oracle\Middleware/odi/odi_misc;

to this:

-Djava.class.path=E:\Oracle\Middleware\oracle_common\modules\oracle.jdbc_11.1.1\ojdbc6dms.jar;E:\Oracle\Middleware\patch_wls1036\profiles\default\sys_manifest_classpath\weblogic_patch.jar;E:\Oracle\Middleware\jrockit_160_37\lib\tools.jar;E:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic_sp.jar;E:\Oracle\Middleware\wlserver_10.3\server\lib\weblogic.jar;E:\Oracle\Middleware\modules\features\weblogic.server.modules_10.3.6.0.jar;E:\Oracle\Middleware\wlserver_10.3\server\lib\webservices.jar;E:\Oracle\Middleware\modules\org.apache.ant_1.7.1/lib/ant-all.jar;E:\Oracle\Middleware\modules\net.sf.antcontrib_1.1.0.0_1-0b2/lib/ant-contrib.jar;E:\Oracle\Middleware\oracle_common\soa\modules\commons-cli-1.1.jar;E:\Oracle\Middleware\oracle_common\soa\modules\oracle.soa.mgmt_11.1.1\soa-infra-mgmt.jar;E:\Oracle\Middleware\oracle_common\modules\oracle.jrf_11.1.1\jrf.jar;E:\Oracle\Middleware\wlserver_10.3\common\derby\lib\derbyclient.jar;E:\Oracle\Middleware\wlserver_10.3\server\lib\xqrl.jar;E:\Oracle\Middleware/odi/odi_misc/planning/HspJS.jar;E:\Oracle\Middleware/odi/odi_misc;

You may have noticed that I placed the JAR in a sub-folder (planning) under odi_misc, I find that this makes it easier to tell what needs to be migrated later and also it provides some extra clues as to what the JAR might be used for since I am sure not everyone goes "HspJS.jar, oh well that's obviously planning..." Anyway if you found this and read it through to this point I hope it was helpful, and if you find a way to get FDMEE to read all the files in the a folder into the classpath let me know on twitter.