/*
 * 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.aries.jax.rs.rest.management;

import javax.ws.rs.core.MediaType;

public class RestManagementConstants {

    public static final String SPECIFICATION_IMPLEMENTATION = "osgi.rest";

    public static final String SPECIFICATION_VERSION = "1.0.0";

    public static final String APPLICATION_BUNDLE_JSON =
        "application/org.osgi.bundle+json";

    public static final MediaType APPLICATION_BUNDLE_JSON_TYPE =
        new MediaType("application", "org.osgi.bundle+json");

    public static final String APPLICATION_BUNDLE_XML =
        "application/org.osgi.bundle+xml";

    public static final MediaType APPLICATION_BUNDLE_XML_TYPE =
        new MediaType("application", "org.osgi.bundle+xml");

    public static final String APPLICATION_BUNDLEEXCEPTION_JSON =
        "application/org.osgi.bundleexception+json";

    public static final MediaType APPLICATION_BUNDLEEXCEPTION_JSON_TYPE =
        new MediaType("application", "org.osgi.bundleexception+json");

    public static final String APPLICATION_BUNDLEEXCEPTION_XML =
        "application/org.osgi.bundleexception+xml";

    public static final MediaType APPLICATION_BUNDLEEXCEPTION_XML_TYPE =
        new MediaType("application", "org.osgi.bundleexception+xml");

    public static final String APPLICATION_BUNDLEHEADER_JSON =
        "application/org.osgi.bundleheader+json";

    public static final MediaType APPLICATION_BUNDLEHEADER_JSON_TYPE =
        new MediaType("application", "org.osgi.bundleheader+json");

    public static final String APPLICATION_BUNDLEHEADER_XML =
        "application/org.osgi.bundleheader+xml";

    public static final MediaType APPLICATION_BUNDLEHEADER_XML_TYPE =
        new MediaType("application", "org.osgi.bundleheader+xml");

    public static final String APPLICATION_BUNDLES_JSON =
        "application/org.osgi.bundles+json";

    public static final MediaType APPLICATION_BUNDLES_JSON_TYPE =
        new MediaType("application", "org.osgi.bundles+json");

    public static final String APPLICATION_BUNDLES_REPRESENTATIONS_JSON =
        "application/org.osgi.bundles.representations+json";

    public static final MediaType APPLICATION_BUNDLES_REPRESENTATIONS_JSON_TYPE =
        new MediaType("application", "org.osgi.bundles.representations+json");

    public static final String APPLICATION_BUNDLES_REPRESENTATIONS_XML =
        "application/org.osgi.bundles.representations+xml";

    public static final MediaType APPLICATION_BUNDLES_REPRESENTATIONS_XML_TYPE =
        new MediaType("application", "org.osgi.bundles.representations+xml");

    public static final String APPLICATION_BUNDLES_XML =
        "application/org.osgi.bundles+xml";

    public static final MediaType APPLICATION_BUNDLES_XML_TYPE =
        new MediaType("application", "org.osgi.bundles+xml");

    public static final String APPLICATION_BUNDLESTARTLEVEL_JSON =
        "application/org.osgi.bundlestartlevel+json";

    public static final MediaType APPLICATION_BUNDLESTARTLEVEL_JSON_TYPE =
        new MediaType("application", "org.osgi.bundlestartlevel+json");

    public static final String APPLICATION_BUNDLESTARTLEVEL_XML =
        "application/org.osgi.bundlestartlevel+xml";

    public static final MediaType APPLICATION_BUNDLESTARTLEVEL_XML_TYPE =
        new MediaType("application", "org.osgi.bundlestartlevel+xml");

    public static final String APPLICATION_BUNDLESTATE_JSON =
        "application/org.osgi.bundlestate+json";

    public static final MediaType APPLICATION_BUNDLESTATE_JSON_TYPE =
        new MediaType("application", "org.osgi.bundlestate+json");

    public static final String APPLICATION_BUNDLESTATE_XML =
        "application/org.osgi.bundlestate+xml";

    public static final MediaType APPLICATION_BUNDLESTATE_XML_TYPE =
        new MediaType("application", "org.osgi.bundlestate+xml");

    public static final String APPLICATION_EXTENSIONS_JSON =
        "application/org.osgi.extensions+json";

    public static final MediaType APPLICATION_EXTENSIONS_JSON_TYPE =
        new MediaType("application", "org.osgi.extensions+json");

    public static final String APPLICATION_EXTENSIONS_XML =
        "application/org.osgi.extensions+xml";

    public static final MediaType APPLICATION_EXTENSIONS_XML_TYPE =
        new MediaType("application", "org.osgi.extensions+xml");

    public static final String APPLICATION_FRAMEWORKSTARTLEVEL_JSON =
        "application/org.osgi.frameworkstartlevel+json";

    public static final MediaType APPLICATION_FRAMEWORKSTARTLEVEL_JSON_TYPE =
        new MediaType("application", "org.osgi.frameworkstartlevel+json");

    public static final String APPLICATION_FRAMEWORKSTARTLEVEL_XML =
        "application/org.osgi.frameworkstartlevel+xml";

    public static final MediaType APPLICATION_FRAMEWORKSTARTLEVEL_XML_TYPE =
        new MediaType("application", "org.osgi.frameworkstartlevel+xml");

    public static final String APPLICATION_SERVICE_JSON =
        "application/org.osgi.service+json";

    public static final MediaType APPLICATION_SERVICE_JSON_TYPE =
        new MediaType("application", "org.osgi.service+json");

    public static final String APPLICATION_SERVICE_XML =
        "application/org.osgi.service+xml";

    public static final MediaType APPLICATION_SERVICE_XML_TYPE =
        new MediaType("application", "org.osgi.service+xml");

    public static final String APPLICATION_SERVICES_JSON =
        "application/org.osgi.services+json";

    public static final MediaType APPLICATION_SERVICES_JSON_TYPE =
        new MediaType("application", "org.osgi.services+json");

    public static final String APPLICATION_SERVICES_REPRESENTATIONS_JSON =
        "application/org.osgi.services.representations+json";

    public static final MediaType APPLICATION_SERVICES_REPRESENTATIONS_JSON_TYPE =
        new MediaType("application", "org.osgi.services.representations+json");

    public static final String APPLICATION_SERVICES_REPRESENTATIONS_XML =
        "application/org.osgi.services.representations+xml";

    public static final MediaType APPLICATION_SERVICES_REPRESENTATIONS_XML_TYPE =
        new MediaType("application", "org.osgi.services.representations+xml");

    public static final String APPLICATION_SERVICES_XML =
        "application/org.osgi.services+xml";

    public static final MediaType APPLICATION_SERVICES_XML_TYPE =
        new MediaType("application", "org.osgi.services+xml");

    public static final String APPLICATION_VNDOSGIBUNDLE =
        "application/vnd.osgi.bundle";

    public static final MediaType APPLICATION_VNDOSGIBUNDLE_TYPE =
        new MediaType("application", "vnd.osgi.bundle");

}
