电脑技术学习

How to access eclipse workspace?

dn001
内容:
How to access eclipse workspace?

转载者:cleverpig

原作者:kobye

原作者网站:http://blog.csdn.net/jsports/


摘要:

在开发eclipse pluin的时候,某些情况下我们需要访问eclipse workspace,例如:在插件中以编程的方式调用ant命令、访问eclipse workspace中的project等。一次在网上偶遇到本文的原创者kobye,此人正在进行jsports项目的开发,对此颇有心地,故在此行文与众人共同探讨之。

一、基础工作-在插件中以编程的方式调用ant命令:

在开发eclipse pluin的时候,某些情况下我们需要访问eclipse workspace,例如:在插件中以编程的方式调用ant命令等。

如何做到这一点?


public void execute(){
IWorkspace ws = ResourcesPlugin.getWorkspace();
IProject[] ps = ws.getRoot().getProjects();
System.out.println(ws.getRoot().getFullPath().makeAbsolute().toOSString());

for(int i=0;i IProject p = ps[i];
IPath location = p.getLocation();
IFile ifile = p.getFile("build.xml");
System.out.println(ifile.getLocation().toFile().getAbsolutePath());
File f = new File(ifile.getLocation().toFile().getAbsolutePath());
if(!f.exists()){
continue;
}
Project pro = new Project();
pro.setBasedir(location.toFile().getAbsolutePath());
pro.init();
ProjectHelper helper = ProjectHelper.getProjectHelper();
helper.parse(pro, f);
Hashtable tars = pro.getTargets();
System.out.println("name==="+name);
Target t = (Target) tars.get(name);
if(t==null){
return;
}
DefaultLogger consoleLogger = new DefaultLogger();
consoleLogger.setErrorPrintStream(System.err);
consoleLogger.setOutputPrintStream(System.out);
consoleLogger.setMessageOutputLevel(Project.MSG_INFO);
pro.addBuildListener(consoleLogger);
pro.executeTarget(this.name);
break;
}

}


以上代码(单独编译不会通过,请把 name换位ant 的target)可以放到插件的代码中。

以上代码的含义:

获得eclipse workspace的引用,对workspace下的pronjects进行循环,如果该project下有build.xml并且该文件中有name的target那么就以ant的方式调用,并把ant运行的输出输出到eclipse的console。

二、如何访问current project:

上一节给出来在eclipse plugin 中访问eclipse workspace, 从而访问该workspace下所有project的方案,WorkSpace以及相关的类不提供直接访问current project的方法,所以只能走其他途径.

在我们的plugin中,我们要提供界面入口,比如 PopMenu ActionMenu 等之类的,
这些界面入口是要实现一些接口的,例如:PopMenu要实现IObjectActionDelegate,
这个接口有几个方法,其中 public void selectionChanged(IAction action, ISelection
selection) ;

这个方法很早重要,可以通过ISelection获得当前选择中的Project.

ISelection共有三个子接口,分别对应三个实现类,那么通过判断ISelection的实际类型可以获得其子接口的引用,
然后对其遍历,通过getAdaptor方法获得所有的选择的IResource的引用,
再进一步对IResource进行类型识别,得到IResource.PROJECT类型的元素即为IProject的引用.

下面是程序:


import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Iterator;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;

import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;

/**
* @author Kobye
*/
public class TestPopMenu implements IObjectActionDelegate {
private IStructuredSelection selection;



/**
* Constructor for Action1.
*/
public TestPopMenu () {
super();
}

/**
* @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
*/
public void setActivePart(IAction action, IWorkbenchPart targetPart) {

}

/**
* @see IActionDelegate#run(IAction)
*/
public void run(IAction action) {
Shell shell = new Shell();
MessageDialog.openInformation(
shell,
"Pop Plug-in",
"New Action was executed.");

}

public static Object getAdapter(Object adaptable, Class c) {
if (c.isInstance(adaptable)) {
return adaptable;
}
if (adaptable instanceof IAdaptable) {
IAdaptable a = (IAdaptable) adaptable;
Object adapter = a.getAdapter(c);
if (c.isInstance(adapter)) {
return adapter;
}
}
return null;
}


/***
* 这个方法和下面的方法很重要。
* @param selection
* @param c
* @return
*/
private Object[] getSelectedResources(IStructuredSelection selection,Class c) {
return getSelectedAdaptables(selection, c);
}

private static Object[] getSelectedAdaptables(ISelection selection, Class c) {
ArrayList result = null;
if (!selection.isEmpty()) {
result = new ArrayList();
Iterator elements = ((IStructuredSelection) selection).iterator();
while (elements.hasNext()) {
Object adapter = getAdapter(elements.next(), c);
if (c.isInstance(adapter)) {
result.add(adapter);
}
}
}
if (result != null && !result.isEmpty()) {
return result.toArray((Object[])Array.newInstance(c, result.size()));
}
return (Object[])Array.newInstance(c, 0);
}


/**
* 这个方法保存了ISelection的引用,
* 请注意:ISelection的实际类型因不同的应用,其实际类型可能不同,
* 共有三种可能,请查阅eclipse API。
*
* @see IActionDelegate#selectionChanged(IAction, ISelection)
*/
public void selectionChanged(IAction action, ISelection selection) {
this.selection = (IStructuredSelection) selection;
System.out.println("current project name==="+this.getProject().getName());
}

/**
* 这个方法可以得到current project。
*
* @return
*/
private IProject getProject(){
IResource[]rs =
(IResource[])getSelectedResources((IStructuredSelection)selection,IResource.class);
IProject project = null;
for(int i =0;i IResource r = rs[i];
if(r.getType()==IResource.PROJECT){
project = (IProject) r;
break;
}
}
return project;
}
}


三、联系作者:

作者信息:kobye
kobye的jsports项目 Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
How to access eclipse workspace?

转载者:cleverpig

原作者:kobye

原作者网站:http://blog.csdn.net/jsports/

标签: