在第二步中需要有个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]; // }}
经过这三步,能生产最基础的插件工程,用处其实不大,需要进一步的定制特别的插件工程内容来满足需求。