blob: d91d06034a81b0b92de259c34ea53f546a23916d [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.xml.security.stax.ext.stax;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.events.EntityDeclaration;
import org.apache.xml.security.stax.impl.stax.XMLSecAttributeImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecCharactersImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecCommentImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecDTDImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecEndDocumentImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecEndElementImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecEntityDeclarationImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecEntityReferenceImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecNamespaceImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecProcessingInstructionImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecStartDocumentImpl;
import org.apache.xml.security.stax.impl.stax.XMLSecStartElementImpl;
/**
*/
public final class XMLSecEventFactory {
private XMLSecEventFactory() {
}
public static XMLSecEvent allocate(XMLStreamReader xmlStreamReader, XMLSecStartElement parentXMLSecStartElement) throws XMLStreamException {
switch (xmlStreamReader.getEventType()) {
case XMLStreamConstants.START_ELEMENT: {
List<XMLSecAttribute> comparableAttributes = null;
final int attributeCount = xmlStreamReader.getAttributeCount();
if (attributeCount > 0) {
comparableAttributes = new ArrayList<>(attributeCount);
for (int i = 0; i < attributeCount; i++) {
comparableAttributes.add(XMLSecEventFactory.createXMLSecAttribute(xmlStreamReader.getAttributeName(i), xmlStreamReader.getAttributeValue(i)));
}
}
List<XMLSecNamespace> comparableNamespaces = null;
final int namespaceCount = xmlStreamReader.getNamespaceCount();
if (namespaceCount > 0) {
comparableNamespaces = new ArrayList<>(namespaceCount);
for (int i = 0; i < namespaceCount; i++) {
comparableNamespaces.add(XMLSecNamespaceImpl.getInstance(xmlStreamReader.getNamespacePrefix(i), xmlStreamReader.getNamespaceURI(i)));
}
}
return new XMLSecStartElementImpl(xmlStreamReader.getName(), comparableAttributes, comparableNamespaces, parentXMLSecStartElement);
}
case XMLStreamConstants.END_ELEMENT:
return new XMLSecEndElementImpl(xmlStreamReader.getName(), parentXMLSecStartElement);
case XMLStreamConstants.PROCESSING_INSTRUCTION:
return new XMLSecProcessingInstructionImpl(xmlStreamReader.getPITarget(), xmlStreamReader.getPIData(), parentXMLSecStartElement);
case XMLStreamConstants.CHARACTERS:
char[] text = new char[xmlStreamReader.getTextLength()];
xmlStreamReader.getTextCharacters(0, text, 0, xmlStreamReader.getTextLength());
return new XMLSecCharactersImpl(text, false, false, xmlStreamReader.isWhiteSpace(), parentXMLSecStartElement);
case XMLStreamConstants.COMMENT:
return new XMLSecCommentImpl(xmlStreamReader.getText(), parentXMLSecStartElement);
case XMLStreamConstants.SPACE:
return new XMLSecCharactersImpl(xmlStreamReader.getText(), false, true, xmlStreamReader.isWhiteSpace(), parentXMLSecStartElement);
case XMLStreamConstants.START_DOCUMENT:
String systemId = xmlStreamReader.getLocation() != null ? xmlStreamReader.getLocation().getSystemId() : null;
return new XMLSecStartDocumentImpl(systemId, xmlStreamReader.getCharacterEncodingScheme(),
xmlStreamReader.standaloneSet() ? xmlStreamReader.isStandalone() : null, xmlStreamReader.getVersion());
case XMLStreamConstants.END_DOCUMENT:
return new XMLSecEndDocumentImpl();
case XMLStreamConstants.ENTITY_REFERENCE:
return new XMLSecEntityReferenceImpl(xmlStreamReader.getLocalName(), null, parentXMLSecStartElement);
case XMLStreamConstants.ATTRIBUTE:
throw new UnsupportedOperationException("Attribute event not supported");
case XMLStreamConstants.DTD:
return new XMLSecDTDImpl(xmlStreamReader.getText(), parentXMLSecStartElement);
case XMLStreamConstants.CDATA:
return new XMLSecCharactersImpl(xmlStreamReader.getText(), false, false, xmlStreamReader.isWhiteSpace(), parentXMLSecStartElement);
case XMLStreamConstants.NAMESPACE:
throw new UnsupportedOperationException("Namespace event not supported");
case XMLStreamConstants.NOTATION_DECLARATION:
throw new UnsupportedOperationException("NotationDeclaration event not supported");
case XMLStreamConstants.ENTITY_DECLARATION:
throw new UnsupportedOperationException("Entity declaration event not supported");
}
throw new IllegalArgumentException("Unknown XML event occurred");
}
public static XMLSecStartElement createXmlSecStartElement(QName name, List<XMLSecAttribute> attributes, List<XMLSecNamespace> namespaces) {
return new XMLSecStartElementImpl(name, attributes, namespaces);
}
public static XMLSecStartElement createXmlSecStartElement(QName name, Collection<XMLSecAttribute> attributes, Collection<XMLSecNamespace> namespaces) {
return new XMLSecStartElementImpl(name, attributes, namespaces);
}
public static XMLSecEndElement createXmlSecEndElement(QName name) {
return new XMLSecEndElementImpl(name, null);
}
public static XMLSecStartDocument createXmlSecStartDocument(String systemId, String characterEncodingScheme, Boolean standAlone, String version) {
return new XMLSecStartDocumentImpl(systemId, characterEncodingScheme, standAlone, version);
}
public static XMLSecEndDocument createXMLSecEndDocument() {
return new XMLSecEndDocumentImpl();
}
public static XMLSecCharacters createXmlSecCharacters(String data) {
return new XMLSecCharactersImpl(data, false, false, false, null);
}
public static XMLSecCharacters createXmlSecCharacters(char[] text) {
return new XMLSecCharactersImpl(text, false, false, false, null);
}
public static XMLSecCharacters createXmlSecCharacters(char[] text, int off, int len) {
return new XMLSecCharactersImpl(Arrays.copyOfRange(text, off, off + len), false, false, false, null);
}
public static XMLSecComment createXMLSecComment(String data) {
return new XMLSecCommentImpl(data, null);
}
public static XMLSecProcessingInstruction createXMLSecProcessingInstruction(String target, String data) {
return new XMLSecProcessingInstructionImpl(target, data, null);
}
public static XMLSecCharacters createXMLSecCData(String data) {
return new XMLSecCharactersImpl(data, true, false, false, null);
}
public static XMLSecDTD createXMLSecDTD(String dtd) {
return new XMLSecDTDImpl(dtd, null);
}
public static XMLSecEntityReference createXMLSecEntityReference(String name, EntityDeclaration entityDeclaration) {
return new XMLSecEntityReferenceImpl(name, entityDeclaration, null);
}
public static XMLSecEntityDeclaration createXmlSecEntityDeclaration(String name) {
return new XMLSecEntityDeclarationImpl(name);
}
public static XMLSecAttribute createXMLSecAttribute(QName name, String value) {
return new XMLSecAttributeImpl(name, value);
}
public static XMLSecNamespace createXMLSecNamespace(String prefix, String uri) {
return XMLSecNamespaceImpl.getInstance(prefix, uri);
}
}