/*
* 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);
}
}