/*
 * Copyright (c) 2006, 2018 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0, which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the
 * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
 * version 2 with the GNU Classpath Exception, which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 */

package com.sun.s1asdev.security.anyone.ejb;

import jakarta.annotation.Resource;
import jakarta.annotation.security.DeclareRoles;
import jakarta.annotation.security.RolesAllowed;
import jakarta.ejb.Remote;
import jakarta.ejb.SessionContext;
import jakarta.ejb.Stateless;

@Stateless
@Remote({Hello.class})
@DeclareRoles({"javaee", "nobody"})
public class HelloEjb implements Hello {
    @Resource private SessionContext sc;

    @RolesAllowed(value={"ANYONE"})
    public String hello(String msg) {
        if (!sc.isCallerInRole("javaee") || sc.isCallerInRole("nobody")) {
            throw new RuntimeException("Not of role javaee or is of role nobody");
        }

        return "Hello , " + msg;
    }
}
