使用代码生成插件工程,脱离eclipse本身的新建工程向导(3)

在第二步中需要有个PluginClassCodeGenerator类,是用来生产插件工程的启动类Activator,在eclipse源码中,也需要依赖向导中保存的一些上下文信息,也需要进行改造,改造后如下。


import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.ArrayList;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.pde.core.plugin.IPluginReference;
import org.eclipse.pde.internal.build.IPDEBuildConstants;
import org.eclipse.pde.internal.core.util.CoreUtility;
import org.eclipse.pde.ui.templates.PluginReference;

/**
*
* @author aquarion
* @version 1.0
*
*/
@SuppressWarnings("restriction")
public class PluginClassCodeGenerator {
private IProject fProject;
private String fQualifiedClassName;
private String id;

public PluginClassCodeGenerator(IProject project,
String qualifiedClassName, String id) {
fProject = project;
fQualifiedClassName = qualifiedClassName;
this.id = id;
}

public IFile generate() throws CoreException {
int nameloc = fQualifiedClassName.lastIndexOf('.');
String packageName = (nameloc == -1) ? "" : fQualifiedClassName.substring(0, nameloc); //$NON-NLS-1$
String className = fQualifiedClassName.substring(nameloc + 1);

IPath path = new Path(packageName.replace('.', '/'));
path = new Path("src").append(path);

CoreUtility.createFolder(fProject.getFolder(path));

IFile file = fProject.getFile(path.append(className + ".java")); //$NON-NLS-1$
StringWriter swriter = new StringWriter();
PrintWriter writer = new PrintWriter(swriter);
// only generate/extend plug-in classes if it's a IU plug-in
generatePluginClass(packageName, className, writer);
writer.flush();
try {
swriter.close();
ByteArrayInputStream stream = new ByteArrayInputStream(swriter
.toString().getBytes(fProject.getDefaultCharset()));
if (file.exists())
file.setContents(stream, false, true, null);
else
file.create(stream, false, null);
stream.close();
} catch (IOException e) {

}
return file;
}

private void generatePluginClass(String packageName, String className,
PrintWriter writer) {
if (!packageName.equals("")) { //$NON-NLS-1$
writer.println("package " + packageName + ";"); //$NON-NLS-1$ //$NON-NLS-2$
writer.println();
}
writer.println("import org.eclipse.ui.plugin.AbstractUIPlugin;"); //$NON-NLS-1$
writer.println("import org.osgi.framework.BundleContext;"); //$NON-NLS-1$
writer.println();
writer.println("/**"); //$NON-NLS-1$
writer.println(" * The activator class controls the plug-in life cycle"); //$NON-NLS-1$
writer.println(" */"); //$NON-NLS-1$
writer.println("public class " + className + " extends AbstractUIPlugin {"); //$NON-NLS-1$ //$NON-NLS-2$
writer.println();
writer.println("\t// The plug-in ID"); //$NON-NLS-1$
writer.println("\tpublic static final String PLUGIN_ID = \"" + id + "\"; //$NON-NLS-1$"); //$NON-NLS-1$ //$NON-NLS-2$
writer.println();
writer.println("\t// The shared instance"); //$NON-NLS-1$
writer.println("\tprivate static " + className + " plugin;"); //$NON-NLS-1$ //$NON-NLS-2$
writer.println("\t"); //$NON-NLS-1$
writer.println("\t/**"); //$NON-NLS-1$
writer.println("\t * The constructor"); //$NON-NLS-1$
writer.println("\t */"); //$NON-NLS-1$
writer.println("\tpublic " + className + "() {"); //$NON-NLS-1$ //$NON-NLS-2$
writer.println("\t}"); //$NON-NLS-1$
writer.println();

writer.println("\t/*"); //$NON-NLS-1$
writer.println("\t * (non-Javadoc)"); //$NON-NLS-1$
writer.println("\t * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)"); //$NON-NLS-1$
writer.println("\t */"); //$NON-NLS-1$
writer.println("\tpublic void start(BundleContext context) throws Exception {"); //$NON-NLS-1$
writer.println("\t\tsuper.start(context);"); //$NON-NLS-1$
writer.println("\t\tplugin = this;"); //$NON-NLS-1$
writer.println("\t}"); //$NON-NLS-1$
writer.println();

writer.println("\t/*"); //$NON-NLS-1$
writer.println("\t * (non-Javadoc)"); //$NON-NLS-1$
writer.println("\t * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)"); //$NON-NLS-1$
writer.println("\t */"); //$NON-NLS-1$
writer.println("\tpublic void stop(BundleContext context) throws Exception {"); //$NON-NLS-1$
writer.println("\t\tplugin = null;"); //$NON-NLS-1$
writer.println("\t\tsuper.stop(context);"); //$NON-NLS-1$
writer.println("\t}"); //$NON-NLS-1$
writer.println();

writer.println("\t/**"); //$NON-NLS-1$
writer.println("\t * Returns the shared instance"); //$NON-NLS-1$
writer.println("\t *"); //$NON-NLS-1$
writer.println("\t * @return the shared instance"); //$NON-NLS-1$
writer.println("\t */"); //$NON-NLS-1$
writer.println("\tpublic static " + className + " getDefault() {"); //$NON-NLS-1$ //$NON-NLS-2$
writer.println("\t\treturn plugin;"); //$NON-NLS-1$
writer.println("\t}"); //$NON-NLS-1$
writer.println();
writer.println("}"); //$NON-NLS-1$
}

@SuppressWarnings({ "rawtypes", "unchecked", "restriction" })
public IPluginReference[] getDependencies() {
ArrayList result = new ArrayList();
result.add(new PluginReference("org.eclipse.ui", null, 0)); //$NON-NLS-1$
result.add(new PluginReference(IPDEBuildConstants.BUNDLE_CORE_RUNTIME,
null, 0));
return (IPluginReference[]) result.toArray(new IPluginReference[result
.size()]);
}

// public String[] getImportPackages() {
// return fPluginData.getOSGiFramework() != null ? new String[] { "org.osgi.framework;version=\"1.3.0\"" } //$NON-NLS-1$
// : new String[0];
// }

}


经过这三步,能生产最基础的插件工程,用处其实不大,需要进一步的定制特别的插件工程内容来满足需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值