/** * {@inheritDoc} * * @see * org.jboss.staxmapper.XMLElementWriter#writeContent(org.jboss.staxmapper.XMLExtendedStreamWriter, * java.lang.Object) */ @Override public void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException { context.startSubsystemElement(Namespace.CURRENT.getUri(), false); ModelNode model = context.getModelNode(); if (model.isDefined()) { writer.writeAttribute( Attribute.DEFAULT_CACHE_CONTAINER.getLocalName(), model.require(ModelKeys.DEFAULT_CACHE_CONTAINER).asString()); for (Property entry : model.get(ModelKeys.CACHE_CONTAINER).asPropertyList()) { String containerName = entry.getName(); ModelNode container = entry.getValue(); writer.writeStartElement(Element.CACHE_CONTAINER.getLocalName()); writer.writeAttribute(Attribute.NAME.getLocalName(), containerName); this.writeRequired(writer, Attribute.DEFAULT_CACHE, container, ModelKeys.DEFAULT_CACHE); this.writeOptional(writer, Attribute.JNDI_NAME, container, ModelKeys.JNDI_NAME); this.writeOptional( writer, Attribute.LISTENER_EXECUTOR, container, ModelKeys.LISTENER_EXECUTOR); this.writeOptional( writer, Attribute.EVICTION_EXECUTOR, container, ModelKeys.EVICTION_EXECUTOR); this.writeOptional( writer, Attribute.REPLICATION_QUEUE_EXECUTOR, container, ModelKeys.REPLICATION_QUEUE_EXECUTOR); if (container.hasDefined(ModelKeys.ALIAS)) { for (ModelNode alias : container.get(ModelKeys.ALIAS).asList()) { writer.writeStartElement(Element.ALIAS.getLocalName()); writer.writeCharacters(alias.asString()); writer.writeEndElement(); } } if (container.hasDefined(ModelKeys.SINGLETON)) { writer.writeStartElement(Element.TRANSPORT.getLocalName()); ModelNode transport = container.get(ModelKeys.SINGLETON, ModelKeys.TRANSPORT); this.writeOptional(writer, Attribute.STACK, transport, ModelKeys.STACK); this.writeOptional(writer, Attribute.EXECUTOR, transport, ModelKeys.EXECUTOR); this.writeOptional(writer, Attribute.LOCK_TIMEOUT, transport, ModelKeys.LOCK_TIMEOUT); this.writeOptional(writer, Attribute.SITE, transport, ModelKeys.SITE); this.writeOptional(writer, Attribute.RACK, transport, ModelKeys.RACK); this.writeOptional(writer, Attribute.MACHINE, transport, ModelKeys.MACHINE); writer.writeEndElement(); } // create a list of all caches in the model List<Property> cachesPL = new ArrayList<Property>(); String[] cacheTypes = { ModelKeys.LOCAL_CACHE, ModelKeys.INVALIDATION_CACHE, ModelKeys.REPLICATED_CACHE, ModelKeys.DISTRIBUTED_CACHE }; for (String cacheType : cacheTypes) { List<Property> cachesOfAType = getCachesAsPropertyList(model, containerName, cacheType); if (cachesOfAType != null) cachesPL.addAll(cachesOfAType); } List<ModelNode> caches = new ArrayList<ModelNode>(); for (Property cacheEntry : cachesPL) { caches.add(cacheEntry.getValue()); } // for (ModelNode cache: container.get(ModelKeys.CACHE).asList()) { for (ModelNode cache : caches) { Configuration.CacheMode mode = Configuration.CacheMode.valueOf(cache.get(ModelKeys.CACHE_MODE).asString()); if (mode.isClustered()) { if (mode.isDistributed()) { writer.writeStartElement(Element.DISTRIBUTED_CACHE.getLocalName()); this.writeOptional(writer, Attribute.OWNERS, cache, ModelKeys.OWNERS); this.writeOptional(writer, Attribute.VIRTUAL_NODES, cache, ModelKeys.VIRTUAL_NODES); this.writeOptional(writer, Attribute.L1_LIFESPAN, cache, ModelKeys.L1_LIFESPAN); } else if (mode.isInvalidation()) { writer.writeStartElement(Element.INVALIDATION_CACHE.getLocalName()); } else { writer.writeStartElement(Element.REPLICATED_CACHE.getLocalName()); } writer.writeAttribute(Attribute.MODE.getLocalName(), Mode.forCacheMode(mode).name()); this.writeOptional(writer, Attribute.QUEUE_SIZE, cache, ModelKeys.QUEUE_SIZE); this.writeOptional( writer, Attribute.QUEUE_FLUSH_INTERVAL, cache, ModelKeys.QUEUE_FLUSH_INTERVAL); this.writeOptional(writer, Attribute.REMOTE_TIMEOUT, cache, ModelKeys.REMOTE_TIMEOUT); } else { writer.writeStartElement(Element.LOCAL_CACHE.getLocalName()); } this.writeRequired(writer, Attribute.NAME, cache, ModelKeys.NAME); this.writeOptional(writer, Attribute.START, cache, ModelKeys.START); this.writeOptional(writer, Attribute.BATCHING, cache, ModelKeys.BATCHING); this.writeOptional(writer, Attribute.INDEXING, cache, ModelKeys.INDEXING); if (cache.hasDefined(ModelKeys.LOCKING)) { writer.writeStartElement(Element.LOCKING.getLocalName()); ModelNode locking = cache.get(ModelKeys.LOCKING); this.writeOptional(writer, Attribute.ISOLATION, locking, ModelKeys.ISOLATION); this.writeOptional(writer, Attribute.STRIPING, locking, ModelKeys.STRIPING); this.writeOptional( writer, Attribute.ACQUIRE_TIMEOUT, locking, ModelKeys.ACQUIRE_TIMEOUT); this.writeOptional( writer, Attribute.CONCURRENCY_LEVEL, locking, ModelKeys.CONCURRENCY_LEVEL); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.TRANSACTION)) { writer.writeStartElement(Element.TRANSACTION.getLocalName()); ModelNode transaction = cache.get(ModelKeys.TRANSACTION); this.writeOptional(writer, Attribute.STOP_TIMEOUT, transaction, ModelKeys.STOP_TIMEOUT); this.writeOptional(writer, Attribute.MODE, transaction, ModelKeys.MODE); this.writeOptional(writer, Attribute.LOCKING, transaction, ModelKeys.LOCKING); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.EVICTION)) { writer.writeStartElement(Element.EVICTION.getLocalName()); ModelNode eviction = cache.get(ModelKeys.EVICTION); this.writeOptional(writer, Attribute.STRATEGY, eviction, ModelKeys.STRATEGY); this.writeOptional(writer, Attribute.MAX_ENTRIES, eviction, ModelKeys.MAX_ENTRIES); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.EXPIRATION)) { writer.writeStartElement(Element.EXPIRATION.getLocalName()); ModelNode expiration = cache.get(ModelKeys.EXPIRATION); this.writeOptional(writer, Attribute.MAX_IDLE, expiration, ModelKeys.MAX_IDLE); this.writeOptional(writer, Attribute.LIFESPAN, expiration, ModelKeys.LIFESPAN); this.writeOptional(writer, Attribute.INTERVAL, expiration, ModelKeys.INTERVAL); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.STORE)) { ModelNode store = cache.get(ModelKeys.STORE); writer.writeStartElement(Element.STORE.getLocalName()); this.writeRequired(writer, Attribute.CLASS, store, ModelKeys.CLASS); this.writeStoreAttributes(writer, store); this.writeStoreProperties(writer, store); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.FILE_STORE)) { ModelNode store = cache.get(ModelKeys.FILE_STORE); writer.writeStartElement(Element.FILE_STORE.getLocalName()); this.writeOptional(writer, Attribute.RELATIVE_TO, store, ModelKeys.RELATIVE_TO); this.writeOptional(writer, Attribute.PATH, store, ModelKeys.PATH); this.writeStoreAttributes(writer, store); this.writeStoreProperties(writer, store); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.JDBC_STORE)) { ModelNode store = cache.get(ModelKeys.JDBC_STORE); writer.writeStartElement(Element.JDBC_STORE.getLocalName()); this.writeRequired(writer, Attribute.DATASOURCE, store, ModelKeys.DATASOURCE); this.writeStoreAttributes(writer, store); this.writeJDBCStoreTable(writer, Element.ENTRY_TABLE, store, ModelKeys.ENTRY_TABLE); this.writeJDBCStoreTable(writer, Element.BUCKET_TABLE, store, ModelKeys.BUCKET_TABLE); this.writeStoreProperties(writer, store); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.REMOTE_STORE)) { ModelNode store = cache.get(ModelKeys.REMOTE_STORE); writer.writeStartElement(Element.REMOTE_STORE.getLocalName()); this.writeOptional(writer, Attribute.CACHE, store, ModelKeys.CACHE); this.writeOptional(writer, Attribute.SOCKET_TIMEOUT, store, ModelKeys.SOCKET_TIMEOUT); this.writeOptional(writer, Attribute.TCP_NO_DELAY, store, ModelKeys.TCP_NO_DELAY); this.writeStoreAttributes(writer, store); for (ModelNode remoteServer : store.get(ModelKeys.REMOTE_SERVER).asList()) { writer.writeStartElement(Element.REMOTE_SERVER.getLocalName()); writer.writeAttribute( Attribute.OUTBOUND_SOCKET_BINDING.getLocalName(), remoteServer.get(ModelKeys.OUTBOUND_SOCKET_BINDING).asString()); writer.writeEndElement(); } this.writeStoreProperties(writer, store); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.STATE_TRANSFER)) { ModelNode stateTransfer = cache.get(ModelKeys.STATE_TRANSFER); writer.writeStartElement(Element.STATE_TRANSFER.getLocalName()); this.writeOptional(writer, Attribute.ENABLED, stateTransfer, ModelKeys.ENABLED); this.writeOptional(writer, Attribute.TIMEOUT, stateTransfer, ModelKeys.TIMEOUT); this.writeOptional( writer, Attribute.FLUSH_TIMEOUT, stateTransfer, ModelKeys.FLUSH_TIMEOUT); writer.writeEndElement(); } if (cache.hasDefined(ModelKeys.REHASHING)) { ModelNode rehashing = cache.get(ModelKeys.REHASHING); writer.writeStartElement(Element.REHASHING.getLocalName()); this.writeOptional(writer, Attribute.ENABLED, rehashing, ModelKeys.ENABLED); this.writeOptional(writer, Attribute.TIMEOUT, rehashing, ModelKeys.TIMEOUT); this.writeOptional(writer, Attribute.WAIT, rehashing, ModelKeys.WAIT); writer.writeEndElement(); } writer.writeEndElement(); } writer.writeEndElement(); } } writer.writeEndElement(); }
/** * Base class for cache resources which require common cache attributes and clustered cache * attributes. * * @author Richard Achmatowicz (c) 2011 Red Hat Inc. */ public class ClusteredCacheResourceDefinition extends CacheResourceDefinition { // attributes static final SimpleAttributeDefinition ASYNC_MARSHALLING = new SimpleAttributeDefinitionBuilder(ModelKeys.ASYNC_MARSHALLING, ModelType.BOOLEAN, true) .setXmlName(Attribute.ASYNC_MARSHALLING.getLocalName()) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(new ModelNode().set(false)) .build(); static final SimpleAttributeDefinition MODE = new SimpleAttributeDefinitionBuilder(ModelKeys.MODE, ModelType.STRING, false) .setXmlName(Attribute.MODE.getLocalName()) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setValidator(new EnumValidator<>(Mode.class, false, true)) .build(); static final SimpleAttributeDefinition QUEUE_FLUSH_INTERVAL = new SimpleAttributeDefinitionBuilder(ModelKeys.QUEUE_FLUSH_INTERVAL, ModelType.LONG, true) .setXmlName(Attribute.QUEUE_FLUSH_INTERVAL.getLocalName()) .setMeasurementUnit(MeasurementUnit.MILLISECONDS) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(new ModelNode().set(10)) .build(); static final SimpleAttributeDefinition QUEUE_SIZE = new SimpleAttributeDefinitionBuilder(ModelKeys.QUEUE_SIZE, ModelType.INT, true) .setXmlName(Attribute.QUEUE_SIZE.getLocalName()) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(new ModelNode().set(0)) .build(); static final SimpleAttributeDefinition REMOTE_TIMEOUT = new SimpleAttributeDefinitionBuilder(ModelKeys.REMOTE_TIMEOUT, ModelType.LONG, true) .setXmlName(Attribute.REMOTE_TIMEOUT.getLocalName()) .setMeasurementUnit(MeasurementUnit.MILLISECONDS) .setAllowExpression(true) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setDefaultValue(new ModelNode().set(17500)) .build(); static final AttributeDefinition[] CLUSTERED_CACHE_ATTRIBUTES = { ASYNC_MARSHALLING, MODE, QUEUE_SIZE, QUEUE_FLUSH_INTERVAL, REMOTE_TIMEOUT }; // metrics static final AttributeDefinition AVERAGE_REPLICATION_TIME = new SimpleAttributeDefinitionBuilder( MetricKeys.AVERAGE_REPLICATION_TIME, ModelType.LONG, true) .setStorageRuntime() .build(); static final AttributeDefinition REPLICATION_COUNT = new SimpleAttributeDefinitionBuilder(MetricKeys.REPLICATION_COUNT, ModelType.LONG, true) .setStorageRuntime() .build(); static final AttributeDefinition REPLICATION_FAILURES = new SimpleAttributeDefinitionBuilder(MetricKeys.REPLICATION_FAILURES, ModelType.LONG, true) .setStorageRuntime() .build(); static final AttributeDefinition SUCCESS_RATIO = new SimpleAttributeDefinitionBuilder(MetricKeys.SUCCESS_RATIO, ModelType.DOUBLE, true) .setStorageRuntime() .build(); static final AttributeDefinition[] CLUSTERED_CACHE_METRICS = { AVERAGE_REPLICATION_TIME, REPLICATION_COUNT, REPLICATION_FAILURES, SUCCESS_RATIO }; public ClusteredCacheResourceDefinition( PathElement pathElement, ResourceDescriptionResolver descriptionResolver, AbstractAddStepHandler addHandler, OperationStepHandler removeHandler, ResolvePathHandler resolvePathHandler, boolean runtimeRegistration) { super( pathElement, descriptionResolver, addHandler, removeHandler, resolvePathHandler, runtimeRegistration); } @Override public void registerAttributes(ManagementResourceRegistration resourceRegistration) { super.registerAttributes(resourceRegistration); // do we really need a special handler here? final OperationStepHandler writeHandler = new CacheWriteAttributeHandler(CLUSTERED_CACHE_ATTRIBUTES); for (AttributeDefinition attr : CLUSTERED_CACHE_ATTRIBUTES) { resourceRegistration.registerReadWriteAttribute( attr, CacheReadAttributeHandler.INSTANCE, writeHandler); } // register any metrics for (AttributeDefinition attr : CLUSTERED_CACHE_METRICS) { resourceRegistration.registerMetric(attr, CacheMetricsHandler.INSTANCE); } } }