blob: 5377fc5d001711839755588ccd617ebe623d30fd [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.domain;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import org.apache.geode.DataSerializable;
import org.apache.geode.DataSerializer;
import org.apache.geode.management.internal.configuration.utils.XmlUtils;
/**
* Domain object for all the configuration related data.
*
*/
public class Configuration implements DataSerializable {
private static final long serialVersionUID = 1L;
private String configName;
private String cacheXmlContent;
private String cacheXmlFileName;
private String propertiesFileName;
private Properties gemfireProperties;
Set<String> jarNames;
// Public no arg constructor required for Deserializable
public Configuration() {
}
public Configuration(Configuration that) {
this.configName = that.configName;
this.cacheXmlContent = that.cacheXmlContent;
this.cacheXmlFileName = that.cacheXmlFileName;
this.propertiesFileName = that.propertiesFileName;
this.gemfireProperties = new Properties();
this.gemfireProperties.putAll(that.gemfireProperties);
this.jarNames = new HashSet<>(that.jarNames);
}
public Configuration(String configName) {
this.configName = configName;
this.cacheXmlFileName = configName + ".xml";
this.propertiesFileName = configName + ".properties";
this.gemfireProperties = new Properties();
this.jarNames = new HashSet<String>();
}
public String getCacheXmlContent() {
return cacheXmlContent;
}
public void setCacheXmlContent(String cacheXmlContent) {
this.cacheXmlContent = cacheXmlContent;
}
public void setCacheXmlFile(File cacheXmlFile) throws IOException {
if (cacheXmlFile.length() == 0) {
this.cacheXmlContent = "";
} else {
try {
Document doc = XmlUtils.getDocumentBuilder().parse(cacheXmlFile);
this.cacheXmlContent = XmlUtils.elementToString(doc);
} catch (SAXException | TransformerException | ParserConfigurationException e) {
throw new IOException("Unable to parse existing cluster configuration from file: "
+ cacheXmlFile.getAbsolutePath(), e);
}
}
}
public void setPropertiesFile(File propertiesFile) throws IOException {
if (!propertiesFile.exists())
return;
FileInputStream fis = null;
try {
fis = new FileInputStream(propertiesFile);
this.gemfireProperties.load(fis);
} finally {
if (fis != null) {
fis.close();
}
}
}
public String getCacheXmlFileName() {
return cacheXmlFileName;
}
public Properties getGemfireProperties() {
return gemfireProperties;
}
public void setGemfireProperties(Properties gemfireProperties) {
this.gemfireProperties = gemfireProperties;
}
public void addGemfireProperties(Properties gemfireProperties) {
this.gemfireProperties.putAll(gemfireProperties);
}
public String getConfigName() {
return configName;
}
public String getPropertiesFileName() {
return propertiesFileName;
}
public void addJarNames(Set<String> jarNames) {
this.jarNames.addAll(jarNames);
}
public void addJarNames(String[] jarNames) {
if (jarNames == null)
return;
this.jarNames.addAll(Stream.of(jarNames).collect(Collectors.toSet()));
}
public void removeJarNames(String[] jarNames) {
if (jarNames != null) {
this.jarNames.removeAll(Stream.of(jarNames).collect(Collectors.toSet()));
} else {
this.jarNames.clear();
}
}
public Set<String> getJarNames() {
return this.jarNames;
}
@Override
public void toData(DataOutput out) throws IOException {
DataSerializer.writeString(configName, out);
DataSerializer.writeString(cacheXmlFileName, out);
DataSerializer.writeString(cacheXmlContent, out);
DataSerializer.writeString(propertiesFileName, out);
DataSerializer.writeProperties(gemfireProperties, out);
DataSerializer.writeHashSet((HashSet<?>) jarNames, out);
}
@Override
public void fromData(DataInput in) throws IOException, ClassNotFoundException {
this.configName = DataSerializer.readString(in);
this.cacheXmlFileName = DataSerializer.readString(in);
this.cacheXmlContent = DataSerializer.readString(in);
this.propertiesFileName = DataSerializer.readString(in);
this.gemfireProperties = DataSerializer.readProperties(in);
this.jarNames = DataSerializer.readHashSet(in);
}
@Override
public String toString() {
return "Configuration [configName=" + configName + ", cacheXmlContent=" + cacheXmlContent
+ ", cacheXmlFileName=" + cacheXmlFileName + ", propertiesFileName=" + propertiesFileName
+ ", gemfireProperties=" + gemfireProperties + ", jarNames=" + jarNames + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cacheXmlContent == null) ? 0 : cacheXmlContent.hashCode());
result = prime * result + ((cacheXmlFileName == null) ? 0 : cacheXmlFileName.hashCode());
result = prime * result + ((configName == null) ? 0 : configName.hashCode());
result = prime * result + ((gemfireProperties == null) ? 0 : gemfireProperties.hashCode());
result = prime * result + ((jarNames == null) ? 0 : jarNames.hashCode());
result = prime * result + ((propertiesFileName == null) ? 0 : propertiesFileName.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Configuration))
return false;
Configuration other = (Configuration) obj;
if (cacheXmlContent == null) {
if (other.cacheXmlContent != null)
return false;
} else if (!cacheXmlContent.equals(other.cacheXmlContent))
return false;
if (cacheXmlFileName == null) {
if (other.cacheXmlFileName != null)
return false;
} else if (!cacheXmlFileName.equals(other.cacheXmlFileName))
return false;
if (configName == null) {
if (other.configName != null)
return false;
} else if (!configName.equals(other.configName))
return false;
if (gemfireProperties == null) {
if (other.gemfireProperties != null)
return false;
} else if (!gemfireProperties.equals(other.gemfireProperties))
return false;
if (jarNames == null) {
if (other.jarNames != null)
return false;
} else if (!jarNames.equals(other.jarNames))
return false;
if (propertiesFileName == null) {
if (other.propertiesFileName != null)
return false;
} else if (!propertiesFileName.equals(other.propertiesFileName))
return false;
return true;
}
}