/*
 * 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.
 */

package org.apache.axis2.jaxws;

/**
 * Constants that apply to the JAX-WS implementation.
 *
 */
public interface Constants {
    public static final String ENDPOINT_CONTEXT_MAP =
        "org.apache.axis2.jaxws.addressing.util.EndpointContextMap";
    
    public static final String JAXWS_OUTBOUND_SOAP_HEADERS  = 
        org.apache.axis2.Constants.JAXWS_OUTBOUND_SOAP_HEADERS;
    public static final String JAXWS_INBOUND_SOAP_HEADERS   = 
        org.apache.axis2.Constants.JAXWS_INBOUND_SOAP_HEADERS;
    /**
     * Value that can be set on a MessageContext.  The property value should be a Boolean()
     * 
     * If set to false, then JAXB streaming of the XML body is disabled.
     * A value of false will result in slower performance for unmarshalling JAXB objects
     * but is a loss-less transformation.  
     *  
     * A value of true will cause the JAXB objects to be created when the XML body is initially 
     * parsed, which is more performant, but it may loose some information contained in the 
     * original XML such as namespace prefixes if the XML stream is recreated from the JAXB 
     * objects.
     * 
     * The default value is Boolean(true) if this property is not set.  
     * @deprecated see JAXWS_PAYLOAD_HIGH_FIDELITY
     */
    public static final String JAXWS_ENABLE_JAXB_PAYLOAD_STREAMING = 
        "org.apache.axis2.jaxws.enableJAXBPayloadStreaming";
    
    /**
     * Context Property:
     * Name: jaxws.payload.highFidelity
     * Value: Boolean.TRUE or Boolean.FALSE
     * Default: null, which is interpreted as FALSE....engine may set this to TRUE in some cases.
     * 
     * Configuration Parameter
     * Name: jaxws.payload.highFidelity
     * Value: String or Boolean representing true or false
     * Default: null, which is interpreted as FALSE
     * 
     * Description:
     * If the value is false, the jax-ws engine will transform the message in the most
     * performant manner.  In some cases these transformations will cause the loss of some information.
     * For example, JAX-B transformations are lossy.  
     * 
     * If the value is true, the jax-ws engine will transform the message in the most loss-less manner.
     * In some cases this will result in slower performance.  The message in such cases is "high fidelity",
     * which means that it is a close replica of the original message.
     * 
     * Customers should accept the default behavior (false), and only set the value to true if it is
     * necessary for a SOAP Handler or other code requires a high fidelity message.
     * 
     * The engine will first examine the Context property.  If not set, the value of the Configuration
     * property is used.
     */
    public static final String JAXWS_PAYLOAD_HIGH_FIDELITY =
        "jaxws.payload.highFidelity";
    
    /**
     * Context Property:
     * Name: jaxws.provider.interpretNullAsOneway
     * Value: Boolean.TRUE or Boolean.FALSE
     * Default: TRUE.
     * 
     * Configuration Parameter
     * Name: jaxws.provider.interpretNullAsOneway
     * Value: String or Boolean representing true or false
     * Default: true
     * 
     * Description:
     * If the value is false, the jax-ws engine will interpret a null response from a provider as an empty
     * response to a two-way operation.  As a result it will create a SOAPEnvelope with an empty SOAPBody and send that
     * as a response.
     * 
     * If the value is true, the jax-ws engine will intrepret a null return value from a provider as an indication of 
     * a one-way operation.  As a result, the engine will halt processing on the response.  Response handlers will not
     * be invoked.  An HTTP acknowledgment will be sent back to the client.  No SOAPEnvelope will be sent.  You must use
     * one-way client when invoking a Provider which returns null if this property is true.
     * 
     * This is only true for operations which are not defined in WSDL.  If the operation is defined in WSDL, the WSDL
     * determine the response for a Provider that returns null.  If the WSDL defines a two-way operation, a null
     * from a provider will continue to produce a SOAPEnvelope with and empty SOAPBody as the response.
     * 
     * The engine will first examine the Context property.  If not set, the value of the Configuration
     * property is used.
     */
    public static final String JAXWS_PROVIDER_NULL_ONEWAY =
        "jaxws.provider.interpretNullAsOneway";
    
    public static final String MEP_CONTEXT = 
        "org.apache.axis2.jaxws.handler.MEPContext";
    
    /**
     * If a checked exception is thrown by the webservice's webmethod, then
     * the name of the checked exception is placed in the outbound response context.
     */
    public static final String CHECKED_EXCEPTION =
        "org.apache.axis2.jaxws.checkedException";
    
    /**
     * If an exception is thrown by the JAXWS webservice's webmethod, the 
     * Throwable object is placed in the service outbound response context.
     */
    public static final String JAXWS_WEBMETHOD_EXCEPTION = 
        org.apache.axis2.Constants.JAXWS_WEBMETHOD_EXCEPTION;
    
    /**
     * This constant introduces an extension for @BindingType annotation.
     * When the value of BindingType annotation is set to this constant,
     * the javax.xml.ws.Provider java endpoints will cater to SOAP11 and SOAP12
     * messages.
     */
    public static final String SOAP_HTTP_BINDING ="SOAP_HTTP_BINDING";
    
    /**
     * This constant will be used to determine if a Exception will be throw by
     * JAX-WS layer when a SOAP Fault is received on response. 
     */
    public static final String THROW_EXCEPTION_IF_SOAP_FAULT = "jaxws.response.throwExceptionIfSOAPFault";
    
