创建EGL外部类型的向导简介
创建EGL外部类型的向导简介
1 EGL外部类型的作用
EGL语言提供了一种版型(stereotype) : 外部类型(external type)以方便在EGL代码中集成其他语言的功能,现在EDT中可以通过外部类型集成Java和JavaScript语言的功能;类似于Java语言通过JNI接口集成C和C++语言的功能。
2 创建EGL外部类型的向导
为了方便用户使用外部类型集成Java功能,EDT中提供了一个从Java类或接口创建EGL外部类型的向导。
要使用这个向导,请执行以下步骤:
单击任意一个EGL项目,选择New>External Type来选择这个向导。
图1:外部类型向导模板页
输入要创建的保存外部类型的EGL文件名和放置文件的文件夹名字,单击Next 前进到下一步:
图2:外部类型向导:选择Java类型及指定相应的选项
在图2中,单击”Browse...”按钮进入Java TypeSelection选择页面。
图3:Java Type Selection页面
在图3中输入你选择的Java类或接口名字,单击 “OK”按钮回到外部类型向导的第二个页面(选择Java类型的范围是这个项目的classpath,包括classpath上的jars和来自于java source folder下的源代码文件)。
图4:外部类型向导:选择Java类型及指定相应的选项(选择Java类型后)
在图4中,用户选择的Java类型及它所包含的所有共有field,constructor,method会显示出来供用户选择,用户可以选择这个类型的所有field,constructor,method来产生EGL外部类型,也可以根据需要只选择其中的一部分;在图4的下面提供了两个选项,让用户选择是否为这个Java类型的父类,父接口产生EGL外部类型;是否为这个类成员引用到的Java类型产生EGL外部类型。如果不选择这两个选择或只选择一个,产生的EGL文件中可能会包含验证错误。
在图4中选择第一个构造函数和getChannel()方法,单击Next 前进到下一步:
图5:外部类型向导的预览页面
可以从图5中预览产生的EGL类型及它包含的方法。单击”Finish”按钮产生包含预览内容的EGL文件。
3 Java类型到EGL外部类型的映射规则
• Java基本类型及相应的封装类到EGL类型的映射
Java Type |
EGL Type |
java.lang.String |
string |
boolean |
boolean |
java.lang.Boolean |
Boolean? |
short |
smallint |
java.lang.Short |
Smallint? |
int |
int |
java.lang.Integer |
Int? |
long |
bigint |
java.lang.Long |
bigint? |
java.math.BigDecimal |
decimal? |
java.math.BigInteger |
decimal? |
float |
smallfloat |
java.lang.Float |
smallfloat? |
double |
float |
java.lang.Double |
float? |
java.sql.Date |
date? |
java.sql.Time |
time? |
java.sql.Timestamp |
timestamp? |
•Java的byte,char,java.lang.Byte,java.lang.Character及Java数组,在EGL中还没有相应的对应类型,因而在转换的过程中,如果一个Javafield的类型是上述几种之一,这个field将被过滤掉;如果一个Java constructor中的参数类型是上述几种之一,这个constructor将被过滤掉;如果一个Java method中的参数或返回类型是上述几种之一,这个method将被过滤掉。
•将为Java接口产生一个private constructor。
•将为Java抽象类产生一个private constructor;并过滤掉抽象类声明的任何构造函数。
•将为没有public构造函数,且声明了protect或private或default构造函数的Java类型产生一个private constructor。
•Java类型如果以“eze”开始,将会赋予相应的EGL类型一个别名,如:
EzeTriangle 转换为:
externalType_EzeTriangle type JavaObject{externalName = "EzeTriangle"}
•Java内部类转换时将带上enclosing类的信息。如:
externalType Test_InnerClass type JavaObject {externalName = "Test.InnerClass"}
4 如何在EGL中使用外部类型
下面用一个样例来说明如何在EGL程序中使用EGL外部类型。
我们使用的Java类:
package com.operations.logging.util;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Logging {
// The logger which takes care of the logging occuring in this class.
private final static Logger logger = Logger.getLogger("com.operations");
private final static String formatString = "===>>> %-7s : [%s] - %s";
static public void logFatal(String programName, String message) {
if (logger.isLoggable(Level.SEVERE)) {
logger.log(Level.SEVERE, String.format(formatString, Level.SEVERE.toString(), programName, message));
}
}
static public void logError(String programName, String message) {
if (logger.isLoggable(Level.SEVERE)) {
logger.log(Level.SEVERE, String.format(formatString, Level.SEVERE.toString(), programName, message));
}
}
static public void logWarn(String programName, String message) {
if (logger.isLoggable(Level.WARNING)) {
logger.log(Level.WARNING, String.format(formatString, Level.WARNING.toString(), programName, message));
}
}
static public void logInfo(String programName, String message) {
if (logger.isLoggable(Level.INFO)) {
logger.log(Level.INFO, String.format(formatString, Level.INFO.toString(), programName, message));
} else if (logger.isLoggable(Level.CONFIG)) {
logger.log(Level.CONFIG, String.format(formatString, Level.CONFIG.toString(), programName, message));
}
}
static public void logDebug(String programName, String message) {
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, String.format(formatString, Level.FINE.toString(), programName, message));
} else if (logger.isLoggable(Level.FINER)) {
logger.log(Level.FINER, String.format(formatString, Level.FINER.toString(), programName, message));
}
}
static public void logTrace(String programName, String message) {
if (logger.isLoggable(Level.FINEST)) {
logger.log(Level.FINEST, String.format(formatString, Level.FINEST.toString(), programName, message));
}
}
static public boolean isFatalEnabled() {
return logger.isLoggable(Level.SEVERE);
}
static public boolean isErrorEnabled() {
return logger.isLoggable(Level.SEVERE);
}
static public boolean isWarnEnabled() {
return logger.isLoggable(Level.WARNING);
}
static public boolean isInfoEnabled() {
return logger.isLoggable(Level.INFO) || logger.isLoggable(Level.CONFIG);
}
static public boolean isDebugEnabled() {
return logger.isLoggable(Level.FINE) || logger.isLoggable(Level.FINER);
}
static public boolean isTraceEnabled() {
return logger.isLoggable(Level.FINEST);
}
}
使用创建EGL外部类型的向导来为上面的Java类创建相应的外部类型:
package org.testing;
externalType Logging type JavaObject{PackageName = "com.operations.logging.util"}
constructor();
static function isDebugEnabled() returns(boolean);
static function isErrorEnabled() returns(boolean);
static function isFatalEnabled() returns(boolean);
static function isInfoEnabled() returns(boolean);
static function isTraceEnabled() returns(boolean);
static function isWarnEnabled() returns(boolean);
static function logDebug(arg0 string? in, arg1 string? in);
static function logError(arg0 string? in, arg1 string? in);
static function logFatal(arg0 string? in, arg1 string? in);
static function logInfo(arg0 string? in, arg1 string? in);
static function logTrace(arg0 string? in, arg1 string? in);
static function logWarn(arg0 string? in, arg1 string? in);
end
编写一个EGL Library,它使用外部类型集成Java类Logging提供的功能:
package org.testing;
library LoggerLib
private logging Logging{};
function isAtLevelDebug() returns (boolean)
return(logging.isDebugEnabled());
end
function isAtLevelError() returns (boolean)
return(logging.isErrorEnabled());
end
function isAtLevelFatal() returns (boolean)
return(logging.isFatalEnabled());
end
function isAtLevelInfo() returns (boolean)
return(logging.isInfoEnabled());
end
function isAtLevelTrace() returns (boolean)
return(logging.isTraceEnabled());
end
function isAtLevelWarn() returns (boolean)
return(logging.isWarnEnabled());
end
function logDebug(progName string in, message string in)
logging.logDebug(progName, message);
end
function logInfo(progName string in, message string in)
logging.logInfo(progName, message);
end
function logFatal(progName string in, message string in)
logging.logFatal(progName, message);
end
end
编写一个EGL Program,由它来调用上面的EGL Library:
package org.testing; program basicProgram function main() SysLib.writeStdout(LoggerLib.isAtLevelInfo()); //SysLib.writeStdout(LoggerLib.logInfo("Test", "Some more")); LoggerLib.logInfo("Test", "Some more"); end end选中basicProgram,点击右键 RunAs > EGL Java Main Application, 会调用Java函数打印出信息,如下图: