创建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函数打印出信息,如下图:

 





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值