在ecipse中,一个任务的运行可能有几种方式可供选择,最常用的就是”Java Application”,”Junit”,”Eclipse Application” 等。运用eclipse的插件机制,可以在其中定义自己的任务类型。
<extension
id="org.talend.designer.runprocess.debug"
name="Talend Job Debugger"
point="org.eclipse.debug.core.launchConfigurationTypes">
<launchConfigurationType
name="Talend Job"
delegate="org.talend.designer.core.debug.JobLaunchConfigurationDelegate"
modes="run"
public="true"
id="org.talend.designer.runprocess.jobLaunchConfiguration">
</launchConfigurationType>
</extension>
<extension
point="org.eclipse.debug.ui.launchConfigurationTypeImages">
<launchConfigurationTypeImage
icon="icons/process_icon.gif"
configTypeID="org.talend.designer.runprocess.jobLaunchConfiguration"
id="org.talend.designer.runprocess.launchImage">
</launchConfigurationTypeImage>
</extension>
org.eclipse.debug.core.launchConfigurationTypes 用来使自定义的任务类型集成进eclipse。"org.eclipse.debug.ui.launchConfigurationTypeImages 定义了显示的图标。
类org.talend.designer.core.debug.JobLaunchConfigurationDelegate 实现了接口IlaunchConfigurationDelegate, 方法
publicvoid launch(ILaunchConfiguration configuration, String mode, ILaunch launch, IProgressMonitor monitor) throws CoreException
定义了要执行的动作,相应的持久化数据在IlaunchConfiguration中取得。
ILaunchConfiguration用来进行相应数据的持久化。
实现了此扩展,相当于提供了自定义任务运行的入口,在eclipse toolbar的“Run As” 和“Debug As” 上就会出现该定义的选项。
org.talend.designer.core.debug.JobLaunchShortcut 实现了接口 IlaunchShorcut, 在2个launch方法实现中定义如何运行任务,类的实现如下:
DebugUITools.launch(config, mode); 中会调用eclipse的添加最近执行列表功能,以及执行JobLaunchConfigurationDelegate的launch()方法。
public class JobLaunchShortcut implements ILaunchShortcut ...{
/** *//**
*
*/
public static final String JOB_NAME = "TALEND_JOB_NAME";
/**//*
* Identifier for job configuration type
*/
public static final String JOB_DEBUG_LAUNCH_CONFIGURATION_TYPE = "org.talend.designer.runprocess.jobLaunchConfiguration";
/** *//**
* Locates a launchable entity in the given selection and launches an application in the specified mode.
*
* @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.jface.viewers.ISelection, java.lang.String)
*
* @param selection workbench selection
* @param mode one of the launch modes defined by the launch manager
* @see org.eclipse.debug.core.ILaunchManager
*/
public void launch(ISelection selection, String mode) ...{
if (selection instanceof IStructuredSelection) ...{
Object object = ((IStructuredSelection) selection).getFirstElement();
if (object instanceof RepositoryNode) ...{
RepositoryNode node = (RepositoryNode) object;
launch(node.getObject().getProperty().getItem(), mode);
}
}
}
/** *//**
* Locates a launchable entity in the given active editor, and launches an application in the specified mode.
*
* @see org.eclipse.debug.ui.ILaunchShortcut#launch(org.eclipse.ui.IEditorPart, java.lang.String)
*
* @param editor the active editor in the workbench
* @param mode one of the launch modes defined by the launch manager
* @see org.eclipse.debug.core.ILaunchManager
*/
public void launch(IEditorPart editor, String mode) ...{
if (editor.getSite().getId().equals(MultiPageTalendEditor.ID)) ...{
RepositoryEditorInput input = (RepositoryEditorInput) editor.getEditorInput();
launch(input.getItem(), mode);
}
}
/** *//**
* bqian Comment method "launch".
*
* @param object
* @param mode
*/
private void launch(Item item, String mode) ...{
if (item instanceof ProcessItem) ...{
ILaunchConfiguration config = findLaunchConfiguration((ProcessItem) item, mode);
if (config != null) ...{
DebugUITools.launch(config, mode);
}
}
}
/** *//**
* If re-usable configuration associated with the File and the project exist, this configuration is returned.
* Otherwise a new configuration is created.
*
* @param bin
* @param mode
* @return a re-useable or new config or <code>null</code> if none
*/
private ILaunchConfiguration findLaunchConfiguration(ProcessItem file, String mode) ...{
ILaunchConfiguration configuration = null;
List candidateConfigs = Collections.EMPTY_LIST;
try ...{
ILaunchConfiguration[] configs = DebugPlugin.getDefault().getLaunchManager().getLaunchConfigurations();
candidateConfigs = new ArrayList(configs.length);
for (int i = 0; i < configs.length; i++) ...{
ILaunchConfiguration config = configs[i];
String projectName = config.getAttribute(JOB_NAME, (String) null);
if (projectName == null) ...{
continue;
}
// String programFile = config.getAttribute(PerlLaunchConfigurationConstants.ATTR_STARTUP_FILE, (String)
// null);
// String name = bin.getName();
if (file.getProperty().getLabel().equals(projectName)) ...{
candidateConfigs.add(config);
}
}
} catch (CoreException e) ...{
ExceptionHandler.process(e);
}
int candidateCount = candidateConfigs.size();
if (candidateCount < 1) ...{
configuration = createConfiguration(file);
} else ...{
configuration = (ILaunchConfiguration) candidateConfigs.get(0);
}
return configuration;
}
/** *//**
* Creates a new configuration associated with the given file.
*
* @param file
* @return ILaunchConfiguration
*/
private ILaunchConfiguration createConfiguration(ProcessItem file) ...{
ILaunchConfiguration config = null;
String projectName = file.getProperty().getLabel();
ILaunchConfigurationType type = getLaunchManager().getLaunchConfigurationType(JOB_DEBUG_LAUNCH_CONFIGURATION_TYPE);
try ...{
if (type != null) ...{
ILaunchConfigurationWorkingCopy wc = type.newInstance(null, getLaunchManager()
.generateUniqueLaunchConfigurationNameFrom(projectName));
wc.setAttribute(JOB_NAME, projectName);
// wc.setAttribute(PerlLaunchConfigurationConstants.ATTR_PROJECT_NAME, file.getProject().getName());
// wc.setAttribute(PerlLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY, (String) null);
config = wc.doSave();
}
} catch (CoreException e) ...{
ExceptionHandler.process(e);
}
return config;
}
/** *//**
* Method to get the LaunchManager
*
* @return ILaunchManager
*/
protected ILaunchManager getLaunchManager() ...{
return DebugPlugin.getDefault().getLaunchManager();
}
}
本例中的程序位于talend项目中的"org.talend.designer.core"插件中。使用svn链接
P.S. 该功能的eclipse源码在插件"org.eclipse.debug.ui" 中,可以参考的类:
JavaLaunchShortcut, AbstractLaunchToolbarAction。
查看本文来源