@POST
  @Path("entityManager")
  @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
  @Produces(MediaType.APPLICATION_JSON)
  public String create(@FormParam("sessionId") String sessionId, @FormParam("entities") String json)
      throws IcatException {
    List<EntityBaseBean> entities = new ArrayList<>();

    try (JsonParser parser = Json.createParser(new ByteArrayInputStream(json.getBytes()))) {
      EventChecker checker = new EventChecker(parser);
      checker.get(Event.START_ARRAY);
      while (true) {
        Event event = checker.get(Event.START_OBJECT, Event.END_ARRAY);
        if (event == Event.END_ARRAY) {
          break;
        }
        checker.get(Event.KEY_NAME);
        String entityName = parser.getString();
        checker.get(Event.START_OBJECT);
        entities.add(parseEntity(checker, entityName));
        checker.get(Event.END_OBJECT);
      }
    } catch (JsonException e) {
      throw new IcatException(IcatExceptionType.INTERNAL, e.getMessage());
    }
    String userName = beanManager.getUserName(sessionId, manager);

    List<CreateResponse> createResponses =
        beanManager.createMany(userName, entities, manager, userTransaction);

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (JsonGenerator gen = Json.createGenerator(baos)) {
      gen.writeStartArray();
      for (CreateResponse createResponse : createResponses) {
        transmitter.processMessage(createResponse.getNotificationMessage());
        gen.write(createResponse.getPk());
      }
      gen.writeEnd();
    } catch (JMSException e) {
      throw new IcatException(
          IcatException.IcatExceptionType.INTERNAL, e.getClass() + " " + e.getMessage());
    }
    return baos.toString();
  }
 // Note that the START_OBJECT has already been swallowed
 private EntityBaseBean parseEntity(EventChecker checker, String beanName) throws IcatException {
   Class<EntityBaseBean> klass = EntityInfoHandler.getClass(beanName);
   Map<Field, Method> getters = eiHandler.getGetters(klass);
   Map<Field, Method> setters = eiHandler.getSetters(klass);
   Set<Field> atts = eiHandler.getAttributes(klass);
   Set<Field> updaters = eiHandler.getSettersForUpdate(klass).keySet();
   Map<String, Field> fieldsByName = eiHandler.getFieldsByName(klass);
   EntityBaseBean bean = null;
   JsonParser parser = checker.parser;
   try {
     bean = klass.newInstance();
     while (true) {
       Event event = checker.get(Event.KEY_NAME, Event.END_OBJECT);
       if (event == Event.END_OBJECT) {
         break;
       }
       Field field = fieldsByName.get(parser.getString());
       if (field == null) {
         throw new IcatException(
             IcatExceptionType.BAD_PARAMETER,
             "Field " + parser.getString() + " not found in " + beanName);
       } else if (field.getName().equals("id")) {
         checker.get(Event.VALUE_NUMBER);
         bean.setId(Long.parseLong(parser.getString()));
       } else if (atts.contains(field)) {
         checker.get(Event.VALUE_NUMBER, Event.VALUE_STRING);
         String type = field.getType().getSimpleName();
         Object arg;
         if (type.equals("String")) {
           arg = parser.getString();
         } else if (type.equals("Integer")) {
           arg = Integer.parseInt(parser.getString());
         } else if (type.equals("Double")) {
           arg = Double.parseDouble(parser.getString());
         } else if (type.equals("Long")) {
           arg = Long.parseLong(parser.getString());
         } else if (type.equals("boolean")) {
           arg = Boolean.parseBoolean(parser.getString());
           // } else if (field.getType().isEnum()) {
           // arg =
           // gen.write(field.getName(), value.toString());
         } else if (type.equals("Date")) {
           synchronized (df8601) {
             try {
               arg = df8601.parse(parser.getString());
             } catch (ParseException e) {
               throw new IcatException(
                   IcatExceptionType.BAD_PARAMETER, "Badly formatted date " + parser.getString());
             }
           }
         } else {
           throw new IcatException(
               IcatExceptionType.BAD_PARAMETER,
               "Don't know how to parseEntity field of type " + type);
         }
         setters.get(field).invoke(bean, arg);
       } else if (updaters.contains(field)) {
         event = checker.get(Event.START_OBJECT);
         EntityBaseBean arg = parseEntity(checker, field.getType().getSimpleName());
         setters.get(field).invoke(bean, arg);
       } else {
         checker.get(Event.START_ARRAY);
         @SuppressWarnings("unchecked")
         List<EntityBaseBean> col = (List<EntityBaseBean>) getters.get(field).invoke(bean);
         while (true) {
           event = checker.get(Event.START_OBJECT, Event.END_ARRAY);
           if (event == Event.END_ARRAY) {
             break;
           }
           EntityBaseBean arg = parseEntity(checker, field.getName());
           col.add(arg);
         }
       }
     }
   } catch (InstantiationException
       | IllegalAccessException
       | IllegalArgumentException
       | InvocationTargetException
       | JsonException e) {
     throw new IcatException(
         IcatExceptionType.BAD_PARAMETER,
         e.getClass()
             + " "
             + e.getMessage()
             + " at "
             + parser.getLocation().getStreamOffset()
             + " in json");
   }
   return bean;
 }