Search in sources :

Example 6 with Content

use of org.finos.symphony.toolkit.workflow.content.Content in project spring-bot by finos.

the class MessageMLParser method parse.

public Message parse(String message, EntityJson jsonObjects) {
    message = (!message.contains("<messageML>")) ? "<messageML>" + message + "</messageML>" : message;
    Content[] out = { null };
    try {
        SAXParser saxParser = factory.newSAXParser();
        saxParser.parse(new InputSource(new StringReader(message)), new DefaultHandler2() {

            Frame<?> top = null;

            @Override
            public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
                if (top instanceof CodeBlockFrame) {
                    push(new IgnoredFrame(qName));
                } else if (isStartCodeBlock(qName, attributes)) {
                    push(new CodeBlockFrame(qName));
                } else if (isStartTag(qName, attributes)) {
                    String dataEntityId = attributes.getValue("data-entity-id");
                    Object o = jsonObjects.get(dataEntityId);
                    if (o instanceof SymphonyUser) {
                        push(new TagFrame<SymphonyUser>((SymphonyUser) o));
                    } else if (o instanceof HashTag) {
                        push(new TagFrame<HashTag>((HashTag) o));
                    } else if (o instanceof CashTag) {
                        push(new TagFrame<CashTag>((CashTag) o));
                    } else if (o instanceof Taxonomy && !((Taxonomy) o).getId().isEmpty() && ((Taxonomy) o).getId().get(0) instanceof HashTag) {
                        push(new TagFrame<HashTag>((HashTag) ((Taxonomy) o).getId().get(0)));
                    } else {
                        throw new UnsupportedOperationException();
                    }
                } else if (isStartTable(qName, attributes)) {
                    push(new TableFrame());
                } else if (isStartParaListItemOrCell(qName, attributes)) {
                    push(new ParagraphFrame());
                } else if (isStartList(qName, attributes)) {
                    push(new ListFrame(qName));
                } else if (isStartRow(qName, attributes)) {
                    if (top instanceof TableFrame) {
                        ((TableFrame) top).newRow();
                    } else {
                        throw new UnsupportedOperationException();
                    }
                } else if (isStartMessage(qName, attributes)) {
                    if (top == null) {
                        push(new MessageFrame());
                    }
                }
            }

            private boolean isStartMessage(String qName, Attributes attributes) {
                return "messageML".equals(qName) || ("div".equals(qName) && "PresentationML".equals(attributes.getValue("data-format")));
            }

            private boolean isStartList(String qName, Attributes attributes) {
                return "ul".equals(qName) || "ol".equals(qName);
            }

            private boolean isStartRow(String qName, Attributes attributes) {
                return "tr".equals(qName);
            }

            private boolean isStartCodeBlock(String qName, Attributes attributes) {
                return "pre".equals(qName) || "code".equals(qName);
            }

            private <X extends Frame<?>> X push(X newFrame) {
                newFrame.parent = top;
                top = newFrame;
                return newFrame;
            }

            @Override
            public void startEntity(String name) throws SAXException {
            // do nothing
            }

            @Override
            public void endEntity(String name) throws SAXException {
            // do nothing
            }

            private boolean isStartTable(String qName, Attributes attributes) {
                return "table".equals(qName);
            }

            private boolean isStartTag(String qName, Attributes attributes) {
                return "span".equals(qName) && (attributes.getValue("class") != null) && (attributes.getValue("class").contains("entity"));
            }

            private boolean isStartParaListItemOrCell(String qName, Attributes attributes) {
                return "p".equals(qName) || "td".equals(qName) || "li".equals(qName) || "th".equals(qName);
            }

            @Override
            public void endElement(String uri, String localName, String qName) throws SAXException {
                if (top.isEnding(qName)) {
                    Frame<?> parent = top.parent;
                    Content c = top.getContents();
                    if (parent == null) {
                        out[0] = c;
                    } else {
                        top = parent;
                        top.push(c);
                    }
                }
            }

            @Override
            public void characters(char[] ch, int start, int length) throws SAXException {
                if (top instanceof TextFrame) {
                    ((TextFrame<?>) top).push(ch, start, length);
                } else {
                    String content = new String(ch, start, length);
                    if (!content.trim().isEmpty()) {
                        throw new UnsupportedOperationException("Wasn't expecting text: " + content);
                    }
                }
            }

            @Override
            public void warning(SAXParseException e) throws SAXException {
                LOG.error("SAX warning: ", e);
            }

            @Override
            public void error(SAXParseException e) throws SAXException {
                LOG.error("SAX error: ", e);
            }

            @Override
            public void fatalError(SAXParseException e) throws SAXException {
                LOG.error("SAX fatal error: ", e);
            }
        });
    } catch (Exception e) {
        throw new RuntimeException("Couldn't parse message: " + message, e);
    }
    return (Message) out[0];
}
Also used : InputSource(org.xml.sax.InputSource) Message(org.finos.symphony.toolkit.workflow.content.Message) Taxonomy(org.symphonyoss.Taxonomy) HashTag(org.finos.symphony.toolkit.workflow.sources.symphony.content.HashTag) Attributes(org.xml.sax.Attributes) CashTag(org.finos.symphony.toolkit.workflow.sources.symphony.content.CashTag) SAXException(org.xml.sax.SAXException) SAXParseException(org.xml.sax.SAXParseException) StringReader(java.io.StringReader) SAXParser(javax.xml.parsers.SAXParser) SymphonyUser(org.finos.symphony.toolkit.workflow.sources.symphony.content.SymphonyUser) DefaultHandler2(org.xml.sax.ext.DefaultHandler2) SAXParseException(org.xml.sax.SAXParseException) SAXException(org.xml.sax.SAXException) Content(org.finos.symphony.toolkit.workflow.content.Content) OrderedContent(org.finos.symphony.toolkit.workflow.content.OrderedContent)

Aggregations

Content (org.finos.symphony.toolkit.workflow.content.Content)6 Test (org.junit.jupiter.api.Test)4 HashMap (java.util.HashMap)2 Table (org.finos.symphony.toolkit.workflow.content.Table)2 MessageMatcher (org.finos.symphony.toolkit.workflow.java.mapping.MessageMatcher)2 StringReader (java.io.StringReader)1 ZoneId (java.time.ZoneId)1 Arrays (java.util.Arrays)1 List (java.util.List)1 Map (java.util.Map)1 Optional (java.util.Optional)1 Collectors (java.util.stream.Collectors)1 SAXParser (javax.xml.parsers.SAXParser)1 EntityJson (org.finos.symphony.toolkit.json.EntityJson)1 ChatButton (org.finos.symphony.toolkit.workflow.annotations.ChatButton)1 ChatRequest (org.finos.symphony.toolkit.workflow.annotations.ChatRequest)1 ChatResponseBody (org.finos.symphony.toolkit.workflow.annotations.ChatResponseBody)1 ChatVariable (org.finos.symphony.toolkit.workflow.annotations.ChatVariable)1 WorkMode (org.finos.symphony.toolkit.workflow.annotations.WorkMode)1 Addressable (org.finos.symphony.toolkit.workflow.content.Addressable)1