/*
 * 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.river.container;

/**
 *
 * @author trasukg
 */
public class Strings {

    public static final String
            ADD_URL="addURL",
            BOOTSTRAP_CLASS_LOADER="bootstrapClassLoader",
            CLASS_LOADERS="classLoaders",
            COMMAND_LINE_ARGS = "commandLineArguments",
            CONFIG_XML = "config.xml",
            CORE_CONFIG_XML="core-config.xml",
            CONTAINER_CLASS_LOADER="containerClassLoader",
            CONTAINER_JMX_DOMAIN="org.apache.river.container",
            CONTEXT="context",
            CONTEXT_CLASS = "org.apache.river.container.Context",
            DASH = "-",
            DEFAULT = "default",
            DEFAULT_DEPLOY_DIRECTORY="deploy",
            DEFAULT_DISCOVERY_CONTEXT = "defaultDiscoveryContext",
            DOLLAR="$",
            DOLLAR_STAR="$*",
            DOT=".",
            DOT_CLASS=".class",
            DOT_JAR=".jar",
            DOT_PROPERTIES=".properties",
            DOT_SSAR=".ssar",
            EMPTY = "",
            EXECUTOR_NAME="scheduledExecutorService",
            GET_ADMIN="getAdmin",
            FILE_UTILITY="fileUtility",
            INIT_COMPLETE="initComplete",
            JAR="jar",
            LIB="lib",
            LIB_DL="lib-dl",
            LIFECYCLE_CLASS="com.sun.jini.start.LifeCycle",
            MAIN="main",
            MESSAGES="messages",
            NAME="name",
            NEWLINE="\n",
            PLATFORM_JARS="platformJars",
            PLATFORM_CODEBASE="platformCodebase",
            PROFILE = "profile",
            PROFILE_DIR="profileDirectory",
            PUT = "put",
            PUT_SPECIAL_ENTRY="putSpecialEntry",
            READ="read",
            SECURITY_POLICY="securityPolicy",
            SPACE=" ",
            SSAR="ssar",
            SET = "set",
            SET_WORKING_DIRECTORY="setWorkingDirectory",
            SLASH="/",
            START_CLASS="startClass",
            START_PARAMETERS="startParameters",
            START_PROPERTIES="start.properties",
            STARTER_SERVICE_DEPLOYER_CONFIG="service-starter.cfg",
            SYSTEM_CLASS_LOADER="systemClassLoader",
            TYPE="type",
            UNKNOWN="unknown",
            UNNAMED="unnamed",
            WHITESPACE_SEPARATORS=" \t\n\r",
            WORK="work",
            WORKING_DIRECTORY="workingDirectory";

}
