/*
 * 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.sling.feature.extension.apiregions.api.config;

/**
 * Constants used in this implementation
 */
public abstract class Constants {
    
    static final String KEY_TITLE = "title";

	static final String KEY_DESCRIPTION = "description";

	static final String KEY_DEPRECATED = "deprecated";
	
	static final String KEY_PROPERTIES = "properties";

    static final String KEY_CONFIGURATIONS = "configurations";

    static final String KEY_FACTORIES = "factories";
    
    static final String KEY_FWK_PROPERTIES = "framework-properties";

    static final String KEY_INTERNAL_CONFIGURATIONS = "internal-configurations";

    static final String KEY_INTERNAL_FACTORIES = "internal-factories";
    
    static final String KEY_INTERNAL_FWK_PROPERTIES = "internal-framework-properties";
	
	static final String KEY_TYPE = "type";
	
	static final String KEY_CARDINALITY = "cardinality";
	
    static final String KEY_VARIABLE = "variable";
    
    static final String KEY_RANGE = "range";

    static final String KEY_MIN = "min";

    static final String KEY_MAX = "max";

    static final String KEY_INCLUDES = "includes";

    static final String KEY_EXCLUDES = "excludes";

    static final String KEY_OPTIONS = "options";
  
    static final String KEY_REGEX = "regex";

    static final String KEY_VALUE = "value";
}
