/*
* HtmlQuestionasgroup.java
*
* Created on 4. toukokuuta 2003, 11:23
*/
package kottarainenbeans;
import java.beans.*;
import kotkabeans.*;
import kiurubeans.HtmlBean;
import kottarainenbeans.*;
import java.sql.*;
import java.util.*;
import javax.servlet.http.*;
/**
*
* @author sampsa
*
* Modified 8.5.2003 by tmpoyhon
* - in answering fields' labels' printing fixed
*/
public class HtmlQuestionasgroup extends Questionasgroup
implements java.io.Serializable {
private String htmtTemplatePath;
private TemplateHandler htmlTH;
private String printType="";
private int subQuestiontypeid=1;
private int subSubElementCount=1;
/** Same as in parent class Questionasgroup */
public HtmlQuestionasgroup(String JSPvid, String templatePath) {
super(JSPvid, templatePath);
}
/** returns the path of common htmt directory */
public String getHtmtTemplatePath() {
return this.htmtTemplatePath;
}
/** sets htmt directory */
public void setHtmtTemplatePath(String htmtTemplatePath) {
this.htmtTemplatePath = htmtTemplatePath;
}
/** creates TemplateHandler for html handling */
public void setHtmlTH() {
this.htmlTH =
new TemplateHandler(getHtmtTemplatePath()+"/Questionasgroup.htmt");
}
/** returns type, which this class builds html.
* Only one type is no longer implemented and this type is not needed.
*/
public String getPrintType() {
return this.printType;
}
/** sets printtype. Not yet needed. */
public void setPrintType(String printType) {
this.printType = printType;
}
/** returns not deleted subElements (questions) amount. */
public int getSubElementCount() {
Enumeration en= subElements.elements();
int i = 0;
while(en.hasMoreElements()){
Question question=(Question)en.nextElement();
if(question.isPointerDeleted() == false)
i++;
}
return i;
}
/** returns subElemenet (Questionfields) amount inside of the first
* subElement (Question)
*/
public int getSubSubElementCount() {
return this.subSubElementCount;
}
/** set subElement (Questionfield) amount in every subElement (Question).
* If there is more than wanted,function will mark delete attribute as true.
*/
public void setSubSubElementCount(int subSubElementCount) {
this.subSubElementCount = subSubElementCount;
}
/** returns the type that all subElements (Question) should be. */
public int getSubQuestiontypeid() {
return this.subQuestiontypeid;
}
/** Sets the type that all subElements (Question) should be. */
public void setSubQuestiontypeid(int subQuestiontypeid) {
this.subQuestiontypeid = subQuestiontypeid;
}
/** returns html code that is build. opens also db-connection
*
*/
public String getHtml() {
DB db=new DB("Haetaan gethtml:n kautta");
String get="";
try{
db.connect();
get=getHtml(db);
}finally{
db.disconnect();
return get;
}
}
/** returns html code that is build. */
public String getHtml(DB db) {
Properties variableTable = getHtmlValues(db);
if (getPrintType().equals("for_answering")) {
String html = htmlTH.CompleteTemplate("" +
"for_answering_questionasgroup_content", variableTable);
//if no label then just prints questions
if (!getLabel().equals("")) {
variableTable.setProperty("content",html);
return htmlTH.CompleteTemplate("" +
"for_answering_questionasgroup_header", variableTable);
} else {
return html;
}
}
else if (getPrintType().equals("edit")) {
return htmlTH.CompleteTemplate("edit_questionasgroup",variableTable);
}
else return "";
}
private String getSubElementsHtml() {
Enumeration en = subElements.elements();
String print="";
String fieldDefaults="";
Properties macroTable = new Properties();
String fieldHiddens="";
int i = 1;
int j = 1;
boolean isHeaderPrinted = false; //flag for fieldlabel input printing
while(en.hasMoreElements()){
Question subElement = (Question)en.nextElement();
if (subElement.isDeleted() || subElement.isPointerDeleted())
continue;
//this builds input for questionfield labels or header text if
//printtype is answering
if (isHeaderPrinted == false) {
print = getFieldHeaders(subElement);
isHeaderPrinted = true;
}
macroTable.setProperty("label",subElement.getLabel());
macroTable.setProperty("JSPvid",subElement.getJSPvid());
Enumeration QuestionFields = subElement.getSubElements().elements();
while(QuestionFields.hasMoreElements()){
if (j > getSubSubElementCount())
break;
Questionfield subSubElement =
(Questionfield)QuestionFields.nextElement();
if (subSubElement.isDeleted())
continue;
if(getPrintType().equals("for_answering")) {
fieldDefaults = fieldDefaults +
getAnsweringSubSubElementsHtml(subSubElement,j++,
subElement.getQuestiontypeid(),subElement.getJSPvid());
fieldHiddens = fieldHiddens + getFieldHiddens(subSubElement);
}
else
fieldDefaults = fieldDefaults + getSubSubElementsHtml(
subSubElement,j++, subElement.getQuestiontypeid(),
subElement.getJSPvid());
}
macroTable.setProperty("questionid",
Integer.toString(subElement.getQuestionid()));
if(subElement.getQuestiontypeid()==4 && getPrintType().equals(""+
"for_answering")){
macroTable.setProperty("radios",fieldDefaults);
fieldDefaults = htmlTH.CompleteTemplate(""+
"for_answering_radio_hidden", macroTable);
}
if(subElement.getQuestiontypeid()==5 && getPrintType().equals(""+
"for_answering")){
macroTable.setProperty("options",fieldDefaults);
fieldDefaults = htmlTH.CompleteTemplate("for_answering_select",
macroTable);
}
macroTable.setProperty("fielddefaults",fieldDefaults);
if(getPrintType().equals("for_answering"))
print = print +
htmlTH.CompleteTemplate("for_answering_question",macroTable);
else
print = print + htmlTH.CompleteTemplate("question",macroTable);
i++;
j=1;
fieldDefaults = "";
}
return print;
}
private String getFieldHiddens(Questionfield subSubElement){
Properties macroTable = new Properties();
macroTable.setProperty("id",
String.valueOf(subSubElement.getQuestionfieldid()));
return htmlTH.CompleteTemplate("hiddens", macroTable);
}
private String getSubSubElementsHtml(Questionfield subSubElement,
int fieldnum, int qstypeid,String qsJSPvid) {
Properties macroTable = new Properties();
macroTable.setProperty("JSPvid",
String.valueOf(subSubElement.getJSPvid()));
macroTable.setProperty("questionJSPvid", qsJSPvid);
String defaultValue = (!subSubElement.getDefaultvalue().equals("")) ?
subSubElement.getDefaultvalue() : "";
String fieldType;
//this if checks whether printtype is "for_answering" or not and decides
//typeid in basis of that information
if (!(getPrintType().equals("for_answering")))
qstypeid = getSubQuestiontypeid();
switch(qstypeid) {
case 1 : fieldType = "text"; break;
case 2 : fieldType = "textarea"; break;
case 3 : fieldType = "checkbox";
defaultValue=setSubSubElementDefaultValue(defaultValue); break;
case 4 : //this implements radiobutton, case 5 selectlist
case 5 : fieldType = "radio";
defaultValue=setSubSubElementDefaultValue(defaultValue); break;
case 6 : fieldType = "comment"; break;
default : fieldType = "text";
}
macroTable.setProperty("defaultvalue",defaultValue);
return htmlTH.CompleteTemplate("fielddefault_"+fieldType, macroTable);
}
/** Creates fields' html-format when in "for_answering"-state.
* @author Tiina Pöyhönen 8.5.2003
* @return Completed html-format for fields.
*/
private String getAnsweringSubSubElementsHtml(Questionfield subSubElement,
int fieldnum, int qstypeid,String qsJSPvid){
Properties macroTable = new Properties();
macroTable.setProperty("JSPvid",
String.valueOf(subSubElement.getQuestionid()));
macroTable.setProperty("id",
String.valueOf(subSubElement.getQuestionfieldid()));
macroTable.setProperty("questionid",
String.valueOf(subSubElement.getQuestionid()));
String defaultValue = (!subSubElement.getDefaultvalue().equals("")) ?
subSubElement.getDefaultvalue() : "";
String fieldType;
//this if checks whether printtype is "for_answering" or not and decides
//typeid in basis of that information
switch(qstypeid) {
case 1 : fieldType = "text"; break;
case 2 : fieldType = "textarea"; break;
case 3 : fieldType = "checkbox";
defaultValue=setSubSubElementDefaultValue(defaultValue); break;
case 4 : fieldType = "radio";
defaultValue=setSubSubElementDefaultValue(defaultValue); break;
case 5 : fieldType = "option";
macroTable.setProperty("label", subSubElement.getLabel());
defaultValue = setSubSubElementDefaultValue(defaultValue);
defaultValue = (defaultValue.equals("checked")) ?
"selected=\"selected\"" : "";
break;
case 6 : fieldType = "comment"; break;
default : fieldType = "text";
}
macroTable.setProperty("defaultvalue",defaultValue);
//next is needed for radiogroups
macroTable.setProperty("questionJSPvid", qsJSPvid);
return htmlTH.CompleteTemplate("for_answering_fielddefault_"+fieldType,
macroTable);
}
private String setSubSubElementDefaultValue(String defaultValue) {
if (defaultValue.equals("on"))
return "checked";
else
return defaultValue;
}
private String getFieldHeaders(Question question) {
Properties macroTable = new Properties();
macroTable.setProperty("JSPvid",getJSPvid());
Enumeration fields = question.getSubElements().elements();
String label = "";
String subsection = "";
String section = "";
String fieldHeaders = "";
if (getPrintType().equals("edit")) {
subsection = "fieldheader"; // returns input fields
section = "fieldheaders";
} else if (getPrintType().equals("for_answering")) {
if (getSubQuestiontypeid() == 5)
return "";
subsection = "for_answering_fieldheader"; // returns text headers
section = "for_answering_fieldheaders";
}
int i=0;
boolean isEmpty = true;
while (fields.hasMoreElements()) {
Questionfield subsubElement = (Questionfield)fields.nextElement();
if (subsubElement.isDeleted()) {
i++;
continue;
}
label = subsubElement.getLabel();
if (!label.equals(""))
isEmpty = false;
macroTable.setProperty("label",subsubElement.getLabel());
macroTable.setProperty("fieldnum",String.valueOf(i+1));
fieldHeaders = fieldHeaders +
htmlTH.CompleteTemplate(subsection,macroTable);
i++;
}
if (isEmpty && getPrintType().equals("for_answering"))
return ""; //if no header set, nothing will print
macroTable.setProperty("fieldheaders",fieldHeaders);
return htmlTH.CompleteTemplate(section, macroTable);
}
private Properties getHtmlValues(DB db) {
Properties variableTable = new Properties();
variableTable.setProperty("label",this.getLabel());
variableTable.setProperty("uri",this.getUri());
variableTable.setProperty("bankgroupid",
Integer.toString(getBankgroupid()));
variableTable.setProperty("bankuserightid",
Integer.toString(getBankuserightid()));
variableTable.setProperty("personid",Integer.toString(getPersonid()));
variableTable.setProperty("deleted", String.valueOf(isDeleted()));
variableTable.setProperty("JSPvid", getJSPvid());
variableTable.setProperty("subelementcount",
String.valueOf(getSubElementCount()));
variableTable.setProperty("subsubelementcount",
String.valueOf(getSubSubElementCount()));
variableTable.setProperty("rownumber",
String.valueOf(getOrdernum()+"."));
try {
variableTable = makeLists(variableTable, db);
} catch (Exception e) {}
variableTable.setProperty("questions",getSubElementsHtml());
return variableTable;
}
private Properties makeLists(Properties variableTable, DB db) {
RS2 rs;
HtmlBean HB = new HtmlBean();
String SQLsentence =
"SELECT * FROM questionbankgroup WHERE deleted='false'";
try {
rs = DBhandler.bringFromDatabase(db, "QuestionnairesFrDb",
SQLsentence,"HtmlQuestionAsGroup1");
String list = HB.makeSelectList(getJSPvid()+"_bankgroupid",rs,
"bankgroupid","name",String.valueOf(getBankgroupid()));
variableTable.setProperty("bankgrouplist",list);
} catch (Exception e) {}
SQLsentence =
"SELECT * FROM questionbankuseright WHERE deleted='false'";
try {
rs = DBhandler.bringFromDatabase(db, "QuestionnairesFrDb",
SQLsentence,"HtmlQuestionAsGroup2");
String list = HB.makeSelectList(getJSPvid()+"_bankuserightid",rs,
"bankuserightid","name",String.valueOf(getBankuserightid()));
variableTable.setProperty("bankuserightlist",list);
} catch (Exception e){}
SQLsentence = "SELECT * FROM questiontype WHERE deleted='false'";
try {
rs = DBhandler.bringFromDatabase(db, "QuestionnairesFrDb",
SQLsentence,"HtmlQuestionAsGroup3");
String list = HB.makeSelectList(getJSPvid()+"_questiontypeid",rs,
"questiontypeid","name",String.valueOf(getSubQuestiontypeid()));
variableTable.setProperty("questiontypelist",list);
} catch (Exception e){}
return variableTable;
}
public void update(Properties commonVars){
super.update(commonVars);
String id=getJSPvid();
setPrintType(commonVars.getProperty(id+"_printtype",getPrintType()));
try {
setSubQuestiontypeid(Integer.parseInt(commonVars.getProperty(id+
"_questiontypeid", String.valueOf(getSubQuestiontypeid()))));
} catch (NumberFormatException e) {}
try {
setSubSubElementCount(Integer.parseInt(commonVars.getProperty(id+
"_subsubelementcount", String.valueOf(getSubSubElementCount()))));
} catch (NumberFormatException e) {}
try {
int newSubElementCount = Integer.parseInt(commonVars.getProperty(id+
"_subelementcount", String.valueOf(getSubElementCount())));
if (newSubElementCount > getSubElementCount())
addSubElements(newSubElementCount - getSubElementCount());
else if (newSubElementCount < getSubElementCount())
deleteLastSubElements(getSubElementCount() - newSubElementCount);
} catch (NumberFormatException e) {}
handleSubElements(commonVars);
}
private void handleSubElements(Properties commonVars) {
Enumeration en = subElements.elements();
while(en.hasMoreElements()){
Question qs=(Question)en.nextElement();
qs.setQuestiontypeid(getSubQuestiontypeid());
if (getSubSubElementCount() > qs.getSubElementCount())
qs.addSubElements(getSubSubElementCount() -
qs.getSubElementCount());
else if (getSubSubElementCount() < qs.getSubElementCount())
qs.deleteLastSubElements(qs.getSubElementCount() -
getSubSubElementCount());
setSubSubElementsLabel(qs,commonVars);
}
}
private void setSubSubElementsLabel(Question question,Properties commonVars){
Enumeration fields = question.getSubElements().elements();
int i=0;
while (fields.hasMoreElements()) {
Questionfield subSubElement = (Questionfield)fields.nextElement();
if (subSubElement.isDeleted()) {
i++;
continue;
}
else {
String label="";
try {
label = commonVars.getProperty(getJSPvid()+
"_questionfieldheader_"+(i+1),subSubElement.getLabel());
} catch (NullPointerException npe) {
subSubElement.setLabel("virhe");
}
subSubElement.setLabel(label);
i++;
}
}
}
public void deleteLastSubElements(int howmany) {
Enumeration en= subElements.elements();
int startDeletingIndex=(getSubElementCount()+1)-howmany;
int i=1;
while(en.hasMoreElements()){
Question question=(Question)en.nextElement();
if (question.isPointerDeleted())
continue;
if(i>=startDeletingIndex)
question.setDeleted(true);
i++;
}
}
protected void getSubElementsFromdb(DB db) {
super.getSubElementsFromdb(db);
Enumeration en= subElements.elements();
if (en.hasMoreElements()){
Question question=(Question)en.nextElement();
setSubSubElementCount(question.getSubElementCount());
setSubQuestiontypeid(question.getQuestiontypeid());
}
}
public void addSubElements(int howmany) {
int elements;
for (int i=0;i