28 июн. 2010 г.

Использование CDF (часть II)

Как передать в CDF значение переменной бизнес-правила?

К сожелению Java-класс, описаный в первой части, имеет ряд ограничений:
  • Невозможно передать значение переменной бизнес-правила
  • Нельзя использовать внутри FIX, получать код возврата

Что нужно сделать, чтобы CDF работала:
  • Настроить Essbase (см. часть I)
  • Создать и скомпилировать Java-класс
  • Настроить безопасность
  • Зарегистрировать Java-функцию в Essbase

1. Настраиваем Essbase.

см. часть I

2. Создаем и компилируем Java-класс.

2.1. Создаем файл ARBORPATH/java/udf/RunCmd.java
import java.util.*;
import java.io.*;

public class EssbaseRuRunTime {
public static void main(com.hyperion.essbase.calculator.Context ctx, String[] args)
{
int i,  n = args.length;
String Str = args[0];

for (i=1; i
Str = Str + " " + args[i];
}

try {Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(Str);
int exitVal = proc.waitFor();
System.out.println(args[0]+" ExitValue: " + exitVal);
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.out.println(args[0]);
}

}
}
2.2 Компилируем класс из каталога, где он расположен
javac RunCmd.java
jar cf RunCmd.jar RunCmd.class
Примечание: компилировать версией Java, которая инсталирована с Essbase

3. Настраиваем безопасность

3.1. В файл ARBORPATH/java/udf.policy добавляем следующие строки:
grant codeBase "file:${java.home}/udf/RunCmd.jar" {
        permission java.security.AllPermission;
};

4. Регистрируем Java-функцию в Essbase

4.1. Выполняем слудующий MaxL скрипт
create function '@jRunCmd'
as 'RunCmd.jRun'
spec '@jRunCmd(arg1, arg2); @jRunCmd(arg1, @List(arg2, arg3,...));'
comment 'Execute shell command';

4.2. Перегружаем Essbase

Пример запуска CDF из бизнес-правила
Текст правила
VAR vA;
FIX(Act, BegBalance…..)
"FY10"
          (
           vA = @jRunCmd(
                          "../java/udf/scripts/alter_sub_var.sh"
                        , @LIST ("Cons_Scenario", @Name({vScenario}))
                        );      
           );
ENDFIX

Текст ALTER_SUB_VAR.SH:
./startMaxl.sh ../java/udf/scripts/alter_sub_var.mxl $1 $2

Текст ALTER_SUB_VAR.MXL:
login LOGINNAME identified by PASSWORD on SERVER;

alter system set variable $1 $2;

exit;


Полезные ресурсы
Документация Developing defined calculation functions
Блог hack4essbase.wordpress.com
Блог essbaselabs.blogspot.com

13 июн. 2010 г.

Использование CDF (часть I)

Что такое CDF?

CDF (custom defined functions) - это java-программы, которые можно использовать в скриптах расчетов (calc script) Essbase и бизнес-правилах Planning.

Что действительно необходимо на каждом проекте, так это запускать MaxL-скрипты или пакетные файлы (bat, cmd, sh) из бизнес-правил. Например запустить обновление replicated partition, загрузить данные и т.д.

Что нужно сделать, чтобы CDF работала:
1. Настроить Essbase
2. Создать и скомпилировать Java-класс
3. Настроить безопасность

Настраиваем Essbase.

1.1. Создаем папку ARBORPATH/java/udf
1.2. Изменяем настройку безопастности Java CDF
Необходимо в файле ARBORPATH/java/udf.policy снять комментарий с последней строки:
// **************************************************** 

// Permissions for all other classes.
// By default UDF sandbox is almost the same as applet environment, 
// with some additional restrictions.
grant {
            ……..
 permission java.util.PropertyPermission "java.vm.version", "read";
 permission java.util.PropertyPermission "java.vm.vendor", "read";
 permission java.util.PropertyPermission "java.vm.name", "read";

 // Uncomment the following line if you want to remove all restrictions
 permission java.security.AllPermission;
};


Создаем и компилируем Java-класс.

2.1. Создаем файл ARBORPATH/java/udf/EssbaseRuRunTime.java
import java.util.*;
import java.io.*;

public class EssbaseRuRunTime {
public static void main(com.hyperion.essbase.calculator.Context ctx, String[] args)
{
int i,  n = args.length;
String Str = args[0];

for (i=1; i
Str = Str + " " + args[i];
}

try {Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(Str);
int exitVal = proc.waitFor();
System.out.println(args[0]+" ExitValue: " + exitVal);
}
catch(Exception e)
{
System.out.println(e.getMessage());
System.out.println(args[0]);
}

}
}
2.2 Компилируем класс из каталога, где он расположен
javac –classpath ../essbase.jar EssbaseRuRunTime.java
jar cf EssbaseRuRunTime.jar EssbaseRuRunTime.class
Примечание: компилировать версией Java, которая инсталирована с Essbase

Настраиваем безопасность

3.1. В файл ARBORPATH/java/udf.policy добавляем следующие строки:
grant codeBase "file:${java.home}/udf/EssbaseRuRunTime.jar" {
        permission java.security.AllPermission;
};
3.2. Перегружаем Essbase

Пример запуска CDF из calc-script
FIX
   ... что-то считаем
ENDFIX

RUNJAVA EssbaseRuRunTime "../java/udf/scripts/alter_sub_var.sh" "BudYear" &Act_Year;

FIX
   ... что-то считаем
ENDFIX
Примечание: внутри FIX нельзя запускать EssbaseRuRunTime

Полезные ресурсы
Документация Developing defined calculation functions
Блог hack4essbase.wordpress.com
Блог essbaselabs.blogspot.com