/*
 * Copyright 2015 Open Networking Laboratory
 *
 * Licensed 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.onosproject.security;

import com.google.common.annotations.Beta;
import org.onosproject.core.ApplicationId;

import java.security.Permission;
import java.util.List;
import java.util.Map;

/**
 * Security-Mode ONOS service.
 */
@Beta
public interface SecurityAdminService {

    /**
     * Returns true if security policy has been enforced to specified application.
     * @param appId application identifier
     * @return true if secured.
     */
    boolean isSecured(ApplicationId appId);

    /**
     * Changes SecurityModeState of specified application to REVIEWED.
     * @param appId application identifier
     */
    void review(ApplicationId appId);

    /**
     * Accepts and enforces security policy to specified application.
     * @param appId application identifier
     */
    void acceptPolicy(ApplicationId appId);

    /**
     * Register application to SM-ONOS subsystem.
     * @param appId application identifier
     */
    void register(ApplicationId appId);

    /**
     * Returns sorted developer specified permission Map.
     * @param appId application identifier
     * @return Map of list of permissions sorted by permission type
     */
    Map<Integer, List<Permission>> getPrintableSpecifiedPermissions(ApplicationId appId);

    /**
     * Returns sorted granted permission Map.
     * @param appId application identifier
     * @return Map of list of permissions sorted by permission type
     */
    Map<Integer, List<Permission>> getPrintableGrantedPermissions(ApplicationId appId);

    /**
     * Returns sorted requested permission Map.
     * @param appId application identifier
     * @return Map of list of permissions sorted by permission type
     */
    Map<Integer, List<Permission>> getPrintableRequestedPermissions(ApplicationId appId);


}
