/*
 * Copyright  1999-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.savan;

/** Contains the constants used by Savan */
public interface SavanConstants {

    String CONFIGURATION_MANAGER =
            "SavanConfigurationManager"; //Property name to store the CM in the ConfigCtx.

    String VALUE_TRUE = "true";
    String VALUE_FALSE = "false";

    String MESSAGE_TYPE = "SavanMessageType";
    String PUBLICATION_MESSAGE = "SavanPublicationMessage";

    String SUBSCRIBER_STORE = "SubscriberStore"; //AxisService property
    String SUBSCRIBER_STORE_KEY = "SubscriberStoreKey"; //to mention the key in the services.xml
    String PROTOCOL = "Protocol";

    String CONFIG_FILE = "savan-config.xml";
    String UTIL_FACTORY = "UtilFactory";

    String DEFAULT_SUBSCRIBER_STORE_KEY = "default";

    interface MessageTypes {
        int UNKNOWN = -1;
        int SUBSCRIPTION_MESSAGE = 1;
        int SUBSCRIPTION_RESPONSE_MESSAGE = 2;
        int UNSUBSCRIPTION_MESSAGE = 3;
        int UNSUBSCRIPTION_RESPONSE_MESSAGE = 4;
        int RENEW_MESSAGE = 5;
        int RENEW_RESPONSE_MESSAGE = 6;
        int GET_STATUS_MESSAGE = 7;
        int GET_STATUS_RESPONSE_MESSAGE = 8;
        int PUBLISH = 9;
    }

    interface Properties {
        String SUBSCRIBER_STORE = "SubscriberStore";
    }


}
