// Path: Web/src/main/java/org/emerjoin/hi/web/AuthComponent.java
// public interface AuthComponent {
// 
//     public boolean isUserInAnyOfThisRoles(String[] roles);
//     public boolean doesUserHavePermission(String permissionName);
// 
// }
// 
// Path: Web/src/main/java/org/emerjoin/hi/web/RequestContext.java
// @RequestScoped
// public class RequestContext {
// 
//     public static String AJAX_HEADER_KEY = "AJAX_MVC";
// 
//     @Inject
//     private AppContext appContext;
// 
//     @Inject
//     private HttpServletRequest request = null;
//     private HttpServletResponse response = null;
// 
//     @Inject
//     private Event<JSCommandSchedule> jsCommandScheduleEvent;
// 
//     @Inject
//     private ServletContext servletContext = null;
//     private Map<String,Object> data = new HashMap<String, Object>();
//     private String url = null;
//     private String routeUrl;
// 
//     private OutputStream outputStream = null;
//     private Logger log = LoggerFactory.getLogger(RequestContext.class);
// 
//     @PostConstruct
//     private void getReady(){
// 
//         this.url = request.getRequestURI();
// 
//     }
// 
//     protected void setRouteUrl(String r){
// 
//         this.routeUrl = r;
// 
//     }
// 
//     public void setUrl(String url) {
//         this.url = url;
//     }
// 
//     protected  void setResponse(HttpServletResponse response){
// 
//         this.response = response;
// 
//     }
// 
//     public void echo(String  str){
// 
//         Helper.echo(str,this);
// 
//     }
// 
//     public void echoln(String  str){
// 
//         Helper.echoln(str,this);
// 
//     }
// 
// 
//     public String readToEnd(InputStream inputStream){
// 
//         return  Helper.readLines(inputStream,this);
// 
//     }
// 
// 
//     public String getUsername(){
// 
//         return request.getRemoteUser();
// 
//     }
// 
//     public boolean isUserLogged(){
// 
//         return request.getRemoteUser()!=null;
// 
//     }
// 
//     public OutputStream getOutputStream(){
// 
//         if(outputStream ==null){
//             try {
// 
//                 outputStream = response.getOutputStream();
// 
//             }catch (Throwable ex){
//                 log.error("Failed to get the HttpServletResponse OutputStream",ex);
//             }
//         }
// 
//         return outputStream;
// 
//     }
// 
//     public String getRouteUrl(){
// 
//         return routeUrl;
// 
//     }
// 
//     public  HttpServletRequest getRequest(){
// 
//         return request;
// 
//     }
// 
//     public HttpServletResponse getResponse(){
// 
//         return response;
// 
//     }
// 
//     public  boolean hasAjaxHeader(){
// 
//         if(request==null)
//             return false;
//         return request.getHeader(AJAX_HEADER_KEY)!=null;
// 
//     }
// 
// 
// 
//     public ServletContext getServletContext(){
// 
//         return  servletContext;
// 
//     }
// 
// 
//     public String getUrl() {
//         return url;
//     }
// 
//     public Map<String,Object> getData(){
// 
//         return data;
// 
//     }
// 
//     public void sendRedirect(String route) throws IOException{
//         if(hasAjaxHeader()){
//             log.debug("Ajax Redirect: "+route);
//             this.ajaxRedirect(routeUrl);
//             return;
//         }
//         String path = appContext.getBaseURL() + route;
//         log.debug("HTTP Redirect: "+path);
//         getResponse().sendRedirect(path);
//     }
// 
//     private void ajaxRedirect(String url){
//         JSCommandSchedule redirectCommand = new JSCommandSchedule(FrontEnd.
//                 COMMAND_REDIRECT);
//         redirectCommand.getParameters().put(FrontEnd.COMMAND_URL_PARAM, url);
//         jsCommandScheduleEvent.fire(
//                 redirectCommand);
//     }
// 
// }


