/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.messaging; import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD; import static org.jboss.as.controller.parsing.ParseUtils.missingRequired; import static org.jboss.as.controller.parsing.ParseUtils.readStringAttributeElement; import static org.jboss.as.controller.parsing.ParseUtils.requireSingleAttribute; import static org.jboss.as.controller.parsing.ParseUtils.unexpectedElement; import static org.jboss.as.messaging.CommonAttributes.FILTER; import java.util.EnumSet; import java.util.List; import java.util.Set; import javax.xml.stream.XMLStreamException; import org.jboss.as.controller.parsing.ParseUtils; import org.jboss.as.messaging.logging.MessagingLogger; import org.jboss.dmr.ModelNode; import org.jboss.staxmapper.XMLExtendedStreamReader; public class Messaging12SubsystemParser extends MessagingSubsystemParser { protected Messaging12SubsystemParser() { } @Override protected void handleUnknownConnectionFactoryAttribute(XMLExtendedStreamReader reader, Element element, ModelNode connectionFactory, boolean pooled) throws XMLStreamException { switch (element) { case MAX_POOL_SIZE: case MIN_POOL_SIZE: if (!pooled) { throw unexpectedElement(reader); } handleElementText(reader, element, connectionFactory); break; default: { super.handleUnknownConnectionFactoryAttribute(reader, element, connectionFactory, pooled); } } } protected void processBridge(XMLExtendedStreamReader reader, ModelNode address, List<ModelNode> updates) throws XMLStreamException { requireSingleAttribute(reader, CommonAttributes.NAME); String name = reader.getAttributeValue(0); ModelNode bridgeAdd = org.jboss.as.controller.operations.common.Util.getEmptyOperation(ADD, address.clone().add(CommonAttributes.BRIDGE, name)); EnumSet<Element> required = EnumSet.of(Element.QUEUE_NAME); Set<Element> seen = EnumSet.noneOf(Element.class); while(reader.hasNext() && reader.nextTag() != END_ELEMENT) { final Element element = Element.forName(reader.getLocalName()); if (!seen.add(element)) { throw ParseUtils.duplicateNamedElement(reader, element.getLocalName()); } required.remove(element); switch (element) { case QUEUE_NAME: case HA: case TRANSFORMER_CLASS_NAME: case USER: case PASSWORD: handleElementText(reader, element, bridgeAdd); break; case FILTER: { String string = readStringAttributeElement(reader, CommonAttributes.STRING); FILTER.parseAndSetParameter(string, bridgeAdd, reader); break; } case CHECK_PERIOD: case CONNECTION_TTL: case MAX_RETRY_INTERVAL: case MIN_LARGE_MESSAGE_SIZE: case RETRY_INTERVAL: case RETRY_INTERVAL_MULTIPLIER: // Use the "default" variant handleElementText(reader, element, "default", bridgeAdd); break; case CONFIRMATION_WINDOW_SIZE: case FORWARDING_ADDRESS: case RECONNECT_ATTEMPTS: case USE_DUPLICATE_DETECTION: handleElementText(reader, element, "bridge", bridgeAdd); break; case STATIC_CONNECTORS: checkOtherElementIsNotAlreadyDefined(reader, seen, Element.STATIC_CONNECTORS, Element.DISCOVERY_GROUP_REF); processStaticConnectors(reader, bridgeAdd, false); break; case DISCOVERY_GROUP_REF: { checkOtherElementIsNotAlreadyDefined(reader, seen, Element.DISCOVERY_GROUP_REF, Element.STATIC_CONNECTORS); final String groupRef = readStringAttributeElement(reader, BridgeDefinition.DISCOVERY_GROUP_NAME.getXmlName()); BridgeDefinition.DISCOVERY_GROUP_NAME.parseAndSetParameter(groupRef, bridgeAdd, reader); break; } case FAILOVER_ON_SERVER_SHUTDOWN: { MessagingLogger.ROOT_LOGGER.deprecatedXMLElement(element.toString()); handleElementText(reader, element, bridgeAdd); break; } default: { handleUnknownBridgeAttribute(reader, element, bridgeAdd); } } } checkOnlyOneOfElements(reader, seen, Element.STATIC_CONNECTORS, Element.DISCOVERY_GROUP_REF); if(!required.isEmpty()) { throw missingRequired(reader, required); } updates.add(bridgeAdd); } protected void handleUnknownBridgeAttribute(XMLExtendedStreamReader reader, Element element, ModelNode bridgeAdd) throws XMLStreamException { throw ParseUtils.unexpectedElement(reader); } @Override protected void handleUnknownClusterConnectionAttribute(XMLExtendedStreamReader reader, Element element, ModelNode clusterConnectionAdd) throws XMLStreamException { switch (element) { case CALL_TIMEOUT: handleElementText(reader, element, clusterConnectionAdd); break; case CHECK_PERIOD: case CONNECTION_TTL: case MAX_RETRY_INTERVAL: case RECONNECT_ATTEMPTS: case RETRY_INTERVAL_MULTIPLIER: // Use the "cluster" variant handleElementText(reader, element, "cluster", clusterConnectionAdd); break; case MIN_LARGE_MESSAGE_SIZE: handleElementText(reader, element, "default", clusterConnectionAdd); break; default: { super.handleUnknownClusterConnectionAttribute(reader, element, clusterConnectionAdd); } } } @Override protected void checkClusterConnectionConstraints(XMLExtendedStreamReader reader, Set<Element> seen) throws XMLStreamException { checkOnlyOneOfElements(reader, seen, Element.STATIC_CONNECTORS, Element.DISCOVERY_GROUP_REF); } }