
org.mobicents.ss7.extension.SS7SubsystemParser Maven / Gradle / Ivy
The newest version!
package org.mobicents.ss7.extension;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.parsing.Attribute;
import org.jboss.as.controller.parsing.ParseUtils;
import org.jboss.as.controller.persistence.SubsystemMarshallingContext;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.staxmapper.XMLElementReader;
import org.jboss.staxmapper.XMLElementWriter;
import org.jboss.staxmapper.XMLExtendedStreamReader;
import org.jboss.staxmapper.XMLExtendedStreamWriter;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import java.util.Collections;
import java.util.List;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.SUBSYSTEM;
import static org.jboss.as.controller.parsing.ParseUtils.missingRequired;
import static org.jboss.as.controller.parsing.ParseUtils.requireNoNamespaceAttribute;
import static org.jboss.as.controller.parsing.ParseUtils.unexpectedAttribute;
import static org.jboss.as.controller.parsing.ParseUtils.unexpectedElement;
/**
/**
* The subsystem parser, which uses stax to read and write to and from xml
*/
class SS7SubsystemParser implements XMLStreamConstants, XMLElementReader>,
XMLElementWriter {
private static final SS7SubsystemParser INSTANCE = new SS7SubsystemParser();
static SS7SubsystemParser getInstance() {
return INSTANCE;
}
/**
* {@inheritDoc}
*/
@Override
public void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException {
context.startSubsystemElement(Namespace.CURRENT.getUriString(), false);
final ModelNode node = context.getModelNode();
final ModelNode mbean = node.get(SS7MbeanDefinition.MBEAN);
for (Property mbeanProp : mbean.asPropertyList()) {
writer.writeStartElement(SS7MbeanDefinition.MBEAN);
final ModelNode mbeanEntry = mbeanProp.getValue();
SS7MbeanDefinition.NAME_ATTR.marshallAsAttribute(mbeanEntry, true, writer);
SS7MbeanDefinition.TYPE_ATTR.marshallAsAttribute(mbeanEntry, true, writer);
SS7MbeanDefinition.CLASS_ATTR.marshallAsAttribute(mbeanEntry, true, writer);
SS7MbeanDefinition.INTERFACE_ATTR.marshallAsAttribute(mbeanEntry, true, writer);
SS7MbeanDefinition.ENABLED_ATTR.marshallAsAttribute(mbeanEntry, true, writer);
SS7MbeanDefinition.REFLECTION_ATTR.marshallAsAttribute(mbeanEntry, true, writer);
final ModelNode constructor = mbeanEntry.get(SS7MbeanConstructorDefinition.CONSTRUCTOR);
if (constructor != null && constructor.isDefined()) {
for (Property constructorProp : constructor.asPropertyList()) {
writer.writeStartElement(SS7MbeanConstructorDefinition.CONSTRUCTOR);
final ModelNode constructorEntry = constructorProp.getValue();
final ModelNode parameter = constructorEntry.get(SS7MbeanConstructorParameterDefinition.PARAMETER);
if (parameter != null && parameter.isDefined()) {
for (Property parameterProp : parameter.asPropertyList()) {
writer.writeStartElement(SS7MbeanConstructorParameterDefinition.PARAMETER);
final ModelNode parameterEntry = parameterProp.getValue();
System.out.println("parameterProp: " + parameterProp.getName());
System.out.println("parameterEntry: " + parameterEntry.asString());
writer.writeCharacters(parameterProp.getName());
writer.writeEndElement();
}
}
writer.writeEndElement();
}
}
final ModelNode property = mbeanEntry.get(SS7MbeanPropertyDefinition.PROPERTY);
if (property != null && property.isDefined()) {
for (Property propertyProp : property.asPropertyList()) {
writer.writeStartElement(SS7MbeanPropertyDefinition.PROPERTY);
final ModelNode propertyEntry = propertyProp.getValue();
SS7MbeanPropertyDefinition.NAME_ATTR.marshallAsAttribute(propertyEntry, true, writer);
SS7MbeanPropertyDefinition.TYPE_ATTR.marshallAsAttribute(propertyEntry, true, writer);
SS7MbeanPropertyDefinition.VALUE_ATTR.marshallAsAttribute(propertyEntry, true, writer);
final ModelNode entry = propertyEntry.get(SS7MbeanPropertyEntryDefinition.ENTRY);
if (entry != null && entry.isDefined()) {
for (Property entryProp : entry.asPropertyList()) {
writer.writeStartElement(SS7MbeanPropertyEntryDefinition.ENTRY);
final ModelNode entryEntry = entryProp.getValue();
SS7MbeanPropertyEntryDefinition.KEY_ATTR.marshallAsAttribute(entryEntry, true, writer);
SS7MbeanPropertyEntryDefinition.TYPE_ATTR.marshallAsAttribute(entryEntry, true, writer);
SS7MbeanPropertyEntryDefinition.VALUE_ATTR.marshallAsAttribute(entryEntry, true, writer);
writer.writeEndElement();
}
}
writer.writeEndElement();
}
}
writer.writeEndElement();
}
writer.writeEndElement();
}
/**
* {@inheritDoc}
*/
@Override
public void readElement(XMLExtendedStreamReader reader, List list) throws XMLStreamException {
PathAddress address = PathAddress.pathAddress(PathElement.pathElement(SUBSYSTEM, SS7Extension.SUBSYSTEM_NAME));
final ModelNode subsystem = new ModelNode();
subsystem.get(OP).set(ADD);
subsystem.get(OP_ADDR).set(address.toModelNode());
list.add(subsystem);
// mbean elements
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
switch (Namespace.forUri(reader.getNamespaceURI())) {
case SS7_1_0: {
final String tagName = reader.getLocalName();
if (tagName.equals(SS7MbeanDefinition.MBEAN)) {
parseMbean(reader, address, list);
}
break;
}
default: {
throw unexpectedElement(reader);
}
}
}
}
static void parseMbean(XMLExtendedStreamReader reader, PathAddress parent, List list)
throws XMLStreamException {
String name = null;
final ModelNode mbean = new ModelNode();
// MBean Attributes
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String attribute = reader.getAttributeLocalName(i);
final String value = reader.getAttributeValue(i);
switch (SS7MbeanDefinition.Element.of(attribute)) {
case NAME: {
name = value;
SS7MbeanDefinition.NAME_ATTR.parseAndSetParameter(value, mbean, reader);
break;
}
case TYPE: {
SS7MbeanDefinition.TYPE_ATTR.parseAndSetParameter(value, mbean, reader);
break;
}
case CLASS: {
SS7MbeanDefinition.CLASS_ATTR.parseAndSetParameter(value, mbean, reader);
break;
}
case INTERFACE: {
SS7MbeanDefinition.INTERFACE_ATTR.parseAndSetParameter(value, mbean, reader);
break;
}
case ENABLED: {
SS7MbeanDefinition.ENABLED_ATTR.parseAndSetParameter(value, mbean, reader);
break;
}
case REFLECTION: {
SS7MbeanDefinition.REFLECTION_ATTR.parseAndSetParameter(value, mbean, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
//ParseUtils.requireNoContent(reader);
if (name == null) {
throw missingRequired(reader, Collections.singleton(Attribute.NAME));
}
mbean.get(OP).set(ADD);
PathAddress address = PathAddress.pathAddress(parent,
PathElement.pathElement(SS7MbeanDefinition.MBEAN, name));
mbean.get(OP_ADDR).set(address.toModelNode());
list.add(mbean);
// constructor/properties elements
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
switch (Namespace.forUri(reader.getNamespaceURI())) {
case SS7_1_0: {
final String tagName = reader.getLocalName();
switch (tagName) {
case SS7MbeanConstructorDefinition.CONSTRUCTOR: {
parseConstructor(reader, address, list);
break;
}
case SS7MbeanPropertyDefinition.PROPERTY: {
parseProperty(reader, address, list);
break;
}
default: {
break;
}
}
break;
}
default: {
throw unexpectedElement(reader);
}
}
}
}
static void parseProperty(XMLExtendedStreamReader reader, PathAddress parent, List list)
throws XMLStreamException {
String name = null;
final ModelNode property = new ModelNode();
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String attribute = reader.getAttributeLocalName(i);
final String value = reader.getAttributeValue(i);
switch (SS7MbeanPropertyDefinition.Element.of(attribute)) {
case NAME: {
name = value;
SS7MbeanPropertyDefinition.NAME_ATTR.parseAndSetParameter(value, property, reader);
break;
}
case TYPE: {
SS7MbeanPropertyDefinition.TYPE_ATTR.parseAndSetParameter(value, property, reader);
break;
}
case VALUE: {
SS7MbeanPropertyDefinition.VALUE_ATTR.parseAndSetParameter(value, property, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
//ParseUtils.requireNoContent(reader);
if (name == null) {
throw missingRequired(reader, Collections.singleton(Attribute.NAME));
}
property.get(OP).set(ADD);
PathAddress address = PathAddress.pathAddress(parent,
PathElement.pathElement(SS7MbeanPropertyDefinition.PROPERTY, name));
property.get(OP_ADDR).set(address.toModelNode());
list.add(property);
parsePropertyEntries(reader, address, list);
}
static void parsePropertyEntries(XMLExtendedStreamReader reader, PathAddress parent, List list)
throws XMLStreamException {
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
switch (Namespace.forUri(reader.getNamespaceURI())) {
case SS7_1_0: {
final String tagName = reader.getLocalName();
switch (tagName) {
case SS7MbeanPropertyEntryDefinition.ENTRY: {
parseEntry(reader, parent, list);
break;
}
default: {
throw unexpectedElement(reader);
}
}
break;
}
default: {
throw unexpectedElement(reader);
}
}
}
}
static void parseEntry(XMLExtendedStreamReader reader, PathAddress parent, List list)
throws XMLStreamException {
String key = null;
final ModelNode entry = new ModelNode();
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String attribute = reader.getAttributeLocalName(i);
final String value = reader.getAttributeValue(i);
switch (SS7MbeanPropertyEntryDefinition.Element.of(attribute)) {
case KEY: {
key = value;
SS7MbeanPropertyEntryDefinition.KEY_ATTR.parseAndSetParameter(value, entry, reader);
break;
}
case TYPE: {
SS7MbeanPropertyEntryDefinition.TYPE_ATTR.parseAndSetParameter(value, entry, reader);
break;
}
case VALUE: {
SS7MbeanPropertyEntryDefinition.VALUE_ATTR.parseAndSetParameter(value, entry, reader);
break;
}
default: {
throw unexpectedAttribute(reader, i);
}
}
}
ParseUtils.requireNoContent(reader);
if (key == null) {
throw missingRequired(reader, Collections.singleton(Attribute.NAME));
}
entry.get(OP).set(ADD);
PathAddress address = PathAddress.pathAddress(parent,
PathElement.pathElement(SS7MbeanPropertyEntryDefinition.ENTRY, key));
entry.get(OP_ADDR).set(address.toModelNode());
list.add(entry);
}
static void parseConstructor(XMLExtendedStreamReader reader, PathAddress parent, List list)
throws XMLStreamException {
ParseUtils.requireNoAttributes(reader);
final ModelNode constructor = new ModelNode();
constructor.get(OP).set(ADD);
PathAddress address = PathAddress.pathAddress(parent,
PathElement.pathElement(Constants.CONSTRUCTOR, Constants.CLASSIC));
constructor.get(OP_ADDR).set(address.toModelNode());
list.add(constructor);
parseConstructorParams(reader, address, list);
}
static void parseConstructorParams(XMLExtendedStreamReader reader, PathAddress parent, List list)
throws XMLStreamException {
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
switch (Namespace.forUri(reader.getNamespaceURI())) {
case SS7_1_0: {
final String tagName = reader.getLocalName();
switch (tagName) {
case SS7MbeanConstructorParameterDefinition.PARAMETER: {
parseParameter(reader, parent, list);
break;
}
default: {
throw unexpectedElement(reader);
}
}
break;
}
default: {
throw unexpectedElement(reader);
}
}
}
}
static void parseParameter(XMLExtendedStreamReader reader, PathAddress parent, List list)
throws XMLStreamException {
ParseUtils.requireNoAttributes(reader);
final ModelNode parameter = new ModelNode();
String value = reader.getElementText();
if (value != null) {
value = value.trim();
}
parameter.get(OP).set(ADD);
PathAddress address = PathAddress.pathAddress(parent,
PathElement.pathElement(Constants.PARAMETER, value));
parameter.get(OP_ADDR).set(address.toModelNode());
list.add(parameter);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy