// Path: src/main/java/prj/jolokiaweb/jolokia/AgentInfo.java
// public class AgentInfo {
//     public enum JolokiaPermission {
//         NONE,READ,WRITE,EXECUTE
//     }
// 
//     private String url;
//     private boolean isLocalAgent = false;
//     private boolean requireAuth = false;
//     private String agentUsername;
//     private String agentPassword;
// 
//     private String webUsername;
//     private String webPassword;
//     private SSLConfig SSLConfig = new SSLConfig();
// 
//     private Set<JolokiaPermission> beanPermissions = new HashSet<>();
// 
//     public AgentInfo() {
//     }
// 
//     public String getUrl() {
//         return (url != null) ? url.toString() : null;
//     }
// 
//     public void setUrl(String url) {
//         this.url = url;
//     }
// 
//     public String getAgentUsername() {
//         return agentUsername;
//     }
// 
//     public void setAgentUsername(String agentUsername) {
//         this.agentUsername = agentUsername;
//     }
// 
//     public String getAgentPassword() {
//         return agentPassword;
//     }
// 
//     public void setAgentPassword(String agentPassword) {
//         this.agentPassword = agentPassword;
//     }
// 
//     public String getWebUsername() {
//         return webUsername;
//     }
// 
//     public void setWebUsername(String webUsername) {
//         this.webUsername = webUsername;
//     }
// 
//     public String getWebPassword() {
//         return webPassword;
//     }
// 
//     public void setWebPassword(String webPassword) {
//         this.webPassword = webPassword;
//     }
// 
//     public boolean isLocalAgent() {
//         return isLocalAgent;
//     }
// 
//     public boolean requiresLocalAuth() {
//         return webUsername != null;
//     }
// 
//     public void setLocalAgent(boolean localAgent) {
//         isLocalAgent = localAgent;
//     }
// 
//     public boolean isRequireAuth() {
//         return requireAuth;
//     }
// 
//     public void setRequireAuth(boolean requireAuth) {
//         this.requireAuth = requireAuth;
//     }
// 
//     public void addPermission(JolokiaPermission ... permission) {
//         this.beanPermissions.addAll(Arrays.asList(permission));
//     }
// 
//     public void clearPermission() {
//         this.beanPermissions.clear();
//     }
// 
//     public Set<JolokiaPermission> getBeanPermissions() {
//         return beanPermissions;
//     }
// 
//     public SSLConfig getSSLConfig() {
//         return SSLConfig;
//     }
// 
//     public void setSSLConfig(SSLConfig SSLConfig) {
//         this.SSLConfig = SSLConfig;
//     }
// }
// 
// Path: src/main/java/prj/jolokiaweb/jolokia/JolokiaClient.java
// public class JolokiaClient {
//     private static final int MAX_CONNECTIONS = 2;
//     private static J4pClient instance;
//     private static AgentInfo agentInfo;
// 
// 
//     private JolokiaClient(){
//     }
// 
//     public static J4pClient init(AgentInfo initialAgentInfo){
//         if (instance != null) {
//             return instance;
//         }
//         agentInfo = initialAgentInfo;
//         return getInstance();
//     }
// 
//     public static synchronized J4pClient getInstance() {
//         if (instance == null) {
//             String user = agentInfo.getAgentUsername();
//             String password = agentInfo.getAgentPassword();
//             if (agentInfo.requiresLocalAuth() && agentInfo.getAgentUsername() == null) {
//                 user = agentInfo.getWebUsername();
//                 password = agentInfo.getWebPassword();
//             }
// 
//             J4pClientBuilder clientBuilder = J4pClientBuilderFactory
//                         .url(agentInfo.getUrl())
//                         .user(user)
//                         .password(password)
//                         .maxTotalConnections(MAX_CONNECTIONS);
// 
//             SSLConfig config = agentInfo.getSSLConfig();
//             if (config.isSelfSignedCertAllowed()) {
//                 try {
//                     SSLContext sslContext = new SSLContextBuilder()
//                         .loadTrustMaterial(null, new TrustSelfSignedStrategy())
//                         .build();
// 
//                     SSLConnectionSocketFactory sslConnection = new SSLConnectionSocketFactory(
//                             sslContext,
//                             SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
//                     );
// 
//                     clientBuilder.sslConnectionSocketFactory(sslConnection);
//                 } catch (Exception e) {
//                     e.printStackTrace();
//                 }
//             }
//             instance = clientBuilder.build();
//         }
//         return instance;
//     }
// 
//     public static AgentInfo getAgentInfo() {
//         return agentInfo;
//     }
// }


import org.json.simple.JSONObject;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import prj.jolokiaweb.jolokia.AgentInfo;
import prj.jolokiaweb.jolokia.JolokiaClient;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
package prj.jolokiaweb.config;



