blob: 471b0653684bda2d7b35883bc6694fa54e9bd438 [file] [log] [blame]
/*
* 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.configuration.mutators;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.apache.commons.lang3.NotImplementedException;
import org.apache.commons.lang3.StringUtils;
import org.apache.geode.cache.configuration.CacheConfig;
import org.apache.geode.cache.configuration.RegionConfig;
import org.apache.geode.lang.Identifiable;
import org.apache.geode.management.configuration.Region;
import org.apache.geode.management.internal.configuration.converters.RegionConverter;
public class RegionConfigManager implements ConfigurationManager<Region> {
private final RegionConverter converter = new RegionConverter();
@Override
public void add(Region configElement, CacheConfig existingConfig) {
existingConfig.getRegions().add(converter.fromConfigObject(configElement));
}
@Override
public void update(Region config, CacheConfig existing) {
throw new NotImplementedException("Not implemented yet");
}
@Override
public void delete(Region config, CacheConfig existing) {
existing.getRegions().removeIf(i -> i.getId().equals(config.getId()));
}
@Override
public List<Region> list(Region filter, CacheConfig existing) {
Stream<RegionConfig> stream = existing.getRegions().stream();
if (StringUtils.isNotBlank(filter.getName())) {
stream = stream.filter(r -> filter.getName().equals(r.getName()));
}
return stream.map(converter::fromXmlObject).filter(Objects::nonNull)
.collect(Collectors.toList());
}
@Override
public Region get(String id, CacheConfig existing) {
return converter.fromXmlObject(Identifiable.find(existing.getRegions(), id));
}
@Override
public void checkCompatibility(Region incoming, String group, Region existing) {
// if their types are the same, then they are compatible
if (incoming.getType().equals(existing.getType())) {
return;
}
// one has to be the proxy of the other's main type
if (!incoming.getType().name().contains("PROXY")
&& !existing.getType().name().contains("PROXY")) {
raiseIncompatibilityError(incoming, group, existing);
}
// the beginning part of the type has to be the same
String incomingType = incoming.getType().name().split("_")[0];
String existingType = existing.getType().name().split("_")[0];
if (!incomingType.equals(existingType)) {
raiseIncompatibilityError(incoming, group, existing);
}
}
private void raiseIncompatibilityError(Region incoming, String group,
Region existing) {
throw new IllegalArgumentException(getDescription(incoming) + " is not compatible with " + group
+ "'s existing " + getDescription(existing) + ".");
}
private String getDescription(Region regionConfig) {
return "Region '" + regionConfig.getName() + "' of type '" + regionConfig.getType() + "'";
}
}