package jdepend.model.component.modelconf;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import jdepend.framework.context.JDependContext;
import jdepend.framework.exception.JDependException;
import jdepend.framework.util.FileUtil;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
/**
* 一个命令组配置的组件模型信息(一个组可以配置多个组件模型)
*
* @author wangdg
*
*/
public final class GroupComponentModelConf {
private String group;
private Map<String, ComponentModelConf> componentModelConfs;
public static final String DEFAULT_PROPERTY_DIR = "conf\\componentconf";
public GroupComponentModelConf(String group) throws ComponentConfException {
this.group = group;
this.componentModelConfs = this.loadComponentModelConfs();
}
public GroupComponentModelConf(String group, Map<String, ComponentModelConf> componentModelConfs) {
super();
this.group = group;
this.componentModelConfs = componentModelConfs;
}
private Map<String, ComponentModelConf> loadComponentModelConfs() throws ComponentConfException {
Map<String, ComponentModelConf> componentModelConfs = new LinkedHashMap<String, ComponentModelConf>();
ComponentModelConf componentModelConf;
if (!(new File(getComponentFilePath(group))).exists())
return componentModelConfs;
try {
DocumentBuilder domBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
InputStream input = new FileInputStream(getComponentFilePath(group));
Document doc = domBuilder.parse(input);
Element root = doc.getDocumentElement();
NodeList componentModels = root.getChildNodes();
if (componentModels != null) {
for (int i = 0; i < componentModels.getLength(); i++) {
Node componentModel = componentModels.item(i);
if (componentModel.getNodeType() == Node.ELEMENT_NODE) {
Node componentModelType = componentModel.getAttributes().getNamedItem("type");
if (componentModelType == null
|| componentModelType.getNodeValue().equals(
ComponentModelConf.ComponentModelType_Package)) {
componentModelConf = new JavaPackageComponentModelConf().load(componentModel);
} else {
componentModelConf = new JavaClassComponentModelConf().load(componentModel);
}
componentModelConfs.put(componentModelConf.getName(), componentModelConf);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return componentModelConfs;
}
public void save() throws ComponentConfException {
if (componentModelConfs != null && componentModelConfs.size() > 0) {
try {
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element root = document.createElement("componentModels");
root.setAttribute("group", group);// 添加group属性
for (String componentModelName : componentModelConfs.keySet()) {
root.appendChild(componentModelConfs.get(componentModelName).save(document));
}
output(root, getComponentFilePath(group));
} catch (ParserConfigurationException e) {
throw new ComponentConfException(e);
}
} else {
try {
FileUtil.deleteFile(getComponentFilePath(group));
} catch (JDependException e) {
throw new ComponentConfException(e);
}
}
}
private static void output(Node node, String filename) {
try {
PrintWriter pWriter = new PrintWriter(new java.io.FileOutputStream(filename));
XMLSerializer serl = new XMLSerializer(pWriter, new OutputFormat("xml", "UTF-8", true));// 这里的参数(TRUE)表示格式化为自动换行
serl.serialize(node);
pWriter.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private String getComponentFilePath(String group) {
return JDependContext.getWorkspacePath() + "\\" + GroupComponentModelConf.DEFAULT_PROPERTY_DIR + "\\component_"
+ group + ".xml";
}
public String getGroup() {
return group;
}
public Map<String, ComponentModelConf> getComponentModelConfs() {
return componentModelConfs;
}
public void setComponentModelConfs(Map<String, ComponentModelConf> componentModelConfs) {
this.componentModelConfs = componentModelConfs;
}
public void addComponentModelConf(ComponentModelConf componentModelConf) throws ComponentConfException {
if (this.componentModelConfs.containsKey(componentModelConf.getName())) {
throw new ComponentConfException("组件模型[" + componentModelConf.getName() + "]重复");
}
this.componentModelConfs.put(componentModelConf.getName(), componentModelConf);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((group == null) ? 0 : group.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final GroupComponentModelConf other = (GroupComponentModelConf) obj;
if (group == null) {
if (other.group != null)
return false;
} else if (!group.equals(other.group))
return false;
return true;
}
}