public class PermissionCheckInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (request.getRequestURI().startsWith("/api/beans")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.READ)) {
                accessDeniedMessage(response);
                return false;
            }
        } else if (request.getRequestURI().startsWith("/api/read")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.READ)) {
                accessDeniedMessage(response);
                return false;
            }
        } else if (request.getRequestURI().startsWith("/api/write")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.WRITE)) {
                accessDeniedMessage(response);
                return false;
            }
        } else if (request.getRequestURI().startsWith("/api/execute")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.EXECUTE)) {
                accessDeniedMessage(response);
                return false;
            }
        } else if (request.getRequestURI().startsWith("/api/gcRun")) {
// Path: src/main/java/prj/jolokiaweb/jolokia/AgentInfo.java
// public class AgentInfo {
//     public enum JolokiaPermission {
//         NONE,READ,WRITE,EXECUTE
//     }
// 
//     private String url;
//     private boolean isLocalAgent = false;
//     private boolean requireAuth = false;
//     private String agentUsername;
//     private String agentPassword;
// 
//     private String webUsername;
//     private String webPassword;
//     private SSLConfig SSLConfig = new SSLConfig();
// 
//     private Set<JolokiaPermission> beanPermissions = new HashSet<>();
// 
//     public AgentInfo() {
//     }
// 
//     public String getUrl() {
//         return (url != null) ? url.toString() : null;
//     }
// 
//     public void setUrl(String url) {
//         this.url = url;
//     }
// 
//     public String getAgentUsername() {
//         return agentUsername;
//     }
// 
//     public void setAgentUsername(String agentUsername) {
//         this.agentUsername = agentUsername;
//     }
// 
//     public String getAgentPassword() {
//         return agentPassword;
//     }
// 
//     public void setAgentPassword(String agentPassword) {
//         this.agentPassword = agentPassword;
//     }
// 
//     public String getWebUsername() {
//         return webUsername;
//     }
// 
//     public void setWebUsername(String webUsername) {
//         this.webUsername = webUsername;
//     }
// 
//     public String getWebPassword() {
//         return webPassword;
//     }
// 
//     public void setWebPassword(String webPassword) {
//         this.webPassword = webPassword;
//     }
// 
//     public boolean isLocalAgent() {
//         return isLocalAgent;
//     }
// 
//     public boolean requiresLocalAuth() {
//         return webUsername != null;
//     }
// 
//     public void setLocalAgent(boolean localAgent) {
//         isLocalAgent = localAgent;
//     }
// 
//     public boolean isRequireAuth() {
//         return requireAuth;
//     }
// 
//     public void setRequireAuth(boolean requireAuth) {
//         this.requireAuth = requireAuth;
//     }
// 
//     public void addPermission(JolokiaPermission ... permission) {
//         this.beanPermissions.addAll(Arrays.asList(permission));
//     }
// 
//     public void clearPermission() {
//         this.beanPermissions.clear();
//     }
// 
//     public Set<JolokiaPermission> getBeanPermissions() {
//         return beanPermissions;
//     }
// 
//     public SSLConfig getSSLConfig() {
//         return SSLConfig;
//     }
// 
//     public void setSSLConfig(SSLConfig SSLConfig) {
//         this.SSLConfig = SSLConfig;
//     }
// }
// 
// Path: src/main/java/prj/jolokiaweb/jolokia/JolokiaClient.java
// public class JolokiaClient {
//     private static final int MAX_CONNECTIONS = 2;
//     private static J4pClient instance;
//     private static AgentInfo agentInfo;
// 
// 
//     private JolokiaClient(){
//     }
// 
//     public static J4pClient init(AgentInfo initialAgentInfo){
//         if (instance != null) {
//             return instance;
//         }
//         agentInfo = initialAgentInfo;
//         return getInstance();
//     }
// 
//     public static synchronized J4pClient getInstance() {
//         if (instance == null) {
//             String user = agentInfo.getAgentUsername();
//             String password = agentInfo.getAgentPassword();
//             if (agentInfo.requiresLocalAuth() && agentInfo.getAgentUsername() == null) {
//                 user = agentInfo.getWebUsername();
//                 password = agentInfo.getWebPassword();
//             }
// 
//             J4pClientBuilder clientBuilder = J4pClientBuilderFactory
//                         .url(agentInfo.getUrl())
//                         .user(user)
//                         .password(password)
//                         .maxTotalConnections(MAX_CONNECTIONS);
// 
//             SSLConfig config = agentInfo.getSSLConfig();
//             if (config.isSelfSignedCertAllowed()) {
//                 try {
//                     SSLContext sslContext = new SSLContextBuilder()
//                         .loadTrustMaterial(null, new TrustSelfSignedStrategy())
//                         .build();
// 
//                     SSLConnectionSocketFactory sslConnection = new SSLConnectionSocketFactory(
//                             sslContext,
//                             SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
//                     );
// 
//                     clientBuilder.sslConnectionSocketFactory(sslConnection);
//                 } catch (Exception e) {
//                     e.printStackTrace();
//                 }
//             }
//             instance = clientBuilder.build();
//         }
//         return instance;
//     }
// 
//     public static AgentInfo getAgentInfo() {
//         return agentInfo;
//     }
// }


// Path: src/main/java/prj/jolokiaweb/config/PermissionCheckInterceptor.java
import org.json.simple.JSONObject;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import prj.jolokiaweb.jolokia.AgentInfo;
import prj.jolokiaweb.jolokia.JolokiaClient;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

package prj.jolokiaweb.config;



public class PermissionCheckInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (request.getRequestURI().startsWith("/api/beans")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.READ)) {
                accessDeniedMessage(response);
                return false;
            }
        } else if (request.getRequestURI().startsWith("/api/read")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.READ)) {
                accessDeniedMessage(response);
                return false;
            }
        } else if (request.getRequestURI().startsWith("/api/write")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.WRITE)) {
                accessDeniedMessage(response);
                return false;
            }
        } else if (request.getRequestURI().startsWith("/api/execute")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.EXECUTE)) {
                accessDeniedMessage(response);
                return false;
            }
        } else if (request.getRequestURI().startsWith("/api/gcRun")) {
            if (!JolokiaClient.getAgentInfo().getBeanPermissions().contains(AgentInfo.JolokiaPermission.EXECUTE)) {