/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You 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.apache.geode.management.internal.cli.functions;
import org.apache.logging.log4j.Logger;
import org.apache.geode.cache.Cache;
import org.apache.geode.cache.CacheFactory;
import org.apache.geode.cache.execute.FunctionAdapter;
import org.apache.geode.cache.execute.FunctionContext;
import org.apache.geode.cache.execute.ResultSender;
import org.apache.geode.cache.wan.GatewaySender.OrderPolicy;
import org.apache.geode.cache.wan.GatewayEventFilter;
import org.apache.geode.cache.wan.GatewaySender;
import org.apache.geode.cache.wan.GatewaySenderFactory;
import org.apache.geode.cache.wan.GatewayTransportFilter;
import org.apache.geode.internal.ClassPathLoader;
import org.apache.geode.internal.InternalEntity;
import org.apache.geode.internal.cache.wan.GatewaySenderException;
import org.apache.geode.internal.cache.xmlcache.CacheXml;
import org.apache.geode.internal.logging.LogService;
import org.apache.geode.management.internal.cli.CliUtil;
import org.apache.geode.management.internal.cli.i18n.CliStrings;
import org.apache.geode.management.internal.configuration.domain.XmlEntity;
public class GatewaySenderCreateFunction extends FunctionAdapter implements InternalEntity {
private static final Logger logger = LogService.getLogger();
private static final long serialVersionUID = 8746830191680509335L;
private static final String ID = GatewaySenderCreateFunction.class.getName();
public static GatewaySenderCreateFunction INSTANCE = new GatewaySenderCreateFunction();
@Override
public void execute(FunctionContext context) {
ResultSender<Object> resultSender = context.getResultSender();
Cache cache = CacheFactory.getAnyInstance();
String memberNameOrId =
CliUtil.getMemberNameOrId(cache.getDistributedSystem().getDistributedMember());
GatewaySenderFunctionArgs gatewaySenderCreateArgs =
(GatewaySenderFunctionArgs) context.getArguments();
try {
GatewaySender createdGatewaySender = createGatewaySender(cache, gatewaySenderCreateArgs);
XmlEntity xmlEntity =
new XmlEntity(CacheXml.GATEWAY_SENDER, "id", gatewaySenderCreateArgs.getId());
resultSender.lastResult(new CliFunctionResult(memberNameOrId, xmlEntity,
CliStrings.format(CliStrings.CREATE_GATEWAYSENDER__MSG__GATEWAYSENDER_0_CREATED_ON_1,
new Object[] {createdGatewaySender.getId(), memberNameOrId})));
} catch (GatewaySenderException e) {
resultSender.lastResult(handleException(memberNameOrId, e.getMessage(), e));
} catch (Exception e) {
String exceptionMsg = e.getMessage();
if (exceptionMsg == null) {
exceptionMsg = CliUtil.stackTraceAsString(e);
}
resultSender.lastResult(handleException(memberNameOrId, exceptionMsg, e));
}
}
private CliFunctionResult handleException(final String memberNameOrId, final String exceptionMsg,
final Exception e) {
if (e != null && logger.isDebugEnabled()) {
logger.debug(e.getMessage(), e);
}
if (exceptionMsg != null) {
return new CliFunctionResult(memberNameOrId, false, exceptionMsg);
}
return new CliFunctionResult(memberNameOrId);
}
/**
* Creates the GatewaySender with given configuration.
*
* @param cache
* @param gatewaySenderCreateArgs
* @return GatewaySender
*/
private static GatewaySender createGatewaySender(Cache cache,
GatewaySenderFunctionArgs gatewaySenderCreateArgs) {
GatewaySenderFactory gateway = cache.createGatewaySenderFactory();
Boolean isParallel = gatewaySenderCreateArgs.isParallel();
if (isParallel != null) {
gateway.setParallel(isParallel);
}
Boolean manualStart = gatewaySenderCreateArgs.isManualStart();
if (manualStart != null) {
gateway.setManualStart(manualStart);
}
Integer maxQueueMemory = gatewaySenderCreateArgs.getMaxQueueMemory();
if (maxQueueMemory != null) {
gateway.setMaximumQueueMemory(maxQueueMemory);
}
Integer batchSize = gatewaySenderCreateArgs.getBatchSize();
if (batchSize != null) {
gateway.setBatchSize(batchSize);
}
Integer batchTimeInterval = gatewaySenderCreateArgs.getBatchTimeInterval();
if (batchTimeInterval != null) {
gateway.setBatchTimeInterval(batchTimeInterval);
}
Boolean enableBatchConflation = gatewaySenderCreateArgs.isBatchConflationEnabled();
if (enableBatchConflation != null) {
gateway.setBatchConflationEnabled(enableBatchConflation);
}
Integer socketBufferSize = gatewaySenderCreateArgs.getSocketBufferSize();
if (socketBufferSize != null) {
gateway.setSocketBufferSize(socketBufferSize);
}
Integer socketReadTimeout = gatewaySenderCreateArgs.getSocketReadTimeout();
if (socketReadTimeout != null) {
gateway.setSocketReadTimeout(socketReadTimeout);
}
Integer alertThreshold = gatewaySenderCreateArgs.getAlertThreshold();
if (alertThreshold != null) {
gateway.setAlertThreshold(alertThreshold);
}
Integer dispatcherThreads = gatewaySenderCreateArgs.getDispatcherThreads();
if (dispatcherThreads != null && dispatcherThreads > 1) {
gateway.setDispatcherThreads(dispatcherThreads);
String orderPolicy = gatewaySenderCreateArgs.getOrderPolicy();
gateway.setOrderPolicy(OrderPolicy.valueOf(orderPolicy));
}
Boolean isPersistenceEnabled = gatewaySenderCreateArgs.isPersistenceEnabled();
if (isPersistenceEnabled != null) {
gateway.setPersistenceEnabled(isPersistenceEnabled);
}
String diskStoreName = gatewaySenderCreateArgs.getDiskStoreName();
if (diskStoreName != null) {
gateway.setDiskStoreName(diskStoreName);
}
Boolean isDiskSynchronous = gatewaySenderCreateArgs.isDiskSynchronous();
if (isDiskSynchronous != null) {
gateway.setDiskSynchronous(isDiskSynchronous);
}
String[] gatewayEventFilters = gatewaySenderCreateArgs.getGatewayEventFilter();
if (gatewayEventFilters != null) {
for (String gatewayEventFilter : gatewayEventFilters) {
Class gatewayEventFilterKlass =
forName(gatewayEventFilter, CliStrings.CREATE_GATEWAYSENDER__GATEWAYEVENTFILTER);
gateway.addGatewayEventFilter((GatewayEventFilter) newInstance(gatewayEventFilterKlass,
CliStrings.CREATE_GATEWAYSENDER__GATEWAYEVENTFILTER));
}
}
String[] gatewayTransportFilters = gatewaySenderCreateArgs.getGatewayTransportFilter();
if (gatewayTransportFilters != null) {
for (String gatewayTransportFilter : gatewayTransportFilters) {
Class gatewayTransportFilterKlass = forName(gatewayTransportFilter,
CliStrings.CREATE_GATEWAYSENDER__GATEWAYTRANSPORTFILTER);
gateway.addGatewayTransportFilter((GatewayTransportFilter) newInstance(
gatewayTransportFilterKlass, CliStrings.CREATE_GATEWAYSENDER__GATEWAYTRANSPORTFILTER));
}
}
return gateway.create(gatewaySenderCreateArgs.getId(),
gatewaySenderCreateArgs.getRemoteDistributedSystemId());
}
@SuppressWarnings("unchecked")
private static Class forName(String classToLoadName, String neededFor) {
Class loadedClass = null;
try {
// Set Constraints
ClassPathLoader classPathLoader = ClassPathLoader.getLatest();
if (classToLoadName != null && !classToLoadName.isEmpty()) {
loadedClass = classPathLoader.forName(classToLoadName);
}
} catch (ClassNotFoundException e) {
throw new RuntimeException(
CliStrings.format(CliStrings.CREATE_REGION__MSG__COULDNOT_FIND_CLASS_0_SPECIFIED_FOR_1,
new Object[] {classToLoadName, neededFor}),
e);
} catch (ClassCastException e) {
throw new RuntimeException(CliStrings.format(
CliStrings.CREATE_REGION__MSG__CLASS_SPECIFIED_FOR_0_SPECIFIED_FOR_1_IS_NOT_OF_EXPECTED_TYPE,
new Object[] {classToLoadName, neededFor}), e);
}
return loadedClass;
}
private static Object newInstance(Class klass, String neededFor) {
Object instance = null;
try {
instance = klass.newInstance();
} catch (InstantiationException e) {
throw new RuntimeException(CliStrings.format(
CliStrings.CREATE_GATEWAYSENDER__MSG__COULDNOT_INSTANTIATE_CLASS_0_SPECIFIED_FOR_1,
new Object[] {klass, neededFor}), e);
} catch (IllegalAccessException e) {
throw new RuntimeException(CliStrings.format(
CliStrings.CREATE_GATEWAYSENDER__MSG__COULDNOT_ACCESS_CLASS_0_SPECIFIED_FOR_1,
new Object[] {klass, neededFor}), e);
}
return instance;
}
@Override
public String getId() {
return ID;
}
}