src/java.management.rest/share/classes/com/oracle/jmx/remote/rest/http/MBeanCollectionResource.java
author hb
Wed, 27 Dec 2017 14:44:48 +0530
branchjmx-rest-api
changeset 55995 a798bdd52997
parent 55994 9721e36abeb0
child 55996 e8d4ccaf6877
permissions -rw-r--r--
POST : Attribute update - working POST : Bulk operation for MBean - working Exception to HTTP error Mapping
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     1
package com.oracle.jmx.remote.rest.http;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     2
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     3
import com.oracle.jmx.remote.rest.json.JSONElement;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     4
import com.oracle.jmx.remote.rest.json.JSONObject;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     5
import com.oracle.jmx.remote.rest.mapper.JSONMapper;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     6
import com.oracle.jmx.remote.rest.mapper.JSONMappingException;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     7
import com.oracle.jmx.remote.rest.mapper.JSONMappingFactory;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     8
import com.sun.net.httpserver.HttpExchange;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
     9
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    10
import javax.management.*;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    11
import javax.management.remote.rest.PlatformRestAdapter;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    12
import java.io.IOException;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    13
import java.io.UnsupportedEncodingException;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    14
import java.util.*;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    15
import java.util.concurrent.ConcurrentHashMap;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    16
import java.util.concurrent.CopyOnWriteArrayList;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    17
import java.util.concurrent.CopyOnWriteArraySet;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    18
import java.util.regex.Matcher;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    19
import java.util.regex.Pattern;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    20
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    21
public class MBeanCollectionResource implements RestResource, NotificationListener {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    22
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    23
    private List<ObjectName> allowedMbeans;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    24
    private final MBeanServer mBeanServer;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    25
    private final Map<String, MBeanResource> mBeanResourceMap = new ConcurrentHashMap<>();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    26
    private static final int pageSize = 10;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    27
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    28
    private boolean isMBeanAllowed(ObjectName objName) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    29
        try {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    30
            MBeanInfo mInfo = mBeanServer.getMBeanInfo(objName);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    31
            MBeanAttributeInfo[] attrsInfo = mInfo.getAttributes();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    32
            for (MBeanAttributeInfo attrInfo : attrsInfo) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    33
                String type = attrInfo.getType();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    34
                if (!JSONMappingFactory.INSTANCE.isTypeMapped(type)) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    35
                    return false;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    36
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    37
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    38
            MBeanOperationInfo[] operations = mInfo.getOperations();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    39
            for (MBeanOperationInfo opInfo : operations) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    40
                MBeanParameterInfo[] signature = opInfo.getSignature();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    41
                for (MBeanParameterInfo sig : signature) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    42
                    if (!JSONMappingFactory.INSTANCE.isTypeMapped(sig.getType())) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    43
                        return false;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    44
                    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    45
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    46
                if (!JSONMappingFactory.INSTANCE.isTypeMapped(opInfo.getReturnType())) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    47
                    return false;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    48
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    49
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    50
            return true;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    51
        } catch (InstanceNotFoundException | IntrospectionException | ReflectionException | ClassNotFoundException ex) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    52
            ex.printStackTrace();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    53
            return false;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    54
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    55
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    56
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    57
    private void introspectMBeanTypes(MBeanServer server) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    58
        if (allowedMbeans.isEmpty()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    59
            Set<ObjectInstance> allMBeans = server.queryMBeans(null, null); // get all Mbeans
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    60
            allMBeans.stream().filter((objIns) -> (isMBeanAllowed(objIns.getObjectName())))
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    61
                    .forEachOrdered(objIns -> allowedMbeans.add(objIns.getObjectName()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    62
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    63
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    64
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    65
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    66
    public void handleNotification(Notification notification, Object handback) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    67
        try {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    68
            MBeanServerNotification mbs = (MBeanServerNotification) notification;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    69
            if (MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(mbs.getType())) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    70
                ObjectName mBeanName = mbs.getMBeanName();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    71
                if (isMBeanAllowed(mBeanName)) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    72
                    allowedMbeans.add(mBeanName);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    73
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    74
            } else if (MBeanServerNotification.UNREGISTRATION_NOTIFICATION.equals(mbs.getType())) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    75
                if (allowedMbeans.contains(mbs.getMBeanName().toString())) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    76
                    allowedMbeans.remove(mbs.getMBeanName().toString());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    77
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    78
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    79
        } catch (Exception e) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    80
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    81
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    82
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    83
    public MBeanCollectionResource(MBeanServer mBeanServer) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    84
        this.mBeanServer = mBeanServer;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    85
        allowedMbeans = new ArrayList<>();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    86
        introspectMBeanTypes(mBeanServer);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    87
        allowedMbeans = new CopyOnWriteArrayList<>(allowedMbeans);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    88
        allowedMbeans.forEach(objectName -> mBeanResourceMap.put(objectName.toString(),
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    89
                new MBeanResource(mBeanServer, objectName)));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    90
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    91
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    92
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    93
    public void handle(HttpExchange exchange) throws IOException {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    94
        String path = exchange.getRequestURI().getPath();
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    95
        String pathPrefix = "^/?jmx/servers/[a-zA-Z0-9\\-\\.]+/mbeans";
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    96
        if (path.matches(pathPrefix + "/?$")) {
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    97
            RestResource.super.handle(exchange);
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
    98
        } else if (path.matches(pathPrefix + "/[^/]+/?.*")) {
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
    99
            // Extract mbean name
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   100
            // Forward the request to its corresponding rest resource
55995
a798bdd52997 POST : Attribute update - working
hb
parents: 55994
diff changeset
   101
            Pattern mbeans = Pattern.compile(pathPrefix + "/");
55994
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   102
            Matcher matcher = mbeans.matcher(path);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   103
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   104
            if (matcher.find()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   105
                String ss = path.substring(matcher.end());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   106
                String mBeanName = ss;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   107
                if (ss.indexOf('/') != -1) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   108
                    mBeanName = ss.substring(0, ss.indexOf('/'));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   109
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   110
                MBeanResource mBeanResource = mBeanResourceMap.get(mBeanName);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   111
                if (mBeanResource == null) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   112
                    HttpUtil.sendResponse(exchange, new HttpResponse(404, "Not found"));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   113
                    return;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   114
                }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   115
                mBeanResource.handle(exchange);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   116
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   117
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   118
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   119
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   120
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   121
    public HttpResponse doGet(HttpExchange exchange) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   122
        // add links
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   123
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   124
        final String path = PlatformRestAdapter.getAuthority() + exchange.getRequestURI().getPath().replaceAll("\\/$", "");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   125
        try {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   126
            List<ObjectName> mbeans = allowedMbeans;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   127
            Map<String, String> queryMap = HttpUtil.getGetRequestQueryMap(exchange);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   128
            if(queryMap.containsKey("query")) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   129
                Set<ObjectName> queryMBeans = mBeanServer.queryNames(new ObjectName(queryMap.get("query")),null);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   130
                queryMBeans.retainAll(allowedMbeans);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   131
                mbeans = new ArrayList<>(queryMBeans);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   132
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   133
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   134
            JSONObject _links = HttpUtil.getPaginationLinks(exchange, mbeans, pageSize);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   135
            List<ObjectName> filteredMBeans = HttpUtil.filterByPage(exchange, mbeans, pageSize);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   136
            List<Map<String, String>> items = new ArrayList<>(filteredMBeans.size());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   137
            filteredMBeans.forEach(objectName -> {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   138
                Map<String, String> item = new LinkedHashMap<>(2);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   139
                item.put("name", objectName.toString());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   140
                String href = path + "/" + objectName.toString();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   141
                href = HttpUtil.escapeUrl(href);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   142
                item.put("href", href);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   143
                items.add(item);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   144
            });
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   145
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   146
            Map<String, String> properties = new HashMap<>();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   147
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   148
            properties.put("mbeanCount", Integer.toString(mbeans.size()));
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   149
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   150
            JSONMapper typeMapper1 = JSONMappingFactory.INSTANCE.getTypeMapper(items);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   151
            JSONMapper typeMapper2 = JSONMappingFactory.INSTANCE.getTypeMapper(properties);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   152
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   153
            JSONElement linkElem = typeMapper1.toJsonValue(items);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   154
            JSONElement propElem = typeMapper2.toJsonValue(properties);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   155
            JSONObject jobj = new JSONObject();
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   156
            if(_links != null && !_links.isEmpty()) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   157
                jobj.put("_links",_links);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   158
            }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   159
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   160
            jobj.putAll((JSONObject) propElem);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   161
            jobj.put("items", linkElem);
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   162
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   163
            return new HttpResponse(200, jobj.toJsonString());
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   164
        } catch (JSONMappingException e) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   165
            return new HttpResponse(500, "Internal server error");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   166
        } catch (UnsupportedEncodingException e) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   167
            return HttpResponse.SERVER_ERROR;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   168
        } catch (MalformedObjectNameException e) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   169
            return new HttpResponse(HttpResponse.BAD_REQUEST, "Invalid query string");
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   170
        }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   171
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   172
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   173
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   174
    public HttpResponse doPut(HttpExchange exchange) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   175
        return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   176
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   177
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   178
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   179
    public HttpResponse doPost(HttpExchange exchange) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   180
        return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   181
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   182
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   183
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   184
    public HttpResponse doDelete(HttpExchange exchange) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   185
        return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   186
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   187
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   188
    @Override
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   189
    public HttpResponse doHead(HttpExchange exchange) {
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   190
        return null;
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   191
    }
9721e36abeb0 Implementation of GET for new APIs
hb
parents:
diff changeset
   192
}