Run ODI from Essbase CalcScript

Source vvsprog

Недавно на каком то из блогов видел пример запуска сценария ODI с помощью написанной странички.
Здесь опишу способ запуска сценария без написания странички, а с помощью бизнес правила Essbase.
Сценарий могут запуcкать конечные пользователи из Hyperion Planning и задавать параметры для сценария интеграции страндартным образом.

В моем случае нужно грузить данные из OEBS (Oracle E-Business Suite) в Hyperion Planning. Для чего была написана view на стороне OEBS
и создан ODI сценарий загрузки с параметрами в Hyperion Planning из view OEBS.

Среда: OEBS 12, Hyperion 11.1.1.3, Oracle Data Integrator 11.1.1.3, компиляция с помощью jdk1.6.0_21, в essbase.cfg прописан jre из jdk1.6.0_21

Для того чтобы это сделать напишем UDF – ODI.java:

Код

package com.oracle.essbase.cdf;

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import java.io.*;
import java.util.Map;
import java.util.HashMap;

import oracle.odi.runtime.agent.invocation.RemoteRuntimeAgentInvoker;
import oracle.odi.runtime.agent.invocation.StartupParams;
import oracle.odi.runtime.agent.invocation.ExecutionInfo;
import oracle.odi.runtime.agent.invocation.InvocationException;

public class ODI {

public static void main(String[] args) throws Exception, InvocationException{

InvokeODIScenario(“http://server:20910/oraclediagent;SUPERVISOR;12345678″,”ACTUALS_FROM_OEBS;001;DEVELOPMENT;5;WORKREP1”,
“PROJECT.Scenario=Actual;PROJECT.Version=Version1;PROJECT.Year=2011;PROJECT.P
eriod=Feb”);

}
public static void ThrowException(String pMessage) throws Exception{
throw new Exception(pMessage);
}

public static void InvokeODIScenario(String pAgentInfo,String pScenarioInfo,String pScenarioParams) throws Exception, InvocationException{

String[] arrAgentInfo = pAgentInfo.split(“;”);
if (arrAgentInfo.length < 3) ThrowException(“Please set Agent Info parameters (first parameter of function)”);

String[] arrScenarioInfo = pScenarioInfo.split(“;”);
if (arrScenarioInfo.length < 5) ThrowException(“Please set Scenario Info parameters (second parameter of function)”);

java.lang.String pScenName = arrScenarioInfo[0];
java.lang.String pScenVersion = arrScenarioInfo[1];

String[] arrScenarioParams = pScenarioParams.split(“;”);

Map<String,String> mp=new HashMap<String, String>();
for(int i=0;i<arrScenarioParams.length;i++)
{
if (arrScenarioParams[i].length() == 0)
continue;
String[] arrScenarioParam = arrScenarioParams[i].split(“=”);
if (arrScenarioParam.length < 2) ThrowException(“Please set Scenario parameters corretly in ParamName1=ParamValue1;ParamName2=ParamValue2 maner(third parameter of function)”);

mp.put(arrScenarioParam[0], arrScenarioParam[1]);
}

StartupParams pVariables = new StartupParams(mp);

java.lang.String pKeywords = null;
java.lang.String pContextCode = arrScenarioInfo[2];
java.lang.Integer pLogLevel = Integer.parseInt(arrScenarioInfo[3]);
java.lang.String pSessionName = null;
boolean pSynchronous = false;
java.lang.String pWorkRepName = arrScenarioInfo[4];
RemoteRuntimeAgentInvoker invoker = new RemoteRuntimeAgentInvoker(arrAgentInfo[0],arrAgentInfo[1],arrAgentInfo[2]);
ExecutionInfo info = invoker.invokeStartScenario(pScenName,pScenVersion,pVariables,pKeywords,pContextCode,pLogLevel,pSessionN
ame,pSynchronous,pWorkRepName);

}

}

Я компилировал с помощью apache ant. При компиляции и теcтировании понадобились следующие jar файлы ODI

Код
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\odi-core.jar;
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\commons-httpclient-3.1.jar;
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\spring-core.jar;
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\commons-logging-1.1.1.jar;
set CLASSPATH=%CLASSPATH%C:\app\oracle\product\11.1.1.3\odihome_1\oracledi.sdk\lib\commons-codec-1.3.jar;

