src/java.management.rest/share/classes/com/oracle/jmx/remote/rest/http/MBeanResource.java
author hb
Thu, 04 Jan 2018 14:39:04 +0530
branchjmx-rest-api
changeset 56006 352a4f213fc6
parent 56001 95c0323f0c1a
child 56007 d6cbabcaf518
permissions -rw-r--r--
1. URL decoding of URL 2. MBean info availble in MBeanCollection page 3. MBeanCollection post supports objectname filtering 4. Tests now use reflection instead of Methodhndles 3. couple of bug fixes
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
        }
56000
054866e5113c Code cleanup - MBeanColl*Resource, MBeanResource
hb
parents: 55997
diff changeset
   368
        jobj.put("name", mbean.toString());
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
}