内容


在 IBM Rational Application Developer 中使用 EGL Resources API

Comments

导言

EGL提供一个用户界面,因此您可以使用IBM® Rational® Application Developer(以后称为,Application Developer)创建并修改EGL资源。尽管如此,如果您正在为客户提供向其他平台移植的工具 — 例如,VisualAge Generator (VAGen) 和 Informix 4GL 到 EGL – 您可能需要能够通过编程来创建EGL资源。一系列API(应用程序编程接口)便应运而生,来帮助您快速创建和更新EGL资源,例如项目、包、文件夹和文件。 EGL Resources API 使您能够通过编程的方式创建EGL资源。当您希望同时创建多样的EGL资源时这一点十分有用。

EGL资源扩充了Eclipse资源并且包含EGL特有的额外功能。例如,当您创建一个EGL项目时,一个Eclipse项目也被创建出来并带有EGL需要的附加信息。EGL Resources API创建必要的Eclipse资源并添加必要的信息。

EGL Resources API允许您创建和删除:

  • EGL项目
  • EGL Web 项目
  • EGL 包
  • EGL 资源文件夹
  • EGL 文件
  • EGL 构建文件

这篇文章将更详细的介绍如何创建上面的EGL资源。

注: EGL Resources API可以以 headless (批处理) 或者在线模式被调用。在调用EGL Resources API 之前,Eclipse 必须已经加载了必需的 EGL plugin 。样本代码 -参看下载部分-这篇文章所提供的样例说明了如何做的方法。

安装使用 EGL Resources API

必要的 plugin.xml 入口

为了使用EGL Resources API,在plugin.xml中您需要以下操作:

<requires>      ...
      <import plugin="com.ibm.etools.egl.ui"/>      ...
  </requires>

调用EGL Resources API中的方法

在调用EGL Resources API的方法之前,使用 EGL Resources API 的应用程序必须已经在 Eclipse 中运行了 - Application Developer 和 EGL plugin 已经被激活。您可以在通过 headless 或者在线模式中调用EGL Resources API。样本代码阐明的是一个调用EGL Resources API的非常简单的 headless 应用程序。

EGL Resources API的主类是com.ibm.etools.egl.ui.wizards.EGLWizardUtilities。 因为EGL Resources API的方法是静态的,没有必要举例说明这个类。

对于不返回一个特定值的方法来说,您可以在如下的EGL Resources API中调用方法:

EGLWizardUtilities.methodName(parameters)

您可以在如下的EGL Resources API中调用返回一个特定值的方法:

return Type field = EGLWizardUtilities.methodName(parameters)

当您调用这些方法时,假定如下定义:

  • ReturnType 为从方法的引用中返回的对象类型
  • methodName 为EGL Resources API要调用方法名
  • parameters 为方法需要的参数列表

例如,要创建一个名称为MyProject的项目,调用可以是:

String projectName = "MyProject";
EGLWizardUtilities.createProject(projectName);

关于EGL Web项目的特别注意事项

注: 下面的信息仅涉及创建EGL Web项目。当您更新现有的EGL Web项目或者使用其他EGL资源时,您不需要考虑这些。

EGL Web项目是带有额外属性的 Application Developer Web 项目。EGL Resources API利用 Application Developer Web项目的工具来创建下面的 Application Developer Web 项目。尽管如此,您不可能真正地在一个headless的环境里创建Application Developer Web 项目的特征。如果您尝试这样去做,您将得到下面的异常:

java.lang.IllegalStateException: Workbench has not been created yet.
   at org.eclipse.ui.PlatformUI.getWorkbench(PlatformUI.java:92)
   at org.eclipse.ui.plugin.AbstractUIPlugin.getWorkbench(AbstractUIPlugin.java:628)
   at com.ibm.etools.linksmanagement.management.MovedFilesHandler
   .<init>(MovedFilesHandler.java:152)
   at com.ibm.etools.linksmanagement.management.LinksBuilder.build(LinksBuilder.java:406)
   at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:564)
   at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:615)
   at org.eclipse.core.runtime.Platform.run(Platform.java:747)
   at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:157)
   at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:249)
   at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:346)
   at org.eclipse.core.internal.resources.Project.build(Project.java:81)
   at com.ibm.etools.linksmanagement.management.LinkRefactorListener
   .refactor(LinkRefactorListener.java:454)
   at com.ibm.etools.linksmanagement.management.LinkRefactorListener
   .resourceChanged(LinkRefactorListener.java:83)
   at org.eclipse.core.internal.events.NotificationManager$2
   .run(NotificationManager.java:283)
   at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatform.java:615)
   at org.eclipse.core.runtime.Platform.run(Platform.java:747)
   at org.eclipse.core.internal.events.NotificationManager
   .notify(NotificationManager.java:277)
   at org.eclipse.core.internal.events.NotificationManager
   .broadcastChanges(NotificationManager.java:151)
   at org.eclipse.core.internal.events.AutoBuildJob.broadcastChanges(AutoBuildJob.java:78)
   at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:156)
   at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:212)
   at org.eclipse.core.internal.jobs.Worker.run(Worker.java:66)

