@Override
 protected JSONObject resolveArgument(WebScriptRequest request, WebScriptResponse response) {
   if (request.getContentType().startsWith(MimetypeMap.MIMETYPE_JSON)) {
     try {
       final String contentText = request.getContent().getContent();
       if (contentText != null) {
         try {
           return new JSONObject(contentText);
         } catch (JSONException e) {
           throw new WebScriptException(
               Status.STATUS_BAD_REQUEST, "Failed to parse JSON body: " + contentText, e);
         }
       }
     } catch (IOException ex) {
       throw new WebScriptException(Status.STATUS_BAD_REQUEST, "Failed to read body content", ex);
     }
   }
   return null;
 }
  @Test
  public void testPutExtractor() throws IOException {
    // Put together the stubs
    ResourceWebScriptPut extractor = new ResourceWebScriptPut();
    extractor.setJsonHelper(jsonHelper);
    Map<String, String> templateVars = new HashMap<String, String>();

    Content content = mock(Content.class);
    when(content.getReader()).thenReturn(new StringReader(JsonJacksonTests.FARMER_JSON));
    WebScriptRequest request = mock(WebScriptRequest.class);
    when(request.getServiceMatch()).thenReturn(new Match(null, templateVars, null));
    when(request.getContent()).thenReturn(content);
    when(request.getContentType()).thenReturn("application/pdf; charset=UTF-16BE");

    Params params = null;
    try {
      params = extractor.extractParams(mockEntity(), request);
      fail("Should not get here. PUT is executed against the instance URL");
    } catch (UnsupportedResourceOperationException uoe) {
      assertNotNull(uoe); // Must throw this exception
    }

    templateVars.put(ResourceLocator.ENTITY_ID, "1234");
    try {
      params = extractor.extractParams(mockRelationship(), request);
      fail("Should not get here. PUT is executed against the instance URL");
    } catch (UnsupportedResourceOperationException uoe) {
      assertNotNull(uoe); // Must throw this exception
    }

    templateVars.put(ResourceLocator.ENTITY_ID, "1234");
    // Put single entity wrapped in array
    params = extractor.extractParams(mockEntity(), request);
    assertNotNull(params);
    Object passed = params.getPassedIn();
    assertNotNull(passed);
    assertTrue("A Farmer was passed in.", Farmer.class.equals(passed.getClass()));

    assertNotNull(params.getFilter());
    assertTrue(
        "Default filter is BeanPropertiesFilter.AllProperties",
        BeanPropertiesFilter.AllProperties.class.equals(params.getFilter().getClass()));

    when(content.getReader())
        .thenReturn(new StringReader(JsonJacksonTests.FARMER_JSON)); // reset the reader
    params = extractor.extractParams(mockEntity(), request);
    assertNotNull(params);
    assertEquals("1234", params.getEntityId());
    passed = params.getPassedIn();
    assertNotNull(passed);

    when(content.getReader())
        .thenReturn(new StringReader(JsonJacksonTests.FARMER_JSON)); // reset the reader
    templateVars.put(ResourceLocator.RELATIONSHIP_ID, "67890");
    params = extractor.extractParams(mockRelationship(), request);
    assertNotNull(params);
    assertEquals("1234", params.getEntityId());
    passed = params.getPassedIn();
    assertNotNull(passed);
    assertTrue("A Farmer was passed in.", Farmer.class.equals(passed.getClass()));
    Farmer aFarmer = (Farmer) passed;
    assertEquals(
        "Relationship id should be automatically set on the object passed in.",
        aFarmer.getId(),
        "67890");

    when(content.getReader())
        .thenReturn(new StringReader(JsonJacksonTests.FARMER_JSON)); // reset the reader
    params = testExtractAddressedParams(templateVars, request, extractor);
    assertEquals("UTF-16BE", params.getContentInfo().getEncoding());
    assertEquals(MimetypeMap.MIMETYPE_PDF, params.getContentInfo().getMimeType());
  }