/* * 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.web.controllers; import org.apache.geode.internal.lang.StringUtils; import org.apache.geode.management.internal.cli.i18n.CliStrings; import org.apache.geode.management.internal.cli.util.CommandStringBuilder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.context.request.WebRequest; /** * The RegionCommands class implements GemFire Management REST API web service endpoints for the * Gfsh Region Commands. * <p/> * * @see org.apache.geode.management.internal.cli.commands.RegionCommands * @see org.apache.geode.management.internal.web.controllers.AbstractCommandsController * @see org.springframework.stereotype.Controller * @see org.springframework.web.bind.annotation.PathVariable * @see org.springframework.web.bind.annotation.RequestMapping * @see org.springframework.web.bind.annotation.RequestMethod * @see org.springframework.web.bind.annotation.RequestParam * @see org.springframework.web.bind.annotation.ResponseBody * @since GemFire 8.0 */ @Controller("regionController") @RequestMapping(AbstractCommandsController.REST_API_VERSION) @SuppressWarnings("unused") public class RegionCommandsController extends AbstractCommandsController { @RequestMapping(method = RequestMethod.GET, value = "/regions") @ResponseBody public String listRegions( @RequestParam(value = CliStrings.LIST_REGION__GROUP, required = false) final String groupName, @RequestParam(value = CliStrings.LIST_REGION__MEMBER, required = false) final String memberNameId) { final CommandStringBuilder command = new CommandStringBuilder(CliStrings.LIST_REGION); if (hasValue(groupName)) { command.addOption(CliStrings.LIST_REGION__GROUP, groupName); } if (hasValue(memberNameId)) { command.addOption(CliStrings.LIST_REGION__MEMBER, memberNameId); } return processCommand(command.toString()); } @RequestMapping(method = RequestMethod.GET, value = "/regions/{name}") @ResponseBody public String describeRegion(@PathVariable("name") final String regionNamePath) { final CommandStringBuilder command = new CommandStringBuilder(CliStrings.DESCRIBE_REGION); command.addOption(CliStrings.DESCRIBE_REGION__NAME, decode(regionNamePath)); return processCommand(command.toString()); } @RequestMapping(method = RequestMethod.PUT, value = "/regions/{name}") @ResponseBody public String alterRegion(final WebRequest request, @PathVariable("name") final String regionNamePath, @RequestParam(value = CliStrings.ALTER_REGION__GROUP, required = false) final String[] groups, @RequestParam(value = CliStrings.ALTER_REGION__ENTRYEXPIRATIONIDLETIME, required = false) final Integer entryIdleTimeExpiration, @RequestParam(value = CliStrings.ALTER_REGION__ENTRYEXPIRATIONIDLETIMEACTION, required = false) final String entryIdleTimeExpirationAction, @RequestParam(value = CliStrings.ALTER_REGION__ENTRYEXPIRATIONTIMETOLIVE, required = false) final Integer entryTimeToLiveExpiration, @RequestParam(value = CliStrings.ALTER_REGION__ENTRYEXPIRATIONTTLACTION, required = false) final String entryTimeToLiveExpirationAction, @RequestParam(value = CliStrings.ALTER_REGION__REGIONEXPIRATIONIDLETIME, required = false) final Integer regionIdleTimeExpiration, @RequestParam(value = CliStrings.ALTER_REGION__REGIONEXPIRATIONIDLETIMEACTION, required = false) final String regionIdleTimeExpirationAction, @RequestParam(value = CliStrings.ALTER_REGION__REGIONEXPIRATIONTTL, required = false) final Integer regionTimeToLiveExpiration, @RequestParam(value = CliStrings.ALTER_REGION__REGIONEXPIRATIONTTLACTION, required = false) final String regionTimeToLiveExpirationAction, @RequestParam(value = CliStrings.ALTER_REGION__CACHELISTENER, required = false) final String[] cacheListeners, @RequestParam(value = CliStrings.ALTER_REGION__CACHELOADER, required = false) final String cacheLoader, @RequestParam(value = CliStrings.ALTER_REGION__CACHEWRITER, required = false) final String cacheWriter, @RequestParam(value = CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, required = false) final String[] asyncEventQueueIds, @RequestParam(value = CliStrings.ALTER_REGION__GATEWAYSENDERID, required = false) final String[] gatewaySenderIds, @RequestParam(value = CliStrings.ALTER_REGION__CLONINGENABLED, required = false) final Boolean enableCloning, @RequestParam(value = CliStrings.ALTER_REGION__EVICTIONMAX, required = false) final Integer evictionMax) { // logRequest(request); final CommandStringBuilder command = new CommandStringBuilder(CliStrings.ALTER_REGION); command.addOption(CliStrings.ALTER_REGION__REGION, decode(regionNamePath)); if (hasValue(groups)) { command.addOption(CliStrings.ALTER_REGION__GROUP, StringUtils.concat(groups, StringUtils.COMMA_DELIMITER)); } addCommandOption(request, command, CliStrings.ALTER_REGION__ENTRYEXPIRATIONIDLETIME, entryIdleTimeExpiration); addCommandOption(request, command, CliStrings.ALTER_REGION__ENTRYEXPIRATIONIDLETIMEACTION, entryIdleTimeExpirationAction); addCommandOption(request, command, CliStrings.ALTER_REGION__ENTRYEXPIRATIONTIMETOLIVE, entryTimeToLiveExpiration); addCommandOption(request, command, CliStrings.ALTER_REGION__ENTRYEXPIRATIONTTLACTION, entryTimeToLiveExpirationAction); addCommandOption(request, command, CliStrings.ALTER_REGION__REGIONEXPIRATIONIDLETIME, regionIdleTimeExpiration); addCommandOption(request, command, CliStrings.ALTER_REGION__REGIONEXPIRATIONIDLETIMEACTION, regionIdleTimeExpirationAction); addCommandOption(request, command, CliStrings.ALTER_REGION__REGIONEXPIRATIONTTL, regionTimeToLiveExpiration); addCommandOption(request, command, CliStrings.ALTER_REGION__REGIONEXPIRATIONTTLACTION, regionTimeToLiveExpirationAction); addCommandOption(request, command, CliStrings.ALTER_REGION__CACHELISTENER, cacheListeners); addCommandOption(request, command, CliStrings.ALTER_REGION__CACHELOADER, cacheLoader); addCommandOption(request, command, CliStrings.ALTER_REGION__CACHEWRITER, cacheWriter); addCommandOption(request, command, CliStrings.ALTER_REGION__ASYNCEVENTQUEUEID, asyncEventQueueIds); addCommandOption(request, command, CliStrings.ALTER_REGION__GATEWAYSENDERID, gatewaySenderIds); if (Boolean.TRUE.equals(enableCloning)) { command.addOption(CliStrings.ALTER_REGION__CLONINGENABLED, String.valueOf(enableCloning)); } if (hasValue(evictionMax)) { command.addOption(CliStrings.ALTER_REGION__EVICTIONMAX, String.valueOf(evictionMax)); } return processCommand(command.toString()); } @RequestMapping(method = RequestMethod.POST, value = "/regions") @ResponseBody public String createRegion(@RequestParam("name") final String regionNamePath, @RequestParam(value = CliStrings.CREATE_REGION__REGIONSHORTCUT, required = false) final String regionType, @RequestParam(value = CliStrings.CREATE_REGION__USEATTRIBUTESFROM, required = false) final String regionTemplate, @RequestParam(value = CliStrings.CREATE_REGION__GROUP, required = false) final String[] groups, @RequestParam(value = CliStrings.CREATE_REGION__SKIPIFEXISTS, defaultValue = "true") final Boolean skipIfExists, @RequestParam(value = CliStrings.CREATE_REGION__KEYCONSTRAINT, required = false) final String keyConstraint, @RequestParam(value = CliStrings.CREATE_REGION__VALUECONSTRAINT, required = false) final String valueConstraint, @RequestParam(value = CliStrings.CREATE_REGION__STATISTICSENABLED, required = false) final Boolean enableStatistics, @RequestParam(value = CliStrings.CREATE_REGION__ENTRYEXPIRATIONIDLETIME, required = false) final Integer entryIdleTimeExpiration, @RequestParam(value = CliStrings.CREATE_REGION__ENTRYEXPIRATIONIDLETIMEACTION, required = false) final String entryIdleTimeExpirationAction, @RequestParam(value = CliStrings.CREATE_REGION__ENTRYEXPIRATIONTIMETOLIVE, required = false) final Integer entryTimeToLiveExpiration, @RequestParam(value = CliStrings.CREATE_REGION__ENTRYEXPIRATIONTTLACTION, required = false) final String entryTimeToLiveExpirationAction, @RequestParam(value = CliStrings.CREATE_REGION__REGIONEXPIRATIONIDLETIME, required = false) final Integer regionIdleTimeExpiration, @RequestParam(value = CliStrings.CREATE_REGION__REGIONEXPIRATIONIDLETIMEACTION, required = false) final String regionIdleTimeExpirationAction, @RequestParam(value = CliStrings.CREATE_REGION__REGIONEXPIRATIONTTL, required = false) final Integer regionTimeToLiveExpiration, @RequestParam(value = CliStrings.CREATE_REGION__REGIONEXPIRATIONTTLACTION, required = false) final String regionTimeToLiveExpirationAction, @RequestParam(value = CliStrings.CREATE_REGION__DISKSTORE, required = false) final String diskStore, @RequestParam(value = CliStrings.CREATE_REGION__DISKSYNCHRONOUS, required = false) final Boolean enableSynchronousDisk, @RequestParam(value = CliStrings.CREATE_REGION__ENABLEASYNCCONFLATION, required = false) final Boolean enableAsynchronousConflation, @RequestParam(value = CliStrings.CREATE_REGION__ENABLESUBSCRIPTIONCONFLATION, required = false) final Boolean enableSubscriptionConflation, @RequestParam(value = CliStrings.CREATE_REGION__CACHELISTENER, required = false) final String[] cacheListeners, @RequestParam(value = CliStrings.CREATE_REGION__CACHELOADER, required = false) final String cacheLoader, @RequestParam(value = CliStrings.CREATE_REGION__CACHEWRITER, required = false) final String cacheWriter, @RequestParam(value = CliStrings.CREATE_REGION__ASYNCEVENTQUEUEID, required = false) final String[] asyncEventQueueIds, @RequestParam(value = CliStrings.CREATE_REGION__GATEWAYSENDERID, required = false) final String[] gatewaySenderIds, @RequestParam(value = CliStrings.CREATE_REGION__CONCURRENCYCHECKSENABLED, required = false) final Boolean enableConcurrencyChecks, @RequestParam(value = CliStrings.CREATE_REGION__CLONINGENABLED, required = false) final Boolean enableCloning, @RequestParam(value = CliStrings.CREATE_REGION__CONCURRENCYLEVEL, required = false) final Integer concurrencyLevel, @RequestParam(value = CliStrings.CREATE_REGION__COLOCATEDWITH, required = false) final String colocatedWith, @RequestParam(value = CliStrings.CREATE_REGION__LOCALMAXMEMORY, required = false) final Integer localMaxMemory, @RequestParam(value = CliStrings.CREATE_REGION__RECOVERYDELAY, required = false) final Long recoveryDelay, @RequestParam(value = CliStrings.CREATE_REGION__REDUNDANTCOPIES, required = false) final Integer redundantCopies, @RequestParam(value = CliStrings.CREATE_REGION__STARTUPRECOVERYDDELAY, required = false) final Long startupRecoveryDelay, @RequestParam(value = CliStrings.CREATE_REGION__TOTALMAXMEMORY, required = false) final Long totalMaxMemory, @RequestParam(value = CliStrings.CREATE_REGION__TOTALNUMBUCKETS, required = false) final Integer totalNumBuckets, @RequestParam(value = CliStrings.CREATE_REGION__COMPRESSOR, required = false) final String compressor) { final CommandStringBuilder command = new CommandStringBuilder(CliStrings.CREATE_REGION); assertArgument(hasValue(regionNamePath), "Region name/path is required!"); assertArgument(hasValue(regionType) || hasValue(regionTemplate), "Either Region type or template-region must be specified!"); command.addOption(CliStrings.CREATE_REGION__REGION, regionNamePath); if (hasValue(regionType)) { command.addOption(CliStrings.CREATE_REGION__REGIONSHORTCUT, regionType); } else { command.addOption(CliStrings.CREATE_REGION__USEATTRIBUTESFROM, regionTemplate); } if (hasValue(groups)) { command.addOption(CliStrings.CREATE_REGION__GROUP, StringUtils.concat(groups, StringUtils.COMMA_DELIMITER)); } command.addOption(CliStrings.CREATE_REGION__SKIPIFEXISTS, String.valueOf(Boolean.TRUE.equals(skipIfExists))); if (hasValue(keyConstraint)) { command.addOption(CliStrings.CREATE_REGION__KEYCONSTRAINT, keyConstraint); } if (hasValue(valueConstraint)) { command.addOption(CliStrings.CREATE_REGION__VALUECONSTRAINT, valueConstraint); } if (Boolean.TRUE.equals(enableStatistics)) { command.addOption(CliStrings.CREATE_REGION__STATISTICSENABLED, String.valueOf(enableStatistics)); } if (hasValue(entryIdleTimeExpiration)) { command.addOption(CliStrings.CREATE_REGION__ENTRYEXPIRATIONIDLETIME, String.valueOf(entryIdleTimeExpiration)); } if (hasValue(entryIdleTimeExpirationAction)) { command.addOption(CliStrings.CREATE_REGION__ENTRYEXPIRATIONIDLETIMEACTION, entryIdleTimeExpirationAction); } if (hasValue(entryTimeToLiveExpiration)) { command.addOption(CliStrings.CREATE_REGION__ENTRYEXPIRATIONTIMETOLIVE, String.valueOf(entryTimeToLiveExpiration)); } if (hasValue(entryTimeToLiveExpirationAction)) { command.addOption(CliStrings.CREATE_REGION__ENTRYEXPIRATIONTTLACTION, entryTimeToLiveExpirationAction); } if (hasValue(regionIdleTimeExpiration)) { command.addOption(CliStrings.CREATE_REGION__REGIONEXPIRATIONIDLETIME, String.valueOf(regionIdleTimeExpiration)); } if (hasValue(regionIdleTimeExpirationAction)) { command.addOption(CliStrings.CREATE_REGION__REGIONEXPIRATIONIDLETIMEACTION, regionIdleTimeExpirationAction); } if (hasValue(regionTimeToLiveExpiration)) { command.addOption(CliStrings.CREATE_REGION__REGIONEXPIRATIONTTL, String.valueOf(regionTimeToLiveExpiration)); } if (hasValue(regionTimeToLiveExpirationAction)) { command.addOption(CliStrings.CREATE_REGION__REGIONEXPIRATIONTTLACTION, regionTimeToLiveExpirationAction); } if (hasValue(diskStore)) { command.addOption(CliStrings.CREATE_REGION__DISKSTORE, diskStore); } if (Boolean.TRUE.equals(enableSynchronousDisk)) { command.addOption(CliStrings.CREATE_REGION__DISKSYNCHRONOUS, String.valueOf(enableSynchronousDisk)); } if (Boolean.TRUE.equals(enableAsynchronousConflation)) { command.addOption(CliStrings.CREATE_REGION__ENABLEASYNCCONFLATION, String.valueOf(enableAsynchronousConflation)); } if (Boolean.TRUE.equals(enableSubscriptionConflation)) { command.addOption(CliStrings.CREATE_REGION__ENABLESUBSCRIPTIONCONFLATION, String.valueOf(enableSubscriptionConflation)); } if (hasValue(cacheListeners)) { command.addOption(CliStrings.CREATE_REGION__CACHELISTENER, StringUtils.concat(cacheListeners, StringUtils.COMMA_DELIMITER)); } if (hasValue(cacheLoader)) { command.addOption(CliStrings.CREATE_REGION__CACHELOADER, cacheLoader); } if (hasValue(cacheWriter)) { command.addOption(CliStrings.CREATE_REGION__CACHEWRITER, cacheWriter); } if (hasValue(asyncEventQueueIds)) { command.addOption(CliStrings.CREATE_REGION__ASYNCEVENTQUEUEID, StringUtils.concat(asyncEventQueueIds, StringUtils.COMMA_DELIMITER)); } if (hasValue(gatewaySenderIds)) { command.addOption(CliStrings.CREATE_REGION__GATEWAYSENDERID, StringUtils.concat(gatewaySenderIds, StringUtils.COMMA_DELIMITER)); } if (Boolean.TRUE.equals(enableConcurrencyChecks)) { command.addOption(CliStrings.CREATE_REGION__CONCURRENCYCHECKSENABLED, String.valueOf(enableConcurrencyChecks)); } if (Boolean.TRUE.equals(enableCloning)) { command.addOption(CliStrings.CREATE_REGION__CLONINGENABLED, String.valueOf(enableCloning)); } if (hasValue(concurrencyLevel)) { command.addOption(CliStrings.CREATE_REGION__CONCURRENCYLEVEL, String.valueOf(concurrencyLevel)); } if (hasValue(colocatedWith)) { command.addOption(CliStrings.CREATE_REGION__COLOCATEDWITH, colocatedWith); } if (hasValue(localMaxMemory)) { command.addOption(CliStrings.CREATE_REGION__LOCALMAXMEMORY, String.valueOf(localMaxMemory)); } if (hasValue(recoveryDelay)) { command.addOption(CliStrings.CREATE_REGION__RECOVERYDELAY, String.valueOf(recoveryDelay)); } if (hasValue(redundantCopies)) { command.addOption(CliStrings.CREATE_REGION__REDUNDANTCOPIES, String.valueOf(redundantCopies)); } if (hasValue(startupRecoveryDelay)) { command.addOption(CliStrings.CREATE_REGION__STARTUPRECOVERYDDELAY, String.valueOf(startupRecoveryDelay)); } if (hasValue(totalMaxMemory)) { command.addOption(CliStrings.CREATE_REGION__TOTALMAXMEMORY, String.valueOf(totalMaxMemory)); } if (hasValue(totalNumBuckets)) { command.addOption(CliStrings.CREATE_REGION__TOTALNUMBUCKETS, String.valueOf(totalNumBuckets)); } if (hasValue(compressor)) { command.addOption(CliStrings.CREATE_REGION__COMPRESSOR, compressor); } return processCommand(command.toString()); } @RequestMapping(method = RequestMethod.DELETE, value = "/regions/{name}") @ResponseBody public String destroyRegion(@PathVariable("name") final String regionNamePath) { final CommandStringBuilder command = new CommandStringBuilder(CliStrings.DESTROY_REGION); command.addOption(CliStrings.DESTROY_REGION__REGION, decode(regionNamePath)); return processCommand(command.toString()); } }