src/java.management.rest/share/classes/com/oracle/jmx/remote/rest/http/MBeanResource.java
author hb
Fri, 05 Jan 2018 13:42:53 +0530
branchjmx-rest-api
changeset 56007 d6cbabcaf518
parent 56006 352a4f213fc6
permissions -rw-r--r--
1. MBeanCollection Bulk operation via objectname query 2. All MBeans identified by getCanonicalName instead of toString
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55997
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     1
/*
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     4
 *
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    10
 *
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    15
 * accompanied this code).
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    16
 *
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    20
 *
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    23
 * questions.
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    24
 */
f881344569d9 Added copyright header
hb
parents: 55996
diff changeset
    25
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    26
package com.oracle.jmx.remote.rest.http;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    27
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    28
import com.oracle.jmx.remote.rest.json.JSONArray;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    29
import com.oracle.jmx.remote.rest.json.JSONElement;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    30
import com.oracle.jmx.remote.rest.json.JSONObject;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    31
import com.oracle.jmx.remote.rest.json.JSONPrimitive;
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    32
import com.oracle.jmx.remote.rest.json.parser.JSONParser;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    33
import com.oracle.jmx.remote.rest.json.parser.ParseException;
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
    34
import com.oracle.jmx.remote.rest.json.parser.TokenMgrError;
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    35
import com.oracle.jmx.remote.rest.mapper.JSONDataException;
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    36
import com.oracle.jmx.remote.rest.mapper.JSONMapper;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    37
import com.oracle.jmx.remote.rest.mapper.JSONMappingException;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    38
import com.oracle.jmx.remote.rest.mapper.JSONMappingFactory;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    39
import com.sun.net.httpserver.HttpExchange;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    40
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    41
import javax.management.*;
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    42
import javax.management.openmbean.OpenMBeanAttributeInfo;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    43
import javax.management.openmbean.OpenMBeanParameterInfo;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    44
import javax.management.openmbean.OpenType;
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    45
import javax.management.remote.rest.PlatformRestAdapter;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    46
import java.io.IOException;
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    47
import java.net.HttpURLConnection;
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
    48
import java.net.URLDecoder;
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
    49
