Rev 1611 |
Blame |
Compare with Previous |
Last modification |
View Log
| RSS feed
package dongfang.mkt.configuration;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ParameterSet
extends ConfigurationSet
{
public static final int NUMBER_OF_VARIABLES =
8;
List<ParameterSection
> declaredSections =
new ArrayList<ParameterSection
>();
protected String name
;
protected int correctLengthToExcludeName
(int length
) {
return length -
12;
}
protected void setName
(int[] data,
int offset
) {
StringBuilder sbname =
new StringBuilder();
for (int i =
0; i
< 12; i++
) {
if (data
[offset
] ==
0)
break;
sbname.
append((char) data
[offset++
]);
}
name = sbname.
toString();
}
protected void outputName
(StringBuilder sb
) {
sb.
append(name +
"\n");
}
public List<ParameterSection
> getDeclaredSections
() {
return declaredSections
;
}
public String toXML
() {
StringBuilder result =
new StringBuilder();
result.
append("<parameterset eepromVersion=\"" + eepromVersion
+
"\" length=\"" + getByteCount
() +
"\">\n");
for (int i =
0; i
< entries.
size(); i++
) {
ParameterEntry entry = entries.
get(i
);
entry.
toXML(result
);
}
result.
append("</parameterset>\n");
return result.
toString();
}
public ParameterSet
(int eepromVersion
) {
super();
this.
eepromVersion = eepromVersion
;
}
// This parses only for the purpose of naming and typing parameter sets!
// It does not parse the section and default information, which could be
// useful for GUIs etc.
public static ParameterSet parseXMLParameterSet
(int version
)
throws IOException {
String fileName =
"configsets/templates/parameterset_v" + version
+
".xml";
File f =
new File(fileName
);
DocumentBuilderFactory saxfac =
DocumentBuilderFactory.
newInstance();
saxfac.
setValidating(false);
try {
DocumentBuilder bldr = saxfac.
newDocumentBuilder();
Document doc = bldr.
parse(f
);
XPath xpath =
XPathFactory.
newInstance().
newXPath();
String s_eepromVersion = xpath.
evaluate(
"/parametertemplate/@eepromVersion", doc
);
int eepromVersion =
Integer.
parseInt(s_eepromVersion
);
String s_declaredLength = xpath.
evaluate(
"/parametertemplate/@length", doc
);
int declaredLength =
Integer.
parseInt(s_declaredLength
);
if (eepromVersion
!= version
) {
throw new IOException(
"Version mismatch between file name ("
+ fileName
+
") and the version in the parametertemplate/@eepromVersion attribute("
+ s_eepromVersion +
")");
}
ParameterSet result =
new ParameterSet
(eepromVersion
);
NodeList sectionNodes =
(NodeList) xpath.
evaluate(
"/parametertemplate/section", doc,
XPathConstants.
NODESET);
for (int i =
0; i
< sectionNodes.
getLength(); i++
) {
Element sectionNode =
(Element) sectionNodes.
item(i
);
ParameterSection section =
new ParameterSection
(
sectionNode.
getAttribute("name"),
sectionNode.
getAttribute("title"));
result.
declaredSections.
add(section
);
NodeList parameterNodes =
(NodeList) xpath.
evaluate(
"parameter", sectionNode,
XPathConstants.
NODESET);
for (int j =
0; j
< parameterNodes.
getLength(); j++
) {
Element parameterNode =
(Element) parameterNodes.
item(j
);
ParameterEntry entry
;
if (!sectionNode.
hasAttribute("name")) {
throw new IOException("A parameter element (the " + j
+
"th in section "
+ sectionNode.
getAttribute("name")
+
") had no name attribute!");
}
String s_name = parameterNode.
getAttribute("name");
String s_type
;
if (parameterNode.
hasAttribute("type")) {
s_type = parameterNode.
getAttribute("type");
} else {
s_type =
"static";
}
if ("static".
equals(s_type
)) {
entry =
new StaticByteEntry
(s_name
);
} else if ("dynamic".
equals(s_type
)) {
DynamicByteEntry de =
new DynamicByteEntry
(s_name
);
if (parameterNode.
hasAttribute("minValue")) {
de.
setMinValue(Integer.
parseInt(parameterNode
.
getAttribute("minValue")));
}
if (parameterNode.
hasAttribute("maxValue")) {
de.
setMinValue(Integer.
parseInt(parameterNode
.
getAttribute("maxValue")));
}
if (parameterNode.
hasAttribute("staticCodeName")) {
de.
setStaticCodeName(parameterNode
.
getAttribute("staticCodeName"));
} else
de.
setStaticCodeName(de.
getName());
if (parameterNode.
hasAttribute("dynamicCodeName")) {
de.
setDynamicCodeName(parameterNode
.
getAttribute("dynamicCodeName"));
} else
de.
setDynamicCodeName(de.
getName());
entry = de
;
} else if ("bitset".
equals(s_type
)) {
NodeList bitNodes =
(NodeList) xpath.
evaluate("bit",
parameterNode,
XPathConstants.
NODESET);
String[] bitNames =
new String[8];
for (int k =
0; k
< 8; k++
) {
Element bitNode =
(Element) bitNodes.
item(k
);
if (bitNode
!=
null) {
bitNames
[k
] = bitNode.
getAttribute("name");
} else {
bitNames
[k
] =
"Unused";
}
}
entry =
new BitSetEntry
(s_name, bitNames
);
} else {
throw new IOException("Unknown parameter type: "
+ s_type
);
}
result.
entries.
add(entry
);
section.
addConfigEntry(entry
);
}
}
result.
name =
"" + version
;
if (result.
getByteCount() != declaredLength
) {
throw new IOException("The number of parameters in the set ("
+ result.
getEntries().
size()
+
") was not equal to the declared length ("
+ declaredLength +
").");
}
return result
;
} catch (IOException ex
) {
throw ex
;
} catch (XPathExpressionException ex
) {
throw new IOException(ex
);
} catch (SAXException ex
) {
throw new IOException(ex
);
} catch (ParserConfigurationException ex
) {
throw new IOException(ex
);
}
}
}