/*
 * 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_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");

}
