@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; }