###############################################################################
# Copyright (c) 2008 IONA Technologies PLC
# 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:
# IONA Technologies PLC - initial API and implementation
###############################################################################

#JDTUtils
TYPE_NAME_DIFFERENT_CASE_EXISTS=A Type with the same name but different case already exists
TYPE_WITH_NAME_ALREADY_EXISTS=A compilation unit named ''{0}'' already exists in package ''{1}''

WEBSERVICE_DEFAULT_PUBLIC_CONSTRUCTOR=Classes annotated with @WebService must have a default public constructor
WEBSERVICE_PUBLIC_ABSTRACT_FINAL=Classes annotated with @WebService must be an outer public class, must not be final, and must not be abstract
WEBSERVICE_OVERRIDE_FINALIZE=Classes annotated with @WebService must not define a finalize() method
WEBMETHOD_ONLY_SUPPORTED_ON_CLASSES_WITH_WEBSERVICE=@WebMethod is only supported on classes annotated with @WebService
WEBMETHOD_ONLY_ON_PUBLIC_METHODS=@WebMethod annotation is not allowed on non-public methods
WEBMETHOD_NO_FINAL_MODIFIER_ALLOWED=@WebMethod annotation is not allowed on final methods
WEBMETHOD_NO_STATIC_MODIFIER_ALLOWED=@WebMethod annotation is not allowed on static methods
WEBMETHOD_EXCLUDE_SPECIFIED_NO_OTHER_ATTRIBUTES_ALLOWED=@WebMethod exclude attribute is specified. No other attributes allowed
WEBMETHOD_EXCLUDE_NOT_ALLOWED_ON_SEI=@WebMethod annotations in SEI's are not allowed to specify the exclude attribute
WEBSERVICE_SERVICENAME_SEI=@WebService serviceName element is not allowed on SEI
WEBSERVICE_ENDPOINTINTERFACE_SEI=@WebService endpointInterface element is not allowed on SEI
WEBSERVICE_PORTNAME_SEI=@WebService portName element is not allowed on SEI
WEBSERVICE_ENPOINTINTERFACE_MUST_IMPLEMENT=Implementation class must implement the SEI method ''{0}''
WEBSERVICE_ENPOINTINTERFACE_NOT_INTERFACE=The endpointInterface ''{0}'' must be an Interface
WEBSERVICE_ENPOINTINTERFACE_NOT_FOUND=The endpointInterface ''{0}'' cannot be found
WEBSERVICE_ENPOINTINTERFACE_NOT_ANNOTATED=The endpointInterface ''{0}'' must be annotated with @javax.jws.WebService
WEBSERVICE_ENPOINTINTERFACE_NOT_PUBLIC=The endpointInterface ''{0}'' must be public
WEBSERVICE_ENPOINTINTERFACE_NOT_OUTER=The endpointInterface ''{0}'' must be an outer interface
WEBSERVICE_ENPOINTINTERFACE_NO_NAME_ATTRIBUTE=@WebService annotation contains an endpointInterface attribute. No name attribute allowed
WEBSERVICE_ENPOINTINTERFACE_NO_WEBMETHODS=@WebService annotation contains an endpointInterface attribute. No methods annotated with @WebMethod allowed in implementation class
WEBSERVICE_ENPOINTINTERFACE_NO_SOAPBINDING=@WebService annotation contains an endpointInterface attribute. @SOAPBinding not allowed in implementation class
WEBSERVICE_ENPOINTINTERFACE_NO_WEBRESULT=@WebService annotation contains an endpointInterface attribute. No methods annotated with @WebResult allowed in implementation class
WEBSERVICE_ENPOINTINTERFACE_NO_WEBPARAM=@WebService annotation contains an endpointInterface attribute. No parameters annotated with @WebParam allowed in implementation class
WEBSERVICE_ENPOINTINTERFACE_NO_ONEWAY=@WebService annotation contains an endpointInterface attribute. No methods annotated with @Oneway allowed in implementation class
WEBSERVICE_WEBSERVICEPROVIDER_COMBINATION=@WebService and @WebServiceProvider annotations cannot be combined
WEBSERVICE_DEFAULT_PACKAGE_TARGET_NAMESPACE=Classes or Interfaces in the default package that are annotated with @WebService must specify a targetNamespace attribute
ONEWAY_NO_RETURN_VALUE=@Oneway methods must not return a value
ONEWAY_NO_CHECKED_EXCEPTIONS=@Oneway methods must not declare any checked exceptions
ONEWAY_NO_HOLDER_PARAMETERS=@Oneway methods must not accept any javax.xml.ws.Holder<T> parameters. 
WEBPARAM_MODE_OUT_INOUT_HOLDER_TYPE=The @WebParam.Mode.OUT and @WebParam.Mode.INOUT modes may only be specified for javax.xml.ws.Holder<T> parameters
HOLDER_TYPE_MUST_BE_OUT_INOUT=javax.xml.ws.Holder<T> parameters must be @WebParam.Mode.OUT or @WebParam.Mode.INOUT
SOAPBINDING_NO_RPC_STYLE_ON_METHODS=RPC style @SOAPBinding annotations not supported on methods
SOAPBINDING_RPC_ENCODED_NOT_SUPPORTED=RPC Encoded SOAP Bindings not supported
SOAPBINDING_DOCUMENT_ENCODED_NOT_SUPPORTED=Document Encoded SOAP Bindings not supported
SOAPBINDING_NO_MIXED_BINDINGS=Mixed RPC and Document style operations not permitted in the same service
SOAPBINDING_RPC_NO_BARE_PARAMETER_STYLE=Use of RPC style requires use of WRAPPED parameter style
DOC_BARE_ONLY_ONE_NON_HEADER_IN_PARAMETER=Document literal bare methods may have only one non-header IN parameter
DOC_BARE_NON_VOID_RETURN_NO_INOUT_OUT_PARAMETER=Document literal bare methods that declare a non-void return value may not have any OUT or INOUT parameters
DOC_BARE_VOID_RETURN_ONE_IN_PARAMETER=Document literal bare methods that declare a void return value may have only one IN/INOUT parameter
DOC_BARE_VOID_RETURN_ONE_OUT_PARAMETER=Document literal bare methods that declare a void return value may have only one OUT/INOUT parameter
WEBPARAM_NAME_REQUIRED_WHEN_DOC_BARE_OUT_INOUT=The @WebParam name attribute is required when the operation is Document Bare and the mode is OUT or INOUT
OPERATION_NAMES_MUST_BE_UNIQUE_ERROR=Operation names must be unique : ''{0}''
WRAPPER_FAULT_BEAN_NAMES_MUST_BE_UNIQUE=Generated Request/Response and Fault bean classes must have unique names within a package and must not clash with other classes in that package : ''{0}''
DOC_BARE_METHODS_UNIQUE_XML_ELEMENTS=Document Literal Bare operations must have unique XML elements for the input and output messages across all operations on the Web Service : ''{0}''
LOCAL_NAME_ATTRIBUTES_MUST_BE_UNIQUE=The wrapper bean localName attributes must be unique : ''{0}''
INVALID_NAME_ATTRIBUTE=The name ''{0}'' contains invalid characters
WEBSERVICE_WSDL_LOCATION_UNABLE_TO_LOCATE=Unable to locate wsdl at wsdlLocation: ''{0}''
WEBSERVICE_WSDL_LOCATION_NO_PORT_NAME=No wsdl:port matching the portName ''{0}'' can be found in the WSDL ''{1}''
WEBSERVICE_WSDL_LOCATION_NO_SERVICE_NAME=No wsdl:service matching the serviceName ''{0}'' can be found in the WSDL ''{1}''
WEBSERVICE_WSDL_LOCATION_NO_OPERTATION_NAME=No @WebMethod matching the wsdl:operation ''{0}'' can be found
WEBSERVICE_WSDL_LOCATION_WSDL_OPERATION_OUTPUT_METHOD_ONEWAY=The Method ''{0}'' is annotated @Oneway but the wsdl:operation ''{0}'' specifies a wsdl:output element
WEBSERVICE_WSDL_LOCATION_SOAP_BINDING_STYLE=The wsdl ''{0}'' specifies a ''{1}'' SOAP binding style which does not match the ''{2}'' SOAP binding style of the web service implementation/SEI
PARAMETER_NAME_CLASH=Parameter names must be unique: ''{0}''
GENERATED_PARAMETER_NAME_CLASH=Parameter Name ''{0}'' will clash with a generated parameter name
HANDLER_CHAIN_SOAP_MESSAGE_HANDLERS=@HandlerChain and @SOAPMessageHandlers cannot be combined
HANDLER_CHAIN_ON_FIELD=The @HandlerChain annotation may only be specified on a TYPE. The annotation target includes FIELD for use by JAX-WS 2.0
HANDLER_CHAIN_ON_METHOD=The @HandlerChain annotation may only be specified on a TYPE. The annotation target includes METHOD for use by JAX-WS 2.0
WEBSERVICEREFS_NAME_REQUIRED=Each @WebServiceRef annotation inside a @WebServiceRefs must contain a name element with a non-default ("") value
WEBSERVICEREFS_TYPE_REQUIRED=Each @WebServiceRef annotation inside a @WebServiceRefs must contain a type element with a non-default (Object.class) value