@Override public IEventInstance readFrom( Class<IEventInstance> type, Type generic, Annotation[] annotation, MediaType media, MultivaluedMap<String, String> map, InputStream eventStream) throws IOException, WebApplicationException { logger.info("started plain text message body reader"); // the InputStream event contains event in plain text format // we should parse the event text, create IEventInstance and return it - // the resource's put/post function will be invoked // String eventString = getEventString(eventStream); String eventString = "Name=StockBuy;id=111;amount=100;price=5000"; logger.info("extracted event string: " + eventString); // the eventString consists of name=value pairs separated by delimiter int nameAttrIndex = eventString.indexOf(EventHeader.NAME_ATTRIBUTE); String nameSubstring = eventString.substring(nameAttrIndex); int delimiterIndex = nameSubstring.indexOf(DELIMITER); int tagDataSeparatorIndex = nameSubstring.indexOf(TAG_DATA_SEPARATOR); String nameValue = nameSubstring.substring(tagDataSeparatorIndex + 1, delimiterIndex); IEventType eventType = WebMetadataFacade.getInstance().getEventMetadataFacade().getEventType(nameValue); // search for all pairs of tag-data by using delimiter Map<String, Object> attrValues = new HashMap<String, Object>(); String[] tagValuePairs = eventString.split(DELIMITER); for (String tagValue : tagValuePairs) { // separate the tag from the value using the tagDataSeparator String[] separatedPair = tagValue.split(TAG_DATA_SEPARATOR); String attrName = separatedPair[0]; // the tag is always the first in the pair // some attributes might not have value specified at all if (separatedPair.length < 2) { attrValues.put(attrName, null); continue; } String attrStringValue = separatedPair[1]; if (attrStringValue.equals("null")) { // the attribute has a value of null attrValues.put(attrName, null); continue; } TypeAttribute eventTypeAttribute = eventType.getTypeAttributeSet().getAttribute(attrName); AttributeTypesEnum attrType = eventTypeAttribute.getTypeEnum(); if (attrType.equals(AttributeTypesEnum.STRING) || eventTypeAttribute.getDimension() > 0) { attrStringValue = "'" + attrStringValue + "'"; } Object attrValueObject; try { attrValueObject = TypeAttribute.parseConstantValue( attrStringValue, attrName, eventType, null, WebFacadesManager.getInstance().getEepFacade()); attrValues.put(attrName, attrValueObject); } catch (Exception e) { String msg = "Could not parse the event string" + eventString + ", reason: " + e.getMessage(); logger.severe(msg); throw new ResponseException(msg); } } IEventInstance event = new EventInstance(eventType, attrValues); event.setDetectionTime(System.currentTimeMillis()); logger.info("finished message body reader"); return event; }
@Override public EventInstance readFrom( Class<EventInstance> type, Type generic, Annotation[] annotation, MediaType media, MultivaluedMap<String, String> map, InputStream eventStream) throws IOException, WebApplicationException { logger.info("started event message body reader"); EventInstance event = null; String attrName = null; String attrStringValue = null; // the InputStream event contains event in XML NGSI format // we should parse the object, create IEventInstance and return it - // the resource's put/post function will be invoked try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(eventStream); doc.getDocumentElement().normalize(); Node entityIdNode = doc.getElementsByTagName("entityId").item(0); String entityType = entityIdNode.getAttributes().getNamedItem("type").getNodeValue(); String entityId = getNodeValue(((Node) doc.getElementsByTagName("id").item(0))); // System.out.println("Entity type: " + entityType + " Entity id:" + entityId); String eventName = entityType + EVENT_NAME_SUFFIX; IEventType eventType = WebMetadataFacade.getInstance().getEventMetadataFacade().getEventType(eventName); logger.info("Event: " + eventName); Map<String, Object> attrValues = new HashMap<String, Object>(); DateFormat dateFormatter = new SimpleDateFormat(DEFAULT_DATE_FORMAT); addAttribute(ENTITY_ID_ATTRIBUTE, entityId, eventType, attrValues, dateFormatter); addAttribute(ENTITY_TYPE_ATTRIBUTE, entityType, eventType, attrValues, dateFormatter); // get all pairs of attribute name and value NodeList attrNodes = doc.getElementsByTagName("contextAttribute"); for (int i = 0; i < attrNodes.getLength(); i++) { Element attr = (Element) attrNodes.item(i); attrName = getNodeValue(attr.getElementsByTagName("name").item(0)); attrStringValue = getNodeValue(attr.getElementsByTagName("contextValue").item(0)); // System.out.println("Attribute[" + i + "] name: " + attrName + // " value:" + attrStringValue); if (attrStringValue != null) { addAttribute(attrName, attrStringValue, eventType, attrValues, dateFormatter); } } event = new EventInstance(eventType, attrValues); event.setDetectionTime(System.currentTimeMillis()); } catch (Exception e) { String msg = "Could not parse XML NGSI event " + e + ", reason: " + e.getMessage() + "\n last attribute name: " + attrName + " last value: " + attrStringValue; logger.severe(msg); new ResponseException(msg); } logger.info("finished event message body reader"); return event; }