    /** 
     * Context Property:
     * Name: jaxws.header.parameter.isNull.write.element.with.xsi.nil
     * Value: Boolean.TRUE or Boolean.FALSE
     * Default: null, which is interpretted as Boolean.TRUE
     * 
     * If the @WebParam indicates that the parameter is mapped to a header 
     * and the argument for the parameter is null, this property is queried by the
     * JAX-WS runtime to determine if 
     *  a) TRUE: A SOAP header element is serialized with an xsi:nil="true" attribute
     *  b) FALSE: No SOAP header element is serialized.
     *  
     *  The default is TRUE because the JAX-WS developers feel that this is a safer
     *  approach.
     * 
     */
    public static final String WRITE_HEADER_ELEMENT_IF_NULL = "jaxws.header.parameter.isNull.write.element.with.xsi.nil";
    /**
     * This constant will be used to store the location of JAX-WS generated artifacts cache.
     */
    public static final String WS_CACHE="wsCache";
    
    /**
     * Context Property:
     * Name: jaxws.jaxb.write.remove.illegal.chars
     * Value: Boolean.TRUE or Boolean.FALSE
     * Default: null, which is interpreted as FALSE.
     * 
     * Configuration Parameter
     * Name: jaxws.jaxb.write.remove.illegal.chars
     * Value: String or Boolean representing true or false
     * Default: null, which is interpreted as FALSE
     * 
     * Description:
     * If the value is true, the jax-ws engine will detect and remove
     * illegal characters (characters not supported in xml) when writing
     * a JAXB data bean associated with a jaxws web method
     *  http://www.w3.org/TR/2008/REC-xml-20081126/#NT-Char
     * This extra filter may degrade performance.
     * 
     * Customers should accept the default behavior (false), and only set the value to true if the
     * character data produced by their web service is invalid and cannot be filtered by some
     * other mechanism.
     * 
     * The engine will first examine the Context property.  If not set, the value of the Configuration
     * property is used.
     */
    public static final String JAXWS_JAXB_WRITE_REMOVE_ILLEGAL_CHARS = 
        "jaxws.jaxb.write.remove.illegal.chars";
    
    /**
     * javax.xml.ws.handler.MessageContext  Property:
     * Name: jaxws.message.as.string
     * Value: null or MessageAccessor
     * 
     * Description:
     * A handler or resource injection @WebServiceContext may use
     * this property to get access to a MessageAccessor object.
     * The MessageAccessor contains methods to allow a user to 
     * get additional attributes from the message (for example getMessageAsString)
     */
    public static final String JAXWS_MESSAGE_ACCESSOR = 
        "jaxws.message.accessor";

    /** 
     * Context Property:
     * Name: jaxws.dispatch.outbound.operation.resolution.enable
     * Value: String "false" or "true"
     * Default: null, which is interpreted as "true"
     * Can be set on:
     * - Axis Configuration, which affects operation resolution across all Dispatch<T> clients
     * - Request message context, which affects only the Dispatch<T> client using that context.
     *
     * Indicates if a Dispatch<T> message should be parsed to determine the operation indicated in the
     * message, and use that to determine the Action that should be placed in the outgoing message.  The
     * Action would be placed in the SOAPAction HTTP header and any WS-Addressing Action headers if 
     * WS-Addressing is enabled.  Prior to the introduction of this property and associated support, 
     * for Dispatch<T> the client would have to set the Action on the Request Message context in order to 
     * get a meaningful value set as the Action.
     * 
     * Note that parsing the outgoing message in order to determine the operation indicated in the
     * message can be slow.  Therefore, this property is provided to disable that operation resolution.
     * The default, however, is to do operation resolution.
     * 
     * Operation resolution will also be disabled on a Dispatch<T> client if an Action was set on the 
     * request message context.  
     * 
     * @see javax.xml.ws.BindingProvider.SOAPACTION_USE_PROPERTY
     * @see javax.xml.ws.BindingProvider.SOAPACTION_URI_PROPERTY
     */
    public static final String  DISPATCH_CLIENT_OUTBOUND_RESOLUTION = "jaxws.dispatch.outbound.operation.resolution.enable"; 

    /** 
     * Context Property:
     * Name: jaxws.soapfault.local.exceptions.disable
     * Value: String "false" or "true"
     * Default: null, which is interpreted as "false"
     * Can be set on:
     * - Axis Configuration, which affects all jax-ws clients
     *
     * Indicates if local exceptions encountered by a JAX-WS client should be turned into a SOAPFaultException
     * and then call the appropriate JAX-WS application handlers handleFault()methods with that SOAPFault
     * in the message.  This is new behavior, which is the default behavior indicated by this property not being
     * set or having a value of "false".
     * 
     * The previous behavior was for local exceptions to be turned into a WebServiceException that was set
     * on an empty response message.  The appropriate JAX-WS application handers handleMessage() methods would be
     * called with that empty message.  Setting this property to "true" will revert to this behavior.
     */
    public static final String  DISABLE_SOAPFAULT_FOR_LOCAL_EXCEPTION = "jaxws.soapfault.local.exceptions.disable"; 

    /** 
     * Context Property:
     * Name: jaxws.endpoint.publish.disable
     * Value: String "false" or "true"
     * Default: null, which is interpreted as "false"
     * Can be set on:
     * - Axis Configuration, which affects all jax-ws endpoints
     *
     * Indicates if the javax.xml.ws.Endpoint.publish methods should be disabled, throwing an exception if
     * they are called.  This may be necessary in a managed environment, since as noted in JSR-109 section
     * 5.3.3 "Publishing Endpoints" using publish is non-portable in managed environments, and managed 
     * environments may disallow publishing of endpoints dynamciall.
     * 
     * If this property is set, the Endpoint.publish methods will throw an UnsupportedOperationException.
     */
    public static final String  DISABLE_ENDPOINT_PUBLISH_METHODS = "jaxws.endpoint.publish.disable"; 
}
