/*=============================================================================*
* Copyright 2004 The 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.ws.util.platform.axis.tool;
import org.apache.axis.AxisEngine;
import org.apache.axis.MessageContext;
import org.apache.axis.configuration.FileProvider;
import org.apache.axis.server.AxisServer;
import org.apache.axis.utils.Admin;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.taskdefs.MatchingTask;
import org.apache.tools.ant.types.FileSet;
import org.apache.ws.util.JaxpUtils;
import org.w3c.dom.Element;
import java.io.File;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Utility class that allows for easy deployment of new entries (e.g. deploy.wsdd)
* to an Axis WSDD. This class can be executed in any of the following ways:
* <ul>
* <li>by calling {@link WsddUpdater#deploy(java.io.File)}</li>
* <li>from the command-line: java org.apache.ws.platform.axis.tool.WsddUpdater path_to_deploy.wsdd</li>
* <li>as an Ant task: <wsddupdater deployWsdd="path_to_deploy.wsdd"></li>
* </ul>
*
* @author Ian P. Springer
*/
public class WsddUpdater
extends MatchingTask
{
/**
* Below default can be overridden by setting the below sysprop.
*/
public static final String SYSPROP_WSDD = "wsdd";
/**
* Default to looking for server-config.wsdd in current dir or classpath.
*/
private static final String DEFAULT_CONFIG_WSDD = "server-config.wsdd";
private String m_configWsdd;
private List m_wsddFiles = new ArrayList();
private Admin m_axisAdmin;
private MessageContext m_msgContext;
/**
* Creates a new {@link WsddUpdater} object.
*/
public WsddUpdater()
{
this( (String) null );
}
/**
* Creates a new {@link WsddUpdater} object for updating the specified WSDD file.
*
* @param configWsdd DOCUMENT_ME
*/
public WsddUpdater( File configWsdd )
{
this( configWsdd.getPath() );
}
/**
* Creates a new {@link WsddUpdater} object for updating the specified WSDD, which may be a a file path or a location in
* the classpath.
*
* @param configWsdd DOCUMENT_ME
*/
public WsddUpdater( String configWsdd )
{
initContextClassLoader();
if ( configWsdd != null )
{
m_configWsdd = configWsdd;
}
else
{
m_configWsdd =
( System.getProperty( SYSPROP_WSDD ) != null ) ? System.getProperty( SYSPROP_WSDD ) : DEFAULT_CONFIG_WSDD;
}
}
private void initContextClassLoader()
{
// this is done because for some reason, when run using Maven,
// the ContextClassloader is null, which causes an issue with Axis.
if ( Thread.currentThread().getContextClassLoader() == null )
{
Thread.currentThread().setContextClassLoader( MatchingTask.class.getClassLoader() );
}
}
/**
* Sets the WSDD to be updated.
*
* @param configWsdd the WSDD to be updated
*/
public void setConfigWsdd( String configWsdd )
{
m_configWsdd = configWsdd;
}
/**
* Sets the WSDD (un)deployment fragment to be added to the WSDD.
*
* @param deployWsdd the WSDD (un)deployment fragment to be added to the WSDD
*/
public void setDeployWsdd( File deployWsdd )
{
m_wsddFiles.add( deployWsdd );
}
/**
* DOCUMENT_ME
*
* @param wsddPaths DOCUMENT_ME
*/
public void addConfiguredWsddPaths( FileSet wsddPaths )
{
File baseDir = wsddPaths.getDir( getProject() );
DirectoryScanner dirScanner = wsddPaths.getDirectoryScanner( getProject() );
String[] includedFiles = dirScanner.getIncludedFiles();
for ( int i = 0; i < includedFiles.length; i++ )
{
m_wsddFiles.add( new File( baseDir, includedFiles[i] ) );
}
}
/**
* DOCUMENT_ME
*
* @param deployWsdd DOCUMENT_ME
* @throws Exception DOCUMENT_ME
*/
public void deploy( File deployWsdd )
throws Exception
{
setDeployWsdd( deployWsdd );
execute();
}
/**
* DOCUMENT_ME
*
* @throws org.apache.tools.ant.BuildException DOCUMENT_ME
*/
public void execute()
throws BuildException
{
if ( m_wsddFiles.isEmpty() )
{
throw new BuildException( "No deploy WSDDs were specified!" );
}
try
{
AxisEngine axisEngine = new AxisServer( new FileProvider( m_configWsdd ) );
m_msgContext = new MessageContext( axisEngine );
m_axisAdmin = new Admin();
for ( int i = 0; i < m_wsddFiles.size(); i++ )
{
deployWsdd( (File) m_wsddFiles.get( i ) );
}
}
catch ( Exception e )
{
throw new BuildException( e );
}
}
/**
* Command-line invocation entry point.
*
* @param args command-line arguments
* @throws Exception on fatal error
*/
public static void main( String[] args )
throws Exception
{
//System.setProperty( SYSPROP_WSDD, "C:/server-config.wsdd" );
if ( args.length != 1 )
{
System.err.println( "Usage: " + WsddUpdater.class.getName() + " deployWsddFile" );
System.exit( 1 );
}
new WsddUpdater().deploy( new File( args[0] ) );
}
private void deployWsdd( File deployWsdd ) throws Exception
{
log( "Deploying WSDD " + deployWsdd + " to configuration WSDD " + m_configWsdd + "..." );
Element deployWsddElem = JaxpUtils.loadDocument( new FileInputStream( deployWsdd ) ).getDocumentElement();
m_axisAdmin.process( m_msgContext, deployWsddElem );
}
}