blob: 7a7ad9358005909b5143ea0ac6014eac0b1c2407 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 Innoopract Informationssysteme GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Innoopract Informationssysteme GmbH - initial API and implementation
******************************************************************************/
package org.eclipse.rap.ui.internal.launch;
import java.net.MalformedURLException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.runtime.*;
import org.eclipse.debug.core.*;
public final class RAPLaunchConfigValidator {
private static final String RAP_LAUNCH_CONFIG_TYPE
= "org.eclipse.rap.ui.launch.RAPLauncher"; //$NON-NLS-1$
private static final String EMPTY = ""; //$NON-NLS-1$
private final RAPLaunchConfig config;
public RAPLaunchConfigValidator( final RAPLaunchConfig config ) {
this.config = config;
}
public IStatus[] validate() {
List states = new ArrayList();
try {
states.add( validateServletName() );
states.add( validateEntryPoint() );
states.add( validatePort() );
states.add( validateUniquePort() );
states.add( validateURL() );
} catch( CoreException e ) {
String text
= "An error occured while validating the launch configuration: {0}";
Object[] args = new Object[] { e.getLocalizedMessage() };
String msg = MessageFormat.format( text, args );
states.add( createError( msg, e ) );
}
IStatus[] result = new IStatus[ states.size() ];
states.toArray( result );
return result;
}
private IStatus validateServletName() throws CoreException {
IStatus result = Status.OK_STATUS;
if( EMPTY.equals( config.getServletName() ) ) {
result = createError( "The servlet name must not be empty", null );
}
return result;
}
private IStatus validateEntryPoint() throws CoreException {
IStatus result = Status.OK_STATUS;
if( EMPTY.equals( config.getEntryPoint() ) ) {
result = createError( "The entry point must not be empty", null );
}
return result;
}
private IStatus validatePort() throws CoreException {
IStatus result = Status.OK_STATUS;
if( config.getUseManualPort() ) {
int port = config.getPort();
if( port < RAPLaunchConfig.MIN_PORT_NUMBER
|| port > RAPLaunchConfig.MAX_PORT_NUMBER )
{
String text = "Port number must be between {0} and {1}";
Object[] args = new Object[] {
new Integer( RAPLaunchConfig.MIN_PORT_NUMBER ),
new Integer( RAPLaunchConfig.MAX_PORT_NUMBER )
};
String msg = MessageFormat.format( text, args );
result = createError( msg, null );
}
}
return result;
}
private IStatus validateUniquePort() throws CoreException {
IStatus result = Status.OK_STATUS;
if( config.getUseManualPort() ) {
RAPLaunchConfig duplicate = null;
ILaunchConfiguration[] launchConfigs = getLaunchConfigs();
for( int i = 0; duplicate == null && i < launchConfigs.length; i++ ) {
RAPLaunchConfig otherConfig = new RAPLaunchConfig( launchConfigs[ i ] );
if( hasSamePort( otherConfig ) ) {
duplicate = otherConfig;
}
}
if( duplicate != null ) {
String text = "The port {0,number,#} is already used by {1}.";
Object[] args = new Object[] {
new Integer( config.getPort() ),
duplicate.getName()
};
String msg = MessageFormat.format( text, args );
result = createWarning( msg, null );
}
}
return result;
}
private IStatus validateURL() throws CoreException {
IStatus result = Status.OK_STATUS;
try {
URLBuilder.fromLaunchConfig( config, 80 );
} catch( MalformedURLException e ) {
String text = "Servlet name and/or entry point cause a malformed URL.";
result = createWarning( text, e );
}
return result;
}
/////////////////////////
// Status creation helper
private IStatus createWarning( final String msg, final Throwable thr ) {
return new Status( IStatus.WARNING, Activator.getPluginId(), msg, thr );
}
private IStatus createError( final String msg, final Throwable thr ) {
return new Status( IStatus.ERROR, Activator.getPluginId(), msg, thr );
}
/////////////////////////////////////////
// Helping methods for validateUniquePort
private static ILaunchConfiguration[] getLaunchConfigs() throws CoreException
{
ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager();
ILaunchConfigurationType type
= launchManager.getLaunchConfigurationType( RAP_LAUNCH_CONFIG_TYPE );
return launchManager.getLaunchConfigurations( type );
}
private boolean hasSamePort( final RAPLaunchConfig otherConfig )
throws CoreException
{
return otherConfig.getUseManualPort()
&& !config.getName().equals( otherConfig.getName() )
&& config.getPort() == otherConfig.getPort();
}
}