blob: 70a57f0b4ac866393b76587578b6bf95868e8deb [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.cli.domain;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.geode.cache.DataPolicy;
import org.apache.geode.cache.Scope;
/***
* Data class which contains description of a region and provides the aggregated view of the region
* Used by describe region command
*/
public class RegionDescription implements Serializable {
private static final long serialVersionUID = 6461449275798378332L;
private String name;
private boolean isPartition;
private boolean isPersistent;
private boolean isReplicate;
private boolean isLocal = false;
private boolean isAccessor = false;
// COPY
// Common Non Default Attributes
private final Map<String, String> cndRegionAttributes = new HashMap<>();
private final Map<String, String> cndPartitionAttributes = new HashMap<>();
private final Map<String, String> cndEvictionAttributes = new HashMap<>();
private Map<String, RegionDescriptionPerMember> regionDescPerMemberMap = null;
private Scope scope;
private DataPolicy dataPolicy;
public RegionDescription() {}
public DataPolicy getDataPolicy() {
return dataPolicy;
}
public Scope getScope() {
return scope;
}
/**
* Adds the RegionDescription per member to the aggregated view
*
* @return boolean describing if description was successfully added
*/
public boolean add(RegionDescriptionPerMember regionDescPerMember) {
boolean isAdded = false;
if (regionDescPerMemberMap == null) {
regionDescPerMemberMap = new HashMap<>();
regionDescPerMemberMap.put(regionDescPerMember.getHostingMember(), regionDescPerMember);
scope = regionDescPerMember.getScope();
dataPolicy = regionDescPerMember.getDataPolicy();
name = regionDescPerMember.getName();
isPartition = dataPolicy.withPartitioning();
isPersistent = dataPolicy.withPersistence();
isReplicate = dataPolicy.withReplication();
isLocal = scope.isLocal();
isAccessor = regionDescPerMember.isAccessor();
cndRegionAttributes.putAll(regionDescPerMember.getNonDefaultRegionAttributes());
cndPartitionAttributes.putAll(regionDescPerMember.getNonDefaultPartitionAttributes());
cndEvictionAttributes.putAll(regionDescPerMember.getNonDefaultEvictionAttributes());
isAdded = true;
} else if (scope.equals(regionDescPerMember.getScope())
&& name.equals(regionDescPerMember.getName())
&& dataPolicy.equals(regionDescPerMember.getDataPolicy())
&& isAccessor == regionDescPerMember.isAccessor()) {
regionDescPerMemberMap.put(regionDescPerMember.getHostingMember(), regionDescPerMember);
findCommon(cndRegionAttributes, regionDescPerMember.getNonDefaultRegionAttributes());
findCommon(cndEvictionAttributes, regionDescPerMember.getNonDefaultEvictionAttributes());
findCommon(cndPartitionAttributes, regionDescPerMember.getNonDefaultPartitionAttributes());
isAdded = true;
}
return isAdded;
}
/**
* Removes any key-value pairs from @commonValuesMap that do not agree with the respective
* key-value pairs of @additionalValuesMap
*
* @param commonValuesMap Common values map, whose key set will be reduced.
* @param additionalValuesMap Incoming values map, against which @commonValuesMap.
*/
static void findCommon(Map<String, String> commonValuesMap,
Map<String, String> additionalValuesMap) {
Set<String> sharedKeySet = commonValuesMap.keySet();
sharedKeySet.retainAll(additionalValuesMap.keySet());
for (String sharedKey : new HashSet<>(sharedKeySet)) {
String commonNdValue = commonValuesMap.get(sharedKey);
String incomingNdValue = additionalValuesMap.get(sharedKey);
if (commonNdValue != null && !commonNdValue.equals(incomingNdValue)
|| commonNdValue == null && incomingNdValue != null) {
commonValuesMap.remove(sharedKey);
}
}
}
@Override
public boolean equals(Object obj) {
if (obj instanceof RegionDescription) {
RegionDescription regionDesc = (RegionDescription) obj;
return getName().equals(regionDesc.getName()) && scope.equals(regionDesc.getScope())
&& dataPolicy.equals(regionDesc.getDataPolicy());
}
return true;
}
public int hashCode() {
return 42; // any arbitrary constant will do
}
public Set<String> getHostingMembers() {
return regionDescPerMemberMap.keySet();
}
public String getName() {
return name;
}
public boolean isPersistent() {
return isPersistent;
}
public boolean isPartition() {
return isPartition;
}
public boolean isReplicate() {
return isReplicate;
}
public boolean isLocal() {
return isLocal;
}
public boolean isAccessor() {
return isAccessor;
}
/***
* Gets the common, non-default region attributes
*
* @return Map containing attribute name and its associated value
*/
public Map<String, String> getCndRegionAttributes() {
return cndRegionAttributes;
}
/***
* Gets the common, non-default eviction attributes
*
* @return Map containing attribute name and its associated value
*/
public Map<String, String> getCndEvictionAttributes() {
return cndEvictionAttributes;
}
/***
* Gets the common, non-default partition attributes
*
* @return Map containing attribute name and its associated value
*/
public Map<String, String> getCndPartitionAttributes() {
return cndPartitionAttributes;
}
public Map<String, RegionDescriptionPerMember> getRegionDescriptionPerMemberMap() {
return regionDescPerMemberMap;
}
public String toString() {
return "";
}
public boolean isEmpty() {
return regionDescPerMemberMap == null || regionDescPerMemberMap.isEmpty();
}
}