001 /*
002 * Copyright 2005 Stephen J. McConnell
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.tools.tasks;
020
021 import java.io.File;
022
023 import net.dpml.library.Resource;
024 import net.dpml.library.impl.DefaultLibrary;
025
026 import net.dpml.tools.impl.StandardBuilder;
027
028 import net.dpml.transit.monitor.LoggingAdapter;
029
030 import net.dpml.util.Logger;
031
032 import org.apache.tools.ant.BuildException;
033 import org.apache.tools.ant.Task;
034 import org.apache.tools.ant.taskdefs.Ant;
035
036 /**
037 * Resolves a sorted sequence of projects with a basedir equal to or
038 * derived from the current ${basedir}.
039 *
040 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
041 * @version 1.2.0
042 */
043 public class ReactorTask extends Task
044 {
045 private String m_target;
046
047 /**
048 * Set the target task name.
049 * @param target the target task
050 */
051 public void setTarget( String target )
052 {
053 m_target = target;
054 }
055
056 private String[] getTargets()
057 {
058 if( null != m_target )
059 {
060 return new String[]{m_target};
061 }
062 else
063 {
064 return new String[0];
065 }
066 }
067
068 /**
069 * Execute the task.
070 */
071 public void execute()
072 {
073 try
074 {
075 Logger logger = new LoggingAdapter();
076 DefaultLibrary library = new DefaultLibrary( logger );
077 StandardBuilder builder = new StandardBuilder( logger, library, false );
078 File basedir = getProject().getBaseDir().getCanonicalFile();
079 Resource[] resources = library.select( basedir, false );
080 log( "Reactive selection: " + resources.length );
081 for( int i=0; i<resources.length; i++ )
082 {
083 Resource resource = resources[i];
084 if( !resource.getBaseDir().equals( basedir ) )
085 {
086 executeTarget( builder, resource );
087 }
088 }
089 }
090 catch( BuildException e )
091 {
092 throw e;
093 }
094 catch( Exception e )
095 {
096 final String error =
097 "Unexpected error while resolving reactive project list.";
098 throw new BuildException( error, e );
099 }
100 }
101
102 private void executeTarget( StandardBuilder builder, final Resource resource ) throws BuildException
103 {
104 log( "Executing reactive build: " + resource );
105 final Ant ant = (Ant) getProject().createTask( "ant" );
106 ant.setDir( resource.getBaseDir() );
107 ant.setInheritRefs( false );
108 ant.setInheritAll( false );
109
110 File template = builder.getTemplateFile( resource );
111 ant.setAntfile( template.toString() );
112 if( null != m_target )
113 {
114 if( !"default".equals( m_target ) )
115 {
116 log( "building " + resource + " with target: " + m_target );
117 ant.setTarget( m_target );
118 }
119 else
120 {
121 log( "building " + resource + " with default target" );
122 }
123 }
124 else
125 {
126 log( "building " + resource + " with default target" );
127 }
128 ant.init();
129 ant.execute();
130 }
131 }