/*
* 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 java.util.HashMap;
import java.util.Map;
import org.apache.logging.log4j.Logger;
import org.apache.geode.LogWriter;
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.GatewayReceiver;
import org.apache.geode.cache.wan.GatewayReceiverFactory;
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.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;
/**
* The function to a create GatewayReceiver using given configuration parameters.
*/
public class GatewayReceiverCreateFunction extends FunctionAdapter implements InternalEntity {
private static final Logger logger = LogService.getLogger();
private static final long serialVersionUID = 8746830191680509335L;
private static final String ID = GatewayReceiverCreateFunction.class.getName();
public static GatewayReceiverCreateFunction INSTANCE = new GatewayReceiverCreateFunction();
@Override
public void execute(FunctionContext context) {
ResultSender<Object> resultSender = context.getResultSender();
Cache cache = CacheFactory.getAnyInstance();
String memberNameOrId =
CliUtil.getMemberNameOrId(cache.getDistributedSystem().getDistributedMember());
GatewayReceiverFunctionArgs gatewayReceiverCreateArgs =
(GatewayReceiverFunctionArgs) context.getArguments();
try {
GatewayReceiver createdGatewayReceiver =
createGatewayReceiver(cache, gatewayReceiverCreateArgs);
Map<String, String> attributes = new HashMap<String, String>();
if (gatewayReceiverCreateArgs.getStartPort() != null) {
attributes.put("start-port", gatewayReceiverCreateArgs.getStartPort().toString());
}
if (gatewayReceiverCreateArgs.getEndPort() != null) {
attributes.put("end-port", gatewayReceiverCreateArgs.getEndPort().toString());
}
if (gatewayReceiverCreateArgs.getBindAddress() != null) {
attributes.put("bind-address", gatewayReceiverCreateArgs.getBindAddress());
}
XmlEntity xmlEntity = XmlEntity.builder().withType(CacheXml.GATEWAY_RECEIVER)
.withAttributes(attributes).build();
resultSender.lastResult(new CliFunctionResult(memberNameOrId, xmlEntity,
CliStrings.format(
CliStrings.CREATE_GATEWAYRECEIVER__MSG__GATEWAYRECEIVER_CREATED_ON_0_ONPORT_1,
new Object[] {memberNameOrId, createdGatewayReceiver.getPort()})));
} catch (IllegalStateException 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);
}
/**
* GatewayReceiver creation happens here.
*
* @param cache
* @param gatewayReceiverCreateArgs
* @return GatewayReceiver
*/
private static GatewayReceiver createGatewayReceiver(Cache cache,
GatewayReceiverFunctionArgs gatewayReceiverCreateArgs) {
GatewayReceiverFactory gatewayReceiverFactory = cache.createGatewayReceiverFactory();
Integer startPort = gatewayReceiverCreateArgs.getStartPort();
if (startPort != null) {
gatewayReceiverFactory.setStartPort(startPort);
}
Integer endPort = gatewayReceiverCreateArgs.getEndPort();
if (endPort != null) {
gatewayReceiverFactory.setEndPort(endPort);
}
String bindAddress = gatewayReceiverCreateArgs.getBindAddress();
if (bindAddress != null) {
gatewayReceiverFactory.setBindAddress(bindAddress);
}
Integer maxTimeBetweenPings = gatewayReceiverCreateArgs.getMaximumTimeBetweenPings();
if (maxTimeBetweenPings != null) {
gatewayReceiverFactory.setMaximumTimeBetweenPings(maxTimeBetweenPings);
}
Integer socketBufferSize = gatewayReceiverCreateArgs.getSocketBufferSize();
if (socketBufferSize != null) {
gatewayReceiverFactory.setSocketBufferSize(socketBufferSize);
}
Boolean manualStart = gatewayReceiverCreateArgs.isManualStart();
if (manualStart != null) {
gatewayReceiverFactory.setManualStart(manualStart);
}
String[] gatewayTransportFilters = gatewayReceiverCreateArgs.getGatewayTransportFilters();
if (gatewayTransportFilters != null) {
for (String gatewayTransportFilter : gatewayTransportFilters) {
Class gatewayTransportFilterKlass = forName(gatewayTransportFilter,
CliStrings.CREATE_GATEWAYRECEIVER__GATEWAYTRANSPORTFILTER);
gatewayReceiverFactory.addGatewayTransportFilter(
(GatewayTransportFilter) newInstance(gatewayTransportFilterKlass,
CliStrings.CREATE_GATEWAYRECEIVER__GATEWAYTRANSPORTFILTER));
}
}
return gatewayReceiverFactory.create();
}
@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;
}
}