modules/helpers/bundleGen/src/main/java/org/rhq/helpers/bundleGen/XmlQuestionsReader.java | 205 ++++++---- modules/helpers/bundleGen/src/main/resources/questions.dtd | 11 pom.xml | 6 3 files changed, 139 insertions(+), 83 deletions(-)
New commits: commit 6e03907d4f26b130f37426e50cdd4df0d111d344 Author: Heiko W. Rupp hwr@pilhuhn.de Date: Sun Jul 25 14:29:57 2010 +0200
BZ 604034 - use a newer version of jaxb impl to avoid issues with maven repos.
diff --git a/pom.xml b/pom.xml index ab4b267..306bbff 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@
<properties> <!-- explictly specify a default encoding to avoid relying on the LANG env var being set correctly --> - <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding> + <project.build.sourceEncoding>ISO-8859-1</project.build.sourceEncoding>
<rhq.groupId>org.rhq</rhq.groupId> <rhq.product.name>RHQ</rhq.product.name> @@ -52,7 +52,7 @@ <product.salesEmail>sales@rhq-project.org</product.salesEmail> <product.supportEmail>info@rhq-project.org</product.supportEmail> <product.version>${project.version}</product.version> - <product.helpDocRoot>http://support.rhq-project.org/display/RHQ/</product.helpDocRoot> + <product.helpDocRoot>http://support.rhq-project.org/display/RHQ/</product.helpDocRoot>
<doUpdate>false</doUpdate>
@@ -81,7 +81,7 @@ <hibernate-entitymanager.version>3.2.1.GA</hibernate-entitymanager.version> <i18nlog.version>1.0.10</i18nlog.version> <jaxb-api.version>2.1</jaxb-api.version> - <jaxb-impl.version>2.1.6</jaxb-impl.version> + <jaxb-impl.version>2.1.9</jaxb-impl.version> <jsf-api.version>1.2_14</jsf-api.version> <jsf-impl.version>1.2_14</jsf-impl.version> <ojdbc5.version>11.2.0.1.0</ojdbc5.version>
commit a1ab2bc79180820bfa05ec8284a03830c5c7f0e0 Author: Heiko W. Rupp hwr@pilhuhn.de Date: Sun Jul 25 14:28:49 2010 +0200
Start rewriting to handle blocks of questions.
diff --git a/modules/helpers/bundleGen/src/main/java/org/rhq/helpers/bundleGen/XmlQuestionsReader.java b/modules/helpers/bundleGen/src/main/java/org/rhq/helpers/bundleGen/XmlQuestionsReader.java index 649cbf5..6e72405 100644 --- a/modules/helpers/bundleGen/src/main/java/org/rhq/helpers/bundleGen/XmlQuestionsReader.java +++ b/modules/helpers/bundleGen/src/main/java/org/rhq/helpers/bundleGen/XmlQuestionsReader.java @@ -21,8 +21,11 @@ package org.rhq.helpers.bundleGen; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.InputStream; +import java.util.Collections; +import java.util.HashMap; import java.util.Locale; import java.lang.reflect.Method; +import java.util.Map; import java.util.ResourceBundle;
import javax.xml.parsers.DocumentBuilder; @@ -78,100 +81,126 @@ public class XmlQuestionsReader {
Document doc = builder.parse(input); Element root = doc.getDocumentElement(); // <questions> - NodeList questionNodes = root.getChildNodes();// "question" + NodeList questionNodes = root.getChildNodes();// "question|block"
for (int i = 0; i < questionNodes.getLength(); i++ ) { Node node = questionNodes.item(i); if (node instanceof Element) { - Element question = (Element)node; - String prop = question.getAttribute("prop"); - String type = question.getAttribute("type"); - if (type.equals("")) - type="string"; - String aIf = question.getAttribute("if"); // TODO implement - - if (!isValidType(type)) { - System.err.println("Type " + type + " is invalid in " + question ); - return; + String nodeName = node.getNodeName(); + if (nodeName.equals("question")) { + Element question = (Element)node; + String res = handleQuestion(reader,question,lang); + String prop = question.getAttribute("prop"); + String type = question.getAttribute("type"); + fillObject(props,prop,type,res); } - Element text = getElementForLang(question,"text",lang); - NodeList prefillNodes = question.getElementsByTagName("prefill"); - String prefill = null; - if (prefillNodes.getLength()>0) { - prefill = prefillNodes.item(0).getTextContent(); - } - Element helpNode = getElementForLang(question,"help",lang); - String help = null; - if (helpNode!=null) { - help = helpNode.getTextContent(); - } - - boolean isBool = false; - System.out.print(text.getTextContent()); - if ("bool".equals(type)) { - isBool = true; - System.out.print(resourceBundle.getString("yes.no")); - } - if (prefill!=null) { - System.out.print("[" + prefill + "]"); - } - - String answer; - boolean helpRequested = false; - do { - helpRequested = false; - System.out.print(": "); - answer = reader.readLine(); - if (answer.startsWith("?")) { - helpRequested = true; - if (help!=null) { - System.out.println(help); - } - else - System.out.println(resourceBundle.getString("no.help.available")); - } - - } while (helpRequested); - - String setterName = "set" + caps(prop); - Method setter; - if (isBool) - setter = Props.class.getMethod(setterName, Boolean.TYPE); - else - setter = Props.class.getMethod(setterName, String.class); - - if (isBool) { - String yesString = resourceBundle.getString("yes.key"); - if (answer.toLowerCase(Locale.getDefault()).startsWith(yesString)) { - setter.invoke(props, true); - } - } - else if ("string".equals(type)) { - // If only return pressed and we have a prefill, use this. - if (prefill!= null && answer.length()==0) { - setter.invoke(props,prefill); - } - else { - if (!answer.startsWith("\n") && !answer.startsWith("\r") && !(answer.length() == 0)) - setter.invoke(props,answer); - } - } - else { + else if (nodeName.equals("block")) { +// Map res = handleBlock(reader,node,props,lang); // TODO } } + } + } + catch (Exception e ) { + e.printStackTrace(); + } + }
+ private void handleBlock(BufferedReader reader, Node node, Props props, String lang) throws Exception + { + Element block = (Element)node; + String repeat = block.getAttribute("repeat"); + if (repeat==null || repeat.isEmpty()) + repeat="one";
+ int repeatCount = 0;
- } +// for () { +// // first ask the standalone question and decide from there +// Element question = (Element) block.getElementsByTagName("question").item(0); +// +// +// // Now loop over the questions +// NodeList questions = block.getElementsByTagName("question"); +// for (int i = 1; i < questions.getLength(); i++) { +// Node qnode = questions.item(i); +// // handleQuestion(reader,qnode,props,lang); TODO +// } +// } + } + + /** + * Handle <question> elements + * @param reader + * @param question + * @param lang + * @throws Exception + */ + private String handleQuestion(BufferedReader reader, Element question,String lang) throws Exception + { + String type = question.getAttribute("type"); + if (type.equals("")) + type="string"; + + if (!isValidType(type)) { + System.err.println("Type " + type + " is invalid in " + question ); + return null; + } + Element text = getElementForLang(question,"text",lang); + NodeList prefillNodes = question.getElementsByTagName("prefill"); + String prefill = null; + if (prefillNodes.getLength()>0) { + prefill = prefillNodes.item(0).getTextContent(); } - catch (Exception e) { - throw e; + Element helpNode = getElementForLang(question,"help",lang); + String help = null; + if (helpNode!=null) { + help = helpNode.getTextContent(); }
+ System.out.print(text.getTextContent()); + if ("bool".equals(type)) { + System.out.print(resourceBundle.getString("yes.no")); + } + if (prefill!=null) { + System.out.print("[" + prefill + "]"); + } + + String answer; + boolean helpRequested = false; + do { + helpRequested = false; + System.out.print(": "); + answer = reader.readLine(); + if (answer.startsWith("?")) { + helpRequested = true; + if (help!=null) { + System.out.println(help); + } + else + System.out.println(resourceBundle.getString("no.help.available")); + } + + } while (helpRequested); + + if (type.equals("bool")) { + String yesString = resourceBundle.getString("yes.key"); + if (answer.toLowerCase(Locale.getDefault()).startsWith(yesString)) + return Boolean.TRUE.toString(); + else + return Boolean.FALSE.toString(); + } + else { + if (prefill!= null && answer.length()==0) { + return prefill; + } + else + return answer; + } }
+ /** * Search for an element <i>tagWanted</i> within parent. If multiple * elements are present, use the one with the matching <i>lang</i>. @@ -201,6 +230,26 @@ public class XmlQuestionsReader { } return noLang; } + + + private void fillObject(Object target, String prop, String type, String res) throws Exception { + + String setterName = "set" + caps(prop); + Method setter; + Class clazz = target.getClass(); + Method[] methods = clazz.getDeclaredMethods(); + + if ("bool".equals(type)) { + setter = clazz.getMethod(setterName, Boolean.TYPE); + setter.invoke(target, Boolean.valueOf(res)); + } + else { + setter = clazz.getMethod(setterName, String.class); + setter.invoke(target,res); + } + } + + /** * Returns true if the passed type is a valid data type of the properties (not for a single * property). @@ -209,7 +258,7 @@ public class XmlQuestionsReader { */ private boolean isValidType(String type) {
- if ("bool".equals(type) || "string".equals(type) || "resourceCategory".equals(type)) + if ("bool".equals(type) || "string".equals(type)) return true;
return false; diff --git a/modules/helpers/bundleGen/src/main/resources/questions.dtd b/modules/helpers/bundleGen/src/main/resources/questions.dtd index ed3981a..13fe665 100644 --- a/modules/helpers/bundleGen/src/main/resources/questions.dtd +++ b/modules/helpers/bundleGen/src/main/resources/questions.dtd @@ -1,6 +1,6 @@
<!-- root of all evil --> -<!ELEMENT questions (question+)> +<!ELEMENT questions (question|block)+>
<!-- one single question --> <!ELEMENT question (text+, options?, prefill?, help*)> @@ -8,11 +8,18 @@ <!ATTLIST question prop CDATA #REQUIRED type (bool|string) #IMPLIED - if (true|false) #IMPLIED strip (start|end|outer|all) #IMPLIED
+<!-- a block of questions asked together --> +<!-- First a question is displayed to introduce the block --> +<!-- And to check if the remainder should be asked at all --> +<!-- Then questions are asked --> +<!ELEMENT block (question,question+)>
+<!ATTLIST block + repeat (one|multi) #IMPLIED +>
<!-- The text to ask --> <!ELEMENT text (#PCDATA)>
rhq-commits@lists.fedorahosted.org