###############################################################################
# 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_CLASS_OR_INTERFACE_ONLY=@WebService may only be added to a class or interface
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_REDUCED_VISIBILITY=Cannot reduce the visibility of the SEI method
WEBSERVICE_ENPOINTINTERFACE_INCOMPATIBLE_RETURN_TYPE=The return type is incompatible with {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_NCNAME_ATTRIBUTE=The @{0} {1} attribute value ''{2}'' 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
WEBSERVICEPROVIDER_DEFAULT_PUBLIC_CONSTRUCTOR=Classes annotated with @WebServiceProvider must have a default public constructor
WEBSERVICEPROVIDER_IMPLEMENT_TYPED_PROVIDER_INTERFACE=A Provider based endpoint implementation must implement a typed javax.xml.ws.Provider interface. Provider implementations work with the following types of objects: javax.xml.transform.Source, javax.xml.soap.SOAPMessage and javax.activation.DataSource
WEBSERVICEPROVIDER_SOAPMESSAGE_SOAPBINDING=javax.xml.soap.SOAPMessage objects require the Provider implementation to use the SOAP Binding
WEBSERVICEPROVIDER_SOAPMESSAGE_MESSAGE_MODE=javax.xml.soap.SOAPMessage objects require the Provider implementation to specify a @javax.xml.ws.ServiceMode annotation with javax.xml.ws.Service.Mode.MESSAGE as the value 
WEBSERVICEPROVIDER_DATASOURCE_HTTPBINDING=javax.activation.DataSource derived objects require the Provider implementation to use the HTTP Binding
WEBSERVICEPROVIDER_DATASOURCE_MESSAGE_MODE=javax.activation.DataSource derived objects require the Provider implementation to specify a @javax.xml.ws.ServiceMode annotation with javax.xml.ws.Service.Mode.MESSAGE as the value
EMPTY_ATTRIBUTE_VALUE=The @{0} {1} attribute should not be empty
WEBPARAM_NAME_REDUNDANT=Name attribute is not used if SOAPBinding.Style is RPC and partName is present
WEBSERVICE_ONLY_ON_STATELESS_SESSION_BEANS=@WebService annotation in EJB modules can be only used on stateless session beans
WEBSERVICE_ENPOINTINTERFACE_INCOMPATIBLE_EXCEPTIONS=Method {0} declares exceptions that are not compatible with the throws clause of the {0} method in the service endpoint interface {1}
INTERFACES_NOT_SUPPORTED={0} is an interface and may not be used as a return type or method parameter as JAXB cannot handle interfaces
HAS_INADMISSIBLE_INNER_TYPES=Class {0} may not be used as a return type or method parameter as it has inner types that are not public and static
IS_REMOTE_OBJECT=Class {0} is a remote Object and may not used as a method return type or parameter
ABSTRACT_CLASS_NOT_IMPLEMENTED=Abstract class {0} cannot be used as a runtime class because it is not extended by a non abstract class which is suitable as a runtime class
INHERITANCE_AND_IMPLEMENTATION=Class {0} extends {1} and implements interface {2} (multiple inheritance is not allowed)
IMPLEMENTS_MULTIPLE_INTERFACES=Class {0} implements multiple interfaces (multiple inheritance is not allowed)
TARGET_NAMESPACE_URI_SYNTAX_ERROR=URI syntax error at index {0} of input String ''{1}''. Reason: {2}
