/*
 * 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.deployer;

import javax.management.MXBean;

/**
 * Life cycle state controller interface for a Starter Service application.
 * @author trasukg
 */
@MXBean
public interface ServiceLifeCycle {
    public String getName();
    
    public void start();
    
    public void startWithArgs(String[] args);
    
    public void stop();
    
    public void prepare();
    
    public String getStatus();
    
}
