/*
 * 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.service.command;

/**
 * Listener for command executions.
 *
 * Such listeners must be registered in the OSGi registry and will be called
 * by the CommandProcessor when a command line is executed in a given session.
 */
public interface CommandSessionListener {

    void beforeExecute(CommandSession session, CharSequence command);

    void afterExecute(CommandSession session, CharSequence command, Exception exception);

    void afterExecute(CommandSession session, CharSequence command, Object result);

}
