package org.codehaus.mojo.xml; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.project.MavenProject; import org.apache.maven.settings.Proxy; import org.apache.maven.settings.Settings; import org.codehaus.plexus.resource.ResourceManager; import org.codehaus.plexus.resource.loader.FileResourceLoader; import org.codehaus.plexus.resource.loader.ResourceNotFoundException; import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.FileUtils; /** Abstract base class for the plugins Mojo's. */ public abstract class AbstractXmlMojo extends AbstractMojo { /** * @parameter expression="${project}" * @required * @readonly */ private MavenProject project; /** * The system settings for Maven. This is the instance resulting from * merging global- and user-level settings files. * * @parameter expression="${settings}" * @required * @readonly */ private Settings settings; /** * The base directory, relative to which directory names are * interpreted. * * @parameter expression="${basedir}" * @required * @readonly */ private File basedir; /** An XML catalog file, or URL, which is being used to resolve * entities. * @parameter */ private String[] catalogs; /** * Plexus resource manager used to obtain XSL. * * @component * @required * @readonly */ private ResourceManager locator; private boolean locatorInitialized; /** * Returns the maven project. */ protected MavenProject getProject() { return project; } /** * Returns the projects base directory. */ protected File getBasedir() { return basedir; } /** * Converts the given file into an file with an absolute * path. */ protected File asAbsoluteFile( File f ) { if ( f.isAbsolute() ) { return f; } return new File( getBasedir(), f.getPath() ); } /** * Returns the plugins catalog files. */ protected void setCatalogs( List pCatalogFiles, List pCatalogUrls ) { if ( catalogs == null || catalogs.length == 0 ) { return; } for ( int i = 0; i < catalogs.length; i++ ) { try { URL url = new URL( catalogs[i] ); pCatalogUrls.add( url ); } catch ( MalformedURLException e ) { pCatalogFiles.add( asAbsoluteFile( new File( catalogs[i] ) ) ); } } } /** * Creates a new resolver. */ protected Resolver getResolver() throws MojoExecutionException { List catalogFiles = new ArrayList(); List catalogUrls = new ArrayList(); setCatalogs( catalogFiles, catalogUrls ); return new Resolver( getBasedir(), catalogFiles, catalogUrls, getLocator(), getLog().isDebugEnabled() ); } /** * Scans a directory for files and returns a set of path names. */ protected String[] getFileNames( File pDir, String[] pIncludes, String[] pExcludes ) throws MojoFailureException { if ( pDir == null ) { throw new MojoFailureException( "A ValidationSet or TransformationSet" + " requires a nonempty 'dir' child element." ); } final File dir = asAbsoluteFile( pDir ); if ( !dir.isDirectory() ) { getLog().warn( "The directory " + dir.getPath() + ", which is a base directory of a ValidationSet or TransformationSet, does not exist." ); return new String[0]; } final DirectoryScanner ds = new DirectoryScanner(); ds.setBasedir( dir ); if ( pIncludes != null && pIncludes.length > 0 ) { ds.setIncludes( pIncludes ); } if ( pExcludes != null && pExcludes.length > 0 ) { ds.setExcludes( pExcludes ); } ds.scan(); return ds.getIncludedFiles(); } /** * Converts the given set of file names into a set of {@link File} * instances. The file names may be relative to the given base directory. */ protected File[] asFiles( File pDir, String[] pFileNames ) { if ( pFileNames == null ) { return new File[0]; } File dir = asAbsoluteFile( pDir ); File[] result = new File[pFileNames.length]; for ( int i = 0; i < pFileNames.length; i++ ) { result[i] = new File( dir, pFileNames[i] ); } return result; } /** * Scans a directory for files and returns a set of {@link File} instances. */ protected File[] getFiles( File pDir, String[] pIncludes, String[] pExcludes ) throws MojoFailureException { return asFiles( pDir, getFileNames( pDir, pIncludes, pExcludes ) ); } /** * Calculates the exclusions to use when searching files. */ protected String[] getExcludes( String[] origExcludes, boolean skipDefaultExcludes ) { if ( skipDefaultExcludes ) { return origExcludes; } String[] defaultExcludes = FileUtils.getDefaultExcludes(); if ( origExcludes == null || origExcludes.length == 0 ) { return defaultExcludes; } String[] result = new String[origExcludes.length + defaultExcludes.length]; System.arraycopy( origExcludes, 0, result, 0, origExcludes.length ); System.arraycopy( defaultExcludes, 0, result, origExcludes.length, defaultExcludes.length ); return result; } private boolean isEmpty( String value ) { return value == null || value.trim().length() == 0; } private void setProperty( List pProperties, String pKey, String pValue ) { if ( pProperties != null ) { pProperties.add( pKey ); pProperties.add( System.getProperty( pKey ) ); } if ( pValue == null ) { System.getProperties().remove( pKey ); } else { System.setProperty( pKey, pValue ); } } /** * Called to install the plugins proxy settings. */ protected Object activateProxy() { if ( settings == null ) { return null; } final Proxy proxy = settings.getActiveProxy(); if ( proxy == null ) { return null; } final List properties = new ArrayList(); final String protocol = proxy.getProtocol(); final String prefix = isEmpty( protocol ) ? "" : ( protocol + "." ); final String host = proxy.getHost(); final String hostProperty = prefix + "proxyHost"; final String hostValue = isEmpty( host ) ? null : host; setProperty( properties, hostProperty, hostValue ); final int port = proxy.getPort(); final String portProperty = prefix + "proxyPort"; final String portValue = ( port == 0 || port == -1 ) ? null : String.valueOf( port ); setProperty( properties, portProperty, portValue ); final String username = proxy.getUsername(); final String userProperty = prefix + "proxyUser"; final String userValue = isEmpty( username ) ? null : username; setProperty( properties, userProperty, userValue ); final String password = proxy.getPassword(); final String passwordProperty = prefix + "proxyPassword"; final String passwordValue = isEmpty( password ) ? null : password; setProperty( properties, passwordProperty, passwordValue ); final String nonProxyHosts = proxy.getNonProxyHosts(); final String nonProxyHostsProperty = prefix + "nonProxyHosts"; final String nonProxyHostsValue = isEmpty( nonProxyHosts ) ? null : nonProxyHosts.replace( ',' , '|' ); setProperty( properties, nonProxyHostsProperty, nonProxyHostsValue ); getLog().debug( "Proxy settings: " + hostProperty + "=" + hostValue + ", " + portProperty + "=" + portValue + ", " + userProperty + "=" + userValue + ", " + passwordProperty + "=" + (passwordValue == null ? "null" : "<PasswordNotLogged>") + ", " + nonProxyHostsProperty + "=" + nonProxyHostsValue ); return properties; } /** * Called to restore the proxy settings, which have been installed * when the plugin was invoked. */ protected void passivateProxy( Object pProperties ) { if ( pProperties == null ) { return; } final List properties = (List) pProperties; for ( Iterator iter = properties.iterator(); iter.hasNext(); ) { final String key = (String) iter.next(); final String value = (String) iter.next(); setProperty( null, key, value ); } } protected URL getResource( String pResource ) throws MojoFailureException { try { return getLocator().getResource( pResource ).getURL(); } catch ( ResourceNotFoundException exception ) { throw new MojoFailureException( "Could not find stylesheet: " + pResource ); } catch ( IOException e ) { throw new MojoFailureException( "Error while locating resource: " + pResource ); } } protected ResourceManager getLocator() { if ( !locatorInitialized ) { locator.addSearchPath( FileResourceLoader.ID, getBasedir().getAbsolutePath() ); locatorInitialized = true; } return locator; } }