List of usage examples for javax.xml.stream.events StartElement getName
public QName getName();
From source file:org.omegat.util.TMXReader2.java
/** * External TMX - level 2. Replace all tags into shortcuts. *//*w w w. j a v a 2 s .co m*/ protected void parseSegExtLevel2() throws Exception { segContent.setLength(0); segInlineTag.setLength(0); inlineTagHandler.reset(); int inlineLevel = 0; while (true) { XMLEvent e = xml.nextEvent(); switch (e.getEventType()) { case XMLEvent.START_ELEMENT: StartElement eStart = e.asStartElement(); if ("hi".equals(eStart.getName().getLocalPart())) { // tag should be skipped break; } inlineLevel++; segInlineTag.setLength(0); if ("bpt".equals(eStart.getName().getLocalPart())) { inlineTagHandler.startBPT(getAttributeValue(eStart, "i"), getAttributeValue(eStart, "x")); inlineTagHandler.setTagShortcutLetter( StringUtil.getFirstLetterLowercase(getAttributeValue(eStart, "type"))); } else if ("ept".equals(eStart.getName().getLocalPart())) { inlineTagHandler.startEPT(getAttributeValue(eStart, "i")); } else if ("it".equals(eStart.getName().getLocalPart())) { inlineTagHandler.startOTHER(); inlineTagHandler.setOtherTagShortcutLetter( StringUtil.getFirstLetterLowercase(getAttributeValue(eStart, "type"))); inlineTagHandler.setCurrentPos(getAttributeValue(eStart, "pos")); } else if ("ph".equals(eStart.getName().getLocalPart())) { inlineTagHandler.startOTHER(); inlineTagHandler.setOtherTagShortcutLetter( StringUtil.getFirstLetterLowercase(getAttributeValue(eStart, "type"))); } else { inlineTagHandler.startOTHER(); } break; case XMLEvent.END_ELEMENT: EndElement eEnd = e.asEndElement(); if ("hi".equals(eEnd.getName().getLocalPart())) { // tag should be skipped break; } inlineLevel--; if ("seg".equals(eEnd.getName().getLocalPart())) { return; } boolean slashBefore = false; boolean slashAfter = false; int tagName = StringUtil.getFirstLetterLowercase(segInlineTag.toString()); Integer tagN; if ("bpt".equals(eEnd.getName().getLocalPart())) { if (tagName != 0) { inlineTagHandler.setTagShortcutLetter(tagName); } else { tagName = inlineTagHandler.getTagShortcutLetter(); } tagN = inlineTagHandler.endBPT(); } else if ("ept".equals(eEnd.getName().getLocalPart())) { slashBefore = true; tagName = inlineTagHandler.getTagShortcutLetter(); tagN = inlineTagHandler.endEPT(); } else if ("it".equals(eEnd.getName().getLocalPart())) { if (tagName != 0) { inlineTagHandler.setOtherTagShortcutLetter(tagName); } else { tagName = inlineTagHandler.getOtherTagShortcutLetter(); } tagN = inlineTagHandler.endOTHER(); if ("end".equals(inlineTagHandler.getCurrentPos())) { slashBefore = true; } } else if ("ph".equals(eEnd.getName().getLocalPart())) { if (tagName != 0) { inlineTagHandler.setOtherTagShortcutLetter(tagName); } else { tagName = inlineTagHandler.getOtherTagShortcutLetter(); } tagN = inlineTagHandler.endOTHER(); if (useSlash) { slashAfter = true; } } else { tagN = inlineTagHandler.endOTHER(); if (useSlash) { slashAfter = true; } } if (tagName == 0) { tagName = 'f'; } if (tagN == null) { // check error of TMX reading Log.logErrorRB("TMX_ERROR_READING_LEVEL2", e.getLocation().getLineNumber(), e.getLocation().getColumnNumber()); errorsCount++; segContent.setLength(0); // wait for end seg while (true) { XMLEvent ev = xml.nextEvent(); switch (ev.getEventType()) { case XMLEvent.END_ELEMENT: EndElement evEnd = (EndElement) ev; if ("seg".equals(evEnd.getName().getLocalPart())) { return; } } } } segContent.append('<'); if (slashBefore) { segContent.append('/'); } segContent.appendCodePoint(tagName); segContent.append(Integer.toString(tagN)); if (slashAfter) { segContent.append('/'); } segContent.append('>'); break; case XMLEvent.CHARACTERS: Characters c = (Characters) e; if (inlineLevel == 0) { segContent.append(c.getData()); } else { segInlineTag.append(c.getData()); } break; } } }
From source file:org.omnaest.utils.xml.XMLNestedMapConverter.java
/** * Template method for {@link #newNamespaceAwareMapFromXML(CharSequence)} and {@link #newMapFromXML(CharSequence)} which allows * to convert the {@link QName} based key values to other representations. * /*from w w w.j a va 2s . c o m*/ * @param xmlContent * @return new (nested) {@link Map} instance */ protected <K> Map<K, Object> newMapFromXML(CharSequence xmlContent, final ElementConverter<QName, K> keyElementConverter) { // final Map<K, Object> retmap = new LinkedHashMap<K, Object>(); // Assert.isNotNull(keyElementConverter, "keyElementConverter must not be null"); // final ExceptionHandler exceptionHandler = this.exceptionHandler; // try { // final XMLInputFactory xmlInputFactory = this.xmlInstanceContextFactory.newXmlInputFactory(); Assert.isNotNull(xmlInputFactory, "xmlInputFactory must not be null"); // final Reader reader = new CharSequenceReader(xmlContent); final XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(reader); // final class Helper { /* ********************************************** Variables ********************************************** */ private List<TupleTwo<QName, Object>> stackList = new ArrayList<TupleTwo<QName, Object>>(); /* ********************************************** Methods ********************************************** */ /** * Manifests a single tag node recursively * * @return * @throws XMLStreamException */ @SuppressWarnings("unchecked") public TupleTwo<QName, Object> manifest() throws XMLStreamException { // TupleTwo<QName, Object> retval = null; // while (xmlEventReader.hasNext()) { // final XMLEvent xmlEvent = xmlEventReader.nextEvent(); // if (xmlEvent.isStartElement()) { // final StartElement startElement = xmlEvent.asStartElement(); final QName name = startElement.getName(); // this.addNewStackElement().setValueFirst(name); // final Iterator<Attribute> attributeIterator = startElement.getAttributes(); if (attributeIterator.hasNext()) { // final Map<QName, Object> map = new LinkedHashMap<QName, Object>(); for (Attribute attribute : IterableUtils.valueOf(attributeIterator)) { map.put(attribute.getName(), attribute.getValue()); } // this.updateCurrentStackValue(map); } } else if (xmlEvent.isEndElement()) { // retval = this.removeStackElement(); // final Object manifestation = retval.getValueSecond(); final QName tagname = retval.getValueFirst(); // updateCurrentStackValue(manifestation, tagname); } else if (xmlEvent.isCharacters()) { // final Characters characters = xmlEvent.asCharacters(); if (!characters.isWhiteSpace()) { // final TupleTwo<QName, Object> currentStackValue = this.getCurrentStackValue(); currentStackValue.setValueSecond( ObjectUtils.defaultIfNull(currentStackValue.getValueSecond(), "") + characters.getData()); } } } // return retval; } /** * Updates the current stack value * * @param manifestation * @param tagname */ private void updateCurrentStackValue(Object manifestation, QName tagname) { // final Map<QName, Object> tagNameToManifestationMap = new LinkedHashMap<QName, Object>(); tagNameToManifestationMap.put(tagname, manifestation); this.updateCurrentStackValue(tagNameToManifestationMap); } @SuppressWarnings("unchecked") private void updateCurrentStackValue(Map<QName, Object> tagNameToManifestationMap) { // final TupleTwo<QName, Object> currentStackValue = this.getCurrentStackValue(); // if (currentStackValue != null) { // Map<K, Object> map = null; { // final Object valueSecond = currentStackValue.getValueSecond(); if (valueSecond instanceof Map) { map = (Map<K, Object>) valueSecond; } else { // map = new LinkedHashMap<K, Object>(); if (valueSecond instanceof String) { map.put(keyElementConverter.convert(new QName("")), valueSecond); } } } // for (Entry<QName, Object> tagNameToManifestationEntry : tagNameToManifestationMap .entrySet()) { // final K tagname = keyElementConverter.convert(tagNameToManifestationEntry.getKey()); final Object manifestation = tagNameToManifestationEntry.getValue(); // if (!map.containsKey(tagname)) { map.put(tagname, manifestation); } else { // final Object object = map.get(tagname); if (object instanceof List) { // final List<Object> list = (List<Object>) object; list.add(manifestation); } else { // final List<Object> list = new ArrayList<Object>(); list.add(object); list.add(manifestation); map.put(tagname, list); } } } // currentStackValue.setValueSecond(map); } } private TupleTwo<QName, Object> getCurrentStackValue() { return ListUtils.firstElement(this.stackList); } private TupleTwo<QName, Object> removeStackElement() { return ListUtils.removeFirst(this.stackList); } private TupleTwo<QName, Object> addNewStackElement() { // final TupleTwo<QName, Object> retval = new TupleTwo<QName, Object>(); this.stackList.add(0, retval); return retval; } } // try { final Helper helper = new Helper(); final TupleTwo<QName, Object> result = helper.manifest(); retmap.put(keyElementConverter.convert(result.getValueFirst()), result.getValueSecond()); } catch (Exception e) { if (exceptionHandler != null) { exceptionHandler.handleException(e); } } // xmlEventReader.close(); reader.close(); } catch (Exception e) { if (exceptionHandler != null) { exceptionHandler.handleException(e); } } // return retmap; }
From source file:org.onosproject.xmpp.core.ctl.handlers.XmlStreamDecoderTest.java
@Test public void testDecodeXmppStanza() throws Exception { XmlStreamDecoder decoder = new XmlStreamDecoder(); ByteBuf buffer = Unpooled.buffer();//from w w w . java2 s.c om buffer.writeBytes(subscribeMsg.getBytes(Charsets.UTF_8)); List<Object> list = Lists.newArrayList(); decoder.decode(new ChannelHandlerContextAdapter(), buffer, list); assertThat(list.size(), is(10)); list.forEach(object -> { assertThat(object, is(instanceOf(XMLEvent.class))); }); assertThat(((XMLEvent) list.get(0)).isStartDocument(), is(true)); XMLEvent secondEvent = (XMLEvent) list.get(1); assertThat(secondEvent.isStartElement(), is(true)); StartElement secondEventAsStartElement = (StartElement) secondEvent; assertThat(secondEventAsStartElement.getName().getLocalPart(), is("iq")); assertThat(Lists.newArrayList(secondEventAsStartElement.getAttributes()).size(), is(4)); assertThat(secondEventAsStartElement.getAttributeByName(QName.valueOf("type")).getValue(), is("set")); assertThat(secondEventAsStartElement.getAttributeByName(QName.valueOf("from")).getValue(), is("test@xmpp.org")); assertThat(secondEventAsStartElement.getAttributeByName(QName.valueOf("to")).getValue(), is("xmpp.onosproject.org")); assertThat(secondEventAsStartElement.getAttributeByName(QName.valueOf("id")).getValue(), is("sub1")); XMLEvent fourthEvent = (XMLEvent) list.get(3); assertThat(fourthEvent.isStartElement(), is(true)); StartElement fourthEventAsStartElement = (StartElement) fourthEvent; assertThat(fourthEventAsStartElement.getName().getLocalPart(), is("pubsub")); assertThat(fourthEventAsStartElement.getNamespaceURI(""), is("http://jabber.org/protocol/pubsub")); XMLEvent fifthEvent = (XMLEvent) list.get(5); assertThat(fifthEvent.isStartElement(), is(true)); StartElement fifthEventAsStartElement = (StartElement) fifthEvent; assertThat(fifthEventAsStartElement.getName().getLocalPart(), is("subscribe")); assertThat(fifthEventAsStartElement.getAttributeByName(QName.valueOf("node")).getValue(), is("test")); XMLEvent sixthEvent = (XMLEvent) list.get(6); assertThat(sixthEvent.isEndElement(), is(true)); EndElement sixthEventAsEndElement = (EndElement) sixthEvent; assertThat(sixthEventAsEndElement.getName().getLocalPart(), is("subscribe")); XMLEvent seventhEvent = (XMLEvent) list.get(8); assertThat(seventhEvent.isEndElement(), is(true)); EndElement seventhEventAsEndElement = (EndElement) seventhEvent; assertThat(seventhEventAsEndElement.getName().getLocalPart(), is("pubsub")); XMLEvent eighthEvent = (XMLEvent) list.get(9); assertThat(eighthEvent.isEndElement(), is(true)); EndElement eighthEventAsEndElement = (EndElement) eighthEvent; assertThat(eighthEventAsEndElement.getName().getLocalPart(), is("iq")); }
From source file:org.openhim.mediator.denormalization.EnrichRegistryStoredQueryActor.java
private String enrichStoredQueryXML(Identifier id, InputStream xml) throws XMLStreamException { XMLEventReader reader = XMLInputFactory.newInstance().createXMLEventReader(xml); StringWriter output = new StringWriter(); XMLEventWriter writer = XMLOutputFactory.newInstance().createXMLEventWriter(output); XMLEventFactory eventFactory = XMLEventFactory.newFactory(); String curSlot = null;// www . ja v a 2 s .c o m boolean patientIdSlot = false; while (reader.hasNext()) { XMLEvent event = reader.nextEvent(); if (event.getEventType() == XMLEvent.START_ELEMENT) { StartElement elem = event.asStartElement(); if ("Slot".equals(elem.getName().getLocalPart())) { curSlot = elem.getAttributeByName(new QName("name")).getValue(); } else if ("Value".equals(elem.getName().getLocalPart()) && ParseRegistryStoredQueryActor.PATIENT_ID_SLOT_TYPE.equals(curSlot)) { patientIdSlot = true; writer.add(event); } } else if (event.getEventType() == XMLEvent.END_ELEMENT) { EndElement elem = event.asEndElement(); if (patientIdSlot && "Value".equals(elem.getName().getLocalPart())) { XMLEvent ecidEvent = eventFactory.createCharacters("'" + id.toString() + "'"); writer.add(ecidEvent); patientIdSlot = false; } } if (!patientIdSlot) { writer.add(event); } } writer.close(); return output.toString(); }
From source file:org.sakaiproject.nakamura.auth.cas.CasAuthenticationHandler.java
private String retrieveCredentials(String responseBody) { String username = null;/*from www. ja va 2 s . co m*/ String pgtIou = null; String failureCode = null; String failureMessage = null; try { XMLInputFactory xmlInputFactory = new WstxInputFactory(); xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true); xmlInputFactory.setProperty(XMLInputFactory.IS_VALIDATING, false); xmlInputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true); XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(new StringReader(responseBody)); while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); // process the event if we're starting an element if (event.isStartElement()) { StartElement startEl = event.asStartElement(); QName startElName = startEl.getName(); String startElLocalName = startElName.getLocalPart(); LOGGER.debug(responseBody); /* * Example of failure XML <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationFailure code='INVALID_REQUEST'> 'service' and 'ticket' parameters are both required </cas:authenticationFailure> </cas:serviceResponse> */ if ("authenticationFailure".equalsIgnoreCase(startElLocalName)) { // get code of the failure Attribute code = startEl.getAttributeByName(QName.valueOf("code")); failureCode = code.getValue(); // get the message of the failure event = eventReader.nextEvent(); assert event.isCharacters(); Characters chars = event.asCharacters(); failureMessage = chars.getData(); break; } /* * Example of success XML <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationSuccess> <cas:user>NetID</cas:user> </cas:authenticationSuccess> </cas:serviceResponse> */ if ("authenticationSuccess".equalsIgnoreCase(startElLocalName)) { // skip to the user tag start while (eventReader.hasNext()) { event = eventReader.nextTag(); if (event.isEndElement()) { if (eventReader.hasNext()) { event = eventReader.nextTag(); } else { break; } } assert event.isStartElement(); startEl = event.asStartElement(); startElName = startEl.getName(); startElLocalName = startElName.getLocalPart(); if (proxy && "proxyGrantingTicket".equals(startElLocalName)) { event = eventReader.nextEvent(); assert event.isCharacters(); Characters chars = event.asCharacters(); pgtIou = chars.getData(); LOGGER.debug("XML parser found pgt: {}", pgtIou); } else if ("user".equals(startElLocalName)) { // move on to the body of the user tag event = eventReader.nextEvent(); assert event.isCharacters(); Characters chars = event.asCharacters(); username = chars.getData(); LOGGER.debug("XML parser found user: {}", username); } else { LOGGER.error("Found unexpected element [{}] while inside 'authenticationSuccess'", startElName); break; } if (username != null && (!proxy || pgtIou != null)) { break; } } } } } } catch (XMLStreamException e) { LOGGER.error(e.getMessage(), e); } if (failureCode != null || failureMessage != null) { LOGGER.error("Error response from server code={} message={}", failureCode, failureMessage); } String pgt = pgts.get(pgtIou); if (pgt != null) { savePgt(username, pgt, pgtIou); } else { LOGGER.debug("Caching '{}' as the IOU for '{}'", pgtIou, username); pgtIOUs.put(pgtIou, username); } return username; }
From source file:org.sakaiproject.nakamura.auth.cas.CasAuthenticationHandler.java
private String getProxyTicketFromXml(String responseBody) { String ticket = null;//www. j a v a 2 s. c o m try { XMLInputFactory xmlInputFactory = new WstxInputFactory(); xmlInputFactory.setProperty(XMLInputFactory.IS_COALESCING, true); xmlInputFactory.setProperty(XMLInputFactory.IS_VALIDATING, false); xmlInputFactory.setProperty(XMLInputFactory.IS_NAMESPACE_AWARE, true); XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(new StringReader(responseBody)); LOGGER.debug(responseBody); while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); // process the event if we're starting an element if (event.isStartElement()) { StartElement startEl = event.asStartElement(); QName startElName = startEl.getName(); String startElLocalName = startElName.getLocalPart(); // Example XML // <cas:serviceResponse> // <cas:proxySuccess> // <cas:proxyTicket>PT-957-ZuucXqTZ1YcJw81T3dxf</cas:proxyTicket> // </cas:proxySuccess> // </cas:serviceResponse> if ("proxySuccess".equalsIgnoreCase(startElLocalName)) { event = eventReader.nextTag(); assert event.isStartElement(); startEl = event.asStartElement(); startElName = startEl.getName(); startElLocalName = startElName.getLocalPart(); if ("proxyTicket".equalsIgnoreCase(startElLocalName)) { event = eventReader.nextEvent(); assert event.isCharacters(); Characters chars = event.asCharacters(); ticket = chars.getData(); } else { LOGGER.error("Found unexpected element [{}] while inside 'proxySuccess'", startElName); break; } } } } } catch (XMLStreamException e) { LOGGER.error(e.getMessage(), e); } return ticket; }
From source file:org.sakaiproject.nakamura.docproxy.url.UrlRepositoryProcessor.java
/** * Parse search results information into documents. * <p>/*from w w w . j a va 2s . co m*/ * The expected format of the returned information is:<br/> * <code> * <documents> * <document contentLength="%s" contentType="%s" uri="%s"> * <properties> * <key1>value1</key1> * <key2>value2</key2> * </properties> * </document> * </documents> * </code> * </p> * * @param body * @return * @throws JSONException */ protected List<ExternalDocumentResult> parseSearch(InputStream body) throws XMLStreamException { ArrayList<ExternalDocumentResult> results = new ArrayList<ExternalDocumentResult>(); XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(body); while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); // process the event if we're starting an element if (event.isStartElement()) { StartElement startEl = event.asStartElement(); QName startElName = startEl.getName(); String startElLocalName = startElName.getLocalPart(); // process the href element if ("document".equalsIgnoreCase(startElLocalName)) { results.add(parseDocument(startEl, null)); event = eventReader.nextEvent(); continue; } } } return results; }
From source file:org.sakaiproject.nakamura.docproxy.url.UrlRepositoryProcessor.java
/** * Parse information about a doc from JSON to an {@link ExternalDocumentResult} object.<br/> * XML is expected to follow the format of: * <p>//from w ww. j a va 2s .c o m * <code> * <document contentLength="%s" contentType="%s" uri="%s"> * <properties> * <key1>value1</key1> * <key2>value2</key2> * </properties> * </document> * </code> * </p> * * @param is * @return * @throws ParserConfigurationException * @throws IOException * @throws SAXException */ protected ExternalDocumentResult parseDocument(InputStream body) throws XMLStreamException { UrlDocumentResult doc = new UrlDocumentResult(); XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(body); while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); // process the event if we're starting an element if (event.isStartElement()) { StartElement startEl = event.asStartElement(); QName startElName = startEl.getName(); String startElLocalName = startElName.getLocalPart(); if ("document".equalsIgnoreCase(startElLocalName)) { parseDocument(startEl, doc); continue; } if ("properties".equalsIgnoreCase(startElLocalName)) { parseProperties(eventReader, doc); continue; } } } return doc; }
From source file:org.sakaiproject.nakamura.docproxy.url.UrlRepositoryProcessor.java
/** * Parse subelements of a 'properties' element into properties on a * {@link UrlDocumentResult}./*from w w w. ja v a 2 s .co m*/ * * @param eventReader * Source to process elements from. Is expected that calls to * eventReader.nextEvent() will yield elements to be added to doc as * properties. Nested elements are not considered. * @param doc * The document to set attributes into. * @throws XMLStreamException * If there is a problem processing the element. */ private void parseProperties(XMLEventReader eventReader, UrlDocumentResult doc) throws XMLStreamException { while (eventReader.hasNext()) { XMLEvent event = eventReader.nextEvent(); // process the event if we're starting an element if (event.isStartElement()) { StartElement startEl = event.asStartElement(); QName startElName = startEl.getName(); String startElLocalName = startElName.getLocalPart(); // collect simple elements as properties event = eventReader.nextEvent(); if (event.isCharacters()) { Characters chars = event.asCharacters(); doc.addProperty(startElLocalName, chars.getData()); } } } }
From source file:org.sakaiproject.nakamura.proxy.RSSProxyPostProcessor.java
public void process(Map<String, Object> templateParams, SlingHttpServletResponse response, ProxyResponse proxyResponse) throws IOException { if (proxyResponse.getResultCode() == HttpServletResponse.SC_PRECONDITION_FAILED) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "This RSS feed is too big "); return;// w w w. j a va2s . c o m } Map<String, String[]> headers = proxyResponse.getResponseHeaders(); // Check if the content-length is smaller than the maximum (if any). String[] contentLengthHeader = headers.get("Content-Length"); if (contentLengthHeader != null) { int length = Integer.parseInt(contentLengthHeader[0]); if (length > maxLength) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "This RSS feed is too big. The maximum for a feed is: " + maxLength); return; } } // Check if the Content-Type we get is valid (if any). String[] contentTypeHeader = headers.get("Content-Type"); if (contentTypeHeader != null) { String contentType = contentTypeHeader[0]; if (contentType.contains(";")) { contentType = contentType.substring(0, contentType.indexOf(';')); } if (!contentTypes.contains(contentType)) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "This URL doesn't send a proper Content-Type back"); return; } } boolean isValid = false; InputStream in = proxyResponse.getResponseBodyAsInputStream(); InputStreamReader reader = new InputStreamReader(in); // XMLStreamWriter writer = null; XMLEventWriter writer = null; ByteArrayOutputStream out = null; int i = 0; try { XMLEventReader eventReader = xmlInputFactory.createXMLEventReader(reader); // Create a temporary outputstream where we can write to. out = new ByteArrayOutputStream(); Set<String> checkedElements = null; XMLOutputFactory outputFactory = new WstxOutputFactory(); writer = outputFactory.createXMLEventWriter(out); while (eventReader.hasNext()) { XMLEvent e = eventReader.nextEvent(); // Stream it to an output stream. writer.add(e); if (!isValid) { if (e.getEventType() == XMLEvent.START_ELEMENT) { StartElement el = e.asStartElement(); String name = el.getName().getLocalPart().toLowerCase(); if (checkedElements == null) { // get the right format to validate against String formatKey = name; Attribute attr = el.getAttributeByName(new QName("version")); if (attr != null) { formatKey += "-" + attr.getValue(); } Set<String> format = formats.get(formatKey); if (format != null) { checkedElements = new HashSet<String>(format); } } else { checkedElements.remove(name); if (checkedElements.isEmpty()) { isValid = true; } } } if (i > eventsThreshold) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "This file is too complex."); return; } i++; } } if (!isValid) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "Invalid RSS file."); return; } // Check if we are not streaming a gigantic file.. if (out.size() > maxLength) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "This file is too big."); return; } for (Entry<String, String[]> h : proxyResponse.getResponseHeaders().entrySet()) { for (String v : h.getValue()) { response.setHeader(h.getKey(), v); } } // We always return 200 when we get to this point. response.setStatus(200); response.setHeader("Content-Length", Integer.toString(out.size())); // Write the cached stream to the output. out.writeTo(response.getOutputStream()); } catch (XMLStreamException e) { response.sendError(HttpServletResponse.SC_BAD_REQUEST, "This is not a valid XML file."); } catch (Exception e) { logger.warn("Exception reading RSS feed.", e); response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "General exception caught."); } finally { if (out != null) { out.close(); } reader.close(); try { if (writer != null) writer.close(); } catch (XMLStreamException e) { // Not much we can do? e.printStackTrace(); } } }