Author: niclas Date: Mon Sep 13 05:12:11 2004 New Revision: 45972 Added: avalon/trunk/central/laboratory/studio/magic/ avalon/trunk/central/laboratory/studio/magic/build.xml (contents, props changed) avalon/trunk/central/laboratory/studio/magic/project.properties (contents, props changed) avalon/trunk/central/laboratory/studio/magic/src/ avalon/trunk/central/laboratory/studio/magic/src/main/ avalon/trunk/central/laboratory/studio/magic/src/main/org/ avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/ avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/ avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/ avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/ avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/EclipseBuildListener.java (contents, props changed) avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/EclipseTask.java (contents, props changed) avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/package.html (contents, props changed) Log: Added a Magic Plugin that generates Eclipse Plugins.
Added: avalon/trunk/central/laboratory/studio/magic/build.xml ============================================================================== --- (empty file) +++ avalon/trunk/central/laboratory/studio/magic/build.xml Mon Sep 13 05:12:11 2004 @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8" ?> + +<project name="metro-studio-magic" default="install" basedir="." + xmlns:x="antlib:org.apache.avalon.tools" +> + + <property file="project.properties" /> + + <x:home index="../index.xml"/> + <import file="${project.system}/default/standard.xml"/> + + <target name="build" depends="standard.build"> + <x:declare/> + </target> + + +</project> Added: avalon/trunk/central/laboratory/studio/magic/project.properties ============================================================================== --- (empty file) +++ avalon/trunk/central/laboratory/studio/magic/project.properties Mon Sep 13 05:12:11 2004 @@ -0,0 +1,5 @@ + +project.name = metro-studio-magic + +project.system = ../../../system/build + Added: avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/EclipseBuildListener.java ============================================================================== --- (empty file) +++ avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/EclipseBuildListener.java Mon Sep 13 05:12:11 2004 @@ -0,0 +1,186 @@ +/* + * Copyright 2004 Apache Software Foundation + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.metro.studio.magic; + +import java.io.File; + +import org.apache.avalon.tools.model.MagicPath; +import org.apache.avalon.tools.model.Policy; + +import org.apache.avalon.tools.tasks.ReplicateTask; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.BuildListener; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.types.FileSet; + +/** + * An abstract build listener. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Avalon Development Team</a> + * @version $Id: MetaBuildListener.java 30977 2004-07-30 08:57:54Z niclas $ + */ +public class EclipseBuildListener + implements BuildListener +{ + private static final String PREPARE_TASK_KEY = + "antlib:org.apache.avalon.tools:prepare"; + + private static final String META_TASK_KEY = + "plugin:metro/studio/metro-studio-magic:studio"; + + private final String m_uri; + + private boolean m_executed; + + public EclipseBuildListener( String uri ) + { + m_uri = uri; + m_executed = false; + } + + /** + * Signals that a build has started. This event + * is fired before any targets have started. + * + * @param event An event with any relevant extra information. + * Must not be <code>null</code>. + */ + public void buildStarted( BuildEvent event ) + { + // will not happen + } + + /** + * Signals that the last target has finished. This event + * will still be fired if an error occurred during the build. + * + * @param event An event with any relevant extra information. + * Must not be <code>null</code>. + * + * @see BuildEvent#getException() + */ + public void buildFinished( BuildEvent event ) + { + } + + /** + * Signals that a target is starting. + * + * @param event An event with any relevant extra information. + * Must not be <code>null</code>. + * + * @see BuildEvent#getTarget() + */ + public void targetStarted( BuildEvent event ) + { + } + + /** + * Signals that a target has finished. This event will + * still be fired if an error occurred during the build. + * + * @param event An event with any relevant extra information. + * Must not be <code>null</code>. + * + * @see BuildEvent#getException() + */ + public void targetFinished( BuildEvent event ) + { + } + + /** + * Signals that a task is starting. + * + * @param event An event with any relevant extra information. + * Must not be <code>null</code>. + * + * @see BuildEvent#getTask() + */ + public void taskStarted( BuildEvent event ) + { + } + + /** + * Signals that a task has finished. This event will still + * be fired if an error occurred during the build. + * + * @param event An event with any relevant extra information. + * Must not be <code>null</code>. + * + * @see BuildEvent#getException() + */ + public void taskFinished( BuildEvent event ) + { + if( m_executed ) + return; + + String type = event.getTask().getTaskType(); + if( PREPARE_TASK_KEY.equals( type ) ) + { + Project project = event.getProject(); + generatePluginXML( project ); + m_executed = true; + } + } + + private void generatePluginXML( Project project ) + { + File basedir = project.getBaseDir(); + File pluginSpec = new File( basedir, "target/build/etc/plugin-spec.xml" ); + if( pluginSpec.exists() ) + { + File dest = new File( basedir, "target/deliverables/" ); + dest.mkdirs(); + + MagicPath path = new MagicPath( project ); + path.setMode( "RUNTIME" ); + + ReplicateTask repl = new ReplicateTask(); + repl.setProject( project ); + repl.setTaskName( "replicate" ); + repl.init(); + File f = new File( basedir, "target/deliverables/lib" ); + f.mkdirs(); + repl.setTodir( f ); + repl.setRefid( path ); + repl.execute(); + + EclipseTask task = new EclipseTask(); + task.setProject( project ); + task.setTaskName( "eclipse" ); + task.init(); + + task.setDestDir( dest ); + task.setPluginSpec( pluginSpec ); + task.execute(); + } + } + + /** + * Signals a message logging event. + * + * @param event An event with any relevant extra information. + * Must not be <code>null</code>. + * + * @see BuildEvent#getMessage() + * @see BuildEvent#getPriority() + */ + public void messageLogged( BuildEvent event ) + { + } +} Added: avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/EclipseTask.java ============================================================================== --- (empty file) +++ avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/EclipseTask.java Mon Sep 13 05:12:11 2004 @@ -0,0 +1,243 @@ +/* + * Copyright 2004 Apache Software Foundation + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.metro.studio.magic; + +import java.io.File; +import java.io.IOException; + +import java.util.ArrayList; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; + +import javax.xml.transform.dom.DOMSource; + +import javax.xml.transform.stream.StreamResult; + +import org.apache.avalon.tools.model.Context; +import org.apache.avalon.tools.model.Definition; +import org.apache.avalon.tools.model.Home; +import org.apache.avalon.tools.model.Info; +import org.apache.avalon.tools.model.Policy; +import org.apache.avalon.tools.model.Resource; +import org.apache.avalon.tools.model.ResourceRef; + +import org.apache.avalon.tools.tasks.SystemTask; + +import org.apache.tools.ant.BuildException; +import org.apache.tools.ant.Project; + +import org.apache.tools.ant.types.Path; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.w3c.dom.Text; + +import org.xml.sax.SAXException; + +/** + * Generate a eclipse plugin XML. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Avalon Development Team</a> + */ +public class EclipseTask extends SystemTask +{ + /** + * The file containing the specification for the plugin.xml + */ + private File m_PluginSpec; + + /** + * The destination directory for plugin.xml + */ + private File m_DestDir; + + + /** + * Set the desitation directory to generate output files to. + * + * @param destDir The destination directory + */ + public void setDestDir( final File destDir ) + { + m_DestDir = destDir; + } + + /** + * Return the destination directory in which files are generated. + * + * @return the destination directory in which files are generated. + */ + public File getDestDir() + { + return m_DestDir; + } + + /** + * Set the file containing the specification for the plugin.xml. + * + * @param destDir the file containing the specification for + * the plugin.xml. + */ + public void setPluginSpec( File pluginSpec ) + { + m_PluginSpec = pluginSpec; + } + + /** + * Return the file containing the specification for the plugin.xml. + * + * @return the file containing the specification for the plugin.xml. + */ + public File getPluginSpec() + { + return m_PluginSpec; + } + + /** + * Execute generator task. + * @exception BuildException if a build error occurs + */ + public void execute() + throws BuildException + { + try + { + Document doc = parseSpecification(); + addVersionAttribute( doc ); + addRuntimeElement( doc ); + writePluginXml( doc ); + } catch( ParserConfigurationException e ) + { + String message = "JAXP is not properly setup. Missing Parser."; + throw new BuildException( message, e ); + } catch( TransformerConfigurationException e ) + { + String message = "JAXP is not properly setup. Missing Transformer."; + throw new BuildException( message, e ); + } catch( SAXException e ) + { + String message = ""; + throw new BuildException( message, e ); + } catch( IOException e ) + { + String message = ""; + throw new BuildException( message, e ); + } catch( TransformerException e ) + { + String message = ""; + throw new BuildException( message, e ); + } + } + + private Document parseSpecification() + throws ParserConfigurationException, SAXException, IOException + { + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilder builder = factory.newDocumentBuilder(); + Document doc = builder.parse( m_PluginSpec ); + return doc; + } + + private void addVersionAttribute( Document doc ) + { + Element root = doc.getDocumentElement(); + Home home = getHome(); + String name = getProject().getName(); + Definition def = home.getDefinition( name ); + Info info = def.getInfo(); + String version = info.getVersion(); + root.setAttribute( "version", version ); + } + + private void addRuntimeElement( Document doc ) + { + Element root = doc.getDocumentElement(); + Element runtimeElement = doc.createElement( "runtime" ); + Text padding = doc.createTextNode( "\n " ); + root.appendChild( padding ); + root.appendChild( runtimeElement ); + padding = doc.createTextNode( "\n" ); + root.appendChild( padding ); + + Project project = getProject(); + String projectName = project.getName(); + Home home = getHome(); + Definition def = home.getDefinition( projectName ); + processDefinition( doc, runtimeElement, def ); + } + + private void processDefinition( Document doc, Element runtime, Definition def ) + { + Element selfNode = appendLibraryChild( doc, runtime, def ); + Element export = doc.createElement( "export" ); + export.setAttribute( "name", "*" ); + Text padding = doc.createTextNode( "\n " ); + selfNode.appendChild( padding ); + selfNode.appendChild( export ); + padding = doc.createTextNode( "\n " ); + selfNode.appendChild( padding ); + + final ResourceRef[] refs = + def.getResourceRefs( getProject(), Policy.RUNTIME, ResourceRef.ANY, true ); + Home home = getHome(); + for( int i=0 ; i < refs.length ; i++ ) + { + Resource resource = home.getResource( refs[i] ); + appendLibraryChild( doc, runtime, resource ); + } + padding = doc.createTextNode( "\n " ); + runtime.appendChild( padding ); + } + + private Element appendLibraryChild( Document doc, Node node, Resource resource ) + { + final String name = resource.getFilename(); + final String group = resource.getInfo().getGroup(); + + final String filename = "lib/" + group + "/" + name; + + final Element library = doc.createElement( "library" ); + library.setAttribute( "name", filename ); + Text padding = doc.createTextNode( "\n " ); + node.appendChild( padding ); + node.appendChild( library ); + return library; + } + + private void writePluginXml( Document doc ) + throws TransformerConfigurationException, TransformerException + { + TransformerFactory factory = TransformerFactory.newInstance(); + Transformer transformer = factory.newTransformer(); + + File output = new File( m_DestDir, "plugin.xml" ); + + DOMSource source = new DOMSource( doc ); + StreamResult result = new StreamResult( output ); + transformer.transform( source, result ); + } +} Added: avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/package.html ============================================================================== --- (empty file) +++ avalon/trunk/central/laboratory/studio/magic/src/main/org/apache/metro/studio/magic/package.html Mon Sep 13 05:12:11 2004 @@ -0,0 +1,5 @@ +<html><body> +<p>Plugin for Magic that creates Eclipse Plugins.</p> +</body></html> + + --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]