这一异常是由于缺少一些必要的特性而导致的以新的方式创建的EGL Web项目。除非这一问题被解决,否则无法在一个headless的环境里创建EGL Web项目。这是在headless模式下唯一无法进行的操作。

EGL Resources API

创建EGL项目

在EGL中有两类项目。第一个是常规的EGL项目,它是带有EGL特性的 Eclipse Java 项目。第二个是 EGL Web 项目,它是带有 EGL 特性的 Application Developer Web 项目。

要创建一个EGL项目,应采用以下方法:

  • createProject: 创建一个参数中列有名称的简单的 EGL 项目

    public static void createProject(String name) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: 想要创建的项目的名称

  • createProject:创建一个参数中列有名称的简单的EGL项目,并且将依赖关系列表中的项目添加到依赖关系当中

    public static void createProject(String name, List dependencies) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: 想要创建的项目的名称

    dependencies:一组应该被添加到项目依赖关系列表中包含项目名称的字符串对象

  • createWebProject: 创建一个参数中列有名称的EGL web项目

    public static void createWebProject(String name) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: 想要创建的项目的名称

    注: 缺省情况下,EGL Web项目是一个具有 EGL、WDO 、JavaServer Pages™ (JSP™)标准标注库以及JavaServer Faces™ (JSF)特性的 Application Developer Web 项目。这个项目默认的Java™ 2 Platform, Enterprise Edition (J2EE™) servlet 版本为2.4版本,与动态的web项目相同。因此您需要一个与 servlet 2.4 版本兼容的应用服务器,例如 Websphere Application Server 6.0。对于下面的方法同样适用

  • createWebProject: 创建一个参数中列有名称的EGL web项目,并且将依赖关系列表中的项目添加到项目依赖关系当中

    public static void createWebProject(String name, List dependencies) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: 想要创建的项目的名称

    dependencies:一组应该被添加到项目依赖关系列表中包含项目名称的字符串对象

  • createEGLBuildFile:创建一个参数中列有名称的空的EGL构建文件

    public static IFile createEGLBuildFile(String name, String projectName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: EGL 构建文件的名称(不包括扩展名.eglbld)

    projectName: 将包含这个 EGL 构建文件的项目的名称

    返回

    IFile: EGL 构建文件对象

    注: 这个EGL构建文件将被创建在项目的EGL资源文件夹下。这个文件只包含带有根据用户首选设置的编码设置的标题。如果一个有着同样名字EGL构建文件已经存在于项目中,那么它的内容将被重新设置。 对于下面此类方法的变量同样适用。

  • createEGLBuildFile:创建一个参数中列有名称的空的EGL构建文件

    public static IFile createEGLBuildFile(String name, String projectName, String packageName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: EGL构建文件的名称(不包括扩展名.eglbld)

    projectName: 将包含这个EGL构建文件的项目的名称

    packageName: 将包含这个EGL构建文件的包的名称(如果是 null 或者空的字符串,将使用默认的包)

    返回

    IFile: EGL构建文件对象

  • createEGLBuildFile: 创建一个参数中列有名称的空的EGL构建文件

    public static IFile createEGLBuildFile(String name, String projectName, String packageName, String sourceFolderName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: EGL构建文件的名称(不包括扩展名.eglbld)

    projectName: 将包含这个EGL构建文件的项目的名称

    packageName: 将包含这个EGL构建文件的包的名称(如果是 null 或者空的字符串,将使用默认的包)

    sourceFolderName: EGL资源文件夹的名称(如果是null,将使用 EGLSource

    返回

    IFile: EGL构建文件对象

  • createEGLFile:创建一个参数中列有名称的空的EGL资源文件(在项目指定的EGL资源文件夹下)

    public static IFile createEGLFile(String name, String projectName, String packageName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: EGL文件的名称(不包括扩展名.egl)

    projectName: 将包含这个EGL文件的项目的名称

    packageName:将包含这个EGL文件的包的名称(如果是null或者空的字符串,将使用默认的包)

    返回

    IFile: EGL构建文件对象

  • createEGLFile:创建一个参数中列有名称的空的EGL资源文件 - 在项目指定的包中(在EGL资源文件夹下)

    public static IFile createEGLFile(String name, String projectName, String packageName, String sourceFolderName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: EGL文件的名称(不包括扩展名.egl)

    projectName: 将包含这个EGL文件的项目的名称

    packageName:将包含这个EGL文件的包的名称(如果是null或者空的字符串,将使用默认的包)

    sourceFolderName: EGL资源文件夹的名称(如果是null,将使用 EGLSource

    返回

    IFile: EGL构建文件对象

  • createPackage:创建一个参数中列有名称的EGL包(在项目指定的EGL资源文件夹下)

    public static void createPackage(String name, String projectName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: EGL包的名称

    projectName:将包含这个EGL包的项目的名称

  • createPackage:创建一个参数中列有名称的EGL包(在项目指定的EGL资源文件夹下)

    public static void createPackage(String name, String projectName, String sourceFolderName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: EGL包的名称

    projectName:将包含这个EGL包的项目的名称

    sourceFolderName:EGL资源文件夹的名称(如果这null,将使用 EGLSource

  • createSourceFolder:在项目中创建一个参数中列有名称的EGL资源文件夹(新的EGL资源文件夹将被添加到egl路径入口)

    public static void createSourceFolder(String name, String projectName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name:EGL资源文件夹的名称

    projectName:将包含这个EGL资源文件夹的项目的名称

  • getExistingProjectDependencies: 为一个现有的项目提取项目依赖关系并从一列项目路径入口创建一列PPListElement对象

    public static ArrayList getExistingProjectDependencies(String projectName) throws CoreException

    参数

    projectName: 从中需要一个依赖关系列表的项目

    返回

    ArrayList:包含现有项目依赖关系的PPListElement对象的列表

  • getNewProjectDependencies:为一个现有项目计算新项目的依赖关系并从一列项目字符串中创建一列PPListElement对象

    public static ArrayList getNewProjectDependencies(String projectName, List dependencies)

    参数

    projectName: 从中需要一个依赖关系列表的项目

    dependencies:依赖关系中项目名称的列表

    返回

    ArrayList: 包含新项目依赖关系的PPListElement对象的列表

  • getProjectDependencies:从一列项目字符串中创建一列PPListElement对象并且将新的依赖关系与项目中已经存在的合并在一起

    public static List getProjectDependencies(String projectName, List dependencies) throws CoreException

    参数

    projectName:从中需要一个依赖关系列表的项目

    dependencies:包含项目名称的字符串对象的列表

    返回

    ArrayList:包含项目依赖关系的PPListElement对象的合成列表

  • removeEGLFile:从项目和文件系统中去除特定的EGL文件

    public static void removeEGLFile(String name, String projectName, String packageName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name:EGL文件的名称(没有.egl扩展名)

    projectName:包括这个EGL文件的项目的名称

    packageName:EGL文件位于其中的包的名称(假定包在EGLSource文件夹之下)

  • removeSourceFolder:从项目和文件系统中去除特定的EGL资源文件夹(也去除了egl路径的入口)

    public static void removeSourceFolder(String name, String projectName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name:EGL资源文件夹的名称

    projectName:包含这个EGL资源文件夹的项目的名称

  • removePackage: 从EGLSource文件夹下的项目中去除特定的EGL包

    public static void removePackage(String name, String projectName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name:EGL包的名称

    projectName: EGLSource文件夹下包含这个EGL包的项目的名称

    注:包下的所有文件将被去除。如果这个包下没有子包,那么这个包文件夹也将被去除。对于下面此类方法的变化同样适用.

  • removePackage: 从EGLSource文件夹下的项目中去除特定的EGL包

    public static void removePackage(String name, String projectName, String sourceFolderName) throws CoreException, InterruptedException, InvocationTargetException

    参数

    name: EGL包的名称

    projectName:包含EGL包的项目的名称

    sourceFolderName: 包含EGL包的资源文件夹的名称

  • removeProject:从工作区域中去除特定的EGL项目,并从文件系统中去除它的内容

    public static void removeProject(String name) throws CoreException, InterruptedException, InvocationTargetException {

    参数

    name:EGL项目的名称

使用样本代码

注:样本代码作为一种阐明如何调用 EGL Resources API的方式来提供。样本仅用作阐明用途,并不能作为产品代码使用

包含在样本代码中的一些主要文件是:

  • 一个包含样本代码所需的plugin描述符的plugin.xml文件。
  • 一个驱动程序, com.ibm.etools.egl.resources.sample.EGLResourcesBatchDriver, 以批处理的模式启动Eclipse。它启动一个Eclipse实例及headless 应用。 它应作为一个带有以下参数的常规的Java应用程序被启动:
    • –data用来详细说明将要使用的工作区的位置
    • –importFile用来详细说明包含将要更新的资源信息的XML文件的位置
  • 一个Eclipse应用程序, com.ibm.etools.egl.resources.sample.EGLResourcesBatchUpdateSample。这是一个 headless 应用程序,当被批驱动程序 com.ibm.etools.egl.resources.sample.EGLResourcesBatchDriver 请求时,由 Eclipse 启动。同时它也被Junit测试类 com.ibm.etools.egl.ui.wizard.EGLWizardUtilitiesTest 调用,随样品代码一起提供。
  • 一个类, com.ibm.etools.egl.resources.sample.EGLUpdateResources,使用EGL Resources API来执行必要的EGL资源更新资料。这个类可以通过在线模式和批处理模式调用。
  • 一个样本XML文件, EGLResources.xml, 在 com.ibm.etools.egl.resources.sample 包目录中。这个样本文件包含样本代码用到的信息,为了了解需要更新哪个EGL资源(项目、包、文件夹、文件)以及需要执行什么调用(增加、删除)。一个样本XML文件的概要包含如下。
<?xml version="1.0" encoding="UTF-8"?>
	
<resources>

	<project name="EGLProject1" type="egl" action="add">
		<dependentProject name="EGLProject5"/>
		<folder name="SampleFolder" action="add"/>
		<package name="com.yourcompany.sample.pkg" action="add">
			<file name="SampleCustomers" action="add" type="egl"
			      location="C:\workdrive\eglResources\SampleCustomers.egl"/>
		</package>
		<package name="com.yourcompany.sample.pkg" action="add"   
                          folder="SampleFolder">
			<file name="SampleCustomers" action="add" type="egl"
			      location="C:\workdrive\eglResources\SampleCustomers.egl"/>
		</package>
	</project>
.
.
.
</resources>

下面图1显示的是样本代码的结构。

图1.样本代码结构
code structure
code structure

运行样本代码

JUnit 测试: 利用Junit运行样本代码

这里是需要在Junit中运行样本代码的设置信息。

  1. 在文件系统的子目录里打开样本代码eglResourcesSampleSource.zip。这就创建了一个子目录,EGLResourcesAPISamples,以及样品代码资源文件。它也包括以下文件:
    • EGLResources.xml
    • SampleCustomers.egl
  2. 修改EGLResources.xml文件指向SampleCustomers.egl的新位置。这通过改变文件标注中的位置属性(下面粗体部分)的值来实现.
    <file name="SampleCustomers" action="add" type="egl"
    	      location="C:\workdrive\eglResources\SampleCustomers.egl"/>
  3. 伴随着Application Developer v6的启动,点击File > Import > Existing Project into Workspace > Next 如图2所示。
    图2.在 Application Developer 中引入一个项目
    Importing a project
    Importing a project
  4. 点击Browse按钮至 Project contents,然后进入样本代码被打开的目录(图3)。 选择EGLResourcesAPISamples并点击OK
    图3.选择项目内容
    project contents
    project contents
  5. 点击Finish
  6. 在以新的方式引入的项目中(EGLResourcesAPISamples),进入包com.ibm.etools.egl.ui.wizard的EGLWizardUtilitiesTest类中。
  7. 打开类 EGLWizardUtilitiesTest 并修改下面的说明来指向EGLResources.xml文件的位置,这一文件与步骤1中的样本代码被打开在相同的目录中。

    final String eglResourcesFile = "C:/workdrive/eglResources/EGLResources.xml";

  8. 保存这些变更。
  9. 如果存在着许多的编辑错误,可以右击 plugin.xml 并点击 PDE Tools > Update Classpath 如图4所示。这样应该可以去掉编辑错误。
    图4.更正编辑错误
    Correcting errors
  10. 在包资源管理器中,右击EGLWizardUtilitiesTest 然后选择Run > Run 如图5所示。
    图5.启动实用工具
    utilities
    utilities
  11. 选择 JUnit Plug-in Test并点击New
  12. Test标签下, 选择Run a single test并确保选择的项目是 EGLResourcesAPISamples而且测试类是com.ibm.etools.egl.ui.wizard.EGLWizardUtilitiesTest(如图6所示)。
    图6.运行一个测试
    test
    test
  13. Arguments标签下, 详细说明您想要的工作区域的位置。选择Run an application 并确保org.eclipse.ui.ide.workbench是选定的(图7)。
    图7.选择要运行的程序
    program to run
    program to run
  14. 点击Run.这将在上面的(C:\workdrive\eglResource-test-workspace)为Junit测试详细列出的工作区域内创建EGL项目和EGL Web项目以及一些其他的EGL资源.

Headless 操作:将样本代码增加到现有的IRAD装置

注: 在 Headless 模式中将无法创建EGL Web项目,尽管如此,但是您可以在 Headless 模式中删除现有EGL Web项目并修改(增加、删除)现存的EGL Web项目中的资源(文件、文件夹)。这一限制并不适用于以前讨论过的Junit测试。

这里是在批处理模式中运行样本代码的步骤。

  1. 在{RAD}\eclipse\plugins子目录里打开样本代码eglResourcesSampleBin.zip,{RAD}是安装IRAD的根目录(也就是, D:\IBM\Rational\SDP\6.0)。这创建了一个带有下面文件的子目录com.ibm.etools.egl.resources.sample :
    • eglResourcesAPISample.jar
    • plugin.properties
    • plugin.xml
    • EGLResources.xml
    • SampleCustomers.egl
    • eglResourcesSampleTest.bat

    如果您愿意,您可以将下面的文件移到一个不同的目录位置:

    • EGLResources.xml
    • SampleCustomers.egl
    • eglResourcesSampleTest.bat
  2. 修改EGLResources.xml文件指向SampleCustomers.egl的新位置。这个样本xml文件不同于用于Junit测试的文件,因为这个文件不详细说明一个EGL Web项目的创建过程(原因是前面讨论的在 Headless 模式下创建他们的问题)。要修改EGLResources.xml,需改变下面粗体所示的文件标注中的位置属性的值。
    <file name="SampleCustomers" action="add" type="egl"
    location="C:\workdrive\eglResources\SampleCustomers.egl"/>
  3. 编辑eglResourcesSampleTest.bat文件并修改类途径设置说明来指向系统中下面的jar文件的位置:

    {RAD}\eclipse\plugins\com.ibm.etools.egl.resources.sample\eglResourcesAPISample.jar
    {RAD}\eclipse\startup.jar

    在优先的实例目录中,{RAD}是IRAD安装目录。例如,如果IRAD v6被安装在系统的D:\IBM\Rational\SDP\6.0中, 那么可以在D:\IBM\Rational\SDP\6.0\eclipse\startup.jar中找到{RAD}\eclipse\startup.jar。

  4. 在eglResourcesSampleTest.bat文件中, 修改下面说明中的粗体部分来详细说明精确安装的位置。

    java com.ibm.etools.egl.resources.sample.EGLResourcesBatchDriver –data workspace –importFile xmlFile

    在这种情况下,工作区域是指要用到的工作区域的位置(例如, c:\workdrive\myworkspace), xmlFile是包含要更新的资源信息的XML文件的位置(例如, c:\workdrive\resources\eglResFile.xml)。

  5. 通过命令提示符,执行eglResourcesSampleTest.bat命令文件.您可能会看到一个错误信息:"PolicyClassLoader could not find policy com.ibm.jxesupport.JxeClassLoaderPolicy", 这个可以忽略。

    一旦完成操作,您可以启动带有前面详细说明工作区域(c:\workdrive\myworkspace)的Application Developer v6来查看以新的方式修改的EGL资源。

结束语

EGL Resources API使得通过外部工具操作EGL资源变得简单。它帮助您根据需要灵活机动地使用工具操作EGL资源,提供自己的界面及利用应用程序编程接口的功能。

这篇文章提供了应用程序编程接口的一些描述以及一些样本代码来阐明如何使用他们。

致谢

非常感谢那些抽出时间来阅读这篇文章并提供宝贵意见的人。特别感谢EGL Resources API的主要开发者Matt Clement,还有Jon Shavor,因为他们为这篇文章的改进提出了宝贵的建议。


下载资源


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Rational
ArticleID=157497
ArticleTitle=在 IBM Rational Application Developer 中使用 EGL Resources API
publish-date=09042006