All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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