这里有几种情形,对通过命令行工具在模型之间产生差别列表是十分有利的,在一个构建过程或者当量中或许只是作为一个步骤。例如:
这篇文章主要研究 MDD 情形,因为这很可能就是这个技术所需要的情形。而在其它 情形采用此技术则相对比较直接。
根据这个项目规模的大小,主模型的变更可来自多个开发人员。一个构件可能需要在将它们引入到主模型之前浏览来自单个贡献者的变更设置。通常情况下,这是由一个转换来完成的,比如 Java-to-UML。这个转换会产生一个反映 Java 代码当前状态的 UML 模型。要查看主模型和一个源自此代码的模型之间的区别,可以采取几种方式来实现。
方法之一是将这个目标转换输出作为这个主模型。在 Rational 软件环境中运行此转换将会启动一个可视的结构合并会话(正如 融合 ——请参见下面的 Note),这样可以在把它们应用到主机(目标)模型之前展现一个变更列表。这种方法将会在委托此结构合并会话之上修改这个主模型。
注释: 融合 (一个 结构对比)是一项仅仅利用合格的名称来对照模型的技术,并且为在模型之间或者结构变更提供一个机制,而且无论这些模型是否共享一个始祖。它还受到合并模型命令的刺激。融合广泛地应用于 MDD 中 调整工作流程。
然而,这项技术却不能自动从命令行中产生。相反,这个合并技术(请参见下面的 Note)却可用来将这个问题转换为身份的对照。一个生成的模型可以保存到一个位置标志符(一个空白模型),与主模型合并,然后对照会话就可以运行,从而创建一个变更列表(请参见图 1)。这个合并工具和身份对照技术都允许自动化和命令行的调用。
注释: 模型 联合就是一项可以改善目标模型的元素身份使其与源模型中相同的元素相匹配的技术。它利用精密的身份匹配器来产生在稍后的模型中可以匹配的关键元素,这样以来这些元素 ID 就可以向前移动。这样就有效地在这些模型之间创建了一个始祖关系,它们似乎都是直接从一个到另一个这样演化而来的。这样利用这篇文章中所描述的方法就可以使它们变得具有可比性。
图 2 显示了在这些模型之间的可视化合并过程中,当点击 Save deltas 按钮时这些差量列表是如何保存的。假设这个标识必须从一个可视化会话中产生,并且由于要剖析这个文件从而创建更多精致的浏览工具十分困难,就会采用可替换机制和文件格式。
这种方法是由一个 Apache Ant 任务实现自动化的。Ant 任务可以从命令行开始以批量处理模式运行,这样可以产生一个变更列表并将它们保存到一个文件中。此外,生成的变更列表可以以可导向模式保存。Compare Merge 中的功能可以下载这样的文件到 Rational 软件并用 Delta Annotation Viewer 来浏览它们,如图 3所示(请参见资源,可学习更多的关于 deltas 的知识)。
假设这样的情景:
要满足这些需求,您将创建一个您可以通过命令部署的 Ant 任务类。
Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Ant Plug-in Bundle-SymbolicName: com.acme.headless.ant;singleton:=true Bundle-Version: 1.0.0 Bundle-Activator: com.acme.headless.ant.Activator Bundle-Vendor: ACME Bundle-Localization: plugin Require-Bundle: org.eclipse.ui, org.eclipse.core.runtime, org.eclipse.ant.core, org.apache.ant, org.eclipse.gmf.runtime.emf.core.compatibility, com.ibm.xtools.transform.core, com.ibm.xtools.uml.core, com.ibm.xtools.uml.msl, com.ibm.xtools.comparemerge.modelconverter, com.ibm.xtools.comparemerge.delta.annotation.ui, com.ibm.xtools.comparemerge.core Eclipse-LazyStart: true |
package com.acme.headless.ant.task;
public class DifferencesLogger extends org.apache.tools.ant.Task {
// ant task parameter variables
// absolute path to transformation configuration (.tc) file
public String transformConfigPath;
// absolute path to the master model to be compared to
public String masterModelPath;
// absolute path to the auto-generated changes log (the file does not have pre-exist)
public String deltaLogFileName;
// absolute path to a blank model template
public String blankModelPath;
// private members
private String tempModelName = "HTBlankModel"; //$NON-NLS-1$
private URI tempModelURI = null;
}
|
/*
* Execute task
* (non-Javadoc)
* @see org.apache.tools.ant.Task#execute()
*/
public void execute() throws BuildException {
try {
// load transformation configuration file
IFile file =
ResourcesPlugin.getWorkspace().getRoot().getFileForLocation(
new Path(transformConfigPath));
ITransformConfig config = TransformConfigUtil.loadConfiguration(file);
//prepare Java to UML transformation forward context by switching its target container
to point to a temporary, empty model file
ITransformContext forwardContext = createTarget(config);
//execute transformation
IStatus status =
TransformController.getInstance().
execute(config, forwardContext, false, true, null);
System.out.println("Completed transform. execution, status = " + status.getMessage());
if (status.getCode() == IStatus.OK) {
// instantiate model alignment facade
ModelConverterFacade mc_facade = new ModelConverterFacade();
//verify that master copy does exist
File baseFile = new File(getMasterModelPath());
if (!baseFile.exists()) {
System.out.println("Invalid master copy path: " + getMasterModelPath());
System.out.println("Please correct the parameter and re-run the script");
return;
}
// obtain model file created by transformation. Verify it exits
File contributorFile = new File(getTemporaryModelURI().toFileString());
if (!contributorFile.exists()) {
System.out.println("Error during transformation: failed to create target file");
System.out.println("Verify that " + contributorFile.getParent() + " is not read-only”);
return;
}
// align master and contributor files
if (!mc_facade.alignSingleModelFile(baseFile, contributorFile, null, contributorFile))
{
System.out.println("Error during model alignment");
System.out.println(contributorFile.getAbsolutePath() + " should exist!");
return;
}
// compare aligned models and save changes log
compareWithEachOther(baseFile, contributorFile);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Failed execution" + e.getLocalizedMessage());
}
}
|
bin.includes = META-INF/,\ delta_logger.jar,\ plugin.xml source.delta_logger.jar = src/ output.delta_logger.jar = bin/ |
要阐述这个步骤,我们已经在附加的 Projects.zip 压缩文件中提供了三个案例(请参见 下载)。按照下列这些步骤来使用这三个项目:
|
注释:
确保 C:\targets\my-workspace 是由您工作空间的真实位置所代替的。
运行环境现在已经安装,这个任务可以在 Rational 软件中,也可以在 headless 操作模式中运行。
这个 EMF 层级 deltas (单个的变更), 显示在叶节点,可以在 UML 层级很方便地归到复核的 deltas 中。这些复合构件代表姿势或者其它逻辑分类(比如一个拖拽-放下复合对象图解,这将导致一个组位置变更,包裹-相关变更,比如变更到特定的包裹复合 delta,等等)。
setlocal REM RUNANT_DIR=This directory (which may, or may not, be your current working directory) set RUNANT_DIR=%~dp0 set debug= if not '%1' == 'debug' goto studio set debug=-Xdebug -Xnoagent -Djava.compiler=none ^ -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 :studio REM The root directory of your Studio installation set STUDIO_DIR=C:\Program Files\IBM\SDP70 if not exist '%STUDIO_DIR%'\jdk\jre set STUDIO_DIR=%RUNANT_DIR%..\..\.. if not exist '%STUDIO_DIR%'\jdk\jre echo ERROR: incorrect STUDIO_DIR=%STUDIO_DIR% if not exist '%STUDIO_DIR%'\jdk\jre goto done :java if not $%JAVA_DIR%$==$$ goto workspace set JAVA_DIR=jdk\jre\bin :workspace if not $%WORKSPACE%$==$$ goto check REM ####################################################### REM ##### you must edit the 'WORKSPACE' setting below ##### REM ####################################################### REM *********** The location of your workspace ************ set WORKSPACE=C:\targets\my-workspace :check REM ************* The location of your workspace ***************** if not exist '%WORKSPACE%' echo ERROR: incorrect workspace=%WORKSPACE%, edit this runAnt.bat and correct the WORKSPACE envar if not exist '%WORKSPACE%' goto done set LOCATIONS=-DSTUDIO.DIR=%STUDIO_DIR% -DSTUDIO.RUNANT= %RUNANT_DIR% -DSTUDIO.WORKSPACE=%WORKSPACE% :run @echo on '%JAVA_DIR%\java' -cp '%STUDIO_DIR%\startup.jar' %debug% org.eclipse.core.launcher.Main -debug -application org.eclipse.ant.core.antRunner -data '%WORKSPACE%' -file %WORKSPACE%\AntRunnerPlugin\build.xml |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/14780914/viewspace-588973/ ,如需转载,请注明出处,否则将追究法律责任。