private void fillGridRow( FormEntryController formEntryController, GridRow gridRow, int columnIndex) throws Exception { FormEntryPrompt currentQuestionPrompt = formEntryController.getModel().getQuestionPrompt(); IAnswerData currentAnswer = currentQuestionPrompt.getAnswerValue(); if (currentAnswer == null) return; final int dataType = currentQuestionPrompt.getDataType(); QuestionDef questionDef = currentQuestionPrompt.getQuestion(); String answerAsString = getMartusAnswerStringFromQuestion(currentAnswer, questionDef, dataType); gridRow.setCellText(columnIndex, answerAsString); }
private FieldSpec convertToFieldSpec(FormEntryPrompt questionPrompt) { QuestionDef question = questionPrompt.getQuestion(); final int dataType = questionPrompt.getDataType(); TreeReference reference = (TreeReference) question.getBind().getReference(); String tag = reference.getNameLast(); String questionLabel = questionPrompt.getQuestion().getLabelInnerText(); if (questionPrompt.isReadOnly()) return FieldSpec.createCustomField(tag, questionLabel, new FieldTypeMessage()); if (isNormalFieldType(dataType)) return FieldSpec.createCustomField(tag, questionLabel, new FieldTypeNormal()); if (dataType == Constants.DATATYPE_DATE) return FieldSpec.createCustomField(tag, questionLabel, new FieldTypeDate()); if (shouldTreatSingleItemChoiceListAsBooleanField(dataType, question)) return FieldSpec.createCustomField(tag, questionLabel, new FieldTypeBoolean()); if (dataType == Constants.DATATYPE_CHOICE) { Vector<ChoiceItem> convertedChoices = new Vector<ChoiceItem>(); List<SelectChoice> choicesToConvert = question.getChoices(); for (SelectChoice choiceToConvert : choicesToConvert) { // String choiceItemCode = choiceToConvert.getValue(); String choiceItemLabel = choiceToConvert.getLabelInnerText(); // Martus doesn't keep Code's when exporting so use Label twice instead convertedChoices.add(new ChoiceItem(choiceItemLabel, choiceItemLabel)); } FieldSpec fieldSpec = new CustomDropDownFieldSpec(convertedChoices); fieldSpec.setTag(tag); fieldSpec.setLabel(questionLabel); return fieldSpec; } MartusLogger.log( "Warning: BulletinFromXFormsLoader.convertToFieldSpec unknown Field Type:" + String.valueOf(dataType)); return null; }
private FormEntryPrompt findQuestion( FormEntryController formEntryContorller, TreeReference treeReferenceToMatch) { formEntryContorller.jumpToIndex(FormIndex.createBeginningOfFormIndex()); int event; while ((event = formEntryContorller.stepToNextEvent()) != FormEntryController.EVENT_END_OF_FORM) { if (event == FormEntryController.EVENT_QUESTION) { FormEntryPrompt questionPrompt = formEntryContorller.getModel().getQuestionPrompt(); QuestionDef thisQuestionDef = questionPrompt.getQuestion(); TreeReference thisTreeReference = (TreeReference) thisQuestionDef.getBind().getReference(); if (thisTreeReference.equals(treeReferenceToMatch)) return questionPrompt; } } return null; }
private Bulletin createBulletin( MartusCrypto signatureGenerator, FormEntryController formEntryController, FieldSpecCollection fieldsFromXForms) throws Exception { FieldSpecCollection allFields = new FieldSpecCollection(); FieldSpecCollection nonEmptytopSectionFieldSpecsFrom = getNonEmptyTopFieldSpecs(); allFields.addAll(nonEmptytopSectionFieldSpecsFrom); allFields.addAll(fieldsFromXForms); Bulletin bulletinLoadedFromXForms = new Bulletin(signatureGenerator, allFields, new FieldSpecCollection()); transferAllStandardFields(bulletinLoadedFromXForms, nonEmptytopSectionFieldSpecsFrom); resetFormEntryControllerIndex(formEntryController); int event; while ((event = formEntryController.stepToNextEvent()) != FormEntryController.EVENT_END_OF_FORM) { if (event == FormEntryController.EVENT_REPEAT) convertXFormRepeatToGridData( formEntryController, fieldsFromXForms, bulletinLoadedFromXForms); if (event != FormEntryController.EVENT_QUESTION) continue; FormEntryPrompt questionPrompt = formEntryController.getModel().getQuestionPrompt(); IAnswerData answer = questionPrompt.getAnswerValue(); if (answer == null) continue; QuestionDef question = questionPrompt.getQuestion(); final int dataType = questionPrompt.getDataType(); TreeReference reference = (TreeReference) question.getBind().getReference(); FieldDataPacket fieldDataPacket = bulletinLoadedFromXForms.getFieldDataPacket(); String xFormsFieldTag = reference.getNameLast(); String answerAsString = getMartusAnswerStringFromQuestion(answer, question, dataType); fieldDataPacket.set(xFormsFieldTag, answerAsString); } copyPrivateAttachmentProxies(bulletinLoadedFromXForms); copyPublicAttachmentProxies(bulletinLoadedFromXForms); return bulletinLoadedFromXForms; }
protected ItemsetWidget( Context context, FormEntryPrompt prompt, boolean readOnlyOverride, boolean derived) { super(context, prompt); mButtons = new RadioGroup(context); mButtons.setId(QuestionWidget.newUniqueId()); mReadOnly = prompt.isReadOnly() || readOnlyOverride; mAnswers = new HashMap<String, String>(); String currentAnswer = prompt.getAnswerText(); // the format of the query should be something like this: // query="instance('cities')/root/item[state=/data/state and county=/data/county]" // "query" is what we're using to notify that this is an // itemset widget. String nodesetStr = prompt.getQuestion().getAdditionalAttribute(null, "query"); // parse out the list name, between the '' String list_name = nodesetStr.substring(nodesetStr.indexOf("'") + 1, nodesetStr.lastIndexOf("'")); // isolate the string between between the [ ] characters String queryString = nodesetStr.substring(nodesetStr.indexOf("[") + 1, nodesetStr.lastIndexOf("]")); StringBuilder selection = new StringBuilder(); // add the list name as the first argument, which will always be there selection.append("list_name=?"); // check to see if there are any arguments if (queryString.indexOf("=") != -1) { selection.append(" and "); } // can't just split on 'and' or 'or' because they have different // behavior, so loop through and break them off until we don't have any // more // must include the spaces in indexOf so we don't match words like // "land" int andIndex = -1; int orIndex = -1; ArrayList<String> arguments = new ArrayList<String>(); while ((andIndex = queryString.indexOf(" and ")) != -1 || (orIndex = queryString.indexOf(" or ")) != -1) { if (andIndex != -1) { String subString = queryString.substring(0, andIndex); String pair[] = subString.split("="); if (pair.length == 2) { selection.append(pair[0].trim() + "=? and "); arguments.add(pair[1].trim()); } else { // parse error } // move string forward to after " and " queryString = queryString.substring(andIndex + 5, queryString.length()); andIndex = -1; } else if (orIndex != -1) { String subString = queryString.substring(0, orIndex); String pair[] = subString.split("="); if (pair.length == 2) { selection.append(pair[0].trim() + "=? or "); arguments.add(pair[1].trim()); } else { // parse error } // move string forward to after " or " queryString = queryString.substring(orIndex + 4, queryString.length()); orIndex = -1; } } // parse the last segment (or only segment if there are no 'and' or 'or' // clauses String pair[] = queryString.split("="); if (pair.length == 2) { selection.append(pair[0].trim() + "=?"); arguments.add(pair[1].trim()); } if (pair.length == 1) { // this is probably okay, because then you just list all items in // the list } else { // parse error } // +1 is for the list_name String[] selectionArgs = new String[arguments.size() + 1]; boolean nullArgs = false; // can't have any null arguments selectionArgs[0] = list_name; // first argument is always listname // loop through the arguments, evaluate any expressions // and build the query string for the DB for (int i = 0; i < arguments.size(); i++) { XPathExpression xpr = null; try { xpr = XPathParseTool.parseXPath(arguments.get(i)); } catch (XPathSyntaxException e) { e.printStackTrace(); TextView error = new TextView(context); error.setText("XPathParser Exception: \"" + arguments.get(i) + "\""); addView(error); break; } if (xpr != null) { FormDef form = Collect.getInstance().getFormController().getFormDef(); TreeElement mTreeElement = form.getMainInstance().resolveReference(prompt.getIndex().getReference()); EvaluationContext ec = new EvaluationContext(form.getEvaluationContext(), mTreeElement.getRef()); Object value = xpr.eval(form.getMainInstance(), ec); if (value == null) { nullArgs = true; } else { if (value instanceof XPathNodeset) { XPathNodeset xpn = (XPathNodeset) value; value = xpn.getValAt(0); } selectionArgs[i + 1] = value.toString(); } } } File itemsetFile = new File( Collect.getInstance().getFormController().getMediaFolder().getAbsolutePath() + "/itemsets.csv"); if (nullArgs) { // we can't try to query with null values else it blows up // so just leave the screen blank // TODO: put an error? } else if (itemsetFile.exists()) { ItemsetDbAdapter ida = new ItemsetDbAdapter(); ida.open(); // name of the itemset table for this form String pathHash = ItemsetDbAdapter.getMd5FromString(itemsetFile.getAbsolutePath()); try { Cursor c = ida.query(pathHash, selection.toString(), selectionArgs); if (c != null) { c.move(-1); while (c.moveToNext()) { String label = ""; String val = ""; // try to get the value associated with the label:lang // string if that doen't exist, then just use label String lang = ""; if (Collect.getInstance().getFormController().getLanguages() != null && Collect.getInstance().getFormController().getLanguages().length > 0) { lang = Collect.getInstance().getFormController().getLanguage(); } // apparently you only need the double quotes in the // column name when creating the column with a : // included String labelLang = "label" + "::" + lang; int langCol = c.getColumnIndex(labelLang); if (langCol == -1) { label = c.getString(c.getColumnIndex("label")); } else { label = c.getString(c.getColumnIndex(labelLang)); } // the actual value is stored in name val = c.getString(c.getColumnIndex("name")); mAnswers.put(label, val); RadioButton rb = new RadioButton(context); rb.setOnCheckedChangeListener(this); rb.setText(label); rb.setTextSize(mAnswerFontsize); mButtons.addView(rb); // have to add it to the radiogroup before checking it, // else it lets two buttons be checked... if (currentAnswer != null && val.compareTo(currentAnswer) == 0) { rb.setChecked(true); } } c.close(); } } finally { ida.close(); } addView(mButtons); } else { TextView error = new TextView(context); error.setText(getContext().getString(R.string.file_missing, itemsetFile.getAbsolutePath())); addView(error); } }
public String getQuetionLabel(FormEntryPrompt questionPrompt) { return questionPrompt.getQuestion().getLabelInnerText(); }