/*
 * 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.felix.deploymentadmin.test.bundle3.impl;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;

/**
 * Throws an exception upon start or stop, depending on a system property.
 */
public class Activator implements BundleActivator {

    public void start(BundleContext context) throws Exception {
        checkMethodRuntimeFailure("start");
    }

    public void stop(BundleContext context) throws Exception {
        checkMethodRuntimeFailure("stop");
    }
    
    private void checkMethodRuntimeFailure(String methodName) {
        if (shouldFail(methodName)) {
            throw new RuntimeException(methodName + " fails forcedly!");
        }
    }
    
    private boolean shouldFail(String methodName) {
        String value = System.getProperty("bundle3", "");
        return methodName.equals(value);
    }

}