Полученный ODI.jar и вышеперечисленные jar файлы кладем в %HYPERION_HOME%\products\Essbase\EssbaseServer\java\udf.

например у меня файлы данных Essbase лежат на другом диске и я положил по другому пути (E:\ESSDATA\java\udf)

Поднявшись на каталог выше правим файл udf.policy, добавляем строки:

Код

grant codeBase “file:${essbase.java.home}/udf/ODI.jar” {
permission java.security.AllPermission;
};

grant codeBase “file:${essbase.java.home}/udf/commons-codec-1.3.jar” {
permission java.security.AllPermission;
};

grant codeBase “file:${essbase.java.home}/udf/commons-httpclient-3.1.jar” {
permission java.security.AllPermission;
};

grant codeBase “file:${essbase.java.home}/udf/commons-logging-1.1.1.jar” {
permission java.security.AllPermission;
};

grant codeBase “file:${essbase.java.home}/udf/odi-core.jar” {
permission java.security.AllPermission;
};

grant codeBase “file:${essbase.java.home}/udf/spring-core.jar” {
permission java.security.AllPermission;
};

После чего нам надо перегрузить Essbase.

Создаем файл RegisterODI.msh

Код

set UserName = ‘admin’;
set Password = ‘password’;
set ServerName = ‘server’;

LOGIN $UserName $Password ON $ServerName;

CREATE OR REPLACE FUNCTION ‘@JInvokeODIScenario’
AS ‘com.oracle.essbase.cdf.ODI.InvokeODIScenario(String,String,String)’
SPEC ‘@JInvokeODIScenario(pAgentInfo,pScenarioInfo,pScenarioParams)’
COMMENT ‘Execute ODI Scenario’
with property runtime;

logout;
exit;

создаем RegisterODI.bat файл рядом

Код

set ARBORPATH=E:\ESSDATA
set ESSBASEPATH=C:\Hyperion\products\Essbase\EssbaseServer

C:\Hyperion\products\Essbase\EssbaseServer\bin\essmsh RegisterODI.msh
pause

Запускаем RegisterODI.bat, тут надо убедится что все функции зарегистрированны. Например из за того что у меня данные
лежат на другом диске у меня возникла проблема(essmsh не мог найти function registry, чтото типа того).
Я не стал разбираться какой файл есть function registry а просто перекопировал bin каталог в ARBORPATH из HYPERION_HOME\products\Essbase\EssbaseServer. После этого все зарегистрировалось. Возможно есть более “Прямой” способ это исправить:)

Пишем тестовое бизнес правило:

Код

FIX(…)
“Actual”(

@JInvokeODIScenario(“http://server:20910/oraclediagent;SUPERVISOR;12345678″,”IN_PLANS_PLAN1DATA_001;001;DEVELOPMENT;5;WORKREP1”,
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(
@CONCATENATE(“PROJECT.Scenario=”, @NAME([AAScenario])), “;PROJECT.Version=”), @NAME([AAVersion])),
“;PROJECT.Year=”),@NAME([AAYear])),”;PROJECT.Period=”),@NAME([AAPeriod]))
);

)
ENDFIX

В моем случае у @JInvokeODIScenario 3 параметра:
1 параметр адрес агента(http://server:20910/oraclediagent), логин(SUPERVISOR) и пароль(12345678) разделенные ;
2 параметр наименование сценария(IN_PLANS_PLAN1DATA_001), версия сценария (001), контекст(DEVELOPMENT), уровень логов(5),
имя рабочего репозитария(WORKREP1) разделенные ;
3 параметр это параметры сценария в формате ИМЯПАРАМЕТРА1=ЗНАЧЕНИЕ1;ИМЯПАРАМЕТРА2=ЗНАЧЕНИЕ2 итд. Можно указать пустое значение если нет параметра.

Бизнес правило можно подключить на форму Hyperion Planning (с помощью меню или просто на форме)
и дать возможность инициировать загрузку данных из различных источников конечным пользователям
(либо ограничить только определенным лицам стандартными механизмами безопасности).

Думаю все тоже самое можно сделать и с предыдущей версией ODI (Возможно другой набор API)

Удачи!