import org.emerjoin.hi.web.AuthComponent;
import org.emerjoin.hi.web.RequestContext;
import org.emerjoin.hi.web.meta.Denied;
import org.emerjoin.hi.web.meta.Granted;
import org.emerjoin.hi.web.meta.RequirePermission;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.enterprise.inject.spi.CDI;
import javax.servlet.ServletException;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(url);
            return matcher.matches();
        }catch (Exception ex){

            throw new ReqMatchException(reqHandler.getCanonicalName(), "handler <"+reqHandler.getCanonicalName()+"> has an invalid match regular expression");

        }
    }

    private static boolean checkPermission(Granted granted, RequestContext requestContext){
        if(granted.value().length==0)
            return true;
        boolean allowed = false;
        for(String role : granted.value()){
            if(requestContext.getRequest().isUserInRole(role)){
                allowed = true;
                break;
            }
        }
        return allowed;
    }



    private static boolean validateAccess(Annotation grantedAnnotation,
                                          Annotation deniedAnnotation, Annotation requirePermissionAnnotation){

        boolean accessGranted = true;

// Path: Web/src/main/java/org/emerjoin/hi/web/AuthComponent.java
// public interface AuthComponent {
// 
//     public boolean isUserInAnyOfThisRoles(String[] roles);
//     public boolean doesUserHavePermission(String permissionName);
// 
// }
// 
// Path: Web/src/main/java/org/emerjoin/hi/web/RequestContext.java
// @RequestScoped
// public class RequestContext {
// 
//     public static String AJAX_HEADER_KEY = "AJAX_MVC";
// 
//     @Inject
//     private AppContext appContext;
// 
//     @Inject
//     private HttpServletRequest request = null;
//     private HttpServletResponse response = null;
// 
//     @Inject
//     private Event<JSCommandSchedule> jsCommandScheduleEvent;
// 
//     @Inject
//     private ServletContext servletContext = null;
//     private Map<String,Object> data = new HashMap<String, Object>();
//     private String url = null;
//     private String routeUrl;
// 
//     private OutputStream outputStream = null;
//     private Logger log = LoggerFactory.getLogger(RequestContext.class);
// 
//     @PostConstruct
//     private void getReady(){
// 
//         this.url = request.getRequestURI();
// 
//     }
// 
//     protected void setRouteUrl(String r){
// 
//         this.routeUrl = r;
// 
//     }
// 
//     public void setUrl(String url) {
//         this.url = url;
//     }
// 
//     protected  void setResponse(HttpServletResponse response){
// 
//         this.response = response;
// 
//     }
// 
//     public void echo(String  str){
// 
//         Helper.echo(str,this);
// 
//     }
// 
//     public void echoln(String  str){
// 
//         Helper.echoln(str,this);
// 
//     }
// 
// 
//     public String readToEnd(InputStream inputStream){
// 
//         return  Helper.readLines(inputStream,this);
// 
//     }
// 
// 
//     public String getUsername(){
// 
//         return request.getRemoteUser();
// 
//     }
// 
//     public boolean isUserLogged(){
// 
//         return request.getRemoteUser()!=null;
// 
//     }
// 
//     public OutputStream getOutputStream(){
// 
//         if(outputStream ==null){
//             try {
// 
//                 outputStream = response.getOutputStream();
// 
//             }catch (Throwable ex){
//                 log.error("Failed to get the HttpServletResponse OutputStream",ex);
//             }
//         }
// 
//         return outputStream;
// 
//     }
// 
//     public String getRouteUrl(){
// 
//         return routeUrl;
// 
//     }
// 
//     public  HttpServletRequest getRequest(){
// 
//         return request;
// 
//     }
// 
//     public HttpServletResponse getResponse(){
// 
//         return response;
// 
//     }
// 
//     public  boolean hasAjaxHeader(){
// 
//         if(request==null)
//             return false;
//         return request.getHeader(AJAX_HEADER_KEY)!=null;
// 
//     }
// 
// 
// 
//     public ServletContext getServletContext(){
// 
//         return  servletContext;
// 
//     }
// 
// 
//     public String getUrl() {
//         return url;
//     }
// 
//     public Map<String,Object> getData(){
// 
//         return data;
// 
//     }
// 
//     public void sendRedirect(String route) throws IOException{
//         if(hasAjaxHeader()){
//             log.debug("Ajax Redirect: "+route);
//             this.ajaxRedirect(routeUrl);
//             return;
//         }
//         String path = appContext.getBaseURL() + route;
//         log.debug("HTTP Redirect: "+path);
//         getResponse().sendRedirect(path);
//     }
// 
//     private void ajaxRedirect(String url){
//         JSCommandSchedule redirectCommand = new JSCommandSchedule(FrontEnd.
//                 COMMAND_REDIRECT);
//         redirectCommand.getParameters().put(FrontEnd.COMMAND_URL_PARAM, url);
//         jsCommandScheduleEvent.fire(
//                 redirectCommand);
//     }
// 
// }


// Path: Web/src/main/java/org/emerjoin/hi/web/req/ReqHandler.java
import org.emerjoin.hi.web.AuthComponent;
import org.emerjoin.hi.web.RequestContext;
import org.emerjoin.hi.web.meta.Denied;
import org.emerjoin.hi.web.meta.Granted;
import org.emerjoin.hi.web.meta.RequirePermission;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.enterprise.inject.spi.CDI;
import javax.servlet.ServletException;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(url);
            return matcher.matches();
        }catch (Exception ex){

            throw new ReqMatchException(reqHandler.getCanonicalName(), "handler <"+reqHandler.getCanonicalName()+"> has an invalid match regular expression");

        }
    }

    private static boolean checkPermission(Granted granted, RequestContext requestContext){
        if(granted.value().length==0)
            return true;
        boolean allowed = false;
        for(String role : granted.value()){
            if(requestContext.getRequest().isUserInRole(role)){
                allowed = true;
                break;
            }
        }
        return allowed;
    }



    private static boolean validateAccess(Annotation grantedAnnotation,
                                          Annotation deniedAnnotation, Annotation requirePermissionAnnotation){

        boolean accessGranted = true;

        AuthComponent authComponent = null;