package de.FeatureModellingTool.PatternBase.store;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.Namespace;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import component.FComponent;
import de.FeatureModellingTool.FeatureModel.store.FmdlParser;
import de.FeatureModellingTool.FeatureModel.store.FmdlParserPrototype;
import de.FeatureModellingTool.PatternBase.Pattern;
import de.FeatureModellingTool.PatternBase.PatternBase;
import de.FeatureModellingTool.PatternBase.PatternBaseImplementation;
import de.FeatureModellingTool.PatternBase.Templete;
/**
* author:chenting
* date:2007-12-4
* time:����07:48:43
*/
public class PatternBaseStoreImplementation implements PatternBaseStore {
FmdlParser fmParser;
public PatternBaseStoreImplementation() {
fmParser = new FmdlParserPrototype();
}
public void savePl(OutputStream outStream, PatternBase patternBase)
throws IOException, JDOMException {
Namespace xsi = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
Namespace pbd = Namespace.getNamespace("pbd", "http://sei.pku.edu.cn/DomainEngineering/PatternBase");
Document doc = new Document(new Element("patternBase", pbd));
Element root = doc.getRootElement();
root.setAttribute("schemaLocation", "http://sei.pku.edu.cn/DomainEngineering/patternBase patternBase.xsd", xsi).setAttribute("name", patternBase.getName());
Element patternList = new Element("patternList", pbd);
root.addContent(patternList);
Element templeteList = new Element("templeteList", pbd);
root.addContent(templeteList);
Map<String, Pattern> allPatterns = patternBase.getAllPatterns();
Iterator patternIterator = allPatterns.values().iterator();
//�洢����ģʽ
while (patternIterator.hasNext()) {
Pattern pattern = (Pattern) patternIterator.next();
String patternName = pattern.getName();
String description = pattern.getDescription();
description = _encode(description);
Element patternElement = new Element("pattern", pbd);
patternElement.setAttribute("name", patternName);
patternElement.addContent(new Element("description", pbd).addContent(description));
//���и�����洢��������
if (pattern.getParentPattern() != null) {
Element parent = new Element("parent", pbd);
String parentName = pattern.getParentPattern().getName();
parent.setAttribute("name", parentName);
patternElement.addContent(parent);
}
Element childrenElement = new Element("childrenList", pbd);
//�洢��ģʽ��������ģʽ����
List<Pattern> childrenPattern = pattern.getChildrenPatterns();
if (!childrenPattern.isEmpty()) {
Element childPatternElement = new Element("childPatternList", pbd);
Iterator childPatternIterator = childrenPattern.iterator();
while (childPatternIterator.hasNext()) {
Pattern childPattern = (Pattern) childPatternIterator.next();
String childPatternName = childPattern.getName();
childPatternElement.addContent(new Element("pattern", pbd).setAttribute("name", childPatternName));
}
childrenElement.addContent(childPatternElement);
}
//�洢��ģʽ��������ģ������
List<Templete> childrenTemplete = pattern.getChildrenTempletes();
if (!childrenTemplete.isEmpty()) {
Element childTempleteElement = new Element("childTempleteList", pbd);
Iterator childTempleteIterator = childrenTemplete.iterator();
while (childTempleteIterator.hasNext()) {
Templete childTemplete = (Templete) childTempleteIterator.next();
String childTempleteName = childTemplete.getName();
childTempleteElement.addContent(new Element("templete", pbd).setAttribute("name", childTempleteName));
}
childrenElement.addContent(childTempleteElement);
}
patternElement.addContent(childrenElement);
//�Ѹ�ģʽ����ģʽ�б�
patternList.addContent(patternElement);
}
//�洢����ģ��
Map<String, Templete> allTempletes = patternBase.getAllTempletes();
Iterator templeteIterator = allTempletes.values().iterator();
while (templeteIterator.hasNext()) {
Templete templete = (Templete) templeteIterator.next();
String templeteName = templete.getName();
Element templeteElement = new Element("templete", pbd);
templeteElement.setAttribute("name", templeteName);
String parentType;
String parentName;
//���ø���������ģʽ��Ҳ������ģ��
if (templete.getParentType() == "templete") {
parentType = "templete";
parentName = ((Templete) templete.getParent()).getName();
} else {
parentType = "pattern";
parentName = ((Pattern) templete.getParent()).getName();
}
Element parentElement = new Element("parent", pbd);
parentElement.setAttribute("type", parentType).setAttribute("name", parentName);
templeteElement.addContent(parentElement);
List<Templete> tChildTempletes = templete.getChildrenTempletes();
if (!tChildTempletes.isEmpty()) {
Element tChildTempleteElement = new Element("childTempleteList", pbd);
Iterator tChildTempleteIterator = tChildTempletes.iterator();
while (tChildTempleteIterator.hasNext()) {
Templete tChildTemplete = (Templete) tChildTempleteIterator.next();
String tChildTempleteName = tChildTemplete.getName();
Element childElement = new Element("Templete", pbd);
childElement.setAttribute("name", tChildTempleteName);
tChildTempleteElement.addContent(childElement);
}
templeteElement.addContent(tChildTempleteElement);
}
templeteList.addContent(templeteElement);
}
XMLOutputter fmt = new XMLOutputter(" ", true, "GB2312");
fmt.output(doc, outStream);
}
public void saveFm(OutputStream outStream, Templete templete)
throws IOException, JDOMException {
fmParser.saveFmdl(outStream, templete.getFeatureModel());
}
public void saveCm(OutputStream outStream, Templete templete)
throws IOException, JDOMException {
fmParser.saveCmdl(outStream, templete.getConstraintModel(), templete.getFeatureModel());
}
public void savePa(OutputStream outStream, Templete templete)
throws IOException, JDOMException {
Namespace xsi = Namespace.getNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
Namespace pad = Namespace.getNamespace("pad", "http://sei.pku.edu.cn/DomainEngineering/parameters");
Document doc = new Document(new Element("Parameters", pad));
Element root = doc.getRootElement();
root.setAttribute("schemaLocation", "http://sei.pku.edu.cn/DomainEngineering/Parameter Parameter.xsd", xsi).setAttribute("name", templete.getName());
Map featureParameter = templete.getParameters().getFeatureNumMap();
Iterator featureParameterIterator = featureParameter.keySet().iterator();
while (featureParameterIterator.hasNext()) {
String featureId = (String) featureParameterIterator.next();
String instanceNum = featureParameter.get(featureId).toString();
Element featureElement = new Element("feature", pad);
featureElement.setAttribute("ID", featureId).addContent(instanceNum);
root.addContent(featureElement);
}
XMLOutputter fmt = new XMLOutputter(" ", true, "GB2312");
fmt.output(doc, outStream);
}
public PatternBase openPl(InputStream inputStream, String baseType)
throws IOException, JDOMException {
PatternBase patternBase = new PatternBaseImplementation();
patternBase.setBaseType(baseType);
Namespace pbd = Namespace.getNamespace("pbd", "http://sei.pku.edu.cn/DomainEngineering/PatternBase");
SAXBuilder saxBuilder = new SAXBuilder(false);
Document doc = saxBuilder.build(inputStream);
Element root = doc.getRootElement();
patternBase.setName(root.getAttributeValue("name"));
//�������patternʵ��
Element patternList = root.getChild("patternList", pbd);
Iterator patternIterator = patternList.getChildren().iterator();
while (patternIterator.hasNext()) {
Element patternElement = (Element) patternIterator.next();
patternBase.addPattern(patternElement.getAttributeValue("name"));
}
//�������templeteʵ��
Element templeteList = root.getChild("templeteList", pbd);
Iterator templeteIterator = templeteList.getChildren().iterator();
while (templeteIterator.hasNext()) {
Element templeteElement = (Element) templeteIterator.next();
patternBase.addTemplete(templeteElement.getAttributeValue("name"));
}
//Ϊ���е�ÿһ��ģʽ����������ԣ�����ģʽ��������������
Iterator patternIteratorAgain = patternList.getChildren().iterator();
while (patternIteratorAgain.hasNext()) {
Element patternElement = (Element) patternIteratorAgain.next();
Pattern pattern = patternBase.getPattern(patternElement.getAttributeValue("name"));
String description = patternElement.getChild("description", pbd).getTextNormalize();
description = _decode(description);
pattern.setDescription(description);
Element parent = patternElement.getChild("parent", pbd);
if (parent != null) {
Pattern parentPattern = patternBase.getPattern(parent.getAttributeValue("name"));
pattern.setParentPattern(parentPattern);
}
Element childrenList = patternElement.getChild("childrenList", pbd);
Element childrenPatternList = childrenList.getChild("childPatternList", pbd);
Element childrenTempleteList = childrenList.getChild("childTempleteList", pbd);
if (childrenPatternList != null) {
Iterator childrenPatternIterator = childrenPatternList.getChildren().iterator();
while (childrenPatternIterator.hasNext()) {
Element childPatternElement = (Element) childrenPatternIterator.next();
Pattern childPattern = patternBase.getPattern(childPatternElement.getAttributeValue("name"));
pattern.addChildPattern(childPattern);
}
}
if (childrenTempleteList != null) {
Iterator childrenTempleteIterator = childrenTempleteList.getChildren().iterator();
while (childrenTempleteIterator.hasNext()) {
Element childTempleteElement = (Element) childrenTempleteIterator.next();
Templete childTemplete = patternBase.getTemplete(childTempleteElement.getAttributeValue("name"));
pattern.addChildTemplete(childTemplete);
}
}
}
Iterator templeteIteratorAgain = templeteList.getChildren().iterator();
while (templeteIteratorAgain.hasNext()) {
Element templeteElement = (Element) templeteIteratorAgain.next();
Templete templete = patternBase.getTemplete(templeteElement.getAttributeValue("name"));
Element parent = templeteElement.getChild("parent", pbd);
if (parent.getAttributeValue("type") == "templete") {
Templete parentTemplete = patternBase.getTemplete(parent.getAttributeValue("name"));
templete.setParentTemplete(parentTemplete);
} else {
Pattern parentPattern = patternBase.getPattern(parent.getAttributeValue("name"));
templete.setParentPattern(parentPattern);
}
Element childList = templeteElement.getChild("childTempleteList", pbd);
if (childList != null) {
Iterator childTempleteIterator = childList.getChildren().iterator();
while (childTempleteIterator.hasNext()) {
Element childTempleteElement = (Element) childTempleteIterator.next();
Templete childTemplete = patternBase.getTemplete(childTempleteElement.getAttributeValue("name"));
templete.addChildTemplete(childTemplete);
}
}
}
return patternBase;
}
public FComponent openFm(InputStream inputstream)
throws IOException, JDOMException {
return fmParser.openFmdl(inputstream);
}
public void openCm(InputStream inputstream, Templete templete)
throws IOException, JDOMException {
fmParser.openCmdl(inputstream, templete.getFComponent());
}
public void openPa(InputStream inputstream, Templete templete)
throws IOException, JDOMException {
SAXBuilder saxBuilder = new SAXBuilder(false);
Document doc = saxBuilder.build(inputstream);
Element root = doc.getRootElement();
Iterator featureParameterIterator = root.getChildren().iterator();
while (featureParameterIterator.hasNext()) {
Element featureParameterElement = (Element) featureParameterIterator.next();
String featureId = featureParameterElement.getAttributeValue("ID");
Integer featureNum = new Integer(featureParameterElement.getTextNormalize());
templete.getParameters().getFeatureNumMap().put(featureId, featureNum);
}
}
protected static String _encode(String in) {
String out = in;
out = out.replaceAll("\u0020", "#x20");
out = out.replaceAll("\u0009", "#x09");
out = out.replaceAll("\n", "#x0a");
out = out.replaceAll("\r", "#x0d");
return out;
}
// decode:��ԭXML����
protected static String _decode(String in) {
String out = in;
out = out.replaceAll("#x20", "\u0020");
out = out.replaceAll("#x09", "\u0009");
out = out.replaceAll("#x0a", "\n");
out = out.replaceAll("#x0d", "\r");
return out;
}
}