/*
 * 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 WARRANTIESOR 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.containers;

import java.util.List;

import org.osgi.annotation.versioning.ProviderType;

@ProviderType
public interface Service {
    /**
     * Destroy the service and all its containers.
     */
    void destroy();

    /**
     * Obtain the current instance count.
     * @return The instance count.
     */
    int getActualInstanceCount();

    ServiceConfig getConfiguration();

    List<Container> listContainers();

    void setInstanceCount(int count);

    /**
     * Update the internal representation of the service with the actual runtime state
     * which can be useful if it has been changed from the outside.
     */
    void refresh();
}