git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269632 13f79535-47bb-0310-9956-ffa450edef68master
@@ -8,6 +8,8 @@ | |||||
package org.apache.myrmidon.components.aspect; | package org.apache.myrmidon.components.aspect; | ||||
import java.util.HashMap; | import java.util.HashMap; | ||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
import org.apache.avalon.framework.activity.Initializable; | import org.apache.avalon.framework.activity.Initializable; | ||||
import org.apache.avalon.framework.configuration.Configuration; | import org.apache.avalon.framework.configuration.Configuration; | ||||
import org.apache.avalon.framework.parameters.Parameters; | import org.apache.avalon.framework.parameters.Parameters; | ||||
@@ -25,6 +27,9 @@ import org.apache.myrmidon.aspects.NoopAspectHandler; | |||||
public class DefaultAspectManager | public class DefaultAspectManager | ||||
implements AspectManager, Initializable | implements AspectManager, Initializable | ||||
{ | { | ||||
private static final Resources REZ = | |||||
ResourceManager.getPackageResources( DefaultAspectManager.class ); | |||||
private HashMap m_aspectMap = new HashMap(); | private HashMap m_aspectMap = new HashMap(); | ||||
private AspectHandler[] m_aspects = new AspectHandler[ 0 ]; | private AspectHandler[] m_aspects = new AspectHandler[ 0 ]; | ||||
private String[] m_names = new String[ 0 ]; | private String[] m_names = new String[ 0 ]; | ||||
@@ -50,7 +55,8 @@ public class DefaultAspectManager | |||||
final AspectHandler entry = (AspectHandler)m_aspectMap.remove( name ); | final AspectHandler entry = (AspectHandler)m_aspectMap.remove( name ); | ||||
if( null == entry ) | if( null == entry ) | ||||
{ | { | ||||
throw new TaskException( "No such aspect with name '" + name + "'" ); | |||||
final String message = REZ.getString( "no.aspect", name ); | |||||
throw new TaskException( message ); | |||||
} | } | ||||
rebuildArrays(); | rebuildArrays(); | ||||
@@ -75,7 +81,8 @@ public class DefaultAspectManager | |||||
final AspectHandler handler = (AspectHandler)m_aspectMap.get( name ); | final AspectHandler handler = (AspectHandler)m_aspectMap.get( name ); | ||||
if( null == handler ) | if( null == handler ) | ||||
{ | { | ||||
throw new TaskException( "No such aspect with name '" + name + "'" ); | |||||
final String message = REZ.getString( "no.aspect", name ); | |||||
throw new TaskException( message ); | |||||
} | } | ||||
handler.aspectSettings( parameters, elements ); | handler.aspectSettings( parameters, elements ); | ||||
@@ -98,7 +105,8 @@ public class DefaultAspectManager | |||||
public void aspectSettings( final Parameters parameters, final Configuration[] elements ) | public void aspectSettings( final Parameters parameters, final Configuration[] elements ) | ||||
throws TaskException | throws TaskException | ||||
{ | { | ||||
throw new UnsupportedOperationException( "Can not provide Settings to AspectManager" ); | |||||
final String message = REZ.getString( "no.settings" ); | |||||
throw new UnsupportedOperationException( message ); | |||||
} | } | ||||
public void postCreate( final Task task ) | public void postCreate( final Task task ) | ||||
@@ -0,0 +1,2 @@ | |||||
no.aspect=No such aspect with name {0}. | |||||
no.settings=Can not provide Settings to AspectManager. |
@@ -7,25 +7,27 @@ | |||||
*/ | */ | ||||
package org.apache.myrmidon.components.builder; | package org.apache.myrmidon.components.builder; | ||||
import java.net.URL; | |||||
import java.io.InputStream; | import java.io.InputStream; | ||||
import java.net.URL; | |||||
import java.util.Properties; | import java.util.Properties; | ||||
import javax.xml.parsers.SAXParser; | import javax.xml.parsers.SAXParser; | ||||
import javax.xml.parsers.SAXParserFactory; | import javax.xml.parsers.SAXParserFactory; | ||||
import org.apache.avalon.framework.configuration.SAXConfigurationHandler; | |||||
import org.apache.avalon.framework.parameters.Parameterizable; | |||||
import org.apache.avalon.framework.parameters.Parameters; | |||||
import org.xml.sax.SAXException; | |||||
import org.xml.sax.XMLReader; | |||||
import javax.xml.transform.TransformerFactory; | |||||
import javax.xml.transform.Transformer; | import javax.xml.transform.Transformer; | ||||
import javax.xml.transform.TransformerConfigurationException; | import javax.xml.transform.TransformerConfigurationException; | ||||
import javax.xml.transform.TransformerFactory; | |||||
import javax.xml.transform.sax.SAXResult; | import javax.xml.transform.sax.SAXResult; | ||||
import javax.xml.transform.sax.SAXSource; | import javax.xml.transform.sax.SAXSource; | ||||
import javax.xml.transform.sax.SAXTransformerFactory; | import javax.xml.transform.sax.SAXTransformerFactory; | ||||
import javax.xml.transform.sax.TransformerHandler; | import javax.xml.transform.sax.TransformerHandler; | ||||
import javax.xml.transform.stream.StreamSource; | |||||
import javax.xml.transform.stream.StreamResult; | import javax.xml.transform.stream.StreamResult; | ||||
import javax.xml.transform.stream.StreamSource; | |||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
import org.apache.avalon.framework.configuration.SAXConfigurationHandler; | |||||
import org.apache.avalon.framework.parameters.Parameterizable; | |||||
import org.apache.avalon.framework.parameters.Parameters; | |||||
import org.xml.sax.SAXException; | |||||
import org.xml.sax.XMLReader; | |||||
/** | /** | ||||
* Default implementation to construct project from a build file. | * Default implementation to construct project from a build file. | ||||
@@ -36,14 +38,8 @@ public class ATIProjectBuilder | |||||
extends DefaultProjectBuilder | extends DefaultProjectBuilder | ||||
implements Parameterizable | implements Parameterizable | ||||
{ | { | ||||
private final static String PARAM_EXCEPTION = | |||||
"Malformed PI: expected <?xsl-param name=\"foo\" value=\"bar\"?>"; | |||||
private final static String PARAMS_EXCEPTION = | |||||
"Malformed PI: expected <?xsl-params location=\"myparams.properties\"?>"; | |||||
private final static String STYLE_EXCEPTION = | |||||
"Malformed PI: expected <?xsl-params href=\"mystylesheet.xsl\"?>"; | |||||
private static final Resources REZ = | |||||
ResourceManager.getPackageResources( ATIProjectBuilder.class ); | |||||
private Parameters m_parameters; | private Parameters m_parameters; | ||||
private URL m_systemID; | private URL m_systemID; | ||||
@@ -82,12 +78,12 @@ public class ATIProjectBuilder | |||||
if( target.equals( "xsl-param" ) ) handleParameter( data ); | if( target.equals( "xsl-param" ) ) handleParameter( data ); | ||||
else if( target.equals( "xsl-params" ) ) handleParameters( data, sourceID ); | else if( target.equals( "xsl-params" ) ) handleParameters( data, sourceID ); | ||||
else if( target.equals( "xsl-stylesheet" ) ) | |||||
else if( target.equals( "xsl-stylesheet" ) ) | |||||
{ | { | ||||
if( null != transformer ) | if( null != transformer ) | ||||
{ | { | ||||
throw new SAXException( "Build file can not contain " + | |||||
"two xsl-stylesheet PIs" ); | |||||
final String message = REZ.getString( "ati.two.stylesheet.pis" ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
final TransformerFactory factory = TransformerFactory.newInstance(); | final TransformerFactory factory = TransformerFactory.newInstance(); | ||||
@@ -113,9 +109,9 @@ public class ATIProjectBuilder | |||||
final SAXResult result = new SAXResult( handler ); | final SAXResult result = new SAXResult( handler ); | ||||
transformer.transform( new StreamSource( sourceID.toString() ), result ); | transformer.transform( new StreamSource( sourceID.toString() ), result ); | ||||
//transformer.transform( new StreamSource( sourceID.toString() ), | |||||
//transformer.transform( new StreamSource( sourceID.toString() ), | |||||
//new StreamResult( System.out ) ); | //new StreamResult( System.out ) ); | ||||
} | |||||
} | |||||
} | } | ||||
private void handleParameter( final String data ) | private void handleParameter( final String data ) | ||||
@@ -124,22 +120,25 @@ public class ATIProjectBuilder | |||||
int index = data.indexOf( '\"' ); | int index = data.indexOf( '\"' ); | ||||
if( -1 == index ) | if( -1 == index ) | ||||
{ | { | ||||
throw new SAXException( PARAM_EXCEPTION ); | |||||
final String message = REZ.getString( "ati.param.error" ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
index = data.indexOf( '\"', index + 1 ); | index = data.indexOf( '\"', index + 1 ); | ||||
if( -1 == index ) | if( -1 == index ) | ||||
{ | { | ||||
throw new SAXException( PARAM_EXCEPTION ); | |||||
final String message = REZ.getString( "ati.param.error" ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
//split between two "attributes" occurs on index | //split between two "attributes" occurs on index | ||||
final String[] name = parseAttribute( data.substring( 0, index + 1 ) ); | final String[] name = parseAttribute( data.substring( 0, index + 1 ) ); | ||||
final String[] value = parseAttribute( data.substring( index + 1 ).trim() ); | final String[] value = parseAttribute( data.substring( index + 1 ).trim() ); | ||||
if( !name[ 0 ].equals( "name" ) || !value[ 0 ].equals( "value" ) ) | if( !name[ 0 ].equals( "name" ) || !value[ 0 ].equals( "value" ) ) | ||||
{ | { | ||||
throw new SAXException( PARAM_EXCEPTION ); | |||||
final String message = REZ.getString( "ati.param.error" ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
m_parameters.setParameter( name[ 1 ], value[ 1 ] ); | m_parameters.setParameter( name[ 1 ], value[ 1 ] ); | ||||
@@ -151,7 +150,8 @@ public class ATIProjectBuilder | |||||
final String[] params = parseAttribute( data ); | final String[] params = parseAttribute( data ); | ||||
if( !params[ 0 ].equals( "location" ) ) | if( !params[ 0 ].equals( "location" ) ) | ||||
{ | { | ||||
throw new SAXException( PARAMS_EXCEPTION ); | |||||
final String message = REZ.getString( "ati.params.error" ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
try | try | ||||
@@ -165,7 +165,8 @@ public class ATIProjectBuilder | |||||
} | } | ||||
catch( final Exception e ) | catch( final Exception e ) | ||||
{ | { | ||||
throw new SAXException( "Error loading parameters: " + e ); | |||||
final String message = REZ.getString( "ati.loading-params.error", params[ 1 ], e ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
} | } | ||||
@@ -175,14 +176,16 @@ public class ATIProjectBuilder | |||||
final String[] stylesheet = parseAttribute( data ); | final String[] stylesheet = parseAttribute( data ); | ||||
if( !stylesheet[ 0 ].equals( "href" ) ) | if( !stylesheet[ 0 ].equals( "href" ) ) | ||||
{ | { | ||||
throw new SAXException( STYLE_EXCEPTION ); | |||||
final String message = REZ.getString( "ati.style.error" ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
try { return new URL( baseSource, stylesheet[ 1 ] ).toString(); } | try { return new URL( baseSource, stylesheet[ 1 ] ).toString(); } | ||||
catch( final Exception e ) | catch( final Exception e ) | ||||
{ | { | ||||
throw new SAXException( "Error locating stylesheet '" + stylesheet[ 1 ] + | |||||
"' due to " + e ); | |||||
final String message = | |||||
REZ.getString( "ati.loading-style.error", stylesheet[ 1 ], e ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
} | } | ||||
@@ -193,20 +196,20 @@ public class ATIProjectBuilder | |||||
int index = data.indexOf( '=' ); | int index = data.indexOf( '=' ); | ||||
if( -1 == index ) | if( -1 == index ) | ||||
{ | { | ||||
throw new SAXException( "Expecting an attribute but received '" + | |||||
data + "'" ); | |||||
final String message = REZ.getString( "ati.attribue-expected.error", data ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
final int size = data.length(); | final int size = data.length(); | ||||
if( '\"' != data.charAt( index + 1 ) || | |||||
if( '\"' != data.charAt( index + 1 ) || | |||||
'\"' != data.charAt( size - 1 ) || | '\"' != data.charAt( size - 1 ) || | ||||
size - 1 == index ) | size - 1 == index ) | ||||
{ | { | ||||
throw new SAXException( "Expecting the value of attribute " + | |||||
data.substring( 0, index ) + | |||||
" to be enclosed in quotes" ); | |||||
final String message = | |||||
REZ.getString( "ati.attribue-unquoted.error", data.substring( 0, index ) ); | |||||
throw new SAXException( message ); | |||||
} | } | ||||
final String[] result = new String[ 2 ]; | final String[] result = new String[ 2 ]; | ||||
result[ 0 ] = data.substring( 0, index ); | result[ 0 ] = data.substring( 0, index ); | ||||
result[ 1 ] = data.substring( index + 2, size - 1 ); | result[ 1 ] = data.substring( index + 2, size - 1 ); | ||||
@@ -29,6 +29,8 @@ import org.apache.myrmidon.components.model.Project; | |||||
import org.apache.myrmidon.components.model.Target; | import org.apache.myrmidon.components.model.Target; | ||||
import org.xml.sax.SAXException; | import org.xml.sax.SAXException; | ||||
import org.xml.sax.XMLReader; | import org.xml.sax.XMLReader; | ||||
import org.apache.avalon.excalibur.i18n.ResourceManager; | |||||
import org.apache.avalon.excalibur.i18n.Resources; | |||||
/** | /** | ||||
* Default implementation to construct project from a build file. | * Default implementation to construct project from a build file. | ||||
@@ -39,6 +41,9 @@ public class DefaultProjectBuilder | |||||
extends AbstractLoggable | extends AbstractLoggable | ||||
implements ProjectBuilder | implements ProjectBuilder | ||||
{ | { | ||||
private static final Resources REZ = | |||||
ResourceManager.getPackageResources( DefaultProjectBuilder.class ); | |||||
private final static int PROJECT_REFERENCES = 0; | private final static int PROJECT_REFERENCES = 0; | ||||
private final static int LIBRARY_IMPORTS = 1; | private final static int LIBRARY_IMPORTS = 1; | ||||
private final static int IMPLICIT_TASKS = 2; | private final static int IMPLICIT_TASKS = 2; | ||||
@@ -117,7 +122,8 @@ public class DefaultProjectBuilder | |||||
{ | { | ||||
if( !configuration.getName().equals( "project" ) ) | if( !configuration.getName().equals( "project" ) ) | ||||
{ | { | ||||
throw new Exception( "Project file must be enclosed in project element" ); | |||||
final String message = REZ.getString( "ant.no-project-element.error" ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
//get project-level attributes | //get project-level attributes | ||||
@@ -129,7 +135,11 @@ public class DefaultProjectBuilder | |||||
final File baseDirectory = | final File baseDirectory = | ||||
(new File( file.getParentFile(), baseDirectoryName )).getAbsoluteFile(); | (new File( file.getParentFile(), baseDirectoryName )).getAbsoluteFile(); | ||||
getLogger().debug( "Project " + file + " base directory: " + baseDirectory ); | |||||
if( getLogger().isDebugEnabled() ) | |||||
{ | |||||
final String message = REZ.getString( "ant.project-banner.notice", file, baseDirectory ); | |||||
getLogger().debug( message ); | |||||
} | |||||
//create project and ... | //create project and ... | ||||
final DefaultProject project = new DefaultProject(); | final DefaultProject project = new DefaultProject(); | ||||
@@ -205,9 +215,9 @@ public class DefaultProjectBuilder | |||||
if( name.equals( "target" ) ) buildTarget( project, element ); | if( name.equals( "target" ) ) buildTarget( project, element ); | ||||
else | else | ||||
{ | { | ||||
throw new Exception( "Unknown top-level element " + name + | |||||
" at " + element.getLocation() + | |||||
". Expecting target" ); | |||||
final String message = | |||||
REZ.getString( "ant.unknown-toplevel-element.error", name, element.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
} | } | ||||
@@ -228,20 +238,23 @@ public class DefaultProjectBuilder | |||||
if( null == name ) | if( null == name ) | ||||
{ | { | ||||
throw new Exception( "Malformed projectref without a name attribute at " + | |||||
element.getLocation() ); | |||||
final String message = | |||||
REZ.getString( "ant.projectref-no-name.error", element.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
if( !validName( name ) ) | if( !validName( name ) ) | ||||
{ | { | ||||
throw new Exception( "Projectref with an invalid name attribute at " + | |||||
element.getLocation() ); | |||||
final String message = | |||||
REZ.getString( "ant.projectref-bad-name.error", element.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
if( null == location ) | if( null == location ) | ||||
{ | { | ||||
throw new Exception( "Malformed projectref without a location attribute at " + | |||||
element.getLocation() ); | |||||
final String message = | |||||
REZ.getString( "ant.projectref-no-location.error", element.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
final File baseDirectory = project.getBaseDirectory(); | final File baseDirectory = project.getBaseDirectory(); | ||||
@@ -270,17 +283,18 @@ public class DefaultProjectBuilder | |||||
if( null == library ) | if( null == library ) | ||||
{ | { | ||||
throw new Exception( "Malformed import without a library attribute at " + | |||||
element.getLocation() ); | |||||
final String message = | |||||
REZ.getString( "ant.import-no-library.error", element.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
if( null == name || null == type ) | if( null == name || null == type ) | ||||
{ | { | ||||
if( null != name || null != type ) | if( null != name || null != type ) | ||||
{ | { | ||||
throw new Exception( "Malformed import at " + element.getLocation() + | |||||
". If name or type attribute is specified, both " + | |||||
"attributes must be specified." ); | |||||
final String message = | |||||
REZ.getString( "ant.import-malformed.error", element.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
} | } | ||||
@@ -303,34 +317,49 @@ public class DefaultProjectBuilder | |||||
if( null == name ) | if( null == name ) | ||||
{ | { | ||||
throw new Exception( "Discovered un-named target at " + | |||||
target.getLocation() ); | |||||
final String message = | |||||
REZ.getString( "ant.target-noname.error", target.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
if( !validName( name ) ) | if( !validName( name ) ) | ||||
{ | { | ||||
throw new Exception( "Target with an invalid name at " + | |||||
target.getLocation() ); | |||||
final String message = | |||||
REZ.getString( "ant.target-bad-name.error", target.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
getLogger().debug( "Parsing target: " + name ); | |||||
if( getLogger().isDebugEnabled() ) | |||||
{ | |||||
final String message = REZ.getString( "ant.target-parse.notice", name ); | |||||
getLogger().debug( message ); | |||||
} | |||||
if( null != ifCondition && null != unlessCondition ) | if( null != ifCondition && null != unlessCondition ) | ||||
{ | { | ||||
throw new Exception( "Discovered invalid target that has both a if and " + | |||||
"unless condition at " + target.getLocation() ); | |||||
final String message = | |||||
REZ.getString( "ant.target-bad-logic.error", target.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
Condition condition = null; | Condition condition = null; | ||||
if( null != ifCondition ) | if( null != ifCondition ) | ||||
{ | { | ||||
getLogger().debug( "Target if condition: " + ifCondition ); | |||||
if( getLogger().isDebugEnabled() ) | |||||
{ | |||||
final String message = REZ.getString( "ant.target-if.notice", ifCondition ); | |||||
getLogger().debug( message ); | |||||
} | |||||
condition = new Condition( true, ifCondition ); | condition = new Condition( true, ifCondition ); | ||||
} | } | ||||
else if( null != unlessCondition ) | else if( null != unlessCondition ) | ||||
{ | { | ||||
getLogger().debug( "Target unless condition: " + unlessCondition ); | |||||
if( getLogger().isDebugEnabled() ) | |||||
{ | |||||
final String message = REZ.getString( "ant.target-unless.notice", unlessCondition ); | |||||
getLogger().debug( message ); | |||||
} | |||||
condition = new Condition( false, unlessCondition ); | condition = new Condition( false, unlessCondition ); | ||||
} | } | ||||
@@ -348,11 +377,18 @@ public class DefaultProjectBuilder | |||||
if( 0 == dependency.length() ) | if( 0 == dependency.length() ) | ||||
{ | { | ||||
throw new Exception( "Discovered empty dependency in target " + | |||||
target.getName() + " at " + target.getLocation() ); | |||||
final String message = REZ.getString( "ant.target-bad-dependency.error", | |||||
target.getName(), | |||||
target.getLocation() ); | |||||
throw new Exception( message ); | |||||
} | } | ||||
getLogger().debug( "Target dependency: " + dependency ); | |||||
if( getLogger().isDebugEnabled() ) | |||||
{ | |||||
final String message = REZ.getString( "ant.target-dependency.notice", dependency ); | |||||
getLogger().debug( message ); | |||||
} | |||||
dependsList.add( dependency ); | dependsList.add( dependency ); | ||||
} | } | ||||
@@ -0,0 +1,25 @@ | |||||
ati.two.stylesheet.pis=Build file can not contain two xsl-stylesheet PIs. | |||||
ati.params.error=Malformed PI: expected <?xsl-params location=\"myparams.properties\"?> | |||||
ati.param.error=Malformed PI: expected <?xsl-param name=\"foo\" value=\"bar\"?> | |||||
ati.style.error=Malformed PI: expected <?xsl-params href=\"mystylesheet.xsl\"?> | |||||
ati.loading-params.error=Error loading parameters {0}. Reason: {1}. | |||||
ati.loading-style.error=Error locating stylesheet {0}. Reason: {1}. | |||||
ati.attribue-expected.error=Expecting an attribute but received {0}. | |||||
ati.attribue-unquoted.error=Expecting the value of attribute {0} to be enclosed in quotes. | |||||
ant.project-banner.notice=Project {0} base directory: {1}. | |||||
ant.target-parse.notice=Parsing target: {0}. | |||||
ant.target-if.notice=Target if condition: {0} | |||||
ant.target- unless.notice=Target unless condition: {0} | |||||
ant.target-dependency.notice=Target dependency: {0} | |||||
ant.no-project-element.error=Project file must be enclosed in project element. | |||||
ant.unknown-toplevel-element.error=Unknown top-level element {0} at {1}. | |||||
ant.projectref-no-name.error=Malformed projectref without a name attribute at {0}. | |||||
ant.projectref-bad-name.error=Projectref with an invalid name attribute at {0}. | |||||
ant.projectref-no-location.error=Malformed projectref without a location attribute at {0}. | |||||
ant.import-no-library.error=Malformed import without a library attribute at {0}. | |||||
ant.import-malformed.error=Malformed import at {0}. If name or type attribute is specified, both attributes must be specified. | |||||
ant.target-noname.error=Discovered un-named target at {0}. | |||||
ant.target-bad-name.error=Target with an invalid name at {0}. | |||||
ant.target-bad-logic.error=Discovered invalid target that has both a if and unless condition at {0}. | |||||
ant.target-bad-dependency.error=Discovered empty dependency in target {0} at {1}. |