/*
* 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.wildfly.extension.mod_cluster;
import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
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.parsing.ParseUtils.requireNoNamespaceAttribute;
import static org.jboss.as.controller.parsing.ParseUtils.unexpectedAttribute;
import static org.jboss.as.controller.parsing.ParseUtils.unexpectedElement;
import java.util.List;
import javax.xml.stream.XMLStreamException;
import org.jboss.as.controller.PathAddress;
import org.jboss.as.controller.PathElement;
import org.jboss.as.controller.SimpleAttributeDefinition;
import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
import org.jboss.as.controller.operations.common.Util;
import org.jboss.as.controller.parsing.ParseUtils;
import org.jboss.dmr.ModelNode;
import org.jboss.dmr.Property;
import org.jboss.staxmapper.XMLElementReader;
import org.jboss.staxmapper.XMLExtendedStreamReader;
public class ModClusterSubsystemXMLReader_1_0 implements XMLElementReader<List<ModelNode>> {
/**
* {@inheritDoc}
*/
@Override
public void readElement(XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException {
ParseUtils.requireNoAttributes(reader);
PathAddress address = PathAddress.pathAddress(ModClusterSubsystemResourceDefinition.PATH);
final ModelNode subsystem = new ModelNode();
subsystem.get(OP).set(ADD);
subsystem.get(OP_ADDR).set(address.toModelNode());
list.add(subsystem);
// Reads it
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
switch (element) {
case MOD_CLUSTER_CONFIG:
parseModClusterConfig(reader, list, address);
break;
default: {
throw unexpectedElement(reader);
}
}
}
}
void parseModClusterConfig(XMLExtendedStreamReader reader, List<ModelNode> list, PathAddress parent) throws XMLStreamException {
PathAddress address = parent.append(ModClusterConfigResourceDefinition.PATH);
final ModelNode config = Util.createAddOperation(address);
list.add(config);
// Parse the attributes.
parsePropConf(reader, config);
// Parse the elements
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
switch (element) {
case SIMPLE_LOAD_PROVIDER:
parseSimpleLoadProvider(reader, config);
break;
case DYNAMIC_LOAD_PROVIDER:
parseDynamicLoadProvider(reader, list, address);
break;
case SSL:
parseSSL(reader, list, address);
break;
default:
throw unexpectedElement(reader);
}
}
}
void parsePropConf(XMLExtendedStreamReader reader, ModelNode conf) throws XMLStreamException {
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String value = reader.getAttributeValue(i);
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case ADVERTISE_SOCKET:
case PROXY_URL:
case ADVERTISE:
case ADVERTISE_SECURITY_KEY:
case EXCLUDED_CONTEXTS:
case AUTO_ENABLE_CONTEXTS:
case STOP_CONTEXT_TIMEOUT:
case SOCKET_TIMEOUT:
case STICKY_SESSION:
case STICKY_SESSION_REMOVE:
case STICKY_SESSION_FORCE:
case WORKER_TIMEOUT:
case MAX_ATTEMPTS:
case FLUSH_PACKETS:
case FLUSH_WAIT:
case PING:
case SMAX:
case TTL:
case NODE_TIMEOUT:
case BALANCER:
((SimpleAttributeDefinition) ModClusterConfigResourceDefinition.ATTRIBUTES_BY_NAME.get(attribute.getLocalName())).parseAndSetParameter(value, conf, reader);
break;
case DOMAIN:
ModClusterConfigResourceDefinition.LOAD_BALANCING_GROUP.parseAndSetParameter(value, conf, reader);
break;
case PROXY_LIST:
// Keep deprecated PROXY_LIST to be able to support EAP 6.x slaves
ModClusterConfigResourceDefinition.PROXY_LIST.parseAndSetParameter(value, conf, reader);
break;
default:
throw unexpectedAttribute(reader, i);
}
}
// This is a required attribute - so set it to something reasonable
ModClusterConfigResourceDefinition.CONNECTOR.parseAndSetParameter("ajp", conf, reader);
}
void parseSSL(XMLExtendedStreamReader reader, List<ModelNode> list, PathAddress parent) throws XMLStreamException {
PathAddress address = parent.append(ModClusterSSLResourceDefinition.PATH);
final ModelNode ssl = Util.createAddOperation(address);
list.add(ssl);
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String value = reader.getAttributeValue(i);
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case KEY_ALIAS:
case PASSWORD:
case CERTIFICATE_KEY_FILE:
case CIPHER_SUITE:
case PROTOCOL:
case CA_CERTIFICATE_FILE:
case CA_REVOCATION_URL:
ModClusterSSLResourceDefinition.ATTRIBUTES_BY_NAME.get(attribute.getLocalName()).parseAndSetParameter(value, ssl, reader);
break;
default:
throw unexpectedAttribute(reader, i);
}
}
ParseUtils.requireNoContent(reader);
}
void parseSimpleLoadProvider(XMLExtendedStreamReader reader, ModelNode operation) throws XMLStreamException {
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String value = reader.getAttributeValue(i);
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case FACTOR:
ModClusterConfigResourceDefinition.SIMPLE_LOAD_PROVIDER.parseAndSetParameter(value, operation, reader);
break;
default:
throw unexpectedAttribute(reader, i);
}
}
ParseUtils.requireNoContent(reader);
}
void parseDynamicLoadProvider(XMLExtendedStreamReader reader, List<ModelNode> list, PathAddress parent) throws XMLStreamException {
PathAddress address = parent.append(DynamicLoadProviderDefinition.PATH);
final ModelNode load = Util.createAddOperation(address);
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String value = reader.getAttributeValue(i);
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case HISTORY:
DynamicLoadProviderDefinition.HISTORY.parseAndSetParameter(value, load, reader);
break;
case DECAY:
DynamicLoadProviderDefinition.DECAY.parseAndSetParameter(value, load, reader);
break;
default:
throw unexpectedAttribute(reader, i);
}
}
list.add(load);
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
// read the load-metric and the custom-load-metric
final Element element = Element.forName(reader.getLocalName());
switch (element) {
case LOAD_METRIC:
parseLoadMetric(reader, list, address);
break;
case CUSTOM_LOAD_METRIC:
parseCustomLoadMetric(reader, list, address);
break;
default:
throw unexpectedElement(reader);
}
}
}
void parseLoadMetric(XMLExtendedStreamReader reader, List<ModelNode> list, PathAddress address) throws XMLStreamException {
final ModelNode metric = new ModelNode();
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String value = reader.getAttributeValue(i);
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case TYPE:
LoadMetricDefinition.TYPE.parseAndSetParameter(value, metric, reader);
break;
case CAPACITY:
LoadMetricDefinition.CAPACITY.parseAndSetParameter(value, metric, reader);
break;
case WEIGHT:
LoadMetricDefinition.WEIGHT.parseAndSetParameter(value, metric, reader);
break;
default:
throw unexpectedAttribute(reader, i);
}
}
PathElement pe = PathElement.pathElement(LoadMetricDefinition.PATH.getKey(), metric.get(CommonAttributes.TYPE).asString());
metric.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.ADD);
metric.get(ModelDescriptionConstants.OP_ADDR).set(address.append(pe).toModelNode());
readProperties(reader, metric);
list.add(metric);
}
static void readProperties(XMLExtendedStreamReader reader, ModelNode metric) throws XMLStreamException {
while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
final Element element = Element.forName(reader.getLocalName());
switch (element) {
case PROPERTY:
final Property property = ParseUtils.readProperty(reader, true);
metric.get(CommonAttributes.PROPERTY).get(property.getName()).set(property.getValue());
break;
default:
throw unexpectedElement(reader);
}
}
}
void parseCustomLoadMetric(XMLExtendedStreamReader reader, List<ModelNode> list, PathAddress address) throws XMLStreamException {
final ModelNode customMetric = new ModelNode();
final int count = reader.getAttributeCount();
for (int i = 0; i < count; i++) {
requireNoNamespaceAttribute(reader, i);
final String value = reader.getAttributeValue(i);
final Attribute attribute = Attribute.forName(reader.getAttributeLocalName(i));
switch (attribute) {
case CAPACITY:
LoadMetricDefinition.CAPACITY.parseAndSetParameter(value, customMetric, reader);
break;
case WEIGHT:
LoadMetricDefinition.WEIGHT.parseAndSetParameter(value, customMetric, reader);
break;
case CLASS:
CustomLoadMetricDefinition.CLASS.parseAndSetParameter(value, customMetric, reader);
break;
default:
throw unexpectedAttribute(reader, i);
}
}
PathElement pe = PathElement.pathElement(CustomLoadMetricDefinition.PATH.getKey(), customMetric.get(CommonAttributes.CLASS).asString());
customMetric.get(ModelDescriptionConstants.OP).set(ModelDescriptionConstants.ADD);
customMetric.get(ModelDescriptionConstants.OP_ADDR).set(address.append(pe).toModelNode());
readProperties(reader, customMetric);
list.add(customMetric);
}
}