/**
* Copyright 2015-2016 Red Hat, Inc, and individual contributors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.wildfly.swarm.resource.adapters;
import java.io.IOException;
import java.io.StringWriter;
import org.wildfly.swarm.config.resource.adapters.ResourceAdapter;
import org.wildfly.swarm.config.resource.adapters.resource_adapter.AdminObjects;
import org.wildfly.swarm.config.resource.adapters.resource_adapter.ConfigProperties;
import org.wildfly.swarm.config.resource.adapters.resource_adapter.ConnectionDefinitions;
import org.wildfly.swarm.container.util.XmlWriter;
/**
* @author Ralf Battenfeld
*/
enum IronJacamarXmlAssetImpl {
INSTANCE;
private static final String IRONJACAMAR = "ironjacamar";
private static final String CONNECTION_DEFINITION = "connection-definition";
private static final String POOL = "pool";
private static final String TIMEOUT = "timeout";
private static final String RECOVERY = "recovery";
private static final String ADMIN_OBJECT = "admin-object";
public String transform(final ResourceAdapter<?> ra) {
final StringWriter str = new StringWriter();
try (XmlWriter out = new XmlWriter(str)) {
XmlWriter.Element ironJacamarElement = out.element(IRONJACAMAR);
if (ra.beanvalidationgroups() != null && !ra.beanvalidationgroups().isEmpty()) {
XmlWriter.Element beanValidationGroupsElement = null;
for (final Object group : ra.beanvalidationgroups()) {
beanValidationGroupsElement = writeElement(ironJacamarElement, beanValidationGroupsElement, "bean-validation-groups", "bean-validation-group", group.toString());
}
beanValidationGroupsElement.end();
}
ironJacamarElement = writeElement(null, ironJacamarElement, IRONJACAMAR, "bootstrap-context", ra.bootstrapContext());
for (final ConfigProperties<?> prop : ra.subresources().configProperties()) {
ironJacamarElement = writeConfigProperty(null, ironJacamarElement, IRONJACAMAR, prop);
}
ironJacamarElement = writeElement(null, ironJacamarElement, IRONJACAMAR, "transaction-support", ra.transactionSupport());
if (ra.subresources().connectionDefinitions() != null && !ra.subresources().connectionDefinitions().isEmpty()) {
final XmlWriter.Element connDefsElement = ironJacamarElement.element("connection-definitions");
for (final ConnectionDefinitions<?> connDef : ra.subresources().connectionDefinitions()) {
XmlWriter.Element connDefElement = null;
connDefElement = writeAttribute(connDefsElement, connDefElement, CONNECTION_DEFINITION, "use-ccm", connDef.useCcm());
connDefElement = writeAttribute(connDefsElement, connDefElement, CONNECTION_DEFINITION, "class-name", connDef.className());
connDefElement = writeAttribute(connDefsElement, connDefElement, CONNECTION_DEFINITION, "jndi-name", connDef.jndiName());
connDefElement = writeAttribute(connDefsElement, connDefElement, CONNECTION_DEFINITION, "enabled", connDef.enabled());
connDefElement = writeAttribute(connDefsElement, connDefElement, CONNECTION_DEFINITION, "use-java-context", connDef.useJavaContext());
if (connDef.subresources().configProperties() != null && !connDef.subresources().configProperties().isEmpty()) {
for (final ConfigProperties<?> prop : connDef.subresources().configProperties()) {
connDefElement = writeConfigProperty(connDefsElement, connDefElement, CONNECTION_DEFINITION, prop);
}
}
XmlWriter.Element poolElement = null;
poolElement = writeElement(connDefElement, poolElement, POOL, "min-pool-size", connDef.minPoolSize());
poolElement = writeElement(connDefElement, poolElement, POOL, "max-pool-size", connDef.maxPoolSize());
poolElement = writeElement(connDefElement, poolElement, POOL, "prefill", connDef.poolPrefill());
poolElement = writeElement(connDefElement, poolElement, POOL, "use-strict-min", connDef.poolUseStrictMin());
poolElement = writeElement(connDefElement, poolElement, POOL, "flush-strategy", connDef.flushStrategy());
if (poolElement != null) {
poolElement.end();
}
XmlWriter.Element securityElement = null;
securityElement = writeElement(connDefElement, securityElement, "security", "security-domain", connDef.securityDomain());
securityElement = writeElement(connDefElement, securityElement, "security", "security-domain-and-application", connDef.securityDomainAndApplication());
if (securityElement != null) {
securityElement.end();
}
XmlWriter.Element timeoutElement = null;
timeoutElement = writeElement(connDefsElement, timeoutElement, TIMEOUT, "blocking-timeout-millis", connDef.blockingTimeoutWaitMillis());
// TODO
// check
// why
// not
// blockingTimeoutMillis())
timeoutElement = writeElement(connDefsElement, timeoutElement, TIMEOUT, "idle-timeout-minutes", connDef.idleTimeoutMinutes());
timeoutElement = writeElement(connDefsElement, timeoutElement, TIMEOUT, "allocation-retry", connDef.allocationRetry());
timeoutElement = writeElement(connDefsElement, timeoutElement, TIMEOUT, "allocation-retry-wait-millis", connDef.allocationRetryWaitMillis());
timeoutElement = writeElement(connDefsElement, timeoutElement, TIMEOUT, "xa-resource-timeout", connDef.xaResourceTimeout());
if (timeoutElement != null) {
timeoutElement.end();
}
XmlWriter.Element validationElement = null;
validationElement = writeElement(connDefsElement, validationElement, "validation", "background-validation", connDef.backgroundValidation());
validationElement = writeElement(connDefsElement, validationElement, "validation", "background-validation-millis", connDef.backgroundValidationMillis());
validationElement = writeElement(connDefsElement, validationElement, "validation", "use-fast-fail", connDef.useFastFail());
if (validationElement != null) {
validationElement.end();
}
XmlWriter.Element recoveryElement = null;
XmlWriter.Element recoverCredentialElement = null;
XmlWriter.Element recoveryPluginElement = null;
if (connDef.recoveryUsername() != null || connDef.recoveryPassword() != null || connDef.recoverySecurityDomain() != null) {
recoveryElement = connDefsElement.element(RECOVERY);
recoveryElement = writeAttribute(connDefsElement, recoveryElement, RECOVERY, "no-recovery", connDef.noRecovery());
recoverCredentialElement = writeElement(recoveryElement, recoverCredentialElement, "recover-credential", "user-name", connDef.recoveryUsername());
recoverCredentialElement = writeElement(recoveryElement, recoverCredentialElement, "recover-credential", "password", connDef.recoveryPassword());
recoverCredentialElement = writeElement(recoveryElement, recoverCredentialElement, "recover-credential", "security-domain", connDef.recoverySecurityDomain());
if (recoverCredentialElement != null) {
recoverCredentialElement.end();
}
}
if (connDef.recoveryPluginClassName() != null || (connDef.recoveryPluginProperties() != null && !connDef.recoveryPluginProperties().isEmpty())) {
if (recoveryElement == null) {
recoveryElement = connDefsElement.element(RECOVERY);
recoveryElement = writeAttribute(connDefsElement, recoveryElement, RECOVERY, "no-recovery", connDef.noRecovery());
}
recoveryPluginElement = writeAttribute(recoveryElement, recoveryPluginElement, "recover-plugin", "class-name", connDef.recoveryPluginClassName());
recoveryPluginElement = writeElement(recoveryElement, recoveryPluginElement, "recover-plugin", "user-name", connDef.recoveryUsername());
for (Object key : connDef.recoveryPluginProperties().keySet()) {
recoveryPluginElement.element("config-property").attr("name", key.toString()).content(connDef.recoveryPluginProperties().get(key).toString()).end();
}
if (recoveryPluginElement != null) {
recoveryPluginElement.end();
}
}
if (recoveryElement != null) {
recoveryElement.end();
}
connDefElement.end();
}
connDefsElement.end();
}
if (ra.subresources().adminObjects() != null && !ra.subresources().adminObjects().isEmpty()) {
final XmlWriter.Element adminObjsElement = ironJacamarElement.element("admin-objects");
for (final AdminObjects<?> adminObject : ra.subresources().adminObjects()) {
XmlWriter.Element adminObjElement = null;
adminObjElement = writeAttribute(adminObjsElement, adminObjElement, ADMIN_OBJECT, "class-name", adminObject.className());
adminObjElement = writeAttribute(adminObjsElement, adminObjElement, ADMIN_OBJECT, "jndi-name", adminObject.jndiName());
adminObjElement = writeAttribute(adminObjsElement, adminObjElement, ADMIN_OBJECT, "enabled", adminObject.enabled());
adminObjElement = writeAttribute(adminObjsElement, adminObjElement, ADMIN_OBJECT, "use-java-context", adminObject.useJavaContext());
for (final ConfigProperties<?> prop : adminObject.subresources().configProperties()) {
adminObjElement = writeConfigProperty(adminObjsElement, adminObjElement, ADMIN_OBJECT, prop);
}
if (adminObjElement != null) {
adminObjElement.end();
}
}
adminObjsElement.end();
}
ironJacamarElement.end();
out.close();
return str.toString();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// -----------------------------------------------------------------------||
// -- Private Methods ----------------------------------------------------||
// -----------------------------------------------------------------------||
private XmlWriter.Element writeElement(final XmlWriter.Element parentParentElement, final XmlWriter.Element parentElement, final String parentElementName, final String name, final Object value) throws IOException {
XmlWriter.Element localParentElement = parentElement;
if (value != null) {
if (localParentElement == null) {
localParentElement = parentParentElement.element(parentElementName);
}
localParentElement.element(name).content(value.toString()).end();
}
return localParentElement;
}
private XmlWriter.Element writeAttribute(final XmlWriter.Element parentParentElement, final XmlWriter.Element parentElement, final String parentElementName, final String name, final Object value) throws IOException {
XmlWriter.Element localParentElement = parentElement;
if (value != null) {
if (localParentElement == null) {
localParentElement = parentParentElement.element(parentElementName);
}
localParentElement.attr(name, value.toString());
}
return localParentElement;
}
private XmlWriter.Element writeConfigProperty(final XmlWriter.Element parentParentElement, final XmlWriter.Element parentElement, final String parentElementName, final ConfigProperties<?> prop) throws IOException {
XmlWriter.Element localParentElement = parentElement;
if (prop != null) {
if (localParentElement == null) {
localParentElement = parentParentElement.element(parentElementName);
}
localParentElement.element("config-property").attr("name", prop.getKey()).content(prop.value()).end();
}
return localParentElement;
}
}