import java.nio.charset.StandardCharsets;
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    50
import java.util.*;
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    51
import java.util.regex.Matcher;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    52
import java.util.regex.Pattern;
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    53
import java.util.stream.Collectors;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    54
import java.util.stream.Stream;
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    55
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    56
import static javax.management.MBeanOperationInfo.*;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    57
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    58
public class MBeanResource implements RestResource {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    59
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    60
    private final ObjectName objectName;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    61
    private final MBeanServer mBeanServer;
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    62
    private static final String pathPrefix = "^/?jmx/servers/[^/]+/mbeans/[^/]+";
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    63
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    64
    private final static Map<String, Class<?>> primitiveToObject = new HashMap<>();
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    65
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    66
    static {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    67
        primitiveToObject.put("int", Integer.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    68
        primitiveToObject.put("long", Long.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    69
        primitiveToObject.put("double", Double.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    70
        primitiveToObject.put("float", Float.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    71
        primitiveToObject.put("boolean", Boolean.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    72
        primitiveToObject.put("char", Character.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    73
        primitiveToObject.put("byte", Byte.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    74
        primitiveToObject.put("void", Void.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    75
        primitiveToObject.put("short", Short.TYPE);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    76
    }
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    77
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    78
    MBeanResource(MBeanServer mBeanServer, ObjectName objectName) {
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    79
        this.mBeanServer = mBeanServer;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    80
        this.objectName = objectName;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    81
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    82
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    83
    @Override
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    84
    public void handle(HttpExchange exchange) throws IOException {
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
    85
        String path = URLDecoder.decode(exchange.getRequestURI().getPath(),StandardCharsets.UTF_8.displayName());
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    86
        if (path.matches(pathPrefix + "/?$")) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    87
            RestResource.super.handle(exchange);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    88
        } else if (path.matches(pathPrefix + "/info$")
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    89
                && exchange.getRequestMethod().equalsIgnoreCase("GET")) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    90
            RestResource.super.handle(exchange);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    91
        } else if (path.matches(pathPrefix + "/[^/]+/?$")
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    92
                && exchange.getRequestMethod().equalsIgnoreCase("POST")) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    93
            RestResource.super.handle(exchange);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    94
        } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    95
            HttpUtil.sendResponse(exchange, HttpResponse.REQUEST_NOT_FOUND);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    96
        }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    97
    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    98
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
    99
    @Override
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   100
    public HttpResponse doGet(HttpExchange exchange) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   101
        String path = PlatformRestAdapter.getDomain() +
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   102
                exchange.getRequestURI().getPath().replaceAll("/$", "");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   103
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   104
        try {
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   105
            path = URLDecoder.decode(path, StandardCharsets.UTF_8.displayName());
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   106
            if (path.endsWith("info")) {
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   107
                return doMBeanInfo();
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   108
            }
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   109
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   110
            String infoPath = path + "/info";
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   111
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   112
            Map<String, Object> allAttributes = getAllAttributes();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   113
            Map<String, String> _links = new LinkedHashMap<>();
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   114
            //_links.put("info", HttpUtil.escapeUrl(infoPath));
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   115
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   116
            MBeanOperationInfo[] opInfo = mBeanServer.getMBeanInfo(objectName).getOperations();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   117
            JSONArray jarr = new JSONArray();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   118
            for (MBeanOperationInfo op : opInfo) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   119
                JSONObject jobj1 = new JSONObject();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   120
                JSONArray jarr1 = new JSONArray();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   121
                jobj1.put("name", op.getName());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   122
                jobj1.put("href", HttpUtil.escapeUrl(path + "/" + op.getName()));
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   123
                jobj1.put("method", "POST");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   124
                for (MBeanParameterInfo paramInfo : op.getSignature()) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   125
                    JSONObject jobj = new JSONObject();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   126
                    jobj.put("name", paramInfo.getName());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   127
                    jobj.put("type", paramInfo.getType());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   128
                    jarr1.add(jobj);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   129
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   130
                jobj1.put("arguments", jarr1);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   131
                jobj1.put("returnType", op.getReturnType());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   132
                jarr.add(jobj1);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   133
            }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   134
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   135
            JSONMapper typeMapper = JSONMappingFactory.INSTANCE.getTypeMapper(allAttributes);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   136
            if (typeMapper != null) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   137
                JSONElement jsonElement1 = typeMapper.toJsonValue(allAttributes);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   138
                JSONElement jsonElement2 = typeMapper.toJsonValue(_links);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   139
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   140
                JSONObject jobj = new JSONObject();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   141
                jobj.put("attributes", jsonElement1);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   142
                jobj.put("operations", jarr);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   143
                return new HttpResponse(jobj.toJsonString());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   144
            } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   145
                return HttpResponse.SERVER_ERROR;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   146
            }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   147
        } catch (RuntimeOperationsException | IntrospectionException | ReflectionException
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   148
                | JSONMappingException | MBeanException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   149
            return HttpResponse.SERVER_ERROR;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   150
        } catch (InstanceNotFoundException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   151
            return new HttpResponse(HttpResponse.BAD_REQUEST, "Specified MBean does not exist");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   152
        } catch (Exception e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   153
            return HttpResponse.SERVER_ERROR;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   154
        }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   155
    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   156
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   157
    /*
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   158
    HTTP POST for this MBean's URL allows setting of attributes and execution of operations.
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   159
    POST request body can follow one of the below formats
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   160
    1. { name : value}
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   161
    Set a single attribute
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   162
    2. { name1 : value1, name2 : value2 }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   163
    Sets multiple attributes
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   164
    3. {attributes : {read : [name]} , {write : {name : value}}, operations : {op_name : {param_name:name, param_value:value}}}
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   165
    This bulk operation request sets multiple attributes and executes multiple
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   166
    operations on the MBean.
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   167
 */
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   168
    @Override
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   169
    public HttpResponse doPost(HttpExchange exchange) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   170
        String path = exchange.getRequestURI().getPath();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   171
        String reqBody = null;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   172
        try {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   173
            if (path.matches(pathPrefix + "/?$")) { // POST to current URL
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   174
                reqBody = HttpUtil.readRequestBody(exchange);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   175
                if (reqBody.isEmpty()) {                // No Parameters
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   176
                    return HttpResponse.BAD_REQUEST;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   177
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   178
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   179
                JSONParser parser = new JSONParser(reqBody);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   180
                JSONElement jsonElement = parser.parse();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   181
                if (!(jsonElement instanceof JSONObject)) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   182
                    return new HttpResponse(HttpResponse.BAD_REQUEST,
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   183
                            "Invalid parameters : [" + reqBody + "]");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   184
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   185
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   186
                JSONObject jsonObject = (JSONObject) jsonElement;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   187
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   188
                // Handle bulk operation
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   189
                if (jsonObject.keySet().contains("attributes") | jsonObject.keySet().contains("operations")) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   190
                    return new HttpResponse(handleBulkRequest(jsonObject).toJsonString());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   191
                } else {    // Handle attribute update
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   192
                    Map<String, Object> stringObjectMap = setAttributes(jsonObject);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   193
                    JSONMapper typeMapper = JSONMappingFactory.INSTANCE.getTypeMapper(stringObjectMap);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   194
                    if (typeMapper != null) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   195
                        return new HttpResponse(HttpURLConnection.HTTP_OK, typeMapper.toJsonValue(stringObjectMap).toJsonString());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   196
                    } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   197
                        return new HttpResponse(HttpResponse.SERVER_ERROR, "Unable to find JSON Mapper");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   198
                    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   199
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   200
            } else if (path.matches(pathPrefix + "/[^/]+/?$")) {  // POST to MBeanOperation
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   201
                Matcher matcher = Pattern.compile(pathPrefix + "/").matcher(path);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   202
                String operation;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   203
                if (matcher.find()) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   204
                    operation = path.substring(matcher.end());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   205
                } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   206
                    return HttpResponse.BAD_REQUEST;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   207
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   208
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   209
                reqBody = HttpUtil.readRequestBody(exchange);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   210
                JSONElement result;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   211
                if (reqBody.isEmpty()) { // No Parameters
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   212
                    result = execOperation(operation, null);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   213
                } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   214
                    JSONParser parser = new JSONParser(reqBody);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   215
                    JSONElement jsonElement = parser.parse();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   216
                    if (!(jsonElement instanceof JSONObject)) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   217
                        return new HttpResponse(HttpResponse.BAD_REQUEST,
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   218
                                "Invalid parameters : [" + reqBody + "] for operation - " + operation);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   219
                    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   220
                    result = execOperation(operation, (JSONObject) jsonElement);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   221
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   222
                return new HttpResponse(HttpURLConnection.HTTP_OK, result.toJsonString());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   223
            } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   224
                return HttpResponse.REQUEST_NOT_FOUND;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   225
            }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   226
        } catch (InstanceNotFoundException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   227
            // Should never happen
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   228
        } catch (JSONDataException | ParseException | TokenMgrError e) {
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   229
            return new HttpResponse(HttpURLConnection.HTTP_BAD_REQUEST, "Invalid JSON : " + reqBody, e.getMessage());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   230
        } catch (IntrospectionException | JSONMappingException | MBeanException | ReflectionException | IOException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   231
            return new HttpResponse(HttpResponse.SERVER_ERROR, HttpResponse.getErrorMessage(e));
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   232
        } catch (IllegalArgumentException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   233
            return new HttpResponse(HttpResponse.BAD_REQUEST, e.getMessage());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   234
        } catch (Exception e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   235
            return new HttpResponse(HttpResponse.SERVER_ERROR, HttpResponse.getErrorMessage(e));
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   236
        }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   237
        return HttpResponse.REQUEST_NOT_FOUND;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   238
    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   239
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   240
    private HttpResponse doMBeanInfo() {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   241
        try {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   242
            JSONObject mBeanInfo = getMBeanInfo(mBeanServer, objectName);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   243
            return new HttpResponse(mBeanInfo.toJsonString());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   244
        } catch (RuntimeOperationsException | IntrospectionException | ReflectionException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   245
            return HttpResponse.SERVER_ERROR;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   246
        } catch (InstanceNotFoundException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   247
            return new HttpResponse(HttpResponse.BAD_REQUEST, "Specified MBean does not exist");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   248
        } catch (Exception e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   249
            return HttpResponse.SERVER_ERROR;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   250
        }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   251
    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   252
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   253
    JSONElement handleBulkRequest(JSONObject reqObject) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   254
        JSONObject result = new JSONObject();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   255
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   256
        // Handle attributes
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   257
        JSONElement element = reqObject.get("attributes");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   258
        if (element != null && element instanceof JSONObject) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   259
            JSONObject attrInfo = (JSONObject) element;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   260
            JSONObject attrNode = new JSONObject();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   261
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   262
            // Read attributes
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   263
            JSONElement read = attrInfo.get("get");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   264
            if (read != null) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   265
                if (read instanceof JSONArray) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   266
                    JSONArray jsonAttrMap = (JSONArray) read;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   267
                    JSONElement resultJson;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   268
                    Map<String, Object> attrRead;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   269
                    try {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   270
                        String[] attributes = getStrings(jsonAttrMap);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   271
                        attrRead = getAttributes(attributes);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   272
                        JSONMapper typeMapper = JSONMappingFactory.INSTANCE.getTypeMapper(attrRead);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   273
                        resultJson = typeMapper.toJsonValue(attrRead);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   274
                    } catch (InstanceNotFoundException | ReflectionException | JSONMappingException | MBeanException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   275
                        resultJson = new JSONPrimitive("<ERROR: Unable to retrieve value>");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   276
                    } catch (JSONDataException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   277
                        resultJson = new JSONPrimitive("Invalid JSON : " + e.getMessage());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   278
                    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   279
                    attrNode.put("get", resultJson);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   280
                } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   281
                    attrInfo.put("get", new JSONPrimitive("Invalid JSON : " + read.toJsonString()));
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   282
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   283
            }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   284
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   285
            // Write attributes
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   286
            JSONElement write = attrInfo.get("set");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   287
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   288
            if (write != null) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   289
                if (write instanceof JSONObject) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   290
                    JSONElement resultJson;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   291
                    JSONObject jsonAttrMap = (JSONObject) write;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   292
                    try {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   293
                        Map<String, Object> attrMap = setAttributes(jsonAttrMap);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   294
                        JSONMapper typeMapper = JSONMappingFactory.INSTANCE.getTypeMapper(attrMap);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   295
                        resultJson = typeMapper.toJsonValue(attrMap);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   296
                    } catch (JSONDataException ex) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   297
                        resultJson = new JSONPrimitive("Invalid JSON : " + write.toJsonString());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   298
                    } catch (JSONMappingException | IntrospectionException | InstanceNotFoundException | ReflectionException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   299
                        resultJson = new JSONPrimitive("<ERROR: Unable to retrieve value>");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   300
                    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   301
                    attrNode.put("set", resultJson);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   302
                } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   303
                    attrNode.put("set", new JSONPrimitive("Invalid JSON : " + write.toJsonString()));
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   304
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   305
            }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   306
            result.put("attributes", attrNode);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   307
        }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   308
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   309
        // Execute operations
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   310
        element = reqObject.get("operations");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   311
        if (element != null) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   312
            JSONArray operationList;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   313
            if (element instanceof JSONPrimitive             // Single no-arg operation
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   314
                    || element instanceof JSONObject) {     // single/mulitple operations
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   315
                operationList = new JSONArray();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   316
                operationList.add(element);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   317
            } else if (element instanceof JSONArray) {  // List of no-arg/with-arg operation
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   318
                operationList = (JSONArray) element;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   319
            } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   320
                operationList = new JSONArray();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   321
            }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   322
            JSONObject opResult = new JSONObject();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   323
            operationList.forEach((elem) -> {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   324
                if (elem instanceof JSONPrimitive
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   325
                        && ((JSONPrimitive) elem).getValue() instanceof String) { // no-arg operation
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   326
                    String opName = (String) ((JSONPrimitive) elem).getValue();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   327
                    try {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   328
                        JSONElement obj = execOperation(opName, null);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   329
                        opResult.put(opName, obj);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   330
                    } catch (IllegalArgumentException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   331
                        opResult.put(opName, e.getMessage());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   332
                    } catch (IntrospectionException | InstanceNotFoundException
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   333
                            | MBeanException | ReflectionException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   334
                        opResult.put(opName, "<ERROR while executing operation>");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   335
                    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   336
                } else if (elem instanceof JSONObject) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   337
                    ((JSONObject) elem).keySet().forEach((opName) -> {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   338
                        try {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   339
                            JSONElement jsonElement = ((JSONObject) elem).get(opName);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   340
                            if (jsonElement instanceof JSONObject) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   341
                                JSONElement obj = execOperation(opName, (JSONObject) jsonElement);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   342
                                opResult.put(opName, obj);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   343
                            } else {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   344
                                opResult.put(opName, new JSONPrimitive("Invalid parameter JSON"));
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   345
                            }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   346
                        } catch (IllegalArgumentException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   347
                            opResult.put(opName, e.getMessage());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   348
                        } catch (IntrospectionException | InstanceNotFoundException
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   349
                                | MBeanException | ReflectionException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   350
                            opResult.put(opName, "<ERROR while executing operation>");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   351
                        }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   352
                    });
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   353
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   354
            });
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   355
            result.put("operations", opResult);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   356
        }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   357
        return result;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   358
    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   359
56006
352a4f213fc6 1. URL decoding of URL
hb
parents: 56001
diff changeset
   360
    JSONObject getMBeanInfo(MBeanServer mbeanServer, ObjectName mbean)
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   361
            throws InstanceNotFoundException, IntrospectionException, ReflectionException {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   362
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   363
        JSONObject jobj = new JSONObject();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   364
        MBeanInfo mBeanInfo = mbeanServer.getMBeanInfo(mbean);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   365
        if (mBeanInfo == null) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   366
            return jobj;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   367
        }
56007
d6cbabcaf518 1. MBeanCollection Bulk operation via objectname query
hb
parents: 56006
diff changeset
   368
        jobj.put("name", mbean.getCanonicalName());
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   369
        jobj.put("className", mBeanInfo.getClassName());
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   370
        jobj.put("description", mBeanInfo.getDescription());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   371
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   372
        // Populate Attribute Info
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   373
        MBeanAttributeInfo[] attributes = mBeanInfo.getAttributes();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   374
        JSONArray jarr = new JSONArray();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   375
        for (MBeanAttributeInfo attr : attributes) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   376
            String access;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   377
            if (attr.isReadable()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   378
                if (attr.isWritable()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   379
                    access = "read/write";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   380
                } else {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   381
                    access = "read-only";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   382
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   383
            } else if (attr.isWritable()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   384
                access = "write-only";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   385
            } else {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   386
                access = "no-access";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   387
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   388
            JSONObject jobj1 = new JSONObject();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   389
            jobj1.put("name", attr.getName());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   390
            jobj1.put("type", attr.getType());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   391
            jobj1.put("access", access);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   392
            jobj1.put("description", attr.getDescription());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   393
            jobj1.put("descriptor", getDescriptorJSON(attr.getDescriptor()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   394
            jarr.add(jobj1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   395
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   396
        jobj.put("attributeInfo", jarr);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   397
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   398
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   399
        // Add constructor Info
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   400
        MBeanConstructorInfo[] constructorInfo = mBeanInfo.getConstructors();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   401
        jarr = new JSONArray();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   402
        for (MBeanConstructorInfo constructor : constructorInfo) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   403
            JSONObject jobj1 = new JSONObject();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   404
            jobj1.put("name", constructor.getName());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   405
            JSONArray jarr1 = new JSONArray();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   406
            for (MBeanParameterInfo paramInfo : constructor.getSignature()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   407
                jarr1.add(getParamJSON(paramInfo));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   408
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   409
            jobj1.put("signature", jarr1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   410
            jobj1.put("description", constructor.getDescription());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   411
            if (constructor.getDescriptor().getFieldNames().length > 1) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   412
                jobj1.put("descriptor", getDescriptorJSON(constructor.getDescriptor()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   413
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   414
            jarr.add(jobj1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   415
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   416
        jobj.put("constructorInfo", jarr);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   417
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   418
        MBeanOperationInfo[] opInfo = mBeanInfo.getOperations();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   419
        jarr = new JSONArray();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   420
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   421
        for (MBeanOperationInfo op : opInfo) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   422
            String impactString;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   423
            switch (op.getImpact()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   424
                case ACTION:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   425
                    impactString = "action";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   426
                    break;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   427
                case ACTION_INFO:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   428
                    impactString = "action/info";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   429
                    break;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   430
                case INFO:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   431
                    impactString = "info";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   432
                    break;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   433
                case UNKNOWN:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   434
                    impactString = "unknown";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   435
                    break;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   436
                default:
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   437
                    impactString = "(" + op.getImpact() + ")";
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   438
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   439
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   440
            JSONObject jobj1 = new JSONObject();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   441
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   442
            jobj1.put("name", op.getName());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   443
            JSONArray jarr1 = new JSONArray();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   444
            for (MBeanParameterInfo paramInfo : op.getSignature()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   445
                jarr1.add(getParamJSON(paramInfo));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   446
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   447
            jobj1.put("signature", jarr1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   448
            jobj1.put("returnType", op.getReturnType());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   449
            jobj1.put("impact", impactString);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   450
            jobj1.put("description", op.getDescription());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   451
            if (op.getDescriptor().getFieldNames().length > 1) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   452
                jobj1.put("descriptor", getDescriptorJSON(op.getDescriptor()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   453
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   454
            jarr.add(jobj1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   455
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   456
        jobj.put("operationInfo", jarr);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   457
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   458
        MBeanNotificationInfo[] notifications = mBeanInfo.getNotifications();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   459
        jarr = new JSONArray();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   460
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   461
        for (MBeanNotificationInfo notification : notifications) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   462
            JSONObject jobj1 = new JSONObject();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   463
            jobj1.put("name", notification.getName());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   464
            JSONArray jarr1 = new JSONArray();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   465
            for (String notifType : notification.getNotifTypes()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   466
                jarr1.add(new JSONPrimitive(notifType));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   467
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   468
            jobj1.put("notifTypes", jarr1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   469
            jobj1.put("description", notification.getDescription());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   470
            if (notification.getDescriptor().getFieldNames().length > 1) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   471
                jobj1.put("descriptor", getDescriptorJSON(notification.getDescriptor()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   472
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   473
            jarr.add(jobj1);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   474
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   475
        jobj.put("notificationInfo", jarr);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   476
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   477
        jobj.put("descriptor", getDescriptorJSON(mBeanInfo.getDescriptor()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   478
        return jobj;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   479
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   480
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   481
    private JSONObject getParamJSON(MBeanParameterInfo mParamInfo) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   482
        JSONObject jobj1 = new JSONObject();
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   483
        jobj1.put("name", mParamInfo.getName());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   484
        jobj1.put("type", mParamInfo.getType());
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   485
        if (mParamInfo.getDescription() != null && !mParamInfo.getDescription().isEmpty()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   486
            jobj1.put("description", mParamInfo.getDescription());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   487
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   488
        if (mParamInfo.getDescriptor() != null && mParamInfo.getDescriptor().getFieldNames().length > 1) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   489
            jobj1.put("descriptor", getDescriptorJSON(mParamInfo.getDescriptor()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   490
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   491
        return jobj1;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   492
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   493
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   494
    private JSONObject getDescriptorJSON(Descriptor descriptor) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   495
        JSONObject jobj2 = new JSONObject();
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   496
        String[] descNames = descriptor.getFieldNames();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   497
        for (String descName : descNames) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   498
            Object fieldValue = descriptor.getFieldValue(descName);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   499
            jobj2.put(descName, fieldValue != null ? fieldValue.toString() : null);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   500
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   501
        return jobj2;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   502
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   503
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   504
    private Map<String, Object> getAttributes(String[] attrs) throws
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   505
            InstanceNotFoundException, ReflectionException, MBeanException {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   506
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   507
        Map<String, Object> result = new LinkedHashMap<>();
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   508
55996
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   509
        if (attrs == null || attrs.length == 0) {
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   510
            return result;
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   511
        }
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   512
55996
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   513
        AttributeList attrVals = mBeanServer.getAttributes(objectName, attrs);
56001
95c0323f0c1a Few bug fixes
hb
parents: 56000
diff changeset
   514
        List<String> missingAttrs = new ArrayList<>(Arrays.asList(attrs));
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   515
        attrVals.asList().forEach(a -> {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   516
            missingAttrs.remove(a.getName());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   517
            result.put(a.getName(), a.getValue());
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   518
        });
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   519
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   520
        for (String attr : missingAttrs) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   521
            try {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   522
                mBeanServer.getAttribute(objectName, attr);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   523
                result.put(attr, "< Error: No such attribute >");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   524
            } catch (RuntimeException ex) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   525
                if (ex.getCause() instanceof UnsupportedOperationException) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   526
                    result.put(attr, "< Attribute not supported >");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   527
                } else if (ex.getCause() instanceof IllegalArgumentException) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   528
                    result.put(attr, "< Invalid attributes >");
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   529
                }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   530
            } catch (AttributeNotFoundException e) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   531
                result.put(attr, "< Attribute not found >");
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   532
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   533
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   534
        return result;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   535
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   536
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   537
    private Map<String, Object> getAllAttributes() throws InstanceNotFoundException,
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   538
            ReflectionException, MBeanException, IntrospectionException {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   539
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   540
        MBeanInfo mInfo = mBeanServer.getMBeanInfo(objectName);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   541
        String[] attrs = Stream.of(mInfo.getAttributes())
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   542
                .map(MBeanAttributeInfo::getName)
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   543
                .toArray(String[]::new);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   544
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   545
        return getAttributes(attrs);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   546
    }
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   547
55996
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   548
    private Map<String, Object> setAttributes(JSONObject attrMap) throws JSONDataException,
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   549
            IntrospectionException, InstanceNotFoundException, ReflectionException {
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   550
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   551
        if (attrMap == null || attrMap.isEmpty()) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   552
            throw new JSONDataException("Null arguments for set attribute");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   553
        }
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   554
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   555
        MBeanInfo mBeanInfo = mBeanServer.getMBeanInfo(objectName);
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   556
        Map<String, Object> result = new HashMap<>();
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   557
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   558
        for (String attrName : attrMap.keySet()) {
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   559
            MBeanAttributeInfo attrInfo = Arrays.stream(mBeanInfo.getAttributes()).
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   560
                    filter(a -> a.getName().equals(attrName)).findFirst().orElse(null);
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   561
            if (attrInfo == null) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   562
                result.put(attrName, "<Attribute not found>");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   563
            } else if (!attrInfo.isWritable()) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   564
                result.put(attrName, "<Attribute is read-only>");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   565
            } else {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   566
                JSONMapper mapper;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   567
                if (attrInfo instanceof OpenMBeanAttributeInfo) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   568
                    OpenType<?> type = ((OpenMBeanAttributeInfo) attrInfo).getOpenType();
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   569
                    mapper = JSONMappingFactory.INSTANCE.getTypeMapper(type);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   570
                } else {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   571
                    Class<?> inputCls = primitiveToObject.get(attrInfo.getType());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   572
                    try {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   573
                        if (inputCls == null) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   574
                            inputCls = Class.forName(attrInfo.getType());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   575
                        }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   576
                    } catch (ClassNotFoundException | ClassCastException ex) {
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   577
                        throw new IllegalArgumentException("Invalid parameters : "
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   578
                                + attrMap.get(attrName).toJsonString() + " cannot be mapped to : " + attrInfo.getType());
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   579
                    }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   580
                    mapper = JSONMappingFactory.INSTANCE.getTypeMapper(inputCls);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   581
                }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   582
                try {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   583
                    Object attrValue = mapper.toJavaObject(attrMap.get(attrName));
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   584
                    Attribute attrObj = new Attribute(attrName, attrValue);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   585
                    mBeanServer.setAttribute(objectName, attrObj);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   586
                    result.put(attrName, "success");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   587
                } catch (InvalidAttributeValueException | JSONDataException e) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   588
                    result.put(attrName, "<Invalid value for the attribute>");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   589
                } catch (AttributeNotFoundException e) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   590
                    result.put(attrName, "<Attribute not found>");
55996
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   591
                } catch (ReflectionException | InstanceNotFoundException | MBeanException e) {
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   592
                    result.put(attrName, "<ERROR: Unable to retrieve value>");
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   593
                }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   594
            }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   595
        }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   596
        return result;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   597
    }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   598
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   599
    private Object mapJsonElemToType(JSONElement jsonElement, MBeanParameterInfo type) {
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   600
        if (type instanceof OpenMBeanParameterInfo) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   601
            OpenType<?> openType = ((OpenMBeanParameterInfo) type).getOpenType();
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   602
            JSONMapper typeMapper = JSONMappingFactory.INSTANCE.getTypeMapper(openType);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   603
            try {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   604
                return typeMapper.toJavaObject(jsonElement);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   605
            } catch (JSONDataException ex) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   606
                throw new IllegalArgumentException("Invalid JSON String : " + jsonElement.toJsonString() + " for arguments");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   607
            }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   608
        } else {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   609
            Class<?> inputCls = primitiveToObject.get(type.getType());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   610
            try {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   611
                if (inputCls == null) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   612
                    inputCls = Class.forName(type.getType());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   613
                }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   614
            } catch (ClassNotFoundException | ClassCastException ex) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   615
                throw new IllegalArgumentException("Invalid parameters : " + jsonElement.toJsonString() + " cannot be mapped to : " + type.getType());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   616
            }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   617
            JSONMapper typeMapper = JSONMappingFactory.INSTANCE.getTypeMapper(inputCls);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   618
            if (typeMapper == null) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   619
                throw new IllegalArgumentException("Invalid parameters : " + jsonElement.toJsonString() + " cannot be mapped to : " + type.getType());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   620
            }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   621
            try {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   622
                return typeMapper.toJavaObject(jsonElement);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   623
            } catch (JSONDataException ex) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   624
                throw new IllegalArgumentException("Invalid JSON String : " + jsonElement.toJsonString() + " for arguments");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   625
            }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   626
        }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   627
    }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   628
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   629
    private Map<String, Object> getOperationParameters(Map<String, JSONElement> jsonValues, Map<String, MBeanParameterInfo> typeMap) {
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   630
        if (jsonValues.size() != typeMap.size()) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   631
            throw new IllegalArgumentException("Invalid parameters : expected - " + typeMap.size() + " parameters, got - " + jsonValues.size());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   632
        }
55996
e8d4ccaf6877 Bulk operation at MBeanServer level
hb
parents: 55995
diff changeset
   633
        if (!jsonValues.keySet().equals(typeMap.keySet())) {
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   634
            throw new IllegalArgumentException("Invalid parameters - expected : " + Arrays.toString(typeMap.keySet().toArray()));
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   635
        }
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   636
        Map<String, Object> parameters = new LinkedHashMap<>(); // Order of parameters should be same as typeMap
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   637
        if (typeMap.isEmpty() && jsonValues.isEmpty()) {
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   638
            return parameters;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   639
        }
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   640
        typeMap.keySet().forEach((name) -> {
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   641
            MBeanParameterInfo type = typeMap.get(name);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   642
            JSONElement jsonVal = jsonValues.get(name);
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   643
            Object obj = mapJsonElemToType(jsonVal, type);
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   644
            parameters.put(name, obj);
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   645
        });
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   646
        return parameters;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   647
    }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   648
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   649
    private JSONElement execOperation(String opstr, JSONObject params)
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   650
            throws MBeanException, IntrospectionException, ReflectionException, InstanceNotFoundException {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   651
        if (params == null) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   652
            params = new JSONObject();
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   653
        }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   654
        MBeanInfo mBeanInfo;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   655
        try {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   656
            mBeanInfo = mBeanServer.getMBeanInfo(objectName);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   657
        } catch (InstanceNotFoundException ex) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   658
            throw new IllegalArgumentException("MBean does not exist");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   659
        }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   660
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   661
        List<MBeanOperationInfo> mBeanOperationInfos = Arrays.stream(mBeanInfo.getOperations()).
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   662
                filter(a -> a.getName().equals(opstr)).collect(Collectors.toList());
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   663
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   664
        if (mBeanOperationInfos.isEmpty()) {
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   665
            throw new IllegalArgumentException("Invalid Operation String");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   666
        }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   667
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   668
        String[] signature = null;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   669
        Object[] parameters = null;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   670
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   671
        IllegalArgumentException exception = null;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   672
        for (MBeanOperationInfo mBeanOperationInfo : mBeanOperationInfos) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   673
            MBeanParameterInfo[] sig = mBeanOperationInfo.getSignature();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   674
            try {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   675
                Map<String, MBeanParameterInfo> typeMap = new LinkedHashMap<>();    // Order of parameters is important
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   676
                Arrays.stream(sig).forEach(e -> typeMap.put(e.getName(), e));
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   677
                parameters = getOperationParameters(params, typeMap).values().toArray();
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   678
                signature = Stream.of(sig).map(MBeanParameterInfo::getType).toArray(String[]::new);
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   679
                exception = null;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   680
                break;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   681
            } catch (IllegalArgumentException ex) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   682
                exception = ex;
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   683
            }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   684
        }
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   685
        if (exception != null) {
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   686
            throw exception;
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   687
        }
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   688
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   689
        Object invoke;
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   690
        try {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   691
            invoke = mBeanServer.invoke(objectName, opstr, parameters, signature);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   692
            if (invoke != null) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   693
                JSONMapper typeMapper = JSONMappingFactory.INSTANCE.getTypeMapper(invoke);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   694
                if (typeMapper != null) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   695
                    return typeMapper.toJsonValue(invoke);
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   696
                } else {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   697
                    return new JSONPrimitive("<Unable to map result to JSON>");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   698
                }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   699
            } else {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   700
                return new JSONPrimitive("void");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   701
            }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   702
        } catch (JSONMappingException e) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   703
            return new JSONPrimitive("<Unable to map result to JSON>");
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   704
        }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   705
    }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   706
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   707
    private String[] getStrings(JSONArray jsonArray) throws JSONDataException {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   708
        List<String> attributes = new ArrayList<>();
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   709
        for (JSONElement element : jsonArray) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   710
            if (element instanceof JSONPrimitive && ((JSONPrimitive) element).getValue() instanceof String) {
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   711
                JSONPrimitive val = (JSONPrimitive) element;
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   712
                attributes.add((String) val.getValue());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   713
            } else throw new JSONDataException("Expecting String, got " + element.toJsonString());
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   714
        }
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   715
        return attributes.toArray(new String[0]);
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   716
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   717
}