/* Copyright (C) 2005-2012, by the President and Fellows of Harvard College. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Dataverse Network - A web application to share, preserve and analyze research data. Developed at the Institute for Quantitative Social Science, Harvard University. Version 3.0. */ /* * AnalysisPage.java * * Created on October 12, 2006, 12:13 AM * */ package edu.harvard.iq.dvn.core.web.subsetting; /** * * @author asone */ import static java.lang.System.*; import java.util.*; import java.util.Map.*; import java.util.regex.*; import java.util.Collection.*; import java.util.logging.*; import java.io.*; import javax.servlet.http.*; import java.lang.Integer; import java.lang.Long; // jsf-api classes import javax.faces.component.*; import javax.faces.component.UIComponent.*; import javax.faces.component.html.*; import javax.faces.event.*; import javax.faces.context.*; import javax.faces.FacesException; import javax.faces.model.SelectItem; import javax.faces.render.ResponseStateManager; // new VDCRequestBean VDCRequestBean import javax.ejb.EJB; import edu.harvard.iq.dvn.core.study.VariableServiceLocal; import edu.harvard.iq.dvn.core.study.DataVariable; import edu.harvard.iq.dvn.core.study.Study; import edu.harvard.iq.dvn.core.study.StudyVersion; import edu.harvard.iq.dvn.core.study.SummaryStatistic; import edu.harvard.iq.dvn.core.study.VariableCategory; import edu.harvard.iq.dvn.core.study.StudyFile; import edu.harvard.iq.dvn.core.study.StudyServiceLocal; import edu.harvard.iq.dvn.core.web.common.VDCBaseBean; import edu.harvard.iq.dvn.core.admin.VDCUser; import edu.harvard.iq.dvn.core.vdc.VDC; import edu.harvard.iq.dvn.core.vdc.VDCServiceLocal; import edu.harvard.iq.dvn.core.vdc.GuestBookResponseServiceBean; import edu.harvard.iq.dvn.ingest.dsb.*; import edu.harvard.iq.dvn.ingest.dsb.impl.*; import edu.harvard.iq.dvn.core.web.dataaccess.*; import edu.harvard.iq.dvn.core.util.FileUtil; import java.io.File; import java.io.FileNotFoundException; import java.net.MalformedURLException; import java.net.URL; import java.util.zip.*; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; import com.icesoft.faces.component.paneltabset.*; import com.icesoft.faces.context.ByteArrayResource; import com.icesoft.faces.context.Resource; import com.icesoft.faces.component.outputresource.*; import com.icesoft.faces.component.datapaginator.*; import edu.harvard.iq.dvn.core.study.*; import edu.harvard.iq.dvn.core.vdc.GuestBookResponse; import edu.harvard.iq.dvn.core.web.study.StudyUI; import edu.harvard.iq.dvn.core.web.VersionPage; import edu.harvard.iq.dvn.unf.*; import javax.faces.bean.ViewScoped; import javax.inject.Named; import javax.inject.Inject; import edu.harvard.iq.dvn.core.visualization.DataVariableMapping; @ViewScoped @Named("AnalysisPage") public class AnalysisPage extends VDCBaseBean implements java.io.Serializable { /** * Injects VariableServiceLocal to this class */ @EJB private VariableServiceLocal variableService; @EJB private DvnDSBTimerServiceLocal dvnDSBTimerService; @EJB StudyServiceLocal studyService; @EJB private VDCServiceLocal vdcService; @EJB GuestBookResponseServiceBean guestBookResponseServiceBean; @Inject VersionPage versionPageClass; /** * getter for the injected VariableServiceLocal * * @return VariableService */ public VariableServiceLocal getVariableService() { return variableService; } // ----------------------------------------------------------------------- // Initializes JSF components // ----------------------------------------------------------------------- // <editor-fold desc="Initialization of JSF components"> /* * sets various initial values of html components * */ private void _init() throws Exception { // Advanced Statistics: radio button group for the setx option // radioButtonGroup1DefaultOptions.setOptions( // new Option[] { // new Option("0", "Use average values (setx default)"), // new Option("1", "Select values") // }); // new Option("1","Set a value for 1 or 2 variables") // new Option("2","First differences between baseline and alterantive") simOptionMap.put("Use average values (setx default)","0"); simOptionMap.put("Select values", "1"); radioSimTypeChoiceSelected = "0"; //radioSimTypeChoice.setValue("0"); // Sets the default value of the above setx option // radioButtonGroup1DefaultOptions.setSelectedValue("0"); // Advanced Statistics: checkbox group for the output option pane // checkboxGroup2DefaultOptions.setOptions( // new Option[] { // new Option("Summary", "Include Summary Statistics"), // new Option("Plots", "Include Plot"), // new Option("BinOutput", "Include Replication Data") // }); // Sets the default state of each checkbox of the above group // checkboxGroup2DefaultOptions.setSelectedValue(new Object[] { "Summary", // "Plots", "BinOutput" }); chkbxAdvStatOutputOptMap.put("Include Summary Statistics", "Summary"); chkbxAdvStatOutputOptMap.put("Include Plot", "Plots"); chkbxAdvStatOutputOptMap.put("Include Replication Data", "BinOutput"); chkbxAdvStatOutputOpt.setValue(new String[]{ "Summary", "Plots", "BinOutput"}); // Cross-tabs have their own checkbox menu: chkbxAdvStatOutputXtbOptMap.put("Include Totals","xtb_Totals"); chkbxAdvStatOutputXtbOptMap.put("Include Statistics","xtb_Statistics"); chkbxAdvStatOutputXtbOptMap.put("Include Percentages","xtb_Percentages"); chkbxAdvStatOutputXtbOptMap.put("Include Extra Tables","xtb_ExtraTables"); chkbxAdvStatOutputXtbOpt.setValue(new String[]{ "xtb_Totals", "xtb_Statistics", "xtb_Percentages",}); // Advanced Statistics: checkbox group for the output option pane(xtab) // checkboxGroupXtbOptions.setOptions( // new Option[] { // new Option("xtb_Totals", "Include Totals"), // new Option("xtb_Statistics", "Include Statistics"), // new Option("xtb_Percentages", "Include Percentages"), // new Option("xtb_ExtraTables", "Include Extra Tables") // }); // Sets the default state of each checkbox of the above group // checkboxGroupXtbOptions.setSelectedValue( // new Object[] { // "xtb_Totals", // "xtb_Statistics", // "xtb_Percentages", // "false" // }); // Dropdown menu of how many rows to be displayed in the variable table howManyRowsOptions.add(new SelectItem("10", "10 Variables")); howManyRowsOptions.add(new SelectItem("20", "20 Variables")); howManyRowsOptions.add(new SelectItem("50", "50 Variables")); howManyRowsOptions.add(new SelectItem("0", "All")); // Sets the default state of the above Dropdown menu to 20 (variables) /* // howManyRowsOptions.setSelectedValue("20"); */ //selectedNoRows= "10"; /* * Setter for property StudyUIclassName. The instance of StudyUI class * contains citation-related information */ setStudyUIclassName("edu.harvard.iq.dvn.core.web.study.StudyUI"); /* * Fills dropdown menu for selecting a model (advanced Statistics tab) * with options obtained through AnalysisApplicationBean */ setModelMenuOptions(getAnalysisApplicationBean().getModelMenuOptions()); /* * Initializes the dataType-to-integer table used for * the switch statement in the checkVarType method */ dataType2Int.put("binary", Integer.valueOf("1")); dataType2Int.put("nominal", Integer.valueOf("2")); dataType2Int.put("nominal|ordinal", Integer.valueOf("23")); dataType2Int.put("ordinal|nominal", Integer.valueOf("32")); dataType2Int.put("ordinal", Integer.valueOf("3")); dataType2Int.put("discrete", Integer.valueOf("4")); dataType2Int.put("continuous", Integer.valueOf("5")); dataType2Int.put("any", Integer.valueOf("0")); // Initializes the variable-type-to-String conversion table vtInt2String.put("2", "continuous"); vtInt2String.put("1", "discrete"); vtInt2String.put("0", "character"); // getTabSet1().setSelected("tabDwnld"); // getVDCRequestBean().setSelectedTab("tabDwnld"); REP_README_FILE = new File(this.getClass().getResource("README").getFile()); REP_README_FILE_PREFIX = "README_"; DVN_R2HTML_CSS_FILE = new File(this.getClass().getResource("R2HTML.css").getFile()); DVN_R_HELPER_FILE = new File(this.getClass().getResource("dvn_helper.R").getFile()); R_COMMAND_FILE_PREFIX = "RcommandFile_"; } // end of _init() // </editor-fold> // ----------------------------------------------------------------------- // Static Variables // ----------------------------------------------------------------------- // <editor-fold desc="Static Variables"> /** * The number of variables to be shown in the variable table. * The default value is set 20. 0 is used to show all variables */ private static final int INITIAL_ROW_NO = 10; /** Sets the id number of the download GUI pane */ private static final int PANE_DWNLD = 3; /** Sets the id number of the recode GUI pane */ private static final int PANE_RECODE = 2; /** Sets the id number of the EDA GUI pane */ private static final int PANE_EDA = 4; /** Sets the id number of the advanced statistics GUI pane */ private static final int PANE_ADVSTAT = 5; private boolean resultPageTest = false; /** Sets the logger (use the package name) */ private static Logger dbgLog = Logger.getLogger(AnalysisPage.class.getPackage().getName()); private static String SUBSET_FILENAME_PREFIX="dvnSubsetFile."; private static String SUBSET_DATAFILE="dvnDataFile."; private static File REP_README_FILE; private static String REP_README_FILE_PREFIX; private static String R_COMMAND_FILE_PREFIX; private static File DVN_R2HTML_CSS_FILE; private static File DVN_R_HELPER_FILE; private static Long TEMP_FILE_LIFETIME=10L; private static String TEMP_DIR = System.getProperty("java.io.tmpdir"); // </editor-fold> // ----------------------------------------------------------------------- // Non-JSF-component Instance variables // ----------------------------------------------------------------------- // <editor-fold desc="Instance Variables"> private String dvnVersionNumber; public String getDvnVersionNumber() { return dvnVersionNumber; } public void setDvnVersionNumber(String dvnVersionNumber) { this.dvnVersionNumber = dvnVersionNumber; } private Long versionNumber; public Long getVersionNumber() { return versionNumber; } public void setVersionNumber(Long versionNumber) { this.versionNumber = versionNumber; } private List<File> deleteTempFileList = new ArrayList<File>(); /** * Instance of the DataTable that contains major metadata of all variables * in the data file requested by an end-user */ private edu.harvard.iq.dvn.core.study.DataTable dataTable; /** * The List object that holds the metadata of all variables in the * requested data file */ private List<DataVariable> dataVariables = new ArrayList<DataVariable>(); /** * The ID of the requested DataTable instance. Specified as a managed-property in * managed-beans.xml <property-class>java.lang.Long</property-class> * <value>#{param.dtId}</value> */ private Long dtId; /** * Getter for property dtId * * @return value of property dtId */ public Long getDtId() { return this.dtId; } /** * Setter for property dtId. * * @param dtId new value of property dtId * */ public void setDtId(Long dtId) { this.dtId = dtId; } /** * The Id of the data table that stores the requested data file */ private String dataTableId; /** * The hash table (variable Id to variable name) * that stores the current selected variables */ private Map<String, String> varCart = new LinkedHashMap<String, String>(); // Map for switch statement in checkVarType() /** * The dataType-to-integer table used for * the switch statement in the checkVarType method */ private Map<String, Integer> dataType2Int = new HashMap<String, Integer>(); /** * The variable-type-to-String conversion table */ private Map<String, String> vtInt2String = new HashMap<String, String>(); // study-related data /** * The name of StudyUI class that contains the citation-related * information about the requested Study */ private String studyUIclassName; /** * Setter for property studyUI class name * @param suiClass studyUI classbname */ public void setStudyUIclassName(String suiClass) { studyUIclassName = suiClass; } /** * getter for property studyUI class-name * * @return the studyUI class name */ public String getStudyUIclassName() { return studyUIclassName; } /** * getter for property citation * * @return the citation information of the requested data file */ private String getCitation() { return studyUI.getMetadata().getCitation(false); } /** * * * @return the title of the requested study */ private String getStudyTitle() { return studyUI.getMetadata().getTitle(); } /** * * * @return the ID of the requested study */ public Long getStudyId() { return studyUI.getStudy().getId(); } /** * The name of the requested data file * Exposed to SubsettingPage.xhtml */ private String fileName; /** * Getter for property fileName * * @return the name of the requested data file */ public String getFileName() { return fileName; } /** * Setter for property fileName * * @param fNm the name of the requested data file */ public void setFileName(String fNm) { fileName = fNm; } /** The URL of the requested study */ private String studyURL; /** * Getter for property studyURL * * @return the URL of the requested study */ public String getAtudyURL() { return studyURL; } /** * Setter for property studyURL * * @param url the URL of the requested study */ public void setStudyURL(String url) { studyURL = url; } private StudyUI studyUI; public StudyUI getStudyUI() { return studyUI; } public void setStudyUI(StudyUI studyUI) { this.studyUI = studyUI; } /** The type of an end-user's browser */ private String browserType; /** * Getter for property browserType * * @return the type of an end-user's browser */ public String getBrowserType() { return browserType; } /** * Setter for property borwserType * * @param bt the type of an end-user's browser */ public void setBrowserType(String bt) { this.browserType = bt; } /** The subsettability of the Subsetting Page */ private Boolean subsettingPageAccess; /** Sets the state number of the initially selected tab. * The default is 3 */ //private int clickedTab = 3; private int currentTabIndex; private Map<String, String> resultInfo = new HashMap<String, String>(); public Map<String, String> getResultInfo() { return resultInfo; } public void setResultInfo(Map<String, String> resultInfo) { this.resultInfo = resultInfo; } private String DVNversionNo; // </editor-fold> // ----------------------------------------------------------------------- // Page-level JSF components // ----------------------------------------------------------------------- // <editor-fold desc="Page-level-components"> /** * ice:panelTabSet component backing the binding attribute of the tabset in * the subsetting page and whose id is tabSet1 */ private PanelTabSet tabSet1 = new PanelTabSet(); /** * Getter for component tabSet1 * * @return the main tab-set component */ public PanelTabSet getTabSet1() { return tabSet1; } /** * Setter for component tabSet1 * * @param ts the main tab-set component */ public void setTabSet1(PanelTabSet tabSet1) { this.tabSet1 = tabSet1; } /** * ice:panelTab component backing the binding attribute of the tab of * the downloading option and whose id is tabDwnld * */ private PanelTab tabDwnld = new PanelTab(); /** * Getter for component tabDwnld * * @return ice:panelTab of the downloading option */ public PanelTab getTabDwnld() { return tabDwnld; } /** * Setter for component tabDwnld * * @param tab3 ice:panelTab of the downloading option */ public void setTabDwnld(PanelTab tabDwnld) { this.tabDwnld = tabDwnld; } /** * ice:panelTab component backing the binding attribute of the tab of * the recoding option and whose id is tabRecode */ private PanelTab tabRecode = new PanelTab(); /** * Getter for component tabRecode * * @return ice:panelTab of the recoding option */ public PanelTab getTabRecode() { return tabRecode; } /** * Setter for component tabRecode * * @param tab2 ice:panelTab of the recoding option */ public void setTabRecode(PanelTab tabRecode) { this.tabRecode = tabRecode; } /** * ice:panelTab component backing the binding attribute of the tab of * the EDA option and whose id is tabEda */ private PanelTab tabEda = new PanelTab(); /** * Getter for component tabEda * * @return ice:panelTab of the EDA option */ public PanelTab getTabEda() { return tabEda; } /** * Setter for component tabEda * * @param tab4 ice:panelTab of the EDA option */ public void setTabEda(PanelTab tabEda) { this.tabEda = tabEda; } /** * ice:panelTab component backing the binding attribute of the tab of * the advanced statistics optionn and whose id is tabAdvStat */ private PanelTab tabAdvStat = new PanelTab(); /** * Getter for component tabAdvStat * * @return ice:panelTab of the advanced statistics option */ public PanelTab getTabAdvStat() { return tabAdvStat; } /** * Setter for component tabAdvStat * * @param tab5 ice:panelTab of the advanced statistics option */ public void setTabAdvStat(PanelTab tabAdvStat) { this.tabAdvStat = tabAdvStat; } /** The Id of the currently selected tab */ private String currentTabId; /** * Getter for property currentTabId * * @return the Id of the currently selected tab */ public String getCurrentTabId() { return currentTabId; } /** * Setter for property currentTabId * * @param tb the Id of the currently selected tab */ public void setCurrentTabId(String tb) { currentTabId = tb; } /** * Moves all variables back to the box of an end-user selected variables * and resets the backing storage object varCart. * Backing the actionListener attribute of each ice:panelTab component. * * @param acev tab-clicking-action event */ public void resetVariableInLBox(ActionEvent acev) { dbgLog.fine("Within resetVariableInLBox: tab Id =" + acev.getComponent().getId()); getVDCRequestBean().setSelectedTab(acev.getComponent().getId()); // remove vars from RHS boxes advStatVarRBox1.clear(); advStatVarRBox2.clear(); advStatVarRBox3.clear(); // add existing vars to LHS box // add user-defined vars to LHS box if available resetVarSetAdvStat(varCart); // recode message area resetMsgMoveRecodeVarBttn(); resetMsgSaveRecodeBttn(); resetMsg4MoveVar(); // download message area msgDwnldButton.setValue(" "); msgDwnldButton.setVisible(false); // eda message area msgEdaButton.setValue(" "); msgEdaButton.setVisible(false); // advance stat area msgAdvStatButton.setValue(" "); msgAdvStatButton.setVisible(false); // uncheck-variable-error message resetMsgVariableSelection(); } public void processTabChange(TabChangeEvent tce){ dbgLog.fine("***** within processTabChange: start *****"); dbgLog.fine("selectedIndex="+tabSet1.getSelectedIndex()); dbgLog.fine("tabPlacement="+tabSet1.getTabPlacement()); dbgLog.fine("old tab Index="+tce.getOldTabIndex()); dbgLog.fine("new tab Index="+tce.getNewTabIndex()); if (tce.getNewTabIndex() != tce.getOldTabIndex()) { dbgLog.fine("reset messages and boxes"); // reset boxes // remove vars from RHS boxes advStatVarRBox1.clear(); advStatVarRBox2.clear(); advStatVarRBox3.clear(); // add existing vars to LHS box // add user-defined vars to LHS box if available resetVarSetAdvStat(varCart); // download message area msgDwnldButton.setValue(""); msgDwnldButton.setVisible(false); // recode message area resetMsgMoveRecodeVarBttn(); resetMsgSaveRecodeBttn(); resetMsg4MoveVar(); // eda message area msgEdaButton.setValue(""); msgEdaButton.setVisible(false); // advance stat area msgAdvStatButton.setValue(""); msgAdvStatButton.setVisible(false); // uncheck-variable-error message resetMsgVariableSelection(); // hide the download button and // show the create button dwnldButton.setRendered(true); dwnloadSubsetButton.setRendered(false); } dbgLog.fine("***** within processTabChange: end *****"); } // </editor-fold> // ----------------------------------------------------------------------- // download section // ----------------------------------------------------------------------- // <editor-fold desc="download"> // download radio button selection private HtmlSelectOneRadio dwnldFileTypeSet = new com.icesoft.faces.component.ext.HtmlSelectOneRadio(); public HtmlSelectOneRadio getDwnldFileTypeSet() { return dwnldFileTypeSet; } public void setDwnldFileTypeSet(HtmlSelectOneRadio hsor) { this.dwnldFileTypeSet = hsor; } // download: radio button items private List dwnldFileTypeItems = null; public List getDwnldFileTypeItems() { if (dwnldFileTypeItems == null) { dwnldFileTypeItems = new ArrayList(); dwnldFileTypeItems.add("D01");// Text dwnldFileTypeItems.add("D04");// RData dwnldFileTypeItems.add("D02");// Splus dwnldFileTypeItems.add("D03");// Stata } return dwnldFileTypeItems; } public void setDwnldFileTypeItems(List dfti) { dwnldFileTypeItems = dfti; } // File format for the saved subset defaults to plain text: private String dwnldFileTypeSelected = (String)(getDwnldFileTypeItems().get(0)); public String getDwnldFileTypeSelected() { dbgLog.fine("Subsetting: returning dnwldFileTypeSelected="+dwnldFileTypeSelected); return dwnldFileTypeSelected; } public void setDwnldFileTypeSelected(String s) { dbgLog.fine("Subsetting: setting dnwldFileTypeSelected to "+s); this.dwnldFileTypeSelected = s; } // dwnldBttn commandButton@binding private HtmlCommandButton dwnldButton = new com.icesoft.faces.component.ext.HtmlCommandButton(); //new javax.faces.component.html.HtmlCommandButton(); public HtmlCommandButton getDwnldButton() { return dwnldButton; } public void setDwnldButton(HtmlCommandButton hcb) { this.dwnldButton = hcb; } // dwnldBttn:h:commandButton@action public boolean checkDwnldParameters (){ boolean result=false; dbgLog.fine("***** within checkDwnldParameters() *****"); // param-checking conditions if (dwnldFileTypeSelected != null){ dbgLog.fine("download radio button set: selected value="+ (String)dwnldFileTypeSet.getValue()); result = true; } else if (dwnldFileTypeSet.getValue() != null) { dbgLog.fine("download radio button set: selected value="+ (String)dwnldFileTypeSet.getValue()); result=true; } else { dbgLog.warning("download radio button set: no selected value"); } return result; } private HtmlPanelGrid pgDwnldErrMsg = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getPgDwnldErrMsg() { return pgDwnldErrMsg; } public void setPgDwnldErrMsg(HtmlPanelGrid pgDwnldErrMsg) { this.pgDwnldErrMsg = pgDwnldErrMsg; } // msgDwnldButton:ice:outputText@binding private com.icesoft.faces.component.ext.HtmlOutputText msgDwnldButton = new com.icesoft.faces.component.ext.HtmlOutputText(); public com.icesoft.faces.component.ext.HtmlOutputText getMsgDwnldButton() { return msgDwnldButton; } public void setMsgDwnldButton(com.icesoft.faces.component.ext.HtmlOutputText txt) { this.msgDwnldButton = txt; } /** * The object backing the value attribute of * htmlOutputText for msgDwnldButton that shows * error messages for the action of the download * button */ private String msgDwnldButtonTxt; /** * Getter for property msgDwnldButtonTxt * * @return the error message text */ public String getMsgDwnldButtonTxt() { return msgDwnldButtonTxt; } /** * Setter for property msgDwnldButtonTxt * * @param txt the new error message text */ public void setMsgDwnldButtonTxt(String txt) { this.msgDwnldButtonTxt = txt; } /** * Clears the contents of the error message text (msgDwnldButtonTxt) * for the download button (dwnldButton) */ public void resetMsgDwnldButton() { dbgLog.fine("***** within resetMsgDwnldButton *****"); // Replaces the error message text with spaces // so that the previous error message is not shown // even if the following setVisible(false) line fails msgDwnldButton.setValue(" "); // Stores the new state of msgDwnldButtonTxt in the session map FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("msgDwnldButtonTxt", msgDwnldButtonTxt); // Hides the error message text next to the download button msgDwnldButton.setVisible(false); pgDwnldErrMsg.setRendered(false); dbgLog.fine("***** resetMsgDwnldButton: end *****"); } private Resource zipResourceDynFileName; //= new ByteArrayResource(null); public Resource getZipResourceDynFileName() { return zipResourceDynFileName; } public void setZipResourceDynFileName(Resource zipResourceDynFileName) { this.zipResourceDynFileName = zipResourceDynFileName; } private String zipFileName; public String getZipFileName() { return zipFileName; } public void setZipFileName(String zipFileName) { this.zipFileName = zipFileName; } private OutputResource dwnloadSubsetButton = new OutputResource(); public OutputResource getDwnloadSubsetButton() { return dwnloadSubsetButton; } public void setDwnloadSubsetButton(OutputResource dsb) { this.dwnloadSubsetButton = dsb; } public void processDwnldFileType (ValueChangeEvent vce){ dbgLog.fine("***** within processDwnldFileType: start *****"); dbgLog.fine("old value="+vce.getOldValue()); dbgLog.fine("new value="+vce.getNewValue()); if (vce.getOldValue() == null){ dbgLog.fine("old value is null and this must be the initial case"); } else { dwnldFileTypeSelected = (String)vce.getNewValue(); if (vce.getNewValue().equals(vce.getOldValue())){ dbgLog.fine("new value is the same as before"); } else { dbgLog.fine("new value differs from the old one"); dwnloadSubsetButton.setRendered(false); dwnldButton.setRendered(true); } } dbgLog.fine("***** within processDwnldFileType: end *****"); } //TODO: hiddenSelectedFileType -- debug private HtmlInputHidden hiddenSelectedFileType = new HtmlInputHidden(); /** * Get the value of hiddenSelectedFileType * * @return the value of hiddenSelectedFileType */ public HtmlInputHidden getHiddenSelectedFileType() { if (hiddenSelectedFileType != null) { dbgLog.fine("returning hiddenSelectedFileType"+hiddenSelectedFileType.getValue()); } else { dbgLog.fine("hiddenSelectedFileType is null"); } return hiddenSelectedFileType; } /** * Set the value of hiddenSelectedFileType * * @param hiddenSelectedFileType new value of hiddenSelectedFileType */ public void setHiddenSelectedFileType(HtmlInputHidden hiddenSelectedFileType) { this.hiddenSelectedFileType = hiddenSelectedFileType; } // END TODO // end of download section ----------------------------------------------- // </editor-fold> public static byte[] toByteArray(InputStream input) throws IOException { ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] buf = new byte[4096]; int len = 0; while ((len = input.read(buf)) > -1) output.write(buf, 0, len); return output.toByteArray(); } // dwnldButton commandButton@action public String dwnldAction() { dbgLog.fine("***** within dwnldAction() *****"); resetMsgDwnldButton(); if (checkDwnldParameters()) { FacesContext cntxt = FacesContext.getCurrentInstance(); HttpServletResponse res = (HttpServletResponse) cntxt .getExternalContext().getResponse(); HttpServletRequest req = (HttpServletRequest) cntxt .getExternalContext().getRequest(); StudyFile sf = dataTable.getStudyFile(); Long noRecords = dataTable.getRecordsPerCase(); String dsbUrl = getDsbUrl(); dbgLog.fine("dsbUrl=" + dsbUrl); String serverPrefix = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath(); dbgLog.fine("serverPrefix"+serverPrefix); Map <String, List<String>> mpl = new HashMap<String, List<String>>(); // File inFile = new File(sf.getFileSystemLocation()); // File origFile = new File(inFile.getParent(), "_" + sf.getFileSystemName()); String formatType = (String) dwnldFileTypeSet.getValue(); dbgLog.fine("file type from the binding=" + formatType); if (formatType == null){ formatType = dwnldFileTypeSelected; dbgLog.fine("file type from the value=" + dwnldFileTypeSelected); } mpl.put("dtdwnld", Arrays.asList(formatType)); dbgLog.fine("citation info to be sent:\n" + getCitation()); mpl.put("studytitle", Arrays.asList(getStudyTitle())); dbgLog.fine("studyId="+getStudyId().toString()); mpl.put("studyno", Arrays.asList(getStudyId().toString())); mpl.put("studyURL", Arrays.asList(studyURL)); mpl.put("", Arrays.asList("")); mpl.put("browserType", Arrays.asList(browserType)); mpl.put("recodedVarIdSet", getRecodedVarIdSet()); mpl.put("recodedVarNameSet",getRecodedVarNameSet()); mpl.put("recodedVarLabelSet", getRecodedVarLabelSet()); mpl.put("recodedVarTypeSet", getRecodedVariableType()); mpl.put("recodedVarBaseTypeSet", getBaseVariableTypeForRecodedVariable()); mpl.put("baseVarIdSet",getBaseVarIdSetFromRecodedVarIdSet()); mpl.put("baseVarNameSet",getBaseVarNameSetFromRecodedVarIdSet()); mpl.put("requestType", Arrays.asList("Download")); // Added by Matt Owen to find a way to sneak in Metadata that is lost between Rdata -> Tab mpl.put("originalFile", Arrays.asList(getOriginalFileSystemLocation().getAbsolutePath())); // ----------------------------------------------------- // Processing route, step by step: // // Step 0. Locate the data file and its attributes String fileId = sf.getId().toString(); String fileloc = sf.getFileSystemLocation(); String tabflnm = sf.getFileName(); boolean sbstOK = sf.isSubsettable(); String flct = sf.getFileType(); // Output debug statements dbgLog.info("location="+fileloc); dbgLog.info("filename="+tabflnm); dbgLog.info("subsettable="+sbstOK); dbgLog.info("filetype="+flct); dbgLog.info("studyUrl = " + studyURL); dbgLog.info("original file asbolute path = " + getOriginalFileSystemLocation().getAbsolutePath()); // D DvnRJobRequest sro = null; List<File> zipFileList = new ArrayList(); File tmpsbfl= null; if (sbstOK) { try { // this temp file will store the requested column(s): tmpsbfl = File.createTempFile("tempsubsetfile.", ".tab"); deleteTempFileList.add(tmpsbfl); // to produce this file, we'll either open the stream // and run our local subsetting code on it, or request // the subsetting to be performed natively by the access // driver, if it supports the functionality: // check whether a source file is tab-delimited or not boolean fieldcut = true; if ((noRecords != null) && (noRecords >=1)){ fieldcut = false; } DataAccessRequest daReq = new DataAccessRequest(); daReq.setParameter("noVarHeader", "1"); DataAccessObject accessObject = DataAccess.createDataAccessObject(sf, daReq); if (accessObject.isSubsetSupported()) { dbgLog.fine("Using NATIVE subset functionality of the repository."); daReq.setParameter("vars", getVariableNamesForSubset()); accessObject.open(); InputStream inSubset = accessObject.getInputStream(); OutputStream outSubset = new BufferedOutputStream(new FileOutputStream(tmpsbfl.getAbsolutePath())); int bufsize = 8192; byte [] subsetDataBuffer = new byte[bufsize]; while ((bufsize = inSubset.read(subsetDataBuffer))!=-1) { outSubset.write(subsetDataBuffer, 0, bufsize); } inSubset.close(); outSubset.close(); // TODO: catch exceptions; reset the state of the page // if anything went wrong. See the fixed-field section // below for an example. } else { accessObject.open(); if (fieldcut){ // Cutting requested fields of data from a TAB-delimited stream: Set<Integer> fields = getFieldNumbersForSubsetting(); dbgLog.fine("subsetting fields="+fields); // Create an instance of DvnJavaFieldCutter FieldCutter fc = new DvnJavaFieldCutter(); // Executes the subsetting request fc.subsetFile(accessObject.getInputStream(), tmpsbfl.getAbsolutePath(), fields, dataTable.getCaseQuantity(), "\t"); // TODO: catch exceptions; reset the state of the page // if anything went wrong. See the fixed-field section // below for an example. } else { // Cutting requested columns of data from a fixed-field stream: Map<Long, List<List<Integer>>> varMetaSet = getSubsettingMetaData(noRecords); DvnNewJavaFieldCutter fc = new DvnNewJavaFieldCutter(varMetaSet); try { //fc.cutColumns(new File(cutOp1), noRecords.intValue(), 0, "\t", tmpsbfl.getAbsolutePath()); fc.cutColumns(accessObject.getInputStream(), noRecords.intValue(), 0, "\t", tmpsbfl.getAbsolutePath()); } catch (FileNotFoundException e) { e.printStackTrace(); msgDwnldButton.setValue("* could not generate subset due to an IO problem"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } catch (RuntimeException re){ re.printStackTrace(); msgDwnldButton.setValue("* could not generate subset due to an runtime error"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an runtime error"); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } } } // Checks the resulting subset file: if (tmpsbfl.exists()){ Long subsetFileSize = tmpsbfl.length(); dbgLog.fine("subset file:Length="+subsetFileSize); dbgLog.fine("subset file:name="+tmpsbfl.getAbsolutePath()); if (subsetFileSize > 0){ mpl.put("subsetFileName", Arrays.asList(tmpsbfl.getAbsolutePath())); mpl.put("subsetDataFileName",Arrays.asList(tmpsbfl.getName())); } else { // subset file exists but it is empty msgDwnldButton.setValue("* an subset file is empty"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to a subsetting error:"+ "a subset file is empty" ); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } } else { // subset file was not created msgDwnldButton.setValue("* a subset file was not created"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to a subsetting error:"+ "a subset file was not created" ); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } // If we've made it this far, we can increment the number of // downloads for the study file: VDC vdc = vdcService.getVDCFromRequest(req); GuestBookResponse guestbookResponse = (GuestBookResponse) getVDCSessionBean().getGuestbookResponseMap().get("guestBookResponse_" + sf.getStudy().getId()); if (guestbookResponse == null) { //need to set up dummy network response guestbookResponse = guestBookResponseServiceBean.initNetworkGuestBookResponse(sf.getStudy(), sf, getVDCSessionBean().getLoginBean()); } guestbookResponse.setStudyVersion(sf.getStudy().getStudyVersionByNumber(versionNumber)); String jsessionId = null; Cookie cookies[] = req.getCookies(); for ( int i = 0; i < cookies.length; i++) { if ("JSESSIONID".equals(cookies[i].getName())) { jsessionId = cookies[i].getValue(); } } if (jsessionId == null || "".equals(jsessionId)) { String[] stringArray = getVDCSessionBean().toString().split("@"); jsessionId = stringArray[1]; } guestbookResponse.setSessionId(jsessionId); String friendlyFormatName = ""; String formatRequestedMimeType = ""; if (formatType != null && !"".equals(formatType)) { if (formatType.equals("D00")) { formatRequestedMimeType = "text/tab-separated-values"; // tabular } else if (formatType.equals("D01")) { formatRequestedMimeType = "text/tab-separated-values"; // fixed-field } else { for (DataFileFormatType type : studyService.getDataFileFormatTypes()) { if (formatType.equals(type.getValue())) { formatRequestedMimeType = type.getMimeType(); } } } } if (formatRequestedMimeType == null || "".equals(formatRequestedMimeType)) { formatRequestedMimeType = "application/x-unknown"; } friendlyFormatName = FileUtil.getUserFriendlyTypeForMime(formatRequestedMimeType); guestbookResponse.setDownloadtype("Subsetting - " + friendlyFormatName); if (vdc != null) { studyService.incrementNumberOfDownloads(sf.getId(), vdc.getId(), (GuestBookResponse) guestbookResponse); } else { studyService.incrementNumberOfDownloads(sf.getId(), (Long) null, (GuestBookResponse) guestbookResponse); } // Step 3. Organizes parameters/metadata to be sent to the implemented // data-analysis-service class // skip the Rserve call completely (for plain tab file format, with no recoding)! -- L.A. if (!formatType.equals("D01") || (recodeSchema.size() > 0)) { Map<String, Map<String, String>> vls = getValueTablesForAllRequestedVariables(); // New (as of 3.6): support for ordered categorical variables // (ingested from R ordered factors). // Note that this is only being added here, i.e., to the // download-and-save part; if/when we make the analysis // and statistics utilize/handle these ordered categories // in some special way, we'll need to add the actual // ordered values to the SRO objects there as well. -- L.A. Map<String, List<String>> categoryOrders = getCategoryValueOrdersForAllRequestedVariables(); if (categoryOrders != null) { sro = new DvnRJobRequest(getDataVariableForRequest(), mpl, vls, recodeSchema, categoryOrders, null); } else { sro = new DvnRJobRequest(getDataVariableForRequest(), mpl, vls, recodeSchema); } /* * Add the recoded -> base variable name map; (new as of v3.6;) * TODO: (?) do the same for the other action requests. * -- L.A. */ sro.setRecodedToBaseVar(getRecodedVarToBaseVarName()); // dbgLog.fine("sro dump:\n"+ToStringBuilder.reflectionToString(sro, ToStringStyle.MULTI_LINE_STYLE)); // Step 4. Creates an instance of the the implemented // data-analysis-service class DvnRDataAnalysisServiceImpl das = new DvnRDataAnalysisServiceImpl(); // Executes a download or data analysis request and // stores the results in a Map <String, String> resultInfo = das.execute(sro); // Step 5. Check the exit status of the R process: if (resultInfo.get("RexecError").equals("true")){ msgDwnldButton.setValue("* The Request failed due to an R-runtime error"); msgDwnldButton.setVisible(true); dbgLog.fine("exiting dwnldAction() due to an R-runtime error"); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } } if (recodeSchema.size()> 0){ resultInfo.put("subsettingCriteria", sro.getSubsetConditionsForCitation()); } else { resultInfo.put("subsettingCriteria", "variables: "+getVariableNamesForSubset()); } } catch (MalformedURLException e) { e.printStackTrace(); msgDwnldButton.setValue("* file URL is malformed"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to a URL problem "); getVDCRequestBean().setSelectedTab("tabDwnld"); return ""; } catch (IOException e) { // this may occur if the dataverse is not released, // or if the file exists, but it is not accessible, etc. e.printStackTrace(); msgDwnldButton.setValue("* an IO problem occurred"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabDwnld"); return ""; } // end of subset-OK case } else { // not subsettable data file msgDwnldButton.setValue("* this data file is not subsettable file"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction(): the data file is not subsettable "); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } // end:subsetNotOKcase // final processing steps for all successful cases // add study-metadata to the resultInfo map if (formatType.equals("D01") && !(recodeSchema.size() > 0)) { resultInfo.put("wbDataFileName", tmpsbfl.getAbsolutePath()); // Fields that would normally be populated by R: resultInfo.put("PID", "N/A"); resultInfo.put("R_min_verion_no","N/A"); resultInfo.put("dsbHost", "N/A"); Date now = new Date(); resultInfo.put("RexecDate", now.toString()); } else { resultInfo.put("R_min_verion_no",resultInfo.get("Rversion").substring(2)); } resultInfo.put("offlineCitation", getCitation()); resultInfo.put("studyTitle", getStudyTitle()); resultInfo.put("studyNo", getStudyId().toString()); resultInfo.put("dtId", dtId.toString()); if (versionNumber != null) { resultInfo.put("versionNumber", versionNumber.toString()); } resultInfo.put("studyURL", studyURL); resultInfo.put("dataverse_version_no",dvnVersionNumber); resultInfo.put("option", "subset"); resultInfo.put("variableList", getVariableNamesForSubset()); // calculate UNF (locally, on the application side): List<DataVariable> subsetVariableList = getDataVariableForRequest(); String subsetUNFvalue = "[NOT CALCULATED]"; String[] unfValues = new String[subsetVariableList.size()]; for (int i = 0; i < subsetVariableList.size(); i++) { unfValues[i] = subsetVariableList.get(i).getUnf(); } dbgLog.fine("unf set:\n"+Arrays.deepToString(unfValues)); try { subsetUNFvalue = UNF5Util.calculateUNF(unfValues); } catch (NumberFormatException ex) { // if anything went wrong during the UNF calculation, it's not // a fatal condition; we'll just be displaying "not calculated" // instead of the UNF in the final README file. dbgLog.fine("error while trying to calculate subset UNF: Number Format Exception."); ex.printStackTrace(); } catch (IOException ex) { dbgLog.fine("error while trying to calculate subset UNF: IO Exception."); ex.printStackTrace(); } resultInfo.put("fileUNF", subsetUNFvalue); // writing necessary files: try{ if (formatType.equals("D01") && !(recodeSchema.size() > 0)){ // (2) tab-delimited-format-only step: // // In the final zip file we package the subset file // and a replication README file (also contains citation). // We also *used to* include the SAS, SPSS and R control // files created by R. We are not doing this anymore, but // I left the code commented-out below. // -- L.A. Jan. 2012 // // We are also adding the variable header to the file here. /* SKIP CODE FILES -- L.A. String codeFileSas = "codeFile_sas_" + resultInfo.get("PID") + ".sas"; File tmpCCsasfl = new File(TEMP_DIR, codeFileSas); deleteTempFileList.add(tmpCCsasfl); zipFileList.add(tmpCCsasfl); String codeFileSpss = "codeFile_spss_" + resultInfo.get("PID") + ".sps"; File tmpCCspsfl = new File(TEMP_DIR, codeFileSpss); deleteTempFileList.add(tmpCCspsfl); zipFileList.add(tmpCCspsfl); String codeFileStata = "codeFile_stata_" + resultInfo.get("PID") + ".do"; File tmpCCdofl = new File(TEMP_DIR, codeFileStata); deleteTempFileList.add(tmpCCdofl); zipFileList.add(tmpCCdofl); StatisticalCodeFileWriter scfw = new StatisticalCodeFileWriter(sro); scfw.write(tmpCCsasfl, tmpCCspsfl, tmpCCdofl); */ // add the subset file: File tmpsbflnew = File.createTempFile("tempsubsetfile_new.", ".tab"); deleteTempFileList.add(tmpsbflnew); InputStream inb = new BufferedInputStream(new FileInputStream(tmpsbfl)); OutputStream outb = new BufferedOutputStream(new FileOutputStream(tmpsbflnew)); String varHeaderLine = getVariableHeaderForSubset(); // Add the variable header to the subset file: byte[] varHeaderBuffer = null; varHeaderBuffer = varHeaderLine.getBytes(); outb.write(varHeaderBuffer); outb.flush(); int bufsize; byte [] bffr = new byte[8192]; while ((bufsize = inb.read(bffr))!=-1) { outb.write(bffr, 0, bufsize); } inb.close(); outb.close(); dbgLog.fine("adding tab file: "+tmpsbflnew.getName()); zipFileList.add(tmpsbflnew); } else { // (2)The format-converted subset data file String wbDataFileName = resultInfo.get("wbDataFileName"); dbgLog.fine("wbDataFileName="+wbDataFileName); File wbSubsetDataFile = new File(wbDataFileName); if (wbSubsetDataFile.exists()){ dbgLog.fine("wbSubsetDataFile:length="+wbSubsetDataFile.length()); deleteTempFileList.add(wbSubsetDataFile); zipFileList.add(wbSubsetDataFile); } else { // the data file was not created dbgLog.fine("wbSubsetDataFile does not exist"); msgDwnldButton.setValue("* The requested data file is not available"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction(): data file was not transferred"); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } } // Create README file: String readMeFileName = null; if (resultInfo.get("PID") != null && !resultInfo.get("PID").equals("N/A")) { readMeFileName = REP_README_FILE_PREFIX + resultInfo.get("PID") + ".txt"; } else { readMeFileName = REP_README_FILE_PREFIX + fileId + ".txt"; } File readMeFile = new File(TEMP_DIR, readMeFileName); DvnReplicationREADMEFileWriter rw = new DvnReplicationREADMEFileWriter(resultInfo); rw.writeREADMEfile(readMeFile, true); zipFileList.add(readMeFile); deleteTempFileList.add(readMeFile); for (File f : zipFileList){ dbgLog.fine("file to zip: path="+f.getAbsolutePath() +"\tname="+ f.getName()); } // We can now zip all the required files" try { String zipFilePrefix = null; if (resultInfo.get("PID") != null && !resultInfo.get("PID").equals("N/A")) { zipFilePrefix = "zipFile_" + resultInfo.get("PID") + ".zip"; } else { zipFilePrefix = "zipFile_" + fileId + ".zip"; } File zipFile = new File(TEMP_DIR, zipFilePrefix); //deleteTempFileList.add(zipFile); String zfname = zipFile.getName(); zipFileName = zfname; zipFiles(new FileOutputStream(zipFile), zipFileList); /* try { Thread.sleep(1000); } catch (Exception e) { } */ zipResourceDynFileName = new ByteArrayResource( toByteArray( new FileInputStream(zipFile.getAbsolutePath()))); dbgLog.info("Subsetting: zipFileName="+zipFileName); dbgLog.info("Subsetting: zipFile, absolute path: "+zipFile.getAbsolutePath()); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); // Hide 'Create' button, show 'Download' button: dwnldButton.setRendered(false); dwnloadSubsetButton.setRendered(true); dbgLog.info("***** within dwnldAction(): ends here *****"); /* * Navigation: * - is it necessary to use "faces-redirect" navigation here? * Or should we simply return "" as long as we want to stay * on the subsetting page? if (versionNumber != null) { return "/study/SubsettingPage?faces-redirect=true&dtId=" + dtId + "&versionNumber=" + versionNumber; } return "/study/SubsettingPage?faces-redirect=true&dtId=" + dtId; */ return ""; } catch (IOException e){ // file-access problem, etc. e.printStackTrace(); dbgLog.fine("download zipping IO exception"); msgDwnldButton.setValue("* an IO problem occurred"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } // end of zipping step } catch (IOException e){ e.printStackTrace(); msgDwnldButton.setValue("* an IO problem occurred"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } // end: params are OK-case } else { // the selection is incomplete // show error message; pgDwnldErrMsg.setRendered(true); msgDwnldButton.setValue("* Error: Select a file format"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to incomplete data "); getVDCRequestBean().setSelectedTab("tabDwnld"); return ""; } // end: checking params } // ----------------------------------------------------------------------- // recode section // ----------------------------------------------------------------------- // <editor-fold desc="recode"> // moveRecodeVarBttn:h:commandButton@binding private HtmlCommandButton moveRecodeVarBttn = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getMoveRecodeVarBttn() { return moveRecodeVarBttn; } public void setMoveRecodeVarBttn(HtmlCommandButton hcb) { this.moveRecodeVarBttn = hcb; } // errormessage for non-selected var case private HtmlOutputText msgMoveRecodeVarBttn = new com.icesoft.faces.component.ext.HtmlOutputText(); public HtmlOutputText getMsgMoveRecodeVarBttn() { return msgMoveRecodeVarBttn; } public void setMsgMoveRecodeVarBttn(HtmlOutputText txt) { this.msgMoveRecodeVarBttn = txt; } public void resetMsgMoveRecodeVarBttn() { dbgLog.fine("***** within resetMsgMoveRecodeVarBttn *****"); msgMoveRecodeVarBttn.setValue(" "); msgMoveRecodeVarBttn.setRendered(false); } private HtmlPanelGrid groupPanelRecodeNewVarInfo = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getGroupPanelRecodeNewVarInfo() { return groupPanelRecodeNewVarInfo; } public void setGroupPanelRecodeNewVarInfo(HtmlPanelGrid gp) { this.groupPanelRecodeNewVarInfo = gp; } private HtmlPanelGrid groupPanelRecodeInstruction1 = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getGroupPanelRecodeInstruction1() { return groupPanelRecodeInstruction1; } public void setGroupPanelRecodeInstruction1(HtmlPanelGrid gpri) { this.groupPanelRecodeInstruction1 = gpri; } private HtmlPanelGrid groupPanelRecodeInstruction2 = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getGroupPanelRecodeInstruction2() { return groupPanelRecodeInstruction2; } public void setGroupPanelRecodeInstruction2(HtmlPanelGrid gpri2) { this.groupPanelRecodeInstruction2 = gpri2; } private HtmlPanelGrid groupPanelRecodeTableArea = new com.icesoft.faces.component.ext.HtmlPanelGrid();; public HtmlPanelGrid getGroupPanelRecodeTableArea() { return groupPanelRecodeTableArea; } public void setGroupPanelRecodeTableArea(HtmlPanelGrid gprta) { this.groupPanelRecodeTableArea = gprta; } // ice:selectOneListbox binding => varSetAdvStat private HtmlSelectOneListbox listboxRecode = new com.icesoft.faces.component.ext.HtmlSelectOneListbox(); public HtmlSelectOneListbox getListboxRecode() { return listboxRecode; } public void setListboxRecode(HtmlSelectOneListbox lstbx) { this.listboxRecode = lstbx; } // listboxRecode:ice:selectOneListbox value private String selectedRecodeVariable; public void setSelectedRecodeVariable(String s) { selectedRecodeVariable = s; } public String getSelectedRecodeVariable() { return selectedRecodeVariable; } public void recodeVariableChanged(ValueChangeEvent event){ dbgLog.fine("***** recodeVariableChanged(): begins here *****"); dbgLog.fine("old selectedRecodeVariable="+selectedRecodeVariable); String oldVarValue = (String) event.getOldValue(); dbgLog.fine("old value="+event.getOldValue()); String newVarValue = (String) event.getNewValue(); dbgLog.fine("new value="+event.getNewValue()); selectedRecodeVariable = (String)event.getNewValue(); dbgLog.fine("new selectedRecodeVariable="+selectedRecodeVariable); dbgLog.fine("***** recodeVariableChanged(): ends here *****"); } // moveRecodeVarBttn:h:commandButton@actionListener public void moveRecodeVariable(ActionEvent acev) { dbgLog.fine("***** moveRecodeVariable(): begins here *****"); resetMsgMoveRecodeVarBttn(); if (listboxRecode.getValue()!=null){ dbgLog.fine("listboxRecode.getValue="+listboxRecode.getValue()); } else { dbgLog.fine("listboxRecode.getValue is null"); } if (selectedRecodeVariable != null){ dbgLog.fine("selectedRecodeVariable=" + selectedRecodeVariable); } else { dbgLog.fine("selectedRecodeVariable is null"); } String varId = null;// getSelectedRecodeVariable(); if (selectedRecodeVariable == null){ dbgLog.fine("recode varId selected from the binding="+listboxRecode.getValue()); varId = (String)listboxRecode.getValue(); } else { dbgLog.fine("recode varId selected from the value=" + selectedRecodeVariable); varId = selectedRecodeVariable; } if (varId != null){ dbgLog.fine("Is this a recoded var?[" + isRecodedVar(varId) + "]"); } else { dbgLog.fine("recode-variable id is still null"); msgMoveRecodeVarBttn.setRendered(true); msgMoveRecodeVarBttn.setValue( "Select one variable as a source variable;<br />"+ "and click the start button to set up the recode table" ); return; } if (!groupPanelRecodeTableArea.isRendered()){ groupPanelRecodeTableArea.setRendered(true); groupPanelRecodeInstruction2.setRendered(true); groupPanelRecodeInstruction1.setRendered(false); } resetMsgSaveRecodeBttn(); if (isRecodedVar(varId)) { // newly recoded var case dbgLog.fine("This a recoded var[" + varId + "]"); List<Object> rvs = getRecodedVarSetRow(varId); if (rvs != null) { dbgLog.fine("requested newly recoded var was found"); dbgLog.fine("new varName=" + rvs.get(0)); dbgLog.fine("new varLabel=" + rvs.get(1)); recallRecodedVariable(varId); } else { dbgLog.fine("requested newly recoded var was not found=" + varId); } } else { if (varId != null) { // set the name String varName = getVariableNamefromId(varId); dbgLog.fine("recode variable Name=" + varName); // setRecodeVariableName(varName); currentRecodeVariableName= varName; currentRecodeVariableId = varId; dbgLog.fine("currentRecodeVariableName="+currentRecodeVariableName); dbgLog.fine("currentRecodeVariableId="+currentRecodeVariableId); dbgLog.fine("recodeTargetVarName(b)="+recodeTargetVarName.getValue()); // set the label // setRecodeVariableLabel(getVariableLabelfromId(varId)); String newNamePrefix = "new_"+ RandomStringUtils.randomAlphanumeric(2) +"_"; recodeTargetVarName.setValue(newNamePrefix+varName); recodeTargetVarLabel.setValue(newNamePrefix+getVariableLabelfromId(varId)); dbgLog.fine("recodeTargetVarName(a)="+recodeTargetVarName.getValue()); // get value/label data and set them to the table DataVariable dv = getVariableById(varId); Collection<VariableCategory> catStat = dv.getCategories(); recodeDataList.clear(); recodeValueBox.setSubmittedValue(null); recodeTable.setRendered(false); dbgLog.fine("catStat.size=" + catStat.size()); if (catStat.size() > 0) { // catStat exists dbgLog.fine("catStat exists"); for (Iterator elc = catStat.iterator(); elc.hasNext();) { VariableCategory dvcat = (VariableCategory) elc.next(); if ((dvcat.getValue().equals(".")) && (dvcat.getFrequency() == 0)){ continue; } List<Object> rw = new ArrayList<Object>(); // 0th: Drop rw.add(new Boolean(false)); // 1st: New value rw.add(dvcat.getValue()); // 2nd: New value label rw.add(dvcat.getLabel()); // conditions rw.add(dvcat.getValue()); // recodeDataList.add(rw); } } else { // no catStat, either sumStat or too-many-categories dbgLog.fine("catStat does not exists"); dbgLog.fine("create a default two-row table"); for (int i = 0; i < 2; i++) { List<Object> rw = new ArrayList<Object>(); // 0th: Drop rw.add(new Boolean(false)); // 1st: New value rw.add("enter value here"); // 2nd: New value label rw.add("enter label here"); // conditions rw.add("enter a condition here"); // recodeDataList.add(rw); } } dbgLog.fine("recodeDataList="+recodeDataList); //recodeTable.setValue(recodeDataList); dbgLog.fine("recodeTable: value="+recodeTable.getValue()); // show the recodeTable dbgLog.fine("Number of rows in this Recode Table=" + recodeDataList.size()); groupPanelRecodeTableHelp.setRendered(true); recodeValueBox.setRendered(true); // recodeTable.setValue(recodeDataList); // recodeTable.setRendered(true); addValueRangeBttn.setRendered(true); // keep this variable's Id FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("currentRecodeVariableId", currentRecodeVariableId); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("currentRecodeVariableName", currentRecodeVariableName); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("recodeDataList", recodeDataList); //FacesContext.getCurrentInstance().renderResponse(); recodeTable.setRendered(true); recodeTable.setValue(recodeDataList); recodeValueBox.setRendered(true); } else { dbgLog.fine("Variable to be recoded is null"); } } dbgLog.fine("***** moveRecodeVariable(): ends here *****"); } private HtmlInputText recodeValueBox = new com.icesoft.faces.component.ext.HtmlInputText(); public HtmlInputText getRecodeValueBox() { return recodeValueBox; } public void setRecodeValueBox(HtmlInputText recodeValueBox) { this.recodeValueBox = recodeValueBox; } public void clearRecodeTargetVarInfo() { dbgLog.fine("pass the clear step"); recodeTargetVarName.resetValue(); recodeTargetVarLabel.resetValue(); } // panel above the recodeTable : recodeTableHelpPanel // @binding ui to ice private HtmlPanelGrid groupPanelRecodeTableHelp = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getGroupPanelRecodeTableHelp() { return groupPanelRecodeTableHelp; } public void setGroupPanelRecodeTableHelp(HtmlPanelGrid pg) { this.groupPanelRecodeTableHelp = pg; } // checkbox column(drop this value) // recodeDropValueCheckbox@binding // private Checkbox recodeDropValueCheckbox = new Checkbox(); // // public Checkbox getRecodeDropValueCheckbox() { // return recodeDropValueCheckbox; // } // // public void setRecodeDropValueCheckbox(Checkbox c) { // this.recodeDropValueCheckbox = c; // } private HtmlSelectBooleanCheckbox recodeDropValueCheckboxx = new com.icesoft.faces.component.ext.HtmlSelectBooleanCheckbox(); public HtmlSelectBooleanCheckbox getRecodeDropValueCheckboxx() { return recodeDropValueCheckboxx; } public void setRecodeDropValueCheckboxx(HtmlSelectBooleanCheckbox cb) { this.recodeDropValueCheckboxx = cb; } // recode-Variable-name for the recode-table header cell // h:outputText(recodeHdrVariable) // @value private String currentRecodeVariableName; public void setCurrentRecodeVariableName(String crv) { this.currentRecodeVariableName = crv; } public String getCurrentRecodeVariableName() { return currentRecodeVariableName; } private String currentRecodeVariableId; public void setCurrentRecodeVariableId(String crv) { this.currentRecodeVariableId = crv; } public String getCurrentRecodeVariableId() { return currentRecodeVariableId; } // inputText: recodeTargetVarName: // @binding private HtmlInputText recodeTargetVarName = new com.icesoft.faces.component.ext.HtmlInputText(); public HtmlInputText getRecodeTargetVarName() { return recodeTargetVarName; } public void setRecodeTargetVarName(HtmlInputText vn) { this.recodeTargetVarName = vn; } // @value private String recodeVariableName; public void setRecodeVariableName(String vn) { recodeVariableName = vn; } public String getRecodeVariableName() { return recodeVariableName; } // inputText: recodeTargetVarLabel // @binding private HtmlInputText recodeTargetVarLabel = new com.icesoft.faces.component.ext.HtmlInputText(); public HtmlInputText getRecodeTargetVarLabel() { return recodeTargetVarLabel; } public void setRecodeTargetVarLabel(HtmlInputText vl) { this.recodeTargetVarLabel = vl; } // dataTable:recodeTable // @binding private HtmlDataTable recodeTable = new com.icesoft.faces.component.ext.HtmlDataTable(); //new javax.faces.component.html.HtmlDataTable(); public HtmlDataTable getRecodeTable() { return recodeTable; } public void setRecodeTable(HtmlDataTable daTa) { this.recodeTable = daTa; } // @value private List<Object> recodeDataList = new ArrayList<Object>(); public List<Object> getRecodeDataList() { return recodeDataList; } public void setRecodeDataList(List<Object> dl) { this.recodeDataList = dl; } // commandButton (Add Value/Range Button) // addValueRangeBttn@binding private HtmlCommandButton addValueRangeBttn = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getAddValueRangeBttn() { return addValueRangeBttn; } public void setAddValueRangeBttn(HtmlCommandButton hcb) { this.addValueRangeBttn = hcb; } // commandButton:addValueRangeBttn // @actionListener public void addValueRange(ActionEvent acev) { dbgLog.fine("before add: recodeDataList=" + recodeDataList); List<Object> rw = new ArrayList<Object>(); // 0th: Drop rw.add(new Boolean(false)); // 1st: New value rw.add("enter value here"); // 2nd: New value label rw.add("enter label here"); // conditions rw.add("enter a condition here"); // recodeDataList.add(rw); dbgLog.fine("after add: recodeDataList=" + recodeDataList); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put( "recodeDataList", recodeDataList); } // A hash map that stores recoding schema private Map<String, List<Object>> recodeSchema = new HashMap<String, List<Object>>(); // private Map<String, UIData> recodeSchema = new HashMap<String, UIData>(); // public void setRecodeSchema(String varId, UIData rs){ public void setRecodeSchema(String varId, List<Object> rs) { recodeSchema.put(varId, rs); } // public UIData getRecodeSchema (String varId){ public List<Object> getRecodeSchema(String varId) { List<Object> rt = recodeSchema.get(varId); return rt; } // h:commandButton(Apply Recode Button) // recodeBttn@binding private HtmlCommandButton recodeButton = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getRecodeButton() { return recodeButton; } public void setRecodeButton(HtmlCommandButton hcb) { this.recodeButton = hcb; } /** * Saves the current recoding schema in the Map object recodeSchema * after an end-user clicked the apply-recode button. * Attached to the actionListener attribute of h:commandButton component * whose id is recodeBttn */ public void saveRecodedVariable(ActionEvent acev) { dbgLog.fine("***** saveRecodedVariable(): begins here *****"); // get the current var Id (base variable's ID) String oldVarId = getCurrentRecodeVariableId(); dbgLog.fine("base var_id=" + oldVarId); if (oldVarId == null){ dbgLog.fine("source variable is not selected"); msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn.setValue( "Select one of the existing variables as a source variable;<br />"+ "and click the arrow button to set up the recode table" ); return; } // get the varName in the input field String newVarName = (String) recodeTargetVarName.getValue(); dbgLog.fine("new var name=" + newVarName); if (StringUtils.isEmpty(newVarName)){ dbgLog.fine("Recode variable is not entered"); msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn.setValue( "New variable name is not entered;<br />"+ "enter a unique name in the variable-name box;"); return; } else if (isRecodedVar(oldVarId)) { // replace (re-save) case dbgLog.fine("This variable id is found in the new variable set" + " and recoding scheme would be updated"); dbgLog.fine("currentVarId=" + oldVarId); replaceRecodedVariable(oldVarId); return; } else { // newly create case if (isDuplicatedVariableName(newVarName)) { // duplicated name dbgLog.fine("The new variable name is already in use"); msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn.setValue( "The variable Name you entered is found "+ "among the existing variables;<br />"+ " enter a new variable name"); return; } else { // sanity check against the name String whiteSpace = "\\s+"; String prohibitedChars = "\\W+"; String firstChar = "^[^a-zA-Z]"; if (isVariableNameValid(newVarName, whiteSpace)) { // whitespace found msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn.setValue( "A whitespace character was found in "+ "the variable name;<br />"+ "Whitesapce characters are not allowed "+ "in a variable name."); return; } else if (isVariableNameValid(newVarName, prohibitedChars)) { // non-permissible character was found msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn.setValue( "At least one non-permissible character was found "+ "in the variable name;<br />"+ "Use a-z, A-Z, _, 0-9 characters."); return; } else if (isVariableNameValid(newVarName, firstChar)) { // non-permissible character found msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn.setValue( "The first character of a variable name must be "+ "an alphabet character."); return; } else { // unique and safe name dbgLog.fine("The new variable name is unique"); msgSaveRecodeBttn.setRendered(false); } } } // get the varLabel in the input field String newVarLabel = (String) getRecodeTargetVarLabel().getValue(); dbgLog.fine("new var Label=" + newVarLabel); // create a new var Id // new-case only StringBuilder sb = new StringBuilder(oldVarId + "_"); sb.append(varIdGenerator(oldVarId)); String newVarId = sb.toString(); dbgLog.fine("newVarId=" + newVarId); FacesContext.getCurrentInstance().getExternalContext().getSessionMap() .put("currentRecodeVariableId", newVarId); // new-case only varCart.put(newVarId, newVarName); // new only getVarSetAdvStat().add(new SelectItem(newVarId, newVarName)); // add this new var to the old2new mapping table // new-case only if (baseVarToDerivedVar.containsKey(oldVarId)) { // already used for recoding Set<String> tmps = baseVarToDerivedVar.get(oldVarId); if (tmps.contains(newVarId)) { dbgLog.fine("This new var Id [" + newVarId + "] is found in the set"); } else { tmps.add(newVarId); } } else { // not-yet used for recoding Set<String> tmps = new HashSet<String>(); dbgLog.fine("This new var Id [" + newVarId + "] is NOT found in the set"); tmps.add(newVarId); baseVarToDerivedVar.put(oldVarId, tmps); } dbgLog.fine("old-2-new-var map=" + baseVarToDerivedVar); // remove a row whose condition cell is blank // both dbgLog.fine("start normalization"); for (int i = (recodeDataList.size() - 1); i >= 0; i--) { List<Object> row = (List<Object>) recodeDataList.get(i); String raw = removeWhiteSpacesfromBothEnds((String) row.get(3)); dbgLog.fine("after removing white spaces[=" + raw + "]"); if (raw.equals("")) { recodeDataList.remove(i); dbgLog.fine("element[" + i + "] was removed"); } } dbgLog.fine("end of normalization"); dbgLog.fine("recodeDataList=" + recodeDataList); // saving the data for the recode-table // new and replace: both cases // replace-case: remove the key first? recodeSchema.put(newVarId, new ArrayList(recodeDataList)); // update the value-label-mapping-data storage // new and replace: both cases FacesContext.getCurrentInstance().getExternalContext().getSessionMap() .put("recodeSchema", recodeSchema); dbgLog.fine("recodeSchema=" + recodeSchema); if (!recodeVarNameSet.contains(newVarName)) { // 1st-time save // add this var to the mapping table // add this new var to the new2old mappting table derivedVarToBaseVar.put(newVarId, oldVarId); dbgLog.fine("new-2-old-var map=" + derivedVarToBaseVar); // add this var's name, label, id to the backing object // (recodedVarSet) List<Object> rw = new ArrayList<Object>(); // [0] rw.add(new String(newVarName)); // [1] rw.add(new String(newVarLabel)); // [2] rw.add(newVarId); recodedVarSet.add(rw); // update recodeVarSet for the recodedVarTable FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("recodedVarSet", recodedVarSet); // add this newly created var to the set recodeVarNameSet.add(newVarName); // show the recode-var table pgRecodedVarTable.setRendered(true); dbgLog.fine("updated recodeVarNameSet:"+recodeVarNameSet); } else { // 2nd-time save // not required to add this var to mapping tables dbgLog.fine("newVarName="+newVarName); dbgLog.fine("existing recodeVarNameSet:"+recodeVarNameSet); } // show the recoded-var table // recodedVarTable.setRendered(true); dbgLog.fine("recodeVarSet=" + recodedVarSet); // save recode-source variable name for the header FacesContext.getCurrentInstance().getExternalContext().getSessionMap() .put("currentRecodeVariableName", currentRecodeVariableName); dbgLog.fine("***** saveRecodedVariable(): ends here *****"); } public String removeWhiteSpacesfromBothEnds(String src) { String s = src.replaceAll("\\s+$", ""); return s.replaceAll("^\\s+", ""); } public boolean isDuplicatedVariableName(String newVarName) { boolean rtvl = false; // against the set of the existing variable names if (recodeVarNameSet.contains(newVarName)){ rtvl = true; } else { for (Iterator el = dataVariables.iterator(); el.hasNext();) { DataVariable dv = (DataVariable) el.next(); if (dv.getName().equals(newVarName)) { rtvl = true; break; } } } return rtvl; } public boolean isVariableNameValid(String newVarName, String regex) { boolean rtvl = false; // Pattern p = null; try { p = Pattern.compile(regex); } catch (PatternSyntaxException pex) { pex.printStackTrace(); } Matcher matcher = p.matcher(newVarName); rtvl = matcher.find(); return rtvl; } // Map from base-variable=>derived variable by varId // old(one) => new(many) private Map<String, Set<String>> baseVarToDerivedVar = new HashMap<String, Set<String>>(); // new(one) => old(one) private Map<String, String> derivedVarToBaseVar = new HashMap<String, String>(); // for duplication check private Set<String> recodeVarNameSet = new HashSet<String>(); // newly derived variable's ID generator public String varIdGenerator(String varId) { int lstlen = 0; if (baseVarToDerivedVar.containsKey(varId)) { lstlen = baseVarToDerivedVar.get(varId).size(); } return Integer.toString(lstlen); } // errormessage for recode-save button // ice:outputText private HtmlOutputText msgSaveRecodeBttn = new com.icesoft.faces.component.ext.HtmlOutputText(); public HtmlOutputText getMsgSaveRecodeBttn() { return msgSaveRecodeBttn; } public void setMsgSaveRecodeBttn(HtmlOutputText txt) { this.msgSaveRecodeBttn = txt; } public void resetMsgSaveRecodeBttn() { dbgLog.fine("***** within resetMsgSaveRecodeBttn *****"); msgSaveRecodeBttn.setValue(" "); msgSaveRecodeBttn.setRendered(false); } /** * remove a recoded Variable from the cart * * h:commandLink attr: actionListener see recode block above */ public void removeRecodedVariable(ActionEvent e) { dbgLog.fine("***** removeRecodedVariable(): begins here *****"); // get data stored in the event row List<Object> tmpRecodeVarLine = (List<Object>) getRecodedVarTable().getRowData(); // get varId as a key of recodeSchema String newVarId = (String) tmpRecodeVarLine.get(2); String newVarName = (String) tmpRecodeVarLine.get(0); dbgLog.fine("recoded-var id=" + newVarId); // clear the error message if it still exists resetMsgVariableSelection(); // remove this recoded var from the value-label storage Map // (recodeSchema) if (recodeSchema.containsKey(newVarId)) { recodeSchema.remove(newVarId); } else { dbgLog.fine("value-label table of this var [" + newVarId + "] is not found"); } // remove this recoded var from the recoded-var table (recodedVarSet) for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); String iter = (String) rvs.get(2); if (newVarId.equals(iter)) { dbgLog.fine("iter=" + i + " th element removed"); recodedVarSet.remove(i); break; } } // remove this key from the old-2-new mapping table String oldVarId = derivedVarToBaseVar.get(newVarId); if (baseVarToDerivedVar.containsKey(oldVarId)) { Set<String> tmps = baseVarToDerivedVar.get(oldVarId); if (tmps.contains(newVarId)) { dbgLog.fine("This new var Id [" + newVarId + "] is found in the set and to be removed"); tmps.remove(newVarId); if (tmps.size() < 1) { dbgLog.fine("There is no recoded var for this base-var(id=" + oldVarId + " name=" + getVariableNamefromId(oldVarId) + ")"); baseVarToDerivedVar.remove(oldVarId); } else { dbgLog.fine("The set is " + tmps.size() + " for this base-var(id=" + oldVarId + " name=" + getVariableNamefromId(oldVarId) + ")"); } } else { dbgLog.fine("This new var Id [" + newVarId + "] is NOT found in the set"); } derivedVarToBaseVar.remove(newVarId); } else { dbgLog.fine("recoded variable [" + newVarId + "] is not found in the new2old mapping table"); } // remove this key from the new-2-old map if (derivedVarToBaseVar.containsKey(newVarId)) { derivedVarToBaseVar.remove(newVarId); } else { dbgLog.fine("recoded variable [" + newVarId + "] is not found in the new2old mapping table"); } // if this variable is in the recode-table, String currentVarNameInBox = (String) recodeTargetVarName.getValue(); dbgLog.fine("currentVarName in inputBox=" + currentVarNameInBox); if (newVarName.equals(currentVarNameInBox)) { dbgLog.fine("The variable in the recode table is" + " the variable to be removed"); // clear the table recodeDataList.clear(); // reset the current variable Id setCurrentRecodeVariableName(null); setCurrentRecodeVariableId(null); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("currentRecodeVariableId", currentRecodeVariableId); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("currentRecodeVariableName", currentRecodeVariableName); // reset variable name and label recodeTargetVarName.resetValue(); recodeTargetVarLabel.resetValue(); // hide the recode table and add-row button groupPanelRecodeTableHelp.setRendered(false); recodeTable.setRendered(false); addValueRangeBttn.setRendered(false); varCart.remove(newVarId); // remove the existing option first removeOption(newVarId, getVarSetAdvStat()); } else { dbgLog.fine("The variable in the recode table differs " + "from the variable to be removed"); } // if no more recoded var, hide the recoded var table if (baseVarToDerivedVar.isEmpty()) { pgRecodedVarTable.setRendered(false); } // reset the recode-woring area groupPanelRecodeTableArea.setRendered(false); groupPanelRecodeInstruction2.setRendered(false); groupPanelRecodeInstruction1.setRendered(true); dbgLog.fine("***** removeRecodedVariable(): ends here *****"); } public boolean isRecodedVar(String varId) { Pattern p = Pattern.compile("_"); Matcher m = p.matcher(varId); return m.find(); } public String getNewVarName(String newVarId) { for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); String iter = (String) rvs.get(2); if (newVarId.equals(iter)) { dbgLog.fine("recode data(name) found at " + i + " th row"); return (String) rvs.get(0); } } return null; } public String getNewVarLabel(String newVarId) { for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); String iter = (String) rvs.get(2); if (newVarId.equals(iter)) { dbgLog.fine("recode data(label) found at " + i + " th row"); return (String) rvs.get(1); } } return null; } public List<Object> getRecodedVarSetRow(String newVarId) { for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); String iter = (String) rvs.get(2); if (newVarId.equals(iter)) { dbgLog.fine("recode data(row) found at " + i + " th row"); return rvs; } } return null; } // editRecodedVariable // h:commandLink @actionListener // se recode block above public void editRecodedVariable(ActionEvent e) { // get data stored in the event row List<Object> tmpRecodeVarLine = (List<Object>) getRecodedVarTable() .getRowData(); dbgLog.fine("current recodedVar row:size=" + tmpRecodeVarLine.size()); dbgLog.fine("current recodedVar row=" + tmpRecodeVarLine); // get varId String newVarId = (String) tmpRecodeVarLine.get(2); dbgLog.fine("recoded-var id=" + newVarId); dbgLog.fine("Is this a recoded var?[" + isRecodedVar(newVarId) + "]"); // set this varId's list to the recodeTable if (recodeSchema.containsKey(newVarId)) { setRecodeDataList((List<Object>) recodeSchema.get(newVarId)); recodeTable.setValue((List<Object>) recodeSchema.get(newVarId)); // FacesContext.getCurrentInstance().getExternalContext() // .getSessionMap().put("recodeDataList", recodeDataList); dbgLog.fine("contents of new value-label set=" + (List<Object>) recodeSchema.get(newVarId)); dbgLog.fine("contents of new value-label set=" + recodeDataList); clearRecodeTargetVarInfo(); // update the current recode-Variable's ID String[] tmp = null; tmp = newVarId.split("_"); dbgLog.fine("base-var Id from new var id=" + tmp[0]); dbgLog.fine("base-var Id from the map=" + derivedVarToBaseVar.get(newVarId)); // setCurrentRecodeVariableId(tmp[0]); currentRecodeVariableId = tmp[0]; FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("currentRecodeVariableId", currentRecodeVariableId); // update the varName // setRecodeVariableName( (String) tmpRecodeVarLine.get(0)); // update the varLabel // setRecodeVariableLabel((String) tmpRecodeVarLine.get(1)); recodeTargetVarName.setValue((String) tmpRecodeVarLine.get(0)); recodeTargetVarLabel.setValue((String) tmpRecodeVarLine.get(1)); // FacesContext.getCurrentInstance().getExternalContext() // .getSessionMap().put("recodeVariableName",recodeVariableName); // // FacesContext.getCurrentInstance().getExternalContext() // .getSessionMap().put("recodeVariableLabel",recodeVariableLabel); // //FacesContext.getCurrentInstance().renderResponse(); } else { dbgLog.fine("value-label table of this var [" + newVarId + "] is not found"); } } public void recallRecodedVariable(String newVarId) { dbgLog.fine("***** recallRecodedVariable(): begins here *****"); // get data stored in a row of the recodedVarTable by Id List<Object> rvs = getRecodedVarSetRow(newVarId); if (rvs != null) { dbgLog.fine("requested newly recoded var was found"); dbgLog.fine("new varName=" + rvs.get(0)); dbgLog.fine("new varLabel=" + rvs.get(1)); // set this varId's list to the recodeTable if (recodeSchema.containsKey(newVarId)) { setRecodeDataList((List<Object>) recodeSchema.get(newVarId)); recodeTable.setValue((List<Object>) recodeSchema.get(newVarId)); dbgLog.fine("contents of new value-label set=" + (List<Object>) recodeSchema.get(newVarId)); dbgLog.fine("contents of new value-label set=" + recodeDataList); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("recodeDataList", recodeDataList); clearRecodeTargetVarInfo(); // update the current recode-Variable's ID String[] tmp = null; tmp = newVarId.split("_"); dbgLog.fine("base-var Id from new var id=" + tmp[0]); dbgLog.fine("base-var Id from the map=" + derivedVarToBaseVar.get(newVarId)); // currentRecodeVariableId=tmp[0]; currentRecodeVariableId = newVarId; FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("currentRecodeVariableId", currentRecodeVariableId); recodeTargetVarName.setValue((String) rvs.get(0)); recodeTargetVarLabel.setValue((String) rvs.get(1)); //FacesContext.getCurrentInstance().renderResponse(); } else { dbgLog.fine("value-label table of this var [" + newVarId + "] is not found"); } } else { dbgLog.warning("requested newly recoded var was not found=" + newVarId); } dbgLog.fine("***** recallRecodedVariable(): ends here *****"); } // updating the current recoding scheme public void replaceRecodedVariable(String newVarId) { dbgLog.fine("***** replaceRecodedVariable(): begins here *****"); dbgLog.fine("current var id (from: args)=" + newVarId); dbgLog.fine("current var id (from: method)=" + getCurrentRecodeVariableId()); // get the latest varName in the input field String newVarName = (String) recodeTargetVarName.getValue(); dbgLog.fine("new var Name =" + newVarName); // sanity check against the name String whiteSpace = "\\s+"; String prohibitedChars = "\\W+"; String firstChar = "^[^a-zA-Z]"; if (isVariableNameValid(newVarName, whiteSpace)) { // whitespace found msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn .setValue("A whitespace character was found in the variable name;<br />Whitesapce characters are not allowed in a variable name."); return; } else if (isVariableNameValid(newVarName, prohibitedChars)) { // non-permissible character found msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn .setValue("At least one non-permissible character was found in the variable name;<br />Use a-z, A-Z, _, 0-9 characters."); return; } else if (isVariableNameValid(newVarName, firstChar)) { // non-permissible character found msgSaveRecodeBttn.setRendered(true); msgSaveRecodeBttn .setValue("The first character of a variable name must be an alphabet character."); return; } else { // unique and safe name dbgLog.fine("The new variable name is unique"); msgSaveRecodeBttn.setRendered(false); // msgSaveRecodeBttn.setValue("The variable name is unique"); } // get the latest varLabel in the input field String newVarLabel = (String) getRecodeTargetVarLabel().getValue(); dbgLog.fine("new var Label=" + newVarLabel); // create a new var Id // new-case only dbgLog.fine("newVarId=" + newVarId); // replace-case only // remove the current varId-varName pair: variable name might have been // updated varCart.remove(newVarId); // new and replace: both cases varCart.put(newVarId, newVarName); // replace only: remove the existing option first removeOption(newVarId, getVarSetAdvStat()); // new and replace: both cases getVarSetAdvStat().add(new SelectItem(newVarId, newVarName)); // add this new var to the old2new mapping table // new-case only dbgLog.fine("old-2-new-var map=" + baseVarToDerivedVar); // remove a row whose condition cell is blank // both dbgLog.fine("start normalization"); for (int i = (recodeDataList.size() - 1); i >= 0; i--) { List<Object> row = (List<Object>) recodeDataList.get(i); String raw = removeWhiteSpacesfromBothEnds((String) row.get(3)); dbgLog.fine("after removing white spaces[=" + raw + "]"); if (raw.equals("")) { recodeDataList.remove(i); dbgLog.fine("element[" + i + "] was removed"); } } dbgLog.fine("end of normalization"); dbgLog.fine("recodeDataList=" + recodeDataList); // saving the data for the recode-table // replace-case: remove the existing entry first recodeSchema.remove(newVarId); // new and replace: both cases recodeSchema.put(newVarId, new ArrayList(recodeDataList)); // update the value-label-mapping-data storage // new and replace: both cases FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("recodeSchema", recodeSchema); dbgLog.fine("recodeSchema=" + recodeSchema); // replace case // 2nd-time save // update the existing variable name and label because they might have // been modified dbgLog.fine("new-2-old-var map=" + derivedVarToBaseVar); // get the current row of this recoded var int location = -1; for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> row = (List<Object>) recodedVarSet.get(i); String varId = (String) row.get(2); dbgLog.fine(i + "-th current varId=" + varId); if (varId.equals(newVarId)) { dbgLog.fine("The ID was found in the " + i + "-th row"); location = i; } } if (location >= 0) { List<Object> oldrw = (List<Object>) recodedVarSet.get(location); boolean isVariableNameUpdated = false; String oldVarName = (String) oldrw.get(0); if (oldVarName.equals(newVarName)) { dbgLog.fine("The variable name was not updated"); } else { dbgLog.fine("The old variable name(" + oldVarName + ") is replaced by " + newVarName); // The variable name has been updated; // remove the current name from recodeVarNameSet first if (recodeVarNameSet.remove(oldVarName)) { dbgLog.fine("The old variable name was successfully removed"); } else { dbgLog.fine("The old variable name(" + oldVarName + ") was not removed"); } isVariableNameUpdated = true; } // remove the current row first recodedVarSet.remove(location); // add the new row // add this var's name, label, id to the backing object // (recodedVarSet) List<Object> rw = new ArrayList<Object>(); // [0] rw.add(new String(newVarName)); // [1] rw.add(new String(newVarLabel)); // [2] rw.add(newVarId); recodedVarSet.add(rw); // update recodeVarSet for the recodedVarTable FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("recodedVarSet", recodedVarSet); // if the variable name has been updated, // remove the current name from recodeVarNameSet and // add the new one to it if (isVariableNameUpdated) { recodeVarNameSet.add(newVarName); } } else { dbgLog.warning("This variable was not saved(id=" + newVarId + ")"); } // show the recoded-var table // recodedVarTable.setRendered(true); dbgLog.fine("recodeVarSet(after update)=" + recodedVarSet); dbgLog.fine("***** replaceRecodedVariable(): ends here *****"); } public Map<String, List<String>> getRecodedVarParameters() { Map<String, List<String>> mpl = new HashMap<String, List<String>>(); // new var name list List<String> vns = new ArrayList<String>(); // Set<String> vids = recodeSchema.keySet(); for (Object rw : recodedVarSet) { // add variable label List<Object> rwi = (List<Object>) rw; // [0] varName // [1] varLabel // [2] varId String newVarName = (String) rwi.get(0); String newVarLabel = (String) rwi.get(1); String newVarId = (String) rwi.get(2); // add newVarId to newVarName mpl.put("v" + newVarId, Arrays.asList(newVarName)); dbgLog.fine("Id-Name: " + newVarId + "=>" + newVarName); // add new varName vns.add(newVarName); mpl.put("ud_" + newVarName + "_q_lebaLrav", Arrays .asList(newVarLabel)); // add variable type: 0 for character var mpl.put("ud_" + newVarName + "_q_epyTrav", Arrays.asList("1")); // add value-label-condition List<Object> rdtbl = (List<Object>) recodeSchema.get(newVarId); dbgLog.fine("rdtbl=" + rdtbl); List<String> delList = new ArrayList<String>(); for (Object rdtblrw : rdtbl) { List<Object> rdtbli = (List<Object>) rdtblrw; String baseVarName = getVariableNamefromId(derivedVarToBaseVar .get(newVarId)); dbgLog.fine("rdtbli=" + rdtbli); if ((Boolean) rdtbli.get(0)) { // delete flag: boolean true // delete value // "ud_"+ {newVarName} + "_q_eteleD" // "eteleD|"+{VarName}+"|"+{condition} dbgLog.fine("delete this value=" + rdtbli.get(3)); delList.add("eteleD|" + baseVarName + "|" + rdtbli.get(3)); } else { // delete flag: boolean false, i.e., // value - label - condition // "ud_"+ {newVarName} + "_q_" +{value} // {label}+"|"+{VarName}+"|"+{condition} dbgLog.fine("keep this value=" + rdtbli.get(3)); String pmky = "ud_" + newVarName + "_q_" + rdtbli.get(1); dbgLog.fine("pmky=" + pmky); if (mpl.containsKey(pmky)) { // key exits List<String> tmpvl = (List<String>) mpl.get(pmky); dbgLog.fine("tmpvl:b=" + tmpvl); String pmvl = rdtbli.get(2) + "|" + baseVarName + "|" + rdtbli.get(3); dbgLog.fine("pmvl=" + pmvl); tmpvl.add(pmvl); dbgLog.fine("tmpvl:a=" + tmpvl); // mpl.put(pmky, new ArrayList(tmpvl) ); mpl.put(pmky, tmpvl); } else { List<String> pvlst = new ArrayList(); pvlst.add(rdtbli.get(2) + "|" + baseVarName + "|" + rdtbli.get(3)); mpl.put(pmky, pvlst); } // mpl.put("ud_"+newVarName+"_q_"+rdtbli.get(1), // Arrays.asList(rdtbli.get(2)+"|"+baseVarName+"|"+rdtbli.get(3)) // ); } } // for:inner if (delList.size() > 0) { mpl.put("ud_" + newVarName + "_q_eteleD", delList); } } // for:outer // add newVarNameSet mpl.put("newVarNameSet", vns); return mpl; } // ----------------------------------------------------------------------- // recoded-variable Table section // ----------------------------------------------------------------------- // / title and message line // HtmlOutputText: recodedVarTableTitle@binding private HtmlOutputText recodedVarTableTitle = new com.icesoft.faces.component.ext.HtmlOutputText(); public HtmlOutputText getRecodedVarTableTitle() { return recodedVarTableTitle; } public void setRecodedVarTableTitle(HtmlOutputText hot) { this.recodedVarTableTitle = hot; } // h:panelGroup PGrecodedVarTable // @binding private HtmlPanelGrid pgRecodedVarTable = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getPgRecodedVarTable() { return pgRecodedVarTable; } public void setPgRecodedVarTable(HtmlPanelGrid pg) { this.pgRecodedVarTable = pg; } // h:dataTable: recodedVarTable // @binding private UIData recodedVarTable = null; public UIData getRecodedVarTable() { return recodedVarTable; } public void setRecodedVarTable(UIData data) { this.recodedVarTable = data; } // @value private List<Object> recodedVarSet = new ArrayList<Object>(); public void setRecodedVarSet(List<Object> dt) { this.recodedVarSet = dt; } public List<Object> getRecodedVarSet() { return recodedVarSet; } public void hideRecodeTableArea() { groupPanelRecodeTableHelp.setRendered(false); recodeTable.setRendered(false); addValueRangeBttn.setRendered(false); } public void clearRecodeTableBlock(){ // borrowed from the removeRecodedVariable() dbgLog.fine("***** clearRecodeTableBlock(): starts *****"); // clear the table recodeDataList.clear(); // reset the current variable Id setCurrentRecodeVariableName(null); setCurrentRecodeVariableId(null); // reset variable name and label recodeTargetVarName.resetValue(); recodeTargetVarLabel.resetValue(); // hide the recode table and add-row button groupPanelRecodeTableHelp.setRendered(false); recodeTable.setRendered(false); addValueRangeBttn.setRendered(false); // if no more recoded var, hide the recoded var table if (baseVarToDerivedVar.isEmpty()) { pgRecodedVarTable.setRendered(false); } // reset the recode-woring area groupPanelRecodeTableArea.setRendered(false); groupPanelRecodeInstruction2.setRendered(false); groupPanelRecodeInstruction1.setRendered(true); dbgLog.fine("***** clearRecodeTableBlock(): ends *****"); } // recode section ends here // </editor-fold> // ----------------------------------------------------------------------- // eda section // ----------------------------------------------------------------------- // <editor-fold desc="EDA"> // LHS: list box related fields // RHS: checkbox area related fields // analysis :selectManyCheckbox@binding private HtmlSelectManyCheckbox edaOptionSet = new com.icesoft.faces.component.ext.HtmlSelectManyCheckbox(); //new HtmlSelectManyCheckbox(); public HtmlSelectManyCheckbox getEdaOptionSet() { return edaOptionSet; } public void setEdaOptionSet(HtmlSelectManyCheckbox edaOptionSet) { this.edaOptionSet = edaOptionSet; } // selectManyCheckbox@value private Object[] edaOptionSelected = null; public Object[] getEdaOptionSelected() { if (edaOptionSelected == null) { edaOptionSelected = new Object[1]; edaOptionSelected[0] = (Object)(getEdaOptionItems().get(0)); } return edaOptionSelected; } public void setEdaOptionSelected(Object[] edaOptionSelected) { this.edaOptionSelected = edaOptionSelected; } // edaOptionNumeric:f:selectItem@itemValue // edaOptionGraphic:f:selectItem@itemValue private List edaOptionItems = null; public List getEdaOptionItems() { if (edaOptionItems == null) { edaOptionItems = new ArrayList(); edaOptionItems.add("A01"); edaOptionItems.add("A02"); } return edaOptionItems; } // submit button // edaBttn:h:commandButton@binding private HtmlCommandButton edaButton = new com.icesoft.faces.component.ext.HtmlCommandButton(); // new HtmlCommandButton(); public HtmlCommandButton getEdaButton() { return edaButton; } public void setEdaButton(HtmlCommandButton hcb) { this.edaButton = hcb; } // checking parameters before submission- public boolean checkEdaParameters() { boolean result = false; dbgLog.info("EDA: number of selected options (value)=" + edaOptionSelected); Object[] vs = edaOptionSet.getSelectedValues(); dbgLog.info("EDA: number of selected options (binding)=" + vs); // param-checking conditions if (edaOptionSelected.length > 0){ dbgLog.info("EDA(checkEdaParameters): number of selected options=" + vs.length); result = true; } else if (vs.length > 0) { dbgLog.info("EDA(checkEdaParameters): number of selected options=" + vs.length); result = true; } else { dbgLog.info("EDA(checkEdaParameters()): no option is checked"); } return result; } // msgEdaButton:ice:outputText@binding private com.icesoft.faces.component.ext.HtmlOutputText msgEdaButton = new com.icesoft.faces.component.ext.HtmlOutputText(); public com.icesoft.faces.component.ext.HtmlOutputText getMsgEdaButton() { return msgEdaButton; } public void setMsgEdaButton(com.icesoft.faces.component.ext.HtmlOutputText txt) { this.msgEdaButton = txt; } private String msgEdaButtonTxt; public String getMsgEdaButtonTxt() { return msgEdaButtonTxt; } public void setMsgEdaButtonTxt(String txt) { this.msgEdaButtonTxt = txt; } public void resetMsgEdaButton() { dbgLog.info("***** within resetMsgEdaButton *****"); msgEdaButton.setValue(" "); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("msgEdaButtonTxt", msgEdaButtonTxt); msgEdaButton.setVisible(false); dbgLog.info("***** resetMsgEdaButton: end *****"); } // end of eda section ---------------------------------------------------- // </editor-fold> // edaBttn:h:commandButton@action public String edaAction() { // dbgLog.fine("selected tab(eda)="+getTabSet1().getSelected()); // clear the error message around the EDA button if they exisit resetMsgEdaButton(); if (checkEdaParameters()) { FacesContext cntxt = FacesContext.getCurrentInstance(); HttpServletResponse res = (HttpServletResponse) cntxt .getExternalContext().getResponse(); HttpServletRequest req = (HttpServletRequest) cntxt .getExternalContext().getRequest(); dbgLog.info("***** within edaAction() *****"); StudyFile sf = dataTable.getStudyFile(); Long noRecords = dataTable.getRecordsPerCase(); String dsbUrl = getDsbUrl(); dbgLog.info("dsbUrl=" + dsbUrl); String serverPrefix = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath(); /* String serverPrefix = "http://dvn-alpha.hmdc.harvard.edu" + req.getContextPath(); */ dbgLog.info("serverPrefix"+serverPrefix); /* * "optnlst_a" => "A01|A02|A03", * "analysis" => "A01 A02", * "varbl" => "v1.3 v1.10 v1.13 v1.22 v1.40", * "charVarNoSet" => * "v1.10|v1.719", */ Map<String, List<String>> mpl = new HashMap<String, List<String>>(); Object[] vs = edaOptionSet.getSelectedValues(); // analysis=[A01, A02] List<String> alst = new ArrayList<String>(); for (int i = 0; i < vs.length; i++) { dbgLog.info("eda option[" + i + "]=" + vs[i]); alst.add((String) vs[i]); } mpl.put("analysis", alst); mpl.put("optnlst_a", Arrays.asList("A01|A02|A03")); // if there is a user-defined (recoded) variables /* if (recodedVarSet.size() > 0) { mpl.putAll(getRecodedVarParameters()); } */ // dbgLog.fine("citation info to be sent:\n" + citation); // mpl.put("OfflineCitation", Arrays.asList(citation)); // mpl.put("appSERVER", Arrays.asList(req.getServerName() + ":" // + req.getServerPort() + req.getContextPath())); mpl.put("studytitle", Arrays.asList(getStudyTitle())); dbgLog.info("studyId from get method="+getStudyId().toString()); mpl.put("studyno", Arrays.asList(getStudyId().toString())); mpl.put("studyURL", Arrays.asList(studyURL)); mpl.put("browserType", Arrays.asList(browserType)); mpl.put("recodedVarIdSet", getRecodedVarIdSet()); mpl.put("recodedVarNameSet",getRecodedVarNameSet()); mpl.put("recodedVarLabelSet", getRecodedVarLabelSet()); mpl.put("recodedVarTypeSet", getRecodedVariableType()); mpl.put("recodedVarBaseTypeSet", getBaseVariableTypeForRecodedVariable()); mpl.put("baseVarIdSet",getBaseVarIdSetFromRecodedVarIdSet()); mpl.put("baseVarNameSet",getBaseVarNameSetFromRecodedVarIdSet()); mpl.put("requestType", Arrays.asList("EDA")); // ----------------------------------------------------- // New processing route // // Step 0. Locate the data file and its attributes String fileId = sf.getId().toString(); //VDC vdc = vdcService.getVDCFromRequest(req); String fileloc = sf.getFileSystemLocation(); String tabflnm = sf.getFileName(); boolean sbstOK = sf.isSubsettable(); String flct = sf.getFileType(); dbgLog.info("location="+fileloc); dbgLog.info("filename="+tabflnm); dbgLog.info("subsettable="+sbstOK); dbgLog.info("filetype="+flct); DvnRJobRequest sro = null; List<File> zipFileList = new ArrayList(); // the data file for downloading/statistical analyses must be subset-ready // local (relative to the application) file case // note: a typical remote case is: US Census Bureau File tmpsbfl = null; if (sbstOK){ try { // this temp file will store the requested columns: tmpsbfl = File.createTempFile("tempsubsetfile.", ".tab"); deleteTempFileList.add(tmpsbfl); // to produce this file, we'll either open the stream // and run our local subsetting code on it, or request // the subsetting to be performed natively by the access // driver, if it supports the functionality: // check whether a source file is tab-delimited or not boolean fieldcut = true; if ((noRecords != null) && (noRecords >=1)){ fieldcut = false; } DataAccessRequest daReq = new DataAccessRequest(); daReq.setParameter("noVarHeader", "1"); DataAccessObject accessObject = DataAccess.createDataAccessObject(sf, daReq); if (accessObject.isSubsetSupported()) { dbgLog.info("Using NATIVE subset functionality of the repository."); daReq.setParameter("vars", getVariableNamesForSubset()); accessObject.open(); InputStream inSubset = accessObject.getInputStream(); OutputStream outSubset = new BufferedOutputStream(new FileOutputStream(tmpsbfl.getAbsolutePath())); int bufsize = 8192; byte [] subsetDataBuffer = new byte[bufsize]; while ((bufsize = inSubset.read(subsetDataBuffer))!=-1) { outSubset.write(subsetDataBuffer, 0, bufsize); } inSubset.close(); outSubset.close(); // TODO: catch exceptions; reset the state of the page // if anything went wrong. See the fixed-field section // below for an example. } else { accessObject.open(); if (fieldcut){ // Cutting requested fields of data from a TAB-delimited stream: Set<Integer> fields = getFieldNumbersForSubsetting(); dbgLog.info("subsetting fields="+fields); // Create an instance of DvnJavaFieldCutter FieldCutter fc = new DvnJavaFieldCutter(); // Executes the subsetting request fc.subsetFile(accessObject.getInputStream(), tmpsbfl.getAbsolutePath(), fields, dataTable.getCaseQuantity(), "\t"); // TODO: catch exceptions; reset the state of the page // if anything went wrong. See the fixed-field section // below for an example. } else { // Cutting requested columns of data from a fixed-field stream: Map<Long, List<List<Integer>>> varMetaSet = getSubsettingMetaData(noRecords); DvnNewJavaFieldCutter fc = new DvnNewJavaFieldCutter(varMetaSet); try { //fc.cutColumns(new File(cutOp1), noRecords.intValue(), 0, "\t", tmpsbfl.getAbsolutePath()); fc.cutColumns(accessObject.getInputStream(), noRecords.intValue(), 0, "\t", tmpsbfl.getAbsolutePath()); } catch (FileNotFoundException e) { e.printStackTrace(); msgDwnldButton.setValue("* could not generate subset due to an IO problem"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } catch (RuntimeException re){ re.printStackTrace(); msgDwnldButton.setValue("* could not generate subset due to an runtime error"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an runtime error"); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } } } // Checks the resulting subset file if (tmpsbfl.exists()){ Long subsetFileSize = tmpsbfl.length(); dbgLog.info("subsettFile:Length="+subsetFileSize); dbgLog.info("tmpsb file name="+tmpsbfl.getAbsolutePath()); if (subsetFileSize > 0){ mpl.put("subsetFileName", Arrays.asList(tmpsbfl.getAbsolutePath())); mpl.put("subsetDataFileName",Arrays.asList(tmpsbfl.getName())); } else { // subset file exists but it is empty msgEdaButton.setValue("* an subset file is empty"); msgEdaButton.setVisible(true); dbgLog.warning("exiting edaAction() due to a subsetting error:"+ "a subset file is empty" ); getVDCRequestBean().setSelectedTab("tabEda"); return ""; } } else { // subset file was not created msgEdaButton.setValue("* a subset file was not created"); msgEdaButton.setVisible(true); dbgLog.warning("exiting edaAction() due to a subsetting error:"+ "a subset file was not created" ); getVDCRequestBean().setSelectedTab("tabEda"); return ""; } // Step 3. Organizes parameters/metadata to be sent to the implemented // data-analysis-service class //Map<String, Map<String, String>> vls = getValueTableForRequestedVariables(getDataVariableForRequest()); Map<String, Map<String, String>> vls = getValueTablesForAllRequestedVariables(); sro = new DvnRJobRequest(getDataVariableForRequest(), mpl, vls, recodeSchema); // dbgLog.fine("sro dump:\n"+ToStringBuilder.reflectionToString(sro, ToStringStyle.MULTI_LINE_STYLE)); // Step 4. Creates an instance of the the implemented // data-analysis-service class DvnRDataAnalysisServiceImpl das = new DvnRDataAnalysisServiceImpl(); // Executes a request of downloading or data analysis and // capture result info as a Map <String, String> resultInfo = das.execute(sro); // Step 5. Checks the DSB-exit-status code if (resultInfo.get("RexecError").equals("true")){ msgEdaButton.setValue("* The Request failed due to an R-runtime error"); msgEdaButton.setVisible(true); dbgLog.info("exiting edaAction() due to an R-runtime error"); getVDCRequestBean().setSelectedTab("tabEda"); return ""; } else { if (recodeSchema.size()> 0){ resultInfo.put("subsettingCriteria",sro.getSubsetConditionsForCitation()); } else { resultInfo.put("subsettingCriteria",""); } } } catch (MalformedURLException e) { e.printStackTrace(); msgEdaButton.setValue("* file URL is malformed"); msgEdaButton.setVisible(true); dbgLog.warning("exiting edaAction() due to a URL problem "); getVDCRequestBean().setSelectedTab("tabEda"); return ""; } catch (IOException e) { // this may occur if the dataverse is not released // the file exists, but it is not accessible e.printStackTrace(); msgEdaButton.setValue("* an IO problem occurred"); msgEdaButton.setVisible(true); dbgLog.warning("exiting edaAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabEda"); return ""; } // end of the subset-OK case } else { // not subsettable data file msgEdaButton.setValue("* this data file is not subsettable file"); msgEdaButton.setVisible(true); dbgLog.warning("exiting edaAction(): the data file is not subsettable "); getVDCRequestBean().setSelectedTab("tabEda"); return ""; } // end:subsetNotOKcaseF // final processing steps for all successful cases resultInfo.put("offlineCitation", getCitation()); resultInfo.put("studyTitle", getStudyTitle()); resultInfo.put("studyNo", getStudyId().toString()); resultInfo.put("fileName", fileName); resultInfo.put("dtId", dtId.toString()); if (versionNumber != null) { resultInfo.put("versionNumber", versionNumber.toString()); } resultInfo.put("studyURL", studyURL); resultInfo.put("R_min_verion_no",resultInfo.get("Rversion").substring(2)); resultInfo.put("dataverse_version_no",dvnVersionNumber); dbgLog.info("RwrkspFileName="+resultInfo.get("wrkspFileName")); // writing necessary files try{ // rename the subsetting file File tmpsbflnew = File.createTempFile(SUBSET_FILENAME_PREFIX + resultInfo.get("PID") +".", ".tab"); deleteTempFileList.add(tmpsbflnew); InputStream inb = new BufferedInputStream(new FileInputStream(tmpsbfl)); OutputStream outb = new BufferedOutputStream(new FileOutputStream(tmpsbflnew)); int bufsize; byte [] bffr = new byte[8192]; while ((bufsize = inb.read(bffr))!=-1) { outb.write(bffr, 0, bufsize); } inb.close(); outb.close(); String rhistNew = StringUtils.replace(resultInfo.get("RCommandHistory"), tmpsbfl.getName(),tmpsbflnew.getName()); //zipFileList.add(tmpsbflnew); // (1) write a citation file // String citationFilePrefix = "citationFile_"+ resultInfo.get("PID") + "_"; // File tmpcfl = File.createTempFile(citationFilePrefix, ".txt"); // // zipFileList.add(tmpcfl); // deleteTempFileList.add(tmpcfl); // // DvnCitationFileWriter dcfw = new DvnCitationFileWriter(resultInfo); // // String fmpcflFullname = tmpcfl.getAbsolutePath(); // String fmpcflname = tmpcfl.getName(); // dcfw.write(tmpcfl); // (2) R command file String rhistoryFilePrefix = R_COMMAND_FILE_PREFIX + resultInfo.get("PID") + ".R"; File tmpRhfl = new File(TEMP_DIR, rhistoryFilePrefix); zipFileList.add(tmpRhfl); deleteTempFileList.add(tmpRhfl); resultInfo.put("dvn_R_helper_file","dvn_helper.R"); DvnReplicationCodeFileWriter rcfw = new DvnReplicationCodeFileWriter(resultInfo); rcfw.writeEdaCode(tmpRhfl); // (3)RData Replication file String wrkspFileName = resultInfo.get("wrkspFileName"); dbgLog.info("wrkspFileName="+wrkspFileName); File RwrkspFileName = new File(wrkspFileName); if (RwrkspFileName.exists()){ dbgLog.info("RwrkspFileName:length="+RwrkspFileName.length()); zipFileList.add(RwrkspFileName); } else { dbgLog.info("RwrkspFileName does not exist"); //msgEdaButton.setValue("* The workspace file is not available"); //msgEdaButton.setVisible(true); dbgLog.warning("edaAction(): R workspace file was not transferred"); //getVDCRequestBean().setSelectedTab("tabEda"); //return "failure"; } deleteTempFileList.add(RwrkspFileName); // // vdc_startup.R file // String vdc_startupFileName = resultInfo.get("vdc_startupFileName"); // dbgLog.fine("vdc_startupFileName="+vdc_startupFileName); // File vdcstrtFileName = new File(vdc_startupFileName); // if (vdcstrtFileName.exists()){ // dbgLog.fine("vdcstrtFileName:length="+vdcstrtFileName.length()); // zipFileList.add(vdcstrtFileName); // } else { // dbgLog.fine("vdcstrtFileName does not exist"); // //msgEdaButton.setValue("* vdc_startup.R is not available"); // //msgEdaButton.setVisible(true); // dbgLog.warning("edaAction(): vdc_startup.R was not transferred"); // //getVDCRequestBean().setSelectedTab("tabEda"); // // //return "failure"; // } // deleteTempFileList.add(vdcstrtFileName); // add replication readme file // (4) readme file // zipFileList.add(REP_README_FILE); String readMeFileName = REP_README_FILE_PREFIX + resultInfo.get("PID") + ".txt"; File readMeFile = new File(TEMP_DIR, readMeFileName); DvnReplicationREADMEFileWriter rw = new DvnReplicationREADMEFileWriter(resultInfo); rw.writeREADMEfile(readMeFile); //zipFileList.add(REP_README_FILE); zipFileList.add(readMeFile); deleteTempFileList.add(readMeFile); // (5) css file zipFileList.add(DVN_R2HTML_CSS_FILE); // (6) dvn_R_helper zipFileList.add(DVN_R_HELPER_FILE); // zip the following files as a replication-pack // // local local local remote // citation, tab-file, R history, wrksp for (File f : zipFileList){ dbgLog.fine("path="+f.getAbsolutePath() +"\tname="+ f.getName()); } // zipping all required files try{ String zipFilePrefix = "zipFile_" + resultInfo.get("PID") + ".zip"; File zipFile = new File(TEMP_DIR, zipFilePrefix); //res.setContentType("application/zip"); String zfname = zipFile.getAbsolutePath(); //res.setHeader("content-disposition", "attachment; filename=" + zfname); OutputStream zfout = new FileOutputStream(zipFile); //zipFiles(res.getOutputStream(), zipFileList); zipFiles(zfout, zipFileList); deleteTempFileList.add(zipFile); if (zipFile.exists()){ Long zipFileSize = zipFile.length(); dbgLog.info("zip file:length="+zipFileSize); dbgLog.info("zip file:name="+zipFile.getAbsolutePath()); if (zipFileSize > 0){ resultInfo.put("replicationZipFile", zfname); resultInfo.put("replicationZipFileName", zipFile.getName()); } else { dbgLog.info("zip file is empty"); } } else { dbgLog.info("zip file was not saved"); } resultInfo.remove("RCommandHistory"); // put resultInfo into the session object FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put( "resultInfo", resultInfo); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); dbgLog.info("***** within edaAction(): succcessfully ends here *****"); return "/subsetting/AnalysisResultsPage?faces-redirect=true" + getContextSuffix(); //return "success"; } catch (IOException e){ // file-access problem, etc. e.printStackTrace(); dbgLog.info("zipping IO exception"); msgEdaButton.setValue("* an IO problem occurred during zipping replication files"); msgEdaButton.setVisible(true); dbgLog.warning("exiting edaAction() due to an zipping IO problem "); //getVDCRequestBean().setSelectedTab("tabEda"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return "/subsetting/AnalysisResultsPage?faces-redirect=true" + getContextSuffix(); //return "success"; } // end of zipping step } catch (IOException e){ // io errors caught during writing files e.printStackTrace(); msgEdaButton.setValue("* an IO problem occurred"); msgEdaButton.setVisible(true); dbgLog.warning("exiting edaAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabEda"); return ""; } // end of CheckParameters: OK case } else { // parameters are not complete: show error message; msgEdaButton.setValue("* Select at least one option"); msgEdaButton.setVisible(true); dbgLog.warning("exiting edaAction(): selection is incomplete"); getVDCRequestBean().setSelectedTab("tabEda"); return ""; } } // ----------------------------------------------------------------------- // AdvStat section // ----------------------------------------------------------------------- // <editor-fold desc="Advanced Statistics"> // <editor-fold desc="Adv Stat box and panels"> // ice:selectOneMenu @binding private HtmlSelectOneMenu dropDown1 = new com.icesoft.faces.component.ext.HtmlSelectOneMenu(); public HtmlSelectOneMenu getDropDown1() { return dropDown1; } public void setDropDown1(HtmlSelectOneMenu dropDown1) { this.dropDown1 = dropDown1; } // ice:selectOneMenu @value: options for selectOneMenu private List<SelectItem> modelMenuOptions = new ArrayList<SelectItem>(); public List<SelectItem> getModelMenuOptions() { return modelMenuOptions; } public void setModelMenuOptions(List<SelectItem> modelMenuOptions) { this.modelMenuOptions = modelMenuOptions; } private String currentModelName; public String getCurrentModelName() { return currentModelName; } public void setCurrentModelName(String cmn) { this.currentModelName = cmn; } private String modelHelpLinkURL; public String getModelHelpLinkURL() { return modelHelpLinkURL; } public void setModelHelpLinkURL(String url) { this.modelHelpLinkURL = url; } /** * panelGrid component that contains the model help * information box in the advanced statistics pane. * The rendered attribute of this component must be state-kept. * Initially hidden. */ private HtmlPanelGrid gridPanelModelInfoBox = new com.icesoft.faces.component.ext.HtmlPanelGrid(); /** * Getter for component gridPanelModelInfoBox * * @return h:panelGrid of the model help info box */ public HtmlPanelGrid getGridPanelModelInfoBox() { return gridPanelModelInfoBox; } /** * Setter for component gridPanelModelInfoBox * * @param hpg h:panelGrid of the model help info box */ public void setGridPanelModelInfoBox(HtmlPanelGrid hpg) { this.gridPanelModelInfoBox = hpg; } /** * The Boolean object backing the rendered attribute of * gridPanelModelInfoBox (h:panelGrid) component. * Exposed to the SubsettingPage.xhtml. * Must be state-kept. */ private Boolean gridPanelModelInfoBoxRendered; /** * Getter for attribute gridPanelModelInfoBoxRendered * * @return the rendered attribute of h:panelGrid */ public Boolean getGridPanelModelInfoBoxRendered(){ return groupPanel8belowRendered; } /** * Setter for attribute gridPanelModelInfoBoxRendered * * @param rndrd the rendered attribute of h:panelGrid */ public void setGridPanelModelInfoBoxRendered(Boolean rndrd){ gridPanelModelInfoBoxRendered = rndrd; } private String modelSelectionInstruction = "Choose a Statistical Model"; // storage for dropdown1 value private String advModelDropdownValue = modelSelectionInstruction; public String getAdvModelDropdownValue() { return advModelDropdownValue; } public void setAdvModelDropdownValue(String advModelDropdownValue) { this.advModelDropdownValue = advModelDropdownValue; } // dropDown1: @valueChangeListener public void dropDown1_processValueChange(ValueChangeEvent vce) { dbgLog.fine("\n\n***** dropDown1_processValueChange:start *****"); String lastModelName = getCurrentModelName(); dbgLog.fine("stored model name(get)=" + lastModelName); dbgLog.fine("stored model name=" + currentModelName); FacesContext cntxt = FacesContext.getCurrentInstance(); // clear message resetMsg4MoveVar(); resetMsgAdvStatButton(); dbgLog.fine("pass the valueChangeListener dropDown1_processValueChange"); String newModelName = (String) vce.getNewValue(); dbgLog.fine("Newly selected model=" + newModelName); // IE users may select separator "---" if (newModelName.startsWith(modelSelectionInstruction)){ if (lastModelName==null){ // no model has been chosen but the separator was chosen (1st) return; } else if (lastModelName.startsWith(modelSelectionInstruction)) { // 2nd or later time return; } else { // last option was some meaningful model name newModelName = lastModelName; dbgLog.fine("revert to the previous choice"); dbgLog.fine("selected model(---)=" + getCurrentModelName()); dbgLog.fine("selected model(---)=" + lastModelName); setCurrentModelName(lastModelName); dropDown1.setValue(lastModelName); dbgLog.fine("selected model(---)=" + dropDown1.getValue()); dbgLog.fine("selected model(---)=" + currentModelName); cntxt.getExternalContext().getSessionMap().put("currentModelName", currentModelName); } } else { // model option was chosen // this model's name // String selectedModelName= (String)dropDown1.getSelected(); setCurrentModelName((String) dropDown1.getValue()); dbgLog.fine("selected model=" + getCurrentModelName()); cntxt.getExternalContext().getSessionMap().put("currentModelName", currentModelName); } // this model's spec AdvancedStatGUIdata.Model selectedModelSpec = getAnalysisApplicationBean() .getSpecMap().get(getCurrentModelName()); dbgLog.fine("model info:\n" + selectedModelSpec); // cntxt.getExternalContext().getSessionMap().put("selectedModelSpec",selectedModelSpec); // for the first time only //if (!groupPanel8below.isRendered()) { if (!groupPanel8belowRendered) { dbgLog.fine("this is the first time to render the model-option panel"); // groupPanel8below.setRendered(true); groupPanel8belowRendered=Boolean.TRUE; } else { dbgLog.fine("this is NOT the first time to render the model-option panel"); if (!newModelName.equals(lastModelName)) { dbgLog.fine("A New Model is selected: Clear all variables in the R boxes"); advStatVarRBox1.clear(); advStatVarRBox2.clear(); advStatVarRBox3.clear(); resetVarSetAdvStat(varCart); } } String modelHelp = selectedModelSpec.getHelplink(); if (!StringUtils.isEmpty(modelHelp)) { setModelHelpLinkURL(modelHelp); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("modelHelpLinkURL", modelHelp); gridPanelModelInfoBox.setRendered(true); } else { gridPanelModelInfoBox.setRendered(false); } dbgLog.fine("help Link=" + modelHelp); // this model's required variable boxes int noRboxes = selectedModelSpec.getNoRboxes(); dbgLog.fine("model info:RBoxes=" + noRboxes); if (noRboxes == 1) { // hide 2nd/3rd panels groupPanel13.setRendered(false); groupPanel14.setRendered(false); dbgLog.fine("varBoxR1 label=" + selectedModelSpec.getVarBox().get(0).getLabel()); // set var box label varListbox1Lbl.setValue(selectedModelSpec.getVarBox().get(0) .getLabel()); } else if (noRboxes == 2) { // open 2nd panel and hide 3rd one groupPanel13.setRendered(true); groupPanel14.setRendered(false); dbgLog.fine("varBoxR1 label=" + selectedModelSpec.getVarBox().get(0).getLabel()); dbgLog.fine("varBoxR2 label=" + selectedModelSpec.getVarBox().get(1).getLabel()); // set var box label varListbox1Lbl.setValue(selectedModelSpec.getVarBox().get(0) .getLabel()); varListbox2Lbl.setValue(selectedModelSpec.getVarBox().get(1) .getLabel()); } else if (noRboxes == 3) { // open 2nd/3rd panels groupPanel13.setRendered(true); groupPanel14.setRendered(true); dbgLog.fine("varBoxR1 label=" + selectedModelSpec.getVarBox().get(0).getLabel()); dbgLog.fine("varBoxR2 label=" + selectedModelSpec.getVarBox().get(1).getLabel()); dbgLog.fine("varBoxR3 label=" + selectedModelSpec.getVarBox().get(2).getLabel()); // set var box label varListbox1Lbl.setValue(selectedModelSpec.getVarBox().get(0) .getLabel()); varListbox2Lbl.setValue(selectedModelSpec.getVarBox().get(1) .getLabel()); varListbox3Lbl.setValue(selectedModelSpec.getVarBox().get(2) .getLabel()); } // set up option panels if (getCurrentModelName().equals("xtb")) { // cross-tabulation (non-zelig) chkbxAdvStatOutputOpt.setRendered(false); chkbxAdvStatOutputXtbOpt.setRendered(true); // Important! // the "setValue" call on a "selectMany" checkbox, // to specify the boxes checked by default, needs // to be made *after* setRendered(true) call has // been made. // This is the reason the default settings were lost // when this page was rewritten in icefaces. chkbxAdvStatOutputXtbOpt.setValue(new String[]{ "xtb_Totals", "xtb_Statistics", "xtb_Percentages",}); analysisOptionPanel.setRendered(false); } else { // zelig if (selectedModelSpec.getMaxSetx() == 0) { // hide analysis option panel such as factor models setxOptionPanel.setRendered(false); analysisOptionPanel.setRendered(false); } else { chkbxAdvStatOutputOpt.setRendered(true); chkbxAdvStatOutputOpt.setValue(new String[]{ "Summary", "Plots", "BinOutput"}); chkbxAdvStatOutputXtbOpt.setRendered(false); analysisOptionPanel.setRendered(true); // show/hide setx-option panel setxOptionPanel.setRendered(true); } } FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("groupPanel8belowRendered", groupPanel8belowRendered); dbgLog.fine("groupPanel8belowRendered=" + groupPanel8belowRendered); //cntxt.renderResponse(); dbgLog.fine("***** dropDown1_processValueChange:end *****\n"); } private String dropDown1ClientId; public String getDropDown1ClientId() { FacesContext cntxt = FacesContext.getCurrentInstance(); return dropDown1.getClientId(cntxt); } // panel below the dropDown Menu /** * The PanelGroup object backing the binding attribute of * panelGroup component that covers the pane below the dropDown * model-selection menu in the advanced statistics pane. * The rendered attribute of this component must be state-kept. * Initially hidden. */ private HtmlPanelGroup groupPanel8below = new com.icesoft.faces.component.ext.HtmlPanelGroup(); /** * Getter for component groupPanel8below * * @return panelGroup of the pane below the model-selection menu */ public HtmlPanelGroup getGroupPanel8below() { return groupPanel8below; } /** * Setter for component groupPanel8below * * @param pg panelGroup of the pane below the model-selection menu */ public void setGroupPanel8below(HtmlPanelGroup pg) { this.groupPanel8below = pg; } /** * The Boolean object backing the rendered attribute of * groupPanel8below (panelGroup) component. * Exposed to the SubsettingPage.xhtml. * Must be state-kept. * Added after serialization problems of the component-binding */ private Boolean groupPanel8belowRendered; /** * Getter for attribute groupPanel8belowRendered * * @return the rendered attribute of panelGroup */ public Boolean getGroupPanel8belowRendered(){ return groupPanel8belowRendered; } /** * Setter for attribute groupPanel8belowRendered * * @param rndrd the rendered attribute of panelGroup */ public void setGroupPanel8belowRendered(Boolean rndrd){ groupPanel8belowRendered = rndrd; } // ice:outputLabel@binding for variable Left box1 private HtmlOutputLabel varListbox1Lbl = new com.icesoft.faces.component.ext.HtmlOutputLabel(); public HtmlOutputLabel getVarListbox1Lbl() { return varListbox1Lbl; } public void setVarListbox1Lbl(HtmlOutputLabel l) { this.varListbox1Lbl = l; } // ice:outputLabel@binding for variable box2 private HtmlOutputLabel varListbox2Lbl = new com.icesoft.faces.component.ext.HtmlOutputLabel(); public HtmlOutputLabel getVarListbox2Lbl() { return varListbox2Lbl; } public void setVarListbox2Lbl(HtmlOutputLabel l) { this.varListbox2Lbl = l; } // ice:outputLabel@binding for variable box3 private HtmlOutputLabel varListbox3Lbl = new com.icesoft.faces.component.ext.HtmlOutputLabel(); public HtmlOutputLabel getVarListbox3Lbl() { return varListbox3Lbl; } public void setVarListbox3Lbl(HtmlOutputLabel l) { this.varListbox3Lbl = l; } // panel for the 1st var box // PanelGroup@binding private HtmlPanelGroup groupPanel12 = new com.icesoft.faces.component.ext.HtmlPanelGroup(); public HtmlPanelGroup getGroupPanel12() { return groupPanel12; } public void setGroupPanel12(HtmlPanelGroup pg) { this.groupPanel12 = pg; } // panel for the 2nd var box // PanelGroup@binding private HtmlPanelGroup groupPanel13 = new com.icesoft.faces.component.ext.HtmlPanelGroup(); public HtmlPanelGroup getGroupPanel13() { return groupPanel13; } public void setGroupPanel13(HtmlPanelGroup pg) { this.groupPanel13 = pg; } // plane for the 3rd var box // PanelGroup@binding private HtmlPanelGroup groupPanel14 = new com.icesoft.faces.component.ext.HtmlPanelGroup(); public HtmlPanelGroup getGroupPanel14() { return groupPanel14; } public void setGroupPanel14(HtmlPanelGroup pg) { this.groupPanel14 = pg; } // boxL1:listbox@binding //private Listbox listboxAdvStat = new Listbox(); private HtmlSelectManyListbox listboxAdvStat = new com.icesoft.faces.component.ext.HtmlSelectManyListbox(); public HtmlSelectManyListbox getListboxAdvStat() { return listboxAdvStat; } public void setListboxAdvStat(HtmlSelectManyListbox lstbx) { this.listboxAdvStat = lstbx; } // boxL1: listbox@items (data for the listbox) private List<SelectItem> varSetAdvStat = new ArrayList<SelectItem>(); public List<SelectItem> getVarSetAdvStat() { return varSetAdvStat; } public void setVarSetAdvStat(List<SelectItem> co) { this.varSetAdvStat = co; } // re-populating the list of Options public void resetVarSetAdvStat(Map vs) { if (!varSetAdvStat.isEmpty()) { varSetAdvStat.clear(); } /* * dbgLog.fine("resetVarSetAdvStat: current tab * id="+tabSet1.getSelected()); if * (tabSet1.getSelected().equals("tabRecode")){ dbgLog.fine("current tab * is: Recode[no recoded variables added]"); } else{ * dbgLog.fine("current tab is not Recode [add recoded variables]"); } */ Iterator all = vs.entrySet().iterator(); while (all.hasNext()) { Entry entry = (Entry) all.next(); varSetAdvStat.add(new SelectItem(entry.getKey().toString(), (String) entry.getValue())); } } // boxL1: listbox@selected : storage object for selected value private String[] advStatSelectedVarLBox; public String[] getAdvStatSelectedVarLBox() { return advStatSelectedVarLBox; } public void setAdvStatSelectedVarLBox(String[] dol) { this.advStatSelectedVarLBox = dol; } // boxR1: listbox@binding // //private Listbox advStatVarListboxR1 = new Listbox(); private HtmlSelectManyListbox advStatVarListboxR1 = new com.icesoft.faces.component.ext.HtmlSelectManyListbox(); public HtmlSelectManyListbox getAdvStatVarListboxR1() { return advStatVarListboxR1; } public void setAdvStatVarListboxR1(HtmlSelectManyListbox l1) { this.advStatVarListboxR1 = l1; } // boxR1 : listbox@items [provide data for the listbox] // value private List<SelectItem> advStatVarRBox1 = new ArrayList<SelectItem>(); public List<SelectItem> getAdvStatVarRBox1() { return advStatVarRBox1; } public void setAdvStatVarRBox1(List<SelectItem> dol) { this.advStatVarRBox1 = dol; } // boxR1: listbox@selected private String[] advStatSelectedVarRBox1; public String[] getAdvStatSelectedVarRBox1() { return advStatSelectedVarRBox1; } public void setAdvStatSelectedVarRBox1(String[] dol) { this.advStatSelectedVarRBox1 = dol; } // boxR2: listbox@binding // private Listbox advStatVarListboxR2 = new Listbox(); private HtmlSelectManyListbox advStatVarListboxR2 = new com.icesoft.faces.component.ext.HtmlSelectManyListbox(); public HtmlSelectManyListbox getAdvStatVarListboxR2() { return advStatVarListboxR2; } public void setAdvStatVarListboxR2(HtmlSelectManyListbox l2) { this.advStatVarListboxR2 = l2; } // boxR2: listbox@items [provide data for the listbox] private List<SelectItem> advStatVarRBox2 = new ArrayList<SelectItem>(); public List<SelectItem> getAdvStatVarRBox2() { return advStatVarRBox2; } public void setAdvStatVarRBox2(List<SelectItem> dol) { this.advStatVarRBox2 = dol; } // boxR2: listbox@selected private String[] advStatSelectedVarRBox2; public String[] getAdvStatSelectedVarRBox2() { return advStatSelectedVarRBox2; } public void setAdvStatSelectedVarRBox2(String[] dol) { this.advStatSelectedVarRBox2 = dol; } // boxR3: listbox@binding //private Listbox advStatVarListboxR3 = new Listbox(); private HtmlSelectManyListbox advStatVarListboxR3 = new com.icesoft.faces.component.ext.HtmlSelectManyListbox(); public HtmlSelectManyListbox getAdvStatVarListboxR3() { return advStatVarListboxR3; } public void setAdvStatVarListboxR3(HtmlSelectManyListbox l3) { this.advStatVarListboxR3 = l3; } // boxR3: listbox@items [provide data for the listbox] private List<SelectItem> advStatVarRBox3 = new ArrayList<SelectItem>(); public List<SelectItem> getAdvStatVarRBox3() { return advStatVarRBox3; } public void setAdvStatVarRBox3(List<SelectItem> dol) { this.advStatVarRBox3 = dol; } // boxR3: listbox@selected private String[] advStatSelectedVarRBox3; public String[] getAdvStatSelectedVarRBox3() { return advStatSelectedVarRBox3; } public void setAdvStatSelectedVarRBox3(String[] dol) { this.advStatSelectedVarRBox3 = dol; } // moveVar1Bttn // > button (add) // @binding private HtmlCommandButton button4 = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getButton4() { return button4; } public void setButton4(HtmlCommandButton hcb) { this.button4 = hcb; } // < button (remove) // @binding private HtmlCommandButton button4b = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getButton4b() { return button4b; } public void setButton4b(HtmlCommandButton hcb) { this.button4 = hcb; } // moveVar2Bttn // > button (add) // @binding private HtmlCommandButton button5 = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getButton5() { return button5; } public void setButton5(HtmlCommandButton hcb) { this.button5 = hcb; } // < button (remove) // @binding private HtmlCommandButton button5b = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getButton5b() { return button5b; } public void setButton5b(HtmlCommandButton hcb) { this.button5b = hcb; } // moveVar3Bttn // > button (add) // @binding private HtmlCommandButton button6 = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getButton6() { return button6; } public void setButton6(HtmlCommandButton hcb) { this.button6 = hcb; } // < button (remove) // @binding private HtmlCommandButton button6b = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getButton6b() { return button6b; } public void setButton6b(HtmlCommandButton hcb) { this.button6b = hcb; } // </editor-fold> // <editor-fold desc="Adv Stat movement"> // get variable type (int) from a given row of the dataTable public int getVariableType(DataVariable dv) { Integer varType; if (dv.getVariableFormatType().getName().equals("numeric")) { if (dv.getVariableIntervalType().getName().equals("continuous")) { varType = Integer.valueOf("2"); } else { varType = Integer.valueOf("1"); } } else { varType = Integer.valueOf("0"); } dbgLog.fine("within: getVariableType: varType= "+varType); return varType.intValue(); } // character var or not public boolean isCharacterVariable(String newVarId) { boolean chr = false; Pattern p = Pattern.compile("[a-zA-Z_]+"); int counter = 0; // get the recode table by varId List<Object> rvtbl = (List<Object>) recodeSchema.get(newVarId); for (int i = 0; i < rvtbl.size(); i++) { List<Object> rvs = (List<Object>) rvtbl.get(i); // check character or not String value = (String) rvs.get(1); Matcher m = p.matcher(value); if (m.find()) { counter++; } } if (counter > 0) { chr = true; } return chr; } /** * Returns the number of valid and unique categories (String type) * in a recode table (List) that is stored in recodeSchema (Map) * to check whether this variable is binary, etc. * * @param newVarId the id of a requested variable * @return the number of valid and unique categories */ public int getValidCategories(String newVarId) { int noCat = 0; // use a Set object to find a unique set of values (String) Set<String> newValidValueSet = new HashSet<String>(); // get the recode table by varId List<Object> rvtbl = (List<Object>) recodeSchema.get(newVarId); for (int i = 0; i < rvtbl.size(); i++) { List<Object> rvs = (List<Object>) rvtbl.get(i); if (!((Boolean) rvs.get(0))) { // 1st element tells whether this value is to be excuded // false means "not to exclude this value" // add this value to the set newValidValueSet.add((String)rvs.get(1)); noCat++; } } dbgLog.fine("non-exclude values="+noCat); dbgLog.fine("unique non-exclude values="+newValidValueSet.size()); //return noCat; return newValidValueSet.size(); } /** * Returns the number of summary statistics of the requested variable * * @param varId the id of a requested variable * @return the number of summary statistics (8 for continuous variables * and at least 3 for non-continuous ones) */ public int getSumStatSize(String varId) { int sumStatSize = getVariableById(varId).getSummaryStatistics().size(); dbgLog.fine("sumStat size=" + sumStatSize); return sumStatSize; } /** * Returns the number of valid (non-missing-value) values of * the requested variable * * @param varId the id of a requested variable * @return the number of valid (non-missing-value) responses */ public int getCatStatSize(String varId) { Collection<VariableCategory> catStatSet = getVariableById(varId) .getCategories(); // count non-missing category only int catStatSize = 0; for (Iterator elc = catStatSet.iterator(); elc.hasNext();) { VariableCategory dvcat = (VariableCategory) elc.next(); if (!dvcat.isMissing()) { catStatSize++; } } dbgLog.fine("valid categories=" + catStatSize); return catStatSize; } // check whether the requested move is permissible private Boolean checkVarType(String varId, String boxVarType, Boolean strict) { dbgLog.fine("variable id=" + varId); int varType = 1; if (isRecodedVar(varId)) { // recoded var case if (isCharacterVariable(varId)) { // varType = 0; } } else { // existing var case // DataVariable dv = getVariableById(varId); varType = getVariableType(getVariableById(varId)); } dbgLog.fine("Type of the variable to be moved=" + varType); Integer boxType = dataType2Int.get(boxVarType); Boolean result = false; switch (boxType != null ? boxType : -1) { case 5: // continuous if (strict) { // stricter test if (varType == 2) { result = true; } else { result = false; } } else { if (varType != 0) { result = true; } else { result = false; } } break; case 4: // discrete // this categorization is zelig-context if (strict) { // stricter test if ((varType != 0) && (varType != 2)) { result = true; } else { result = false; } } else { if (varType != 0) { result = true; } else { result = false; } } break; case 3: // ordinal if (strict) { // stricter test if ((varType != 0) && (varType != 2)) { result = true; } else { result = false; } } else { if (varType != 0) { result = true; } else { result = false; } } break; case 2: // nominal // no stricter case if (varType == 0) { result = true; } else { result = false; } break; case 23: case 32: // nominal|ordinal // no stricter case if (varType != 2) { result = true; } else { result = false; } break; case 1: // binary int sumStatSize = 0; int catStatSize = 0; if (isRecodedVar(varId)) { catStatSize = getValidCategories(varId); } else { sumStatSize = getSumStatSize(varId); catStatSize = getCatStatSize(varId); } if (varType == 2) { // continuous var => not binary result = false; } else { // net test if (catStatSize == 2) { result = true; } else { result = false; } } break; case 0: // any // do nothing result = true; break; default: result = true; break; } if (result) { dbgLog.fine("The move passed the test"); } else { dbgLog.fine("The move failed the test"); dbgLog.fine("expected type=" + boxVarType); dbgLog.fine("variable's type=" + vtInt2String.get(Integer.toString(varType))); } return result; } // remove the selected SelectItem from a given selectManyListbox private SelectItem removeOption(String varId, List<SelectItem> co) { SelectItem matchedOptn = null; Iterator iter = co.iterator(); while (iter.hasNext()) { SelectItem optn = (SelectItem) iter.next(); if (varId.equals(optn.getValue())) { matchedOptn = optn; co.remove(optn); break; } } return matchedOptn; } // reset all error message text-fields related to moveVar buttons public void resetMsg4MoveVar() { msgMoveVar1Bttn.setRendered(false); msgMoveVar1Bttn.setValue(" "); msgMoveVar2Bttn.setRendered(false); msgMoveVar2Bttn.setValue(" "); msgMoveVar3Bttn.setRendered(false); msgMoveVar3Bttn.setValue(" "); } private HtmlOutputText msgMoveVar1Bttn = new com.icesoft.faces.component.ext.HtmlOutputText(); public HtmlOutputText getMsgMoveVar1Bttn() { return msgMoveVar1Bttn; } public void setMsgMoveVar1Bttn(HtmlOutputText txt) { this.msgMoveVar1Bttn = txt; } // move from L to R1 public void addVarBoxR1(ActionEvent acev) { dbgLog.fine("\n***** within addVarBoxR1(): model name=" + getCurrentModelName()+" *****"); resetMsg4MoveVar(); resetMsgAdvStatButton(); dbgLog.fine("advStatSelectedVarLBox="+advStatSelectedVarLBox); dbgLog.fine("advStatSelectedVar from binding="+listboxAdvStat.getValue()); String[] OptnSet = null; if (getAdvStatSelectedVarLBox() == null){ OptnSet = (String[])listboxAdvStat.getValue(); } else { OptnSet = getAdvStatSelectedVarLBox(); } dbgLog.fine("OptnSet Length="+OptnSet.length); dbgLog.fine("OptnSet="+OptnSet); int BoxR1max = getAnalysisApplicationBean().getSpecMap().get( getCurrentModelName()).getVarBox().get(0).getMaxvar(); dbgLog.fine("BoxR1max=" + BoxR1max); // dbgLog.fine("BoxR1min="+getAnalysisApplicationBean().getSpecMap().get(getCurrentModelName()).getVarBox().get(0).getMinvar() // ); dbgLog.fine("current listboxR1 size=" + advStatVarRBox1.size()); String varType = getAnalysisApplicationBean().getSpecMap().get( getCurrentModelName()).getVarBox().get(0).getVarType(); dbgLog.fine("permissible variable type for advStatVarRBox1=" + varType); // for each selected item if (advStatVarRBox1.size() < BoxR1max) { dbgLog.fine("< BoxR1max case"); for (int i = 0; i < OptnSet.length; i++) { // reset error message field resetMsg4MoveVar(); // type check dbgLog.fine("OptnSet[" + i + "]=" + OptnSet[i]); if (checkVarType(OptnSet[i], varType, true)) { getAdvStatVarRBox1().add( removeOption(OptnSet[i], getVarSetAdvStat())); dbgLog.fine("current listboxR1 size(within loop)=" + advStatVarRBox1.size()); if (advStatVarRBox1.size() == BoxR1max) { return; } } else { // show error message msgMoveVar1Bttn.setValue("* Incompatible type:<br />required=" + varType + "<br />found=" + vtInt2String .get(Integer .toString(getVariableType(getVariableById(OptnSet[i]))))); msgMoveVar1Bttn.setRendered(true); } } } else { dbgLog.fine("1st RHS box is already maxed out"); // show error message; msgMoveVar1Bttn.setValue("* The max number of variables<br/>for this box is: " + BoxR1max); msgMoveVar1Bttn.setRendered(true); } } private HtmlOutputText msgMoveVar2Bttn = new com.icesoft.faces.component.ext.HtmlOutputText(); public HtmlOutputText getMsgMoveVar2Bttn() { return msgMoveVar2Bttn; } public void setMsgMoveVar2Bttn(HtmlOutputText txt) { this.msgMoveVar2Bttn = txt; } // move from L to R2 public void addVarBoxR2(ActionEvent acev) { // set left-selected items to a temp list //String[] OptnSet = (String[])getAdvStatSelectedVarLBox(); dbgLog.fine("***** within addVarBoxR2(): model name=" + getCurrentModelName()+" *****"); resetMsg4MoveVar(); resetMsgAdvStatButton(); dbgLog.fine("advStatSelectedVarLBox="+advStatSelectedVarLBox); dbgLog.fine("advStatSelectedVar from binding="+listboxAdvStat.getValue()); String[] OptnSet = null; if (getAdvStatSelectedVarLBox() == null){ OptnSet = (String[])listboxAdvStat.getValue(); } else { OptnSet = getAdvStatSelectedVarLBox(); } dbgLog.fine("OptnSet Length="+OptnSet.length); dbgLog.fine("OptnSet="+OptnSet); int BoxR2max = getAnalysisApplicationBean().getSpecMap().get( getCurrentModelName()).getVarBox().get(1).getMaxvar(); dbgLog.fine("BoxR2max=" + BoxR2max); // dbgLog.fine("BoxR2min="+getAnalysisApplicationBean().getSpecMap().get(getCurrentModelName()).getVarBox().get(1).getMinvar() // ); dbgLog.fine("current listbox size=" + advStatVarRBox2.size()); String varType = getAnalysisApplicationBean().getSpecMap().get( getCurrentModelName()).getVarBox().get(1).getVarType(); dbgLog.fine("permissible variable type for advStatVarRBox2=" + varType); // for each selected item if (advStatVarRBox2.size() < BoxR2max) { for (int i = 0; i < OptnSet.length; i++) { // reset error message field resetMsg4MoveVar(); // type check dbgLog.fine("OptnSet[" + i + "]=" + OptnSet[i]); if (checkVarType(OptnSet[i], varType, true)) { getAdvStatVarRBox2().add( removeOption(OptnSet[i], getVarSetAdvStat())); dbgLog.fine("current listboxR2 size(within loop)=" + advStatVarRBox2.size()); if (advStatVarRBox2.size() == BoxR2max) { return; } } else { // show error message msgMoveVar2Bttn.setValue("* Incompatible type:<br />required=" + varType + "<br />found=" + vtInt2String .get(Integer .toString(getVariableType(getVariableById(OptnSet[i]))))); msgMoveVar2Bttn.setRendered(true); } } } else { dbgLog.warning("2nd RHS box is already maxed out"); // show error message; msgMoveVar2Bttn.setValue("* The max number of variables<br/>for this box is: " + BoxR2max); msgMoveVar2Bttn.setRendered(true); } } private HtmlOutputText msgMoveVar3Bttn = new com.icesoft.faces.component.ext.HtmlOutputText(); public HtmlOutputText getMsgMoveVar3Bttn() { return msgMoveVar3Bttn; } public void setMsgMoveVar3Bttn(HtmlOutputText txt) { this.msgMoveVar3Bttn = txt; } // move from L to R3 public void addVarBoxR3(ActionEvent acev) { // set left-selected items to a temp list //String[] OptnSet = (String[])getAdvStatSelectedVarLBox(); dbgLog.fine("***** within addVarBoxR3(): model name=" + getCurrentModelName()+" *****"); resetMsg4MoveVar(); resetMsgAdvStatButton(); dbgLog.fine("advStatSelectedVarLBox="+advStatSelectedVarLBox); dbgLog.fine("advStatSelectedVar from binding="+listboxAdvStat.getValue()); String[] OptnSet = null; if (getAdvStatSelectedVarLBox() == null){ OptnSet = (String[])listboxAdvStat.getValue(); } else { OptnSet = getAdvStatSelectedVarLBox(); } dbgLog.fine("OptnSet Length="+OptnSet.length); dbgLog.fine("OptnSet="+OptnSet); int BoxR3max = getAnalysisApplicationBean().getSpecMap().get( getCurrentModelName()).getVarBox().get(2).getMaxvar(); dbgLog.fine("BoxR3max=" + BoxR3max); // dbgLog.fine("BoxR2min="+getAnalysisApplicationBean().getSpecMap().get(getCurrentModelName()).getVarBox().get(2).getMinvar() // ); dbgLog.fine("current listboxR3 size=" + advStatVarRBox3.size()); String varType = getAnalysisApplicationBean().getSpecMap().get( getCurrentModelName()).getVarBox().get(2).getVarType(); dbgLog.fine("permissible variable type for advStatVarRBox3=" + varType); // for each selected item if (advStatVarRBox3.size() < BoxR3max) { for (int i = 0; i < OptnSet.length; i++) { // reset error message field resetMsg4MoveVar(); // type check dbgLog.fine("OptnSet[" + i + "]=" + OptnSet[i]); if (checkVarType(OptnSet[i], varType, true)) { getAdvStatVarRBox3().add( removeOption(OptnSet[i], getVarSetAdvStat())); dbgLog.fine("current listboxR3 size(within loop)=" + advStatVarRBox3.size()); if (advStatVarRBox3.size() == BoxR3max) { return; } } else { // show error message msgMoveVar3Bttn.setValue("* Incompatible type:<br />required=" + varType + "<br />found=" + vtInt2String .get(Integer .toString(getVariableType(getVariableById(OptnSet[i]))))); msgMoveVar3Bttn.setRendered(true); } } } } // move from R1 to L public void removeVarBoxR1(ActionEvent acev) { dbgLog.fine("************ within removeVarBoxR1() ************"); // set left-selected items to a temp list //String[] OptnSet = getAdvStatSelectedVarRBox1(); resetMsg4MoveVar(); resetMsgAdvStatButton(); dbgLog.fine("advStatSelectedVarRBox1="+advStatSelectedVarRBox1); dbgLog.fine("advStatSelectedVar from binding="+advStatVarListboxR1.getValue()); String[] OptnSet = null; if (getAdvStatSelectedVarRBox1() == null){ OptnSet = (String[])advStatVarListboxR1.getValue(); } else { OptnSet = getAdvStatSelectedVarRBox1(); } dbgLog.fine("OptnSet Length="+OptnSet.length); dbgLog.fine("OptnSet="+OptnSet); // for each selected item for (int i = 0; i < OptnSet.length; i++) { getVarSetAdvStat().add(removeOption(OptnSet[i], getAdvStatVarRBox1())); } } // move from R2 to L public void removeVarBoxR2(ActionEvent acev) { dbgLog.fine("************ within removeVarBoxR2() ************"); // set left-selected items to a temp array, Option [] //String[] OptnSet = getAdvStatSelectedVarRBox2(); resetMsg4MoveVar(); resetMsgAdvStatButton(); dbgLog.fine("advStatSelectedVarRBox2="+advStatSelectedVarRBox2); dbgLog.fine("advStatSelectedVar from binding="+advStatVarListboxR2.getValue()); String[] OptnSet = null; if (getAdvStatSelectedVarRBox2() == null){ OptnSet = (String[])advStatVarListboxR2.getValue(); } else { OptnSet = getAdvStatSelectedVarRBox2(); } dbgLog.fine("OptnSet Length="+OptnSet.length); dbgLog.fine("OptnSet="+OptnSet); // for each selected item for (int i = 0; i < OptnSet.length; i++) { getVarSetAdvStat().add( removeOption(OptnSet[i], getAdvStatVarRBox2())); } } // move from R3 to L public void removeVarBoxR3(ActionEvent acev) { dbgLog.fine("************ within removeVarBoxR3() ************"); // set left-selected items to a temp array, Option [] //String[] OptnSet = getAdvStatSelectedVarRBox3(); resetMsg4MoveVar(); resetMsgAdvStatButton(); dbgLog.fine("advStatSelectedVarRBox3="+advStatSelectedVarRBox3); dbgLog.fine("advStatSelectedVar from binding="+advStatVarListboxR3.getValue()); String[] OptnSet = null; if (getAdvStatSelectedVarRBox3() == null){ OptnSet = (String[])advStatVarListboxR3.getValue(); } else { OptnSet = getAdvStatSelectedVarRBox3(); } dbgLog.fine("OptnSet Length="+OptnSet.length); dbgLog.fine("OptnSet="+OptnSet); // for each selected item for (int i = 0; i < OptnSet.length; i++) { getVarSetAdvStat().add( removeOption(OptnSet[i], getAdvStatVarRBox3())); } } // </editor-fold> // //////////////////// // Output option // //////////////////// // <editor-fold desc="Adv Stat Output option"> // output option panel /* * private PanelGroup groupPanel25 = new PanelGroup(); * * public PanelGroup getGroupPanel25() { return groupPanel25; } * * public void setGroupPanel25(PanelGroup pg) { this.groupPanel25 = pg; } */ // output option checkbox group: zelig // private CheckboxGroup checkboxGroup2 = new CheckboxGroup(); // // public CheckboxGroup getCheckboxGroup2() { // return checkboxGroup2; // } // // public void setCheckboxGroup2(CheckboxGroup cg) { // this.checkboxGroup2 = cg; // } // // private MultipleSelectOptionsList checkboxGroup2DefaultOptions = new MultipleSelectOptionsList(); // // public MultipleSelectOptionsList getCheckboxGroup2DefaultOptions() { // return checkboxGroup2DefaultOptions; // } // // public void setCheckboxGroup2DefaultOptions(MultipleSelectOptionsList msol) { // this.checkboxGroup2DefaultOptions = msol; // } private HtmlSelectManyCheckbox chkbxAdvStatOutputOpt = new com.icesoft.faces.component.ext.HtmlSelectManyCheckbox(); public HtmlSelectManyCheckbox getChkbxAdvStatOutputOpt() { return chkbxAdvStatOutputOpt; } public void setChkbxAdvStatOutputOpt(HtmlSelectManyCheckbox chkbxOut) { this.chkbxAdvStatOutputOpt = chkbxOut; } private Map<String, String> chkbxAdvStatOutputOptMap = new LinkedHashMap<String, String>(); public Map<String, String> getChkbxAdvStatOutputOptMap() { return chkbxAdvStatOutputOptMap; } public void setChkbxAdvStatOutputOptMap(Map<String, String> chkbxOutMp) { this.chkbxAdvStatOutputOptMap = chkbxOutMp; } private HtmlSelectManyCheckbox chkbxAdvStatOutputXtbOpt = new com.icesoft.faces.component.ext.HtmlSelectManyCheckbox(); public HtmlSelectManyCheckbox getChkbxAdvStatOutputXtbOpt() { return chkbxAdvStatOutputXtbOpt; } public void setChkbxAdvStatOutputXtbOpt(HtmlSelectManyCheckbox chkbxXtb) { this.chkbxAdvStatOutputXtbOpt = chkbxXtb; } private Map<String, String> chkbxAdvStatOutputXtbOptMap = new LinkedHashMap<String, String>(); public Map<String, String> getChkbxAdvStatOutputXtbOptMap() { return chkbxAdvStatOutputXtbOptMap; } public void setChkbxAdvStatOutputXtbOptMap(Map<String, String> chkbxAdvStatOutputXtbOptMap) { this.chkbxAdvStatOutputXtbOptMap = chkbxAdvStatOutputXtbOptMap; } // output option checkbox group: xtab // private CheckboxGroup checkboxGroupXtb = new CheckboxGroup(); // // public CheckboxGroup getCheckboxGroupXtb() { // return checkboxGroupXtb; // } // // public void setCheckboxGroupXtb(CheckboxGroup cg) { // this.checkboxGroupXtb = cg; // } // // private MultipleSelectOptionsList checkboxGroupXtbOptions = new MultipleSelectOptionsList(); // // public MultipleSelectOptionsList getCheckboxGroupXtbOptions() { // return checkboxGroupXtbOptions; // } // // public void setCheckboxGroupXtbOptions(MultipleSelectOptionsList msol) { // this.checkboxGroupXtbOptions = msol; // } // public void checkboxGroupXtbProcessValueChange(ValueChangeEvent vce) { // dbgLog.fine("checkboxGroupXtbProcessValueChange"); // dbgLog.fine("checkbox: new value=" + vce.getNewValue()); // Option[] outOption = (Option[]) checkboxGroupXtbOptions.getOptions(); // for (int i = 0; i < outOption.length; i++) { // dbgLog.fine("output option[" + i + "]=" + outOption[i].getValue()); // } // } // </editor-fold> // //////////////////// // Analysis option // //////////////////// // <editor-fold desc="Adv Stat Analysis Option"> // Analysis option block: casing panel // private HtmlPanelGroup analysisOptionPanel = // new com.icesoft.faces.component.ext.HtmlPanelGroup(); // // public HtmlPanelGroup getAnalysisOptionPanel() { // return analysisOptionPanel; // } // // public void setAnalysisOptionPanel(HtmlPanelGroup pg) { // this.analysisOptionPanel = pg; // } private HtmlPanelGrid analysisOptionPanel = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getAnalysisOptionPanel() { return analysisOptionPanel; } public void setAnalysisOptionPanel(HtmlPanelGrid analysisOptionPanel) { this.analysisOptionPanel = analysisOptionPanel; } // setx-option panel // private HtmlPanelGroup setxOptionPanel = // new com.icesoft.faces.component.ext.HtmlPanelGroup(); // // public HtmlPanelGroup getSetxOptionPanel() { // return setxOptionPanel; // } // // public void setSetxOptionPanel(HtmlPanelGroup pg) { // this.setxOptionPanel = pg; // } private HtmlPanelGrid setxOptionPanel = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getSetxOptionPanel() { return setxOptionPanel; } public void setSetxOptionPanel(HtmlPanelGrid setxOptionPanel) { this.setxOptionPanel = setxOptionPanel; } // simulation: casing panel // private PanelGroup groupPanel20 = new PanelGroup(); // // public PanelGroup getGroupPanel20() { // return groupPanel20; // } // // public void setGroupPanel20(PanelGroup pg) { // this.groupPanel20 = pg; // } private HtmlPanelGrid groupPanelSimTypeChoice = new com.icesoft.faces.component.ext.HtmlPanelGrid();; public HtmlPanelGrid getGroupPanelSimTypeChoice() { return groupPanelSimTypeChoice; } public void setGroupPanelSimTypeChoice(HtmlPanelGrid gpstc) { this.groupPanelSimTypeChoice = gpstc; } // simulation option: checkbox private HtmlSelectBooleanCheckbox simulationPanel = new com.icesoft.faces.component.ext.HtmlSelectBooleanCheckbox(); public HtmlSelectBooleanCheckbox getSimulationPanel() { return simulationPanel; } public void setSimulationPanel(HtmlSelectBooleanCheckbox c) { this.simulationPanel = c; } public void showHideSimulationsOptPanel(ValueChangeEvent vce) { dbgLog.fine("***** showHideSimulationsOptPanel: starts here *****"); Boolean currentState = (Boolean) vce.getNewValue(); dbgLog.fine("currentState="+currentState); if ((currentState.toString()).equals("true")) { //groupPanel20.setRendered(true); groupPanelSimTypeChoice.setRendered(true); dbgLog.fine("groupPanelSimTypeChoice(rendered?)="+groupPanelSimTypeChoice.isRendered()); } else if ((currentState.toString()).equals("false")) { //groupPanel20.setRendered(false); groupPanelSimTypeChoice.setRendered(false); dbgLog.fine("groupPanelSimTypeChoice(rendered?)="+groupPanelSimTypeChoice.isRendered()); } //FacesContext.getCurrentInstance().renderResponse(); dbgLog.fine("***** showHideSimulationsOptPanel: ends here *****"); } // simulation option: radio button // @selected // private String lastSimCndtnSelected; // // public String getLastSimCndtnSelected() { // return lastSimCndtnSelected; // } // // public void setLastSimCndtnSelected(String lastSimCndtnSelected) { // this.lastSimCndtnSelected = lastSimCndtnSelected; // } private HtmlSelectOneRadio radioSimTypeChoice = new com.icesoft.faces.component.ext.HtmlSelectOneRadio(); public HtmlSelectOneRadio getRadioSimTypeChoice() { return radioSimTypeChoice; } public void setRadioSimTypeChoice(HtmlSelectOneRadio radioSimTypeChoice) { this.radioSimTypeChoice = radioSimTypeChoice; } private Map<String, String> simOptionMap = new LinkedHashMap<String, String>(); public Map<String, String> getSimOptionMap() { return simOptionMap; } public void setSimOptionMap(Map<String, String> simOptionMap) { this.simOptionMap = simOptionMap; } private String radioSimTypeChoiceSelected; public String getRadioSimTypeChoiceSelected() { return radioSimTypeChoiceSelected; } public void setRadioSimTypeChoiceSelected(String s) { this.radioSimTypeChoiceSelected = s; } // @valueChangeListener public void showHideSimCndtnOptPanel(ValueChangeEvent vce) { FacesContext cntxt = FacesContext.getCurrentInstance(); dbgLog.fine("***** within showHideSimCndtnOptPanel(): starts here *****"); String currentState = (String) vce.getNewValue(); dbgLog.fine("currentState=" + currentState); dbgLog.fine("current model name in setx=" + getCurrentModelName()); dbgLog.fine("radioSimTypeChoice(value)=" + radioSimTypeChoice.getValue()); dbgLog.fine("radioSimTypeChoiceSelected="+radioSimTypeChoiceSelected); if (getCurrentModelName() != null) { AdvancedStatGUIdata.Model selectedModelSpec = getAnalysisApplicationBean().getSpecMap() .get(getCurrentModelName()); dbgLog.finer("spec within setx:\n" + selectedModelSpec); if ((currentState.toString()).equals("1")) { //groupPanel22.setRendered(true); groupPanelSimNonDefault.setRendered(true); gridPanel11.setRendered(true); dbgLog.fine("groupPanelSimNonDefault: rendered="+groupPanelSimNonDefault.isRendered()); // set up the @items for dropDown2/dropDown3 if (selectedModelSpec.getNoRboxes() == 2) { setSetxDiffVarBox1(getAdvStatVarRBox2()); setSetxDiffVarBox2(getAdvStatVarRBox2()); } else if (selectedModelSpec.getNoRboxes() == 3) { setSetxDiffVarBox1(getAdvStatVarRBox3()); setSetxDiffVarBox2(getAdvStatVarRBox3()); } cntxt.getExternalContext().getSessionMap().put( "setxDiffVarBox1", setxDiffVarBox1); cntxt.getExternalContext().getSessionMap().put( "setxDiffVarBox2", setxDiffVarBox2); // cntxt.getExternalContext().getSessionMap().put( // "lastSimCndtnSelected", currentState.toString()); } else if ((currentState.toString()).equals("0")) { //groupPanel22.setRendered(false); groupPanelSimNonDefault.setRendered(false); // cntxt.getExternalContext().getSessionMap().put( // "lastSimCndtnSelected", currentState.toString()); } } else { //groupPanel22.setRendered(false); groupPanelSimNonDefault.setRendered(false); } //cntxt.renderResponse(); dbgLog.fine("***** within showHideSimCndtnOptPanel(): ends here *****"); } // simulation: option panel for the radio-button-option of select values // @binding // private PanelGroup groupPanel22 = new PanelGroup(); // // public PanelGroup getGroupPanel22() { // return groupPanel22; // } // // public void setGroupPanel22(PanelGroup pg) { // this.groupPanel22 = pg; // } // private HtmlPanelGroup groupPanelSimNonDefault = // new com.icesoft.faces.component.ext.HtmlPanelGroup(); //new javax.faces.component.html.HtmlPanelGroup(); // // public HtmlPanelGroup getGroupPanelSimNonDefault() { // return groupPanelSimNonDefault; // } // // public void setGroupPanelSimNonDefault(HtmlPanelGroup groupPanelSimNonDefault) { // this.groupPanelSimNonDefault = groupPanelSimNonDefault; // } private HtmlPanelGrid groupPanelSimNonDefault = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getGroupPanelSimNonDefault() { return groupPanelSimNonDefault; } public void setGroupPanelSimNonDefault(HtmlPanelGrid groupPanelSimNonDefault) { this.groupPanelSimNonDefault = groupPanelSimNonDefault; } // simulation : value for 1st diff: casing pane private HtmlPanelGrid gridPanel10 = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getGridPanel10() { return gridPanel10; } public void setGridPanel10(HtmlPanelGrid hpg) { this.gridPanel10 = hpg; } // simulation : value for 1st diff: label for the casing panel // // private Label label2 = new Label(); // // public Label getLabel2() { // return label2; // } // // public void setLabel2(Label l) { // this.label2 = l; // } // simulation : value for 1st diff: pull-down var selection // dropdown2: ice:selectOneMenu@binding // private DropDown dropDown2 = new DropDown(); private HtmlSelectOneMenu dropDown2 = new com.icesoft.faces.component.ext.HtmlSelectOneMenu(); public HtmlSelectOneMenu getDropDown2() { return dropDown2; } public void setDropDown2(HtmlSelectOneMenu dd) { this.dropDown2 = dd; } // dropdown2: ice:selectOneMenu@value private List<SelectItem> setxDiffVarBox1 = new ArrayList<SelectItem>(); public List<SelectItem> getSetxDiffVarBox1() { return setxDiffVarBox1; } public void setSetxDiffVarBox1(List<SelectItem> dol) { this.setxDiffVarBox1 = dol; } // simulation : value for 1st diff: text box private HtmlInputText textField8 = new com.icesoft.faces.component.ext.HtmlInputText(); public HtmlInputText getTextField8() { return textField8; } public void setTextField8(HtmlInputText tf) { this.textField8 = tf; } // simulation : explanatory variable value: casing panel private HtmlPanelGrid gridPanel11 = new com.icesoft.faces.component.ext.HtmlPanelGrid(); public HtmlPanelGrid getGridPanel11() { return gridPanel11; } public void setGridPanel11(HtmlPanelGrid hpg) { this.gridPanel11 = hpg; } // simulation : explanatory variable value: label for casing panel // private Label label1 = new Label(); // // public Label getLabel1() { // return label1; // } // // public void setLabel1(Label l) { // this.label1 = l; // } // simulation : explanatory variable value: pull-down var selection // dropdown3: ice:selectOneMenu@binding //private DropDown dropDown3 = new DropDown(); private HtmlSelectOneMenu dropDown3 = new com.icesoft.faces.component.ext.HtmlSelectOneMenu(); public HtmlSelectOneMenu getDropDown3() { return dropDown3; } public void setDropDown3(HtmlSelectOneMenu dd) { this.dropDown3 = dd; } // dropdown3: ice:selectOneMenu@value private List<SelectItem> setxDiffVarBox2 = new ArrayList<SelectItem>(); public List<SelectItem> getSetxDiffVarBox2() { return setxDiffVarBox2; } public void setSetxDiffVarBox2(List<SelectItem> dol) { this.setxDiffVarBox2 = dol; } // simulation : explanatory variable value: text box private HtmlInputText textField10 = new com.icesoft.faces.component.ext.HtmlInputText(); public HtmlInputText getTextField10() { return textField10; } public void setTextField10(HtmlInputText tf) { this.textField10 = tf; } // submit button (modeling request) // advStatBttn: commandButton@binding private HtmlCommandButton advStatButton = new com.icesoft.faces.component.ext.HtmlCommandButton(); public HtmlCommandButton getAdvStatButton() { return advStatButton; } public void setAdvStatButton(HtmlCommandButton hcb) { this.advStatButton = hcb; } private List<Integer> getCurrentVarBoxSize(String mdlName) { List<Integer> bs = new ArrayList(); int noBoxR = getAnalysisApplicationBean().getSpecMap().get(mdlName) .getNoRboxes(); if (noBoxR == 1) { bs.add(advStatVarRBox1.size()); } else if (noBoxR == 2) { bs.add(advStatVarRBox1.size()); bs.add(advStatVarRBox2.size()); } else if (noBoxR == 3) { bs.add(advStatVarRBox1.size()); bs.add(advStatVarRBox2.size()); bs.add(advStatVarRBox3.size()); } return bs; } // checking advStat-related parameters before submission public boolean checkAdvStatParameters(String mdlName) { // boolean result=false; Integer noBoxR = getAnalysisApplicationBean().getSpecMap().get(mdlName) .getNoRboxes(); List<Integer> RBoxSizes = getCurrentVarBoxSize(mdlName); dbgLog.fine("RBoxSizes=" + RBoxSizes); int noe = 0; resetMsg4MoveVar(); for (int i = 0; i < noBoxR; i++) { Integer ithBoxMin = getAnalysisApplicationBean().getSpecMap().get( mdlName).getVarBox().get(i).getMinvar(); dbgLog.fine("i-th BoxMin(" + i + ")=" + ithBoxMin); if (RBoxSizes.get(i) < ithBoxMin) { String ermsg = "No of Vars in Box" + i + " (" + RBoxSizes.get(i) + ") is less than the minimum(" + ithBoxMin + ")"; dbgLog.fine("* " + ermsg); noe++; if (i == 0) { msgMoveVar1Bttn.setValue("*" + ermsg); msgMoveVar1Bttn.setRendered(true); } else if (i == 1) { msgMoveVar2Bttn.setValue("*" + ermsg); msgMoveVar2Bttn.setRendered(true); } else if (i == 2) { msgMoveVar3Bttn.setValue("*" + ermsg); msgMoveVar3Bttn.setRendered(true); } } } dbgLog.fine("noe=" + noe); return (noe == 0 ? true : false); } // msgAdvStatButton:ice:outputText@binding private com.icesoft.faces.component.ext.HtmlOutputText msgAdvStatButton = new com.icesoft.faces.component.ext.HtmlOutputText(); public com.icesoft.faces.component.ext.HtmlOutputText getMsgAdvStatButton() { return msgAdvStatButton; } public void setMsgAdvStatButton(com.icesoft.faces.component.ext.HtmlOutputText txt) { this.msgAdvStatButton = txt; } private String msgAdvStatButtonTxt; public String getMsgAdvStatButtonTxt() { return msgAdvStatButtonTxt; } public void setMsgAdvStatButtonTxt(String txt) { this.msgAdvStatButtonTxt = txt; } public void resetMsgAdvStatButton() { dbgLog.fine("***** within resetMsgAdvStatButton *****"); msgAdvStatButton.setValue(" "); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("msgAdvStatButtonTxt", msgAdvStatButtonTxt); msgAdvStatButton.setVisible(false); dbgLog.fine("***** resetMsgAdvStatButton: end *****"); } public List<String> getDataVariableForRBox1() { List<String> dvs = new ArrayList<String>(); for (Iterator el = advStatVarRBox1.iterator(); el.hasNext();) { SelectItem dv = (SelectItem) el.next(); String id = (String) dv.getValue(); dvs.add("v" + id); } return dvs; } public List<String> getDataVariableForRBox2() { List<String> dvs = new ArrayList<String>(); for (Iterator el = advStatVarRBox2.iterator(); el.hasNext();) { SelectItem dv = (SelectItem) el.next(); String id = (String) dv.getValue(); dvs.add("v" + id); } return dvs; } public List<String> getDataVariableForRBox3() { List<String> dvs = new ArrayList<String>(); for (Iterator el = advStatVarRBox3.iterator(); el.hasNext();) { SelectItem dv = (SelectItem) el.next(); String id = (String) dv.getValue(); dvs.add("v" + id); } return dvs; } public List<String> getZlg(String mdlId, String mdlName) { List<String> ls = new ArrayList<String>(); ls.add(mdlId + "-" + mdlName); return ls; } public List<String> getMdlType(String mdlName, String sf) { List<String> ls = new ArrayList<String>(); dbgLog.fine("model name=" + mdlName + " special function=" + sf); int typeValue = 0; if (mdlName.equals("blogit") || mdlName.equals("bprobit")) { typeValue = 1; } else { if (sf != null) { if (sf.equals("Surv")) { typeValue = 2; } else { String[] tmp = null; tmp = mdlName.split("\\."); dbgLog.fine("tmp[0]=" + tmp[0]); if (tmp[0].equals("factor")) { typeValue = 3; } } } } dbgLog.fine("model type=" + typeValue); ls.add(Integer.toString(typeValue)); return ls; } // </editor-fold> // end of advStat // <---------------------------------------------------------------------- // </editor-fold> // advStatBttn:h:commandButton@action public String advStatAction() { // dbgLog.fine("selected tab(advStat)="+getTabSet1().getSelected()); // check the current model String mdlName = (String) dropDown1.getValue(); dbgLog.fine("model name=" + mdlName); AdvancedStatGUIdata.Model modelSpec = getAnalysisApplicationBean() .getSpecMap().get(mdlName); if (checkAdvStatParameters(mdlName)) { FacesContext cntxt = FacesContext.getCurrentInstance(); HttpServletResponse res = (HttpServletResponse) cntxt .getExternalContext().getResponse(); HttpServletRequest req = (HttpServletRequest) cntxt .getExternalContext().getRequest(); dbgLog.fine("***** within advStatAction() *****"); // common parts // data file StudyFile sf = dataTable.getStudyFile(); Long noRecords = dataTable.getRecordsPerCase(); String dsbUrl = getDsbUrl(); dbgLog.fine("dsbUrl=" + dsbUrl); String serverPrefix = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath(); dbgLog.fine("serverPrefix="+serverPrefix); // / // "optnlst_a" => "A01|A02|A03", "analysis" => "A01 A02", // "varbl" => "v1.3 v1.10 v1.13 v1.22 v1.40", "charVarNoSet" => // "v1.10|v1.719", // / // common parameters Map<String, List<String>> mpl = new HashMap<String, List<String>>(); List<String> alst = new ArrayList<String>(); List<String> aoplst = new ArrayList<String>(); aoplst.add("A01|A02|A03"); mpl.put("optnlst_a", aoplst); Map<String, List<String>> xtbro = new HashMap<String, List<String>>(); // xtbro: modelName xtbro.put("modelName", Arrays.asList(mdlName)); // outoput options List<String> outOptionList = new ArrayList<String>(); mpl.put("modelName", Arrays.asList(mdlName)); if (mdlName.equals("xtb")) { mpl.put("requestType", Arrays.asList("Xtab")); } else { mpl.put("requestType", Arrays.asList("Zelig")); } if (mdlName.equals("xtb")) { alst.add("A03"); // output options // Object[] outOptn = (Object[]) checkboxGroupXtbOptions.getSelectedValue(); Object[] outOptn = chkbxAdvStatOutputXtbOpt.getSelectedValues(); List<String> tv = new ArrayList<String>(); //tv.add("T"); for (int j = 0; j < outOptn.length; j++) { dbgLog.fine("output option[" + j + "]=" + outOptn[j]); mpl.put((String) outOptn[j], Arrays.asList("T")); tv.add((String) outOptn[j]); } mpl.put("xtb_outputOptions",tv); // variables: 1st RBox if (advStatVarRBox1.size() >= 1) { dbgLog.fine("RB1:" + getDataVariableForRBox1()); mpl.put("xtb_nmBxR1", getDataVariableForRBox1()); } // variables: 2nd RBox if (advStatVarRBox2.size() >= 1) { dbgLog.fine("RB2:" + getDataVariableForRBox2()); mpl.put("xtb_nmBxR2", getDataVariableForRBox2()); } mpl.put("analysis", alst); } else { // Zelig cases dbgLog.fine("***** zelig param block *****"); // non-xtb, i.e., zelig cases // check zlg value dbgLog.fine("model spec dump="+ modelSpec); dbgLog.fine("model spec mdlId="+ modelSpec.getMdlId()); String zligPrefix = modelSpec.getMdlId(); dbgLog.fine("model no=" + zligPrefix); // get the varId-list of each box // 1-RBox case if (advStatVarRBox1.size() >= 1) { dbgLog.fine("RB1:" + getDataVariableForRBox1()); //mpl.put(zligPrefix + "_nmBxR1", getDataVariableForRBox1()); mpl.put("nmBxR1", getDataVariableForRBox1()); } // 2-RBox case if (advStatVarRBox2.size() >= 1) { dbgLog.fine("RB2:" + getDataVariableForRBox2()); //mpl.put(zligPrefix + "_nmBxR2", getDataVariableForRBox2()); mpl.put("nmBxR2", getDataVariableForRBox2()); } // 3-RBox case if (advStatVarRBox3.size() >= 1) { dbgLog.fine("RB3:" + getDataVariableForRBox3()); //mpl.put(zligPrefix + "_nmBxR3", getDataVariableForRBox3()); mpl.put("nmBxR3", getDataVariableForRBox3()); } // model name //mpl.put("zlg", getZlg(zligPrefix, mdlName)); // model type //String sfn = modelSpec.getSpecialFn(); //mpl.put("mdlType_" + mdlName, getMdlType(mdlName, sfn)); // model title //String ttl = modelSpec.getTitle(); //dbgLog.fine("model title=" + ttl); //mpl.put("mdlTitle_" + mdlName, Arrays.asList(ttl)); //mpl.put("mdlTitle", Arrays.asList(ttl)); // nrBoxes int noRboxes = modelSpec.getNoRboxes(); dbgLog.fine("noRboxes=" + noRboxes); //mpl.put("noBoxes_" + mdlName, Arrays.asList(Integer.toString(noRboxes))); mpl.put("noBoxes", Arrays.asList(Integer.toString(noRboxes))); // binary String mdlCategory = modelSpec.getCategory(); String outcomeType = modelSpec.getVarBox().get(0).getVarType(); dbgLog.fine("model category=" + mdlCategory); if (mdlCategory.equals("Models for Dichotomous Dependent Variables")) { mpl.put("mdlDepVarType", Arrays.asList("binary")); } if (outcomeType.equals("binary")){ mpl.put("isOutcomeBinary", Arrays.asList("T")); } else { mpl.put("isOutcomeBinary", Arrays.asList("F")); } // output options // // // // zlg_017_Summary zlg_017_Plots zlg_017_BinOutput // // //Object[] outOptn = (Object[]) checkboxGroup2DefaultOptions.getSelectedValue(); Object[] outOptn = chkbxAdvStatOutputOpt.getSelectedValues(); List<String> tv = new ArrayList<String>(); for (int j = 0; j < outOptn.length; j++) { //String outputOptnkey = zligPrefix + "_"+ (String) outOptn[j]; String outputOptnkey = (String) outOptn[j]; dbgLog.fine("zelig: output option[" + j + "]="+ outputOptnkey); mpl.put(outputOptnkey, Arrays.asList("T")); tv.add((String) outOptn[j]); } mpl.put("zelig_outputOptions",tv); // analysis options // // zlg_017_Sim zlg_017_setx zlg_017_setx_var // zlg_017_setx_val_1 zlg_017_setx_val_2 // // zlg_017_naMethod // // dbgLog.fine("simulationPanel is selected="+simulationPanel.isSelected()); if (simulationPanel.isSelected()) { dbgLog.fine("radioSimTypeChoiceSelected="+radioSimTypeChoiceSelected); //mpl.put(zligPrefix + "_Sim", Arrays.asList("T")); mpl.put("Sim", Arrays.asList("T")); //Object simOptn = radioButtonGroup1DefaultOptions.getSelectedValue(); dbgLog.fine("radioSimTypeChoice(value)="+radioSimTypeChoice.getValue()); dbgLog.fine("radioSimTypeChoiceSelected="+radioSimTypeChoiceSelected); // simOptn = 0 or 1 //mpl.put(zligPrefix + "_setx", Arrays.asList((String) simOptn)); // mpl.put("setx", Arrays.asList((String) simOptn)); // mpl.put("setxType", Arrays.asList((String) simOptn)); mpl.put("setx", Arrays.asList(radioSimTypeChoiceSelected)); mpl.put("setxType", Arrays.asList(radioSimTypeChoiceSelected)); if (radioSimTypeChoiceSelected.equals("1")) { Object v1 = dropDown2.getValue(); Object v2 = dropDown3.getValue(); Object vl1 = textField10.getValue(); Object vl2 = textField8.getValue(); dbgLog.fine("v1="+v1); dbgLog.fine("v2="+v2); dbgLog.fine("vl1="+vl1); dbgLog.fine("vl2="+vl2); List<String> setxVars = new ArrayList<String>(); if (v1 != null) { setxVars.add((String) v1); } if (v2 != null) { setxVars.add((String) v2); } //mpl.put(zligPrefix + "_setx_var", setxVars); mpl.put("setx_var", setxVars); if (vl1 != null) { //mpl.put(zligPrefix + "_setx_val_1", Arrays.asList((String) vl1)); mpl.put("setx_val_1", Arrays.asList((String) vl1)); } if (vl2 != null) { //mpl.put(zligPrefix + "_setx_val_2", Arrays.asList((String) vl2)); mpl.put("setx_val_2", Arrays.asList((String) vl2)); } List<String> setxVar1 = new ArrayList<String>(); if (v1 != null) { setxVar1.add("v" + v1); if (vl1 != null) { setxVar1.add((String) vl1); } else { setxVar1.add(""); } mpl.put("setx_var1", setxVar1); } if (v2 != null) { List<String> setxVar2 = new ArrayList<String>(); setxVar2.add("v"+ v2); if (vl2 != null) { setxVar2.add((String) vl2); } else { setxVar2.add(""); } mpl.put("setx_var2", setxVar2); } } } else { mpl.put("Sim", Arrays.asList("F")); } } dbgLog.fine("contents(mpl so far):" + mpl); // if there is a user-defined (recoded) variables /* if (recodedVarSet.size() > 0) { mpl.putAll(getRecodedVarParameters()); } */ // dbgLog.fine("citation info to be sent:\n" + citation); // mpl.put("OfflineCitation", Arrays.asList(citation)); // mpl.put("appSERVER", Arrays.asList(req.getServerName() + // ":"+ req.getServerPort() + req.getContextPath())); mpl.put("studytitle", Arrays.asList(getStudyTitle())); dbgLog.fine("alt studyId="+getStudyId().toString()); mpl.put("studyno", Arrays.asList(getStudyId().toString())); mpl.put("studyURL", Arrays.asList(studyURL)); mpl.put("browserType", Arrays.asList(browserType)); mpl.put("recodedVarIdSet", getRecodedVarIdSet()); mpl.put("recodedVarNameSet",getRecodedVarNameSet()); mpl.put("recodedVarLabelSet", getRecodedVarLabelSet()); mpl.put("recodedVarTypeSet", getRecodedVariableType()); mpl.put("recodedVarBaseTypeSet", getBaseVariableTypeForRecodedVariable()); mpl.put("baseVarIdSet",getBaseVarIdSetFromRecodedVarIdSet()); mpl.put("baseVarNameSet",getBaseVarNameSetFromRecodedVarIdSet()); // ----------------------------------------------------- // New processing route // // Step 0. Locate the data file and its attributes String fileId = sf.getId().toString(); //VDC vdc = vdcService.getVDCFromRequest(req); String fileloc = sf.getFileSystemLocation(); String tabflnm = sf.getFileName(); boolean sbstOK = sf.isSubsettable(); String flct = sf.getFileType(); dbgLog.fine("location="+fileloc); dbgLog.fine("filename="+tabflnm); dbgLog.fine("subsettable="+sbstOK); dbgLog.fine("filetype="+flct); DvnRJobRequest sro = null; List<File> zipFileList = new ArrayList(); // the data file for downloading/statistical analyses must be subset-ready // local (relative to the application) file case // note: a typical remote case is: US Census Bureau File tmpsbfl = null; if (sbstOK){ try { // this temp file will store the requested columns: tmpsbfl = File.createTempFile("tempsubsetfile.", ".tab"); deleteTempFileList.add(tmpsbfl); // to produce this file, we'll either open the stream // and run our local subsetting code on it, or request // the subsetting to be performed natively by the access // driver, if it supports the functionality: // check whether a source file is tab-delimited or not boolean fieldcut = true; if ((noRecords != null) && (noRecords >=1)){ fieldcut = false; } DataAccessRequest daReq = new DataAccessRequest(); daReq.setParameter("noVarHeader", "1"); DataAccessObject accessObject = DataAccess.createDataAccessObject(sf, daReq); if (accessObject.isSubsetSupported()) { dbgLog.fine("Using NATIVE subset functionality of the repository."); daReq.setParameter("vars", getVariableNamesForSubset()); accessObject.open(); InputStream inSubset = accessObject.getInputStream(); OutputStream outSubset = new BufferedOutputStream(new FileOutputStream(tmpsbfl.getAbsolutePath())); int bufsize = 8192; byte [] subsetDataBuffer = new byte[bufsize]; while ((bufsize = inSubset.read(subsetDataBuffer))!=-1) { outSubset.write(subsetDataBuffer, 0, bufsize); } inSubset.close(); outSubset.close(); // TODO: catch exceptions; reset the state of the page // if anything went wrong. See the fixed-field section // below for an example. } else { accessObject.open(); if (fieldcut){ // Cutting requested fields of data from a TAB-delimited stream: Set<Integer> fields = getFieldNumbersForSubsetting(); dbgLog.fine("subsetting fields="+fields); // Create an instance of DvnJavaFieldCutter FieldCutter fc = new DvnJavaFieldCutter(); // Executes the subsetting request fc.subsetFile(accessObject.getInputStream(), tmpsbfl.getAbsolutePath(), fields, dataTable.getCaseQuantity(), "\t"); // TODO: catch exceptions; reset the state of the page // if anything went wrong. See the fixed-field section // below for an example. } else { // Cutting requested columns of data from a fixed-field stream: Map<Long, List<List<Integer>>> varMetaSet = getSubsettingMetaData(noRecords); DvnNewJavaFieldCutter fc = new DvnNewJavaFieldCutter(varMetaSet); try { //fc.cutColumns(new File(cutOp1), noRecords.intValue(), 0, "\t", tmpsbfl.getAbsolutePath()); fc.cutColumns(accessObject.getInputStream(), noRecords.intValue(), 0, "\t", tmpsbfl.getAbsolutePath()); } catch (FileNotFoundException e) { e.printStackTrace(); msgDwnldButton.setValue("* could not generate subset due to an IO problem"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; } catch (RuntimeException re){ re.printStackTrace(); msgDwnldButton.setValue("* could not generate subset due to an runtime error"); msgDwnldButton.setVisible(true); dbgLog.warning("exiting dwnldAction() due to an runtime error"); getVDCRequestBean().setSelectedTab("tabDwnld"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return ""; //"failure"; } } } // Checks the resulting subset file if (tmpsbfl.exists()){ Long subsetFileSize = tmpsbfl.length(); dbgLog.fine("subsettFile:Length="+subsetFileSize); dbgLog.fine("tmpsb file name="+tmpsbfl.getAbsolutePath()); if (subsetFileSize > 0){ mpl.put("subsetFileName", Arrays.asList(tmpsbfl.getAbsolutePath())); mpl.put("subsetDataFileName",Arrays.asList(tmpsbfl.getName())); } else { // subset file exists but it is empty msgAdvStatButton.setValue("* an subset file is empty"); msgAdvStatButton.setVisible(true); dbgLog.warning("exiting advStatAction() due to a subsetting error:"+ "a subset file is empty" ); getVDCRequestBean().setSelectedTab("tabAdvStat"); return ""; //"failure"; } } else { // subset file was not created msgAdvStatButton.setValue("* a subset file was not created"); msgAdvStatButton.setVisible(true); dbgLog.warning("exiting advStatAction() due to a subsetting error:"+ "a subset file was not created" ); getVDCRequestBean().setSelectedTab("tabAdvStat"); return ""; //"failure"; } // Step 3. Organizes parameters/metadata to be sent to the implemented // data-analysis-service class //Map<String, Map<String, String>> vls = getValueTableForRequestedVariables(getDataVariableForRequest()); Map<String, Map<String, String>> vls = getValueTablesForAllRequestedVariables(); sro = new DvnRJobRequest(getDataVariableForRequest(), mpl, vls, recodeSchema, modelSpec); //dbgLog.fine("Prepared sro dump:\n"+ToStringBuilder.reflectionToString(sro, ToStringStyle.MULTI_LINE_STYLE)); // Step 4. Creates an instance of the the implemented // data-analysis-service class DvnRDataAnalysisServiceImpl das = new DvnRDataAnalysisServiceImpl(); // Executes a request of downloading or data analysis and // capture result info as a Map <String, String> resultInfo = das.execute(sro); // Step 5. Checks the DSB-exit-status code if (resultInfo.get("RexecError").equals("true")){ //msgAdvStatButton.setValue("* The Request failed due to an R-runtime error"); msgAdvStatButton.setValue("* The Request failed due to an R-runtime error"); msgAdvStatButton.setVisible(true); dbgLog.fine("exiting advStatAction() due to an R-runtime error"); getVDCRequestBean().setSelectedTab("tabAdvStat"); return ""; //"failure"; } else { if (recodeSchema.size()> 0){ resultInfo.put("subsettingCriteria",sro.getSubsetConditionsForCitation()); } else { resultInfo.put("subsettingCriteria",""); } } } catch (MalformedURLException e) { e.printStackTrace(); // pass the error message to the resultPage // resultInfo.put(); msgAdvStatButton.setValue("* file URL is malformed"); msgAdvStatButton.setVisible(true); dbgLog.warning("exiting advStatAction() due to a URL problem "); getVDCRequestBean().setSelectedTab("tabAdvStat"); return ""; //"failure"; } catch (IOException e) { // this may occur if the dataverse is not released // the file exists, but it is not accessible e.printStackTrace(); msgAdvStatButton.setValue("* an IO problem occurred"); msgAdvStatButton.setVisible(true); dbgLog.warning("exiting advStatAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabAdvStat"); return ""; //"failure"; } // end of the subset-OK case } else { // not subsettable data file msgAdvStatButton.setValue("* this data file is not subsettable file"); msgAdvStatButton.setVisible(true); dbgLog.warning("exiting advStatAction(): the data file is not subsettable "); getVDCRequestBean().setSelectedTab("tabAdvStat"); return ""; //"failure"; } // end:subsetNotOKcase // final processing steps for all successful cases resultInfo.put("offlineCitation", getCitation()); resultInfo.put("studyTitle", getStudyTitle()); resultInfo.put("studyNo", getStudyId().toString()); resultInfo.put("dtId", dtId.toString()); if (versionNumber != null) { resultInfo.put("versionNumber", versionNumber.toString()); } resultInfo.put("studyURL", studyURL); resultInfo.put("R_min_verion_no",resultInfo.get("Rversion").substring(2)); resultInfo.put("dataverse_version_no",dvnVersionNumber); dbgLog.fine("RwrkspFileName="+resultInfo.get("wrkspFileName")); // writing necessary files try{ // rename the subsetting file File tmpsbflnew = File.createTempFile(SUBSET_FILENAME_PREFIX + resultInfo.get("PID") +".", ".tab"); deleteTempFileList.add(tmpsbflnew); InputStream inb = new BufferedInputStream(new FileInputStream(tmpsbfl)); OutputStream outb = new BufferedOutputStream(new FileOutputStream(tmpsbflnew)); int bufsize; byte [] bffr = new byte[8192]; while ((bufsize = inb.read(bffr))!=-1) { outb.write(bffr, 0, bufsize); } inb.close(); outb.close(); String rhistNew = StringUtils.replace(resultInfo.get("RCommandHistory"), tmpsbfl.getName(),tmpsbflnew.getName()); //zipFileList.add(tmpsbflnew); // (1) write a citation file // String citationFilePrefix = "citationFile_"+ resultInfo.get("PID") + "_"; // File tmpcfl = File.createTempFile(citationFilePrefix, ".txt"); // // zipFileList.add(tmpcfl); // deleteTempFileList.add(tmpcfl); // // DvnCitationFileWriter dcfw = new DvnCitationFileWriter(resultInfo); // // String fmpcflFullname = tmpcfl.getAbsolutePath(); // String fmpcflname = tmpcfl.getName(); // dcfw.write(tmpcfl); // (2) R command file String rhistoryFilePrefix = R_COMMAND_FILE_PREFIX + resultInfo.get("PID") + ".R"; File tmpRhfl = new File(TEMP_DIR, rhistoryFilePrefix); zipFileList.add(tmpRhfl); deleteTempFileList.add(tmpRhfl); resultInfo.put("dvn_R_helper_file","dvn_helper.R"); DvnReplicationCodeFileWriter rcfw = new DvnReplicationCodeFileWriter(resultInfo); if (mdlName.equals("xtb")){ rcfw.writeXtabCode(tmpRhfl); } else { rcfw.writeZeligCode(tmpRhfl); } // (3) RData Replication file String wrkspFileName = resultInfo.get("wrkspFileName"); dbgLog.fine("wrkspFileName="+wrkspFileName); File RwrkspFileName = new File(wrkspFileName); if (RwrkspFileName.exists()){ dbgLog.fine("RwrkspFileName:length="+RwrkspFileName.length()); zipFileList.add(RwrkspFileName); } else { dbgLog.fine("RwrkspFileName does not exist"); //msgAdvStatButton.setValue("* The workspace file is not available"); //msgAdvStatButton.setVisible(true); dbgLog.warning("advStatAction(): R workspace file was not transferred"); //getVDCRequestBean().setSelectedTab("tabAdvStat"); //return "failure"; } deleteTempFileList.add(RwrkspFileName); // vdc_startup.R file // String vdc_startupFileName = resultInfo.get("vdc_startupFileName"); // dbgLog.fine("vdc_startupFileName="+vdc_startupFileName); // File vdcstrtFileName = new File(vdc_startupFileName); // if (vdcstrtFileName.exists()){ // dbgLog.fine("vdcstrtFileName:length="+vdcstrtFileName.length()); // zipFileList.add(vdcstrtFileName); // } else { // dbgLog.fine("vdcstrtFileName does not exist"); // //msgAdvStatButton.setValue("* vdc_startup.R is not available"); // //msgAdvStatButton.setVisible(true); // dbgLog.warning("advStatAction(): vdc_startup.R was not transferred"); // //getVDCRequestBean().setSelectedTab("tabAdvStat"); // // //return "failure"; // } // deleteTempFileList.add(vdcstrtFileName); // (4) add replication readme file String readMeFileName = REP_README_FILE_PREFIX + resultInfo.get("PID") + ".txt"; File readMeFile = new File(TEMP_DIR, readMeFileName); DvnReplicationREADMEFileWriter rw = new DvnReplicationREADMEFileWriter(resultInfo); rw.writeREADMEfile(readMeFile); //zipFileList.add(REP_README_FILE); zipFileList.add(readMeFile); deleteTempFileList.add(readMeFile); // (5) helper zipFileList.add(DVN_R_HELPER_FILE); if (mdlName.equals("xtb")){ // (6) css file zipFileList.add(DVN_R2HTML_CSS_FILE); } // zip the following files as a replication-pack // // local local local remote // citation, tab-file, R history, wrksp for (File f : zipFileList){ dbgLog.fine("path="+f.getAbsolutePath() +"\tname="+ f.getName()); } // zipping all required files try{ String zipFilePrefix = "zipFile_" + resultInfo.get("PID") + ".zip"; File zipFile = new File(TEMP_DIR, zipFilePrefix); deleteTempFileList.add(zipFile); //res.setContentType("application/zip"); String zfname = zipFile.getAbsolutePath(); //res.setHeader("content-disposition", "attachment; filename=" + zfname); OutputStream zfout = new FileOutputStream(zipFile); //zipFiles(res.getOutputStream(), zipFileList); zipFiles(zfout, zipFileList); if (zipFile.exists()){ Long zipFileSize = zipFile.length(); dbgLog.fine("zip file:length="+zipFileSize); dbgLog.fine("zip file:name="+zipFile.getAbsolutePath()); if (zipFileSize > 0){ resultInfo.put("replicationZipFile", zfname); resultInfo.put("replicationZipFileName", zipFile.getName()); } else { dbgLog.fine("zip file is empty"); } } else { dbgLog.fine("zip file was not saved"); } // put resultInfo into the session object resultInfo.remove("RCommandHistory"); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put( "resultInfo", resultInfo); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); dbgLog.fine("***** within advStatAction(): succcessfully ends here *****"); return "/subsetting/AnalysisResultsPage?faces-redirect=true" + getContextSuffix(); //"success"; } catch (IOException e){ // file-access problem, etc. e.printStackTrace(); dbgLog.fine("zipping IO exception"); msgAdvStatButton.setValue("* an IO problem occurred during zipping replication files"); msgAdvStatButton.setVisible(true); dbgLog.warning("exiting edaAction() due to an zipping IO problem "); //getVDCRequestBean().setSelectedTab("tabAdvStat"); dvnDSBTimerService.createTimer(deleteTempFileList, TEMP_FILE_LIFETIME); return "/subsetting/AnalysisResultsPage?faces-redirect=true" + getContextSuffix(); //"success"; } // end of zipping step } catch (IOException e){ // io errors caught during writing files e.printStackTrace(); msgAdvStatButton.setValue("* an IO problem occurred"); msgAdvStatButton.setVisible(true); dbgLog.warning("exiting edaAction() due to an IO problem "); getVDCRequestBean().setSelectedTab("tabAdvStat"); return ""; //"failure"; } // end of CheckParameters: OK case } else { // parameters are not complete: show error message; msgAdvStatButton.setValue("* Selection is incomplete"); msgAdvStatButton.setVisible(true); dbgLog.fine("exiting advStatAction(): selection is incomplete"); getVDCRequestBean().setSelectedTab("tabAdvStat"); return ""; //"failure"; } } // ----------------------------------------------------------------------- // subsetting-instruction section // ----------------------------------------------------------------------- // <editor-fold desc="subsetting instruction"> // message block: subsetting allowed private HtmlOutputText txtSubsettingInstruction = new com.icesoft.faces.component.ext.HtmlOutputText(); public HtmlOutputText getTxtSubsettingInstruction() { return txtSubsettingInstruction; } public void setTxtSubsettingInstruction(HtmlOutputText hot) { this.txtSubsettingInstruction = hot; } // message block: subsetting not allowed private HtmlOutputText txtNonSubsettingInstruction = new com.icesoft.faces.component.ext.HtmlOutputText(); public HtmlOutputText getTxtNonSubsettingInstruction() { return txtNonSubsettingInstruction; } public void setTxtNonSubsettingInstruction(HtmlOutputText hot) { this.txtNonSubsettingInstruction = hot; } private HtmlPanelGrid wrapSubsettingInstruction = new com.icesoft.faces.component.ext.HtmlPanelGrid(); /** * Getter for component wrapSubsettingInstruction * * @return ice:panelGrid of the pane */ public HtmlPanelGrid getWrapSubsettingInstruction() { return wrapSubsettingInstruction; } /** * Setter for panelGroup wrapSubsettingInstruction * * @param pg ice:panelGrid of the pane */ public void setWrapSubsettingInstruction(HtmlPanelGrid pg) { wrapSubsettingInstruction = pg; } private Boolean wrapSubsettingInstructionRendered; /** * Getter for attribute wrapSubsettingInstructionRendered * * @return the rendered attribute of ice:panelGroup */ public Boolean getWrapSubsettingInstructionRendered(){ return wrapSubsettingInstructionRendered; } /** * Setter for attribute wrapSubsettingInstructionRendered * * @param rndrd the rendered attribute of ice:panelGroup */ public void setWrapSusettingInstructionRendered(Boolean rndrd){ wrapSubsettingInstructionRendered = rndrd; } private HtmlPanelGroup wrapNonSubsettingInstruction = new com.icesoft.faces.component.ext.HtmlPanelGroup(); /** * Getter for component wrapNonSubsettingInstruction * * @return ice:panelGroup of the pane */ public HtmlPanelGroup getWrapNonSubsettingInstruction() { return wrapNonSubsettingInstruction; } /** * Setter for panelGroup wrapNonSubsettingInstruction * * @param pg ice:panelGroup of the pane */ public void setWrapNonSubsettingInstruction(HtmlPanelGroup pg) { wrapNonSubsettingInstruction = pg; } private Boolean wrapNonSubsettingInstructionRendered; /** * Getter for attribute wrapNonSubsettingInstructionRendered * * @return the rendered attribute of ice:panelGroup */ public Boolean getWrapNonSubsettingInstructionRendered(){ return wrapNonSubsettingInstructionRendered; } /** * Setter for attribute wrapNonSubsettingInstructionRendered * * @param rndrd the rendered attribute of panelGroup */ public void setWrapNonSubsettingInstructionRendered(Boolean rndrd){ wrapNonSubsettingInstructionRendered = rndrd; } // end of subsetting-instruction // <---------------------------------------------------------------------- // </editor-fold> // ----------------------------------------------------------------------- // How-many-variable-DropDown menu // ----------------------------------------------------------------------- // <editor-fold desc="How Many Variable Menu"> private HtmlInputText textField4 = new com.icesoft.faces.component.ext.HtmlInputText(); public HtmlInputText getTextField4() { return textField4; } public void setTextField4(HtmlInputText hit) { this.textField4 = hit; } // ice:selectOneMenu: howManyRows // howManyRows@binding private HtmlSelectOneMenu howManyRows = new com.icesoft.faces.component.ext.HtmlSelectOneMenu(); public HtmlSelectOneMenu getHowManyRows() { return howManyRows; } public void setHowManyRows(HtmlSelectOneMenu dd) { this.howManyRows = dd; } // howManyRows@value private List<SelectItem> howManyRowsOptions = new ArrayList<SelectItem>(); public List<SelectItem> getHowManyRowsOptions() { return howManyRowsOptions; } public void setHowManyRowsOptions(List<SelectItem> ssol) { this.howManyRowsOptions = ssol; } // howManyRows@valueChangeListener public void howManyRows_processValueChange(ValueChangeEvent vce) { dbgLog.fine("***** howManyRows_processValueChange: start *****"); // the value of show-all-rows option == 0 dbgLog.fine("old number of Rows=" + vce.getOldValue()); if (vce.getOldValue()==null){ return; } dbgLog.fine("new number of Rows=" + vce.getNewValue()); dbgLog.fine("current Row Index(1)=" + data.getRowIndex()); selectedNoRows = (String) howManyRows.getValue(); dbgLog.fine("selected number of Rows=" + selectedNoRows); int newNoRows = Integer.parseInt(selectedNoRows); if (newNoRows == 0) { newNoRows = data.getRowCount(); } dbgLog.fine("acutually selected number of Rows=" + newNoRows); data.setFirst(0); data.setRows(newNoRows); dbgLog.fine("first row to be shown=" + data.getFirst()); dbgLog.fine("current Row Index(2)=" + data.getRowIndex()); //FacesContext.getCurrentInstance().renderResponse(); howManyVarsChecked(); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("selectedNoRows", selectedNoRows); dbgLog.fine("***** howManyRows_processValueChange: end *****"); } private String howManyRowsClientId; public String getHowManyRowsClientId() { FacesContext cntxt = FacesContext.getCurrentInstance(); return howManyRows.getClientId(cntxt); } private String selectedNoRows; public String getSelectedNoRows() { return selectedNoRows; } public void setSelectedNoRows(String selectedNoRows) { this.selectedNoRows = selectedNoRows; } // </editor-fold> // ----------------------------------------------------------------------- // variable Table section // ----------------------------------------------------------------------- // <editor-fold desc="variable table"> // Variable Table: @binding /** * UIData that backs the binding attribute of * the variable table (h:dataTable) whose id is dataTable1 * */ private UIData data = null; /** * Getter for property data * * @return property data */ public UIData getData() { return data; } /** * Setter for property data * * @param data new UIData */ public void setData(UIData data) { this.data = data; } // ----------------------------------------------------------------------- // scroller-related methods // ----------------------------------------------------------------------- /** * Shifts the displayed rows of the variable table back to the top * * @return null String */ public String first() { scroll(0); return (null); } /** * Shifts the displayed rows of the variable table forward to the buttom * * @return null String */ public String last() { scroll(data.getRowCount() - 1); return (null); } /** * Shifts the displayed rows of the variable table one page forward * * @return null String */ public String next() { int first = data.getFirst(); scroll(first + data.getRows()); return (null); } /** * Shifts the displayed rows of the variable table one page back * * @return null String */ public String previous() { int first = data.getFirst(); scroll(first - data.getRows()); return (null); } /** * Shifts the displayed rows of the variable table to * the indexed position on which an end-user clicked * * @param row the new current row Id number (integer) */ public void scroll(int row) { int rows = data.getRows(); dbgLog.fine("within scroll:rows=" + rows); if (rows < 1) { return; } if (rows < 0) { data.setFirst(0); } else if (rows >= data.getRowCount()) { data.setFirst(data.getRowCount() - 1); } else { data.setFirst(row - (row % rows)); } } /** * Shifts the displayed rows of the variable table upon an end-user's * clicking action on the scroller element * * @param event ActionEvent event */ public void processScrollEvent(ActionEvent event) { int currentRow = 1; UIComponent component = event.getComponent(); Integer curRow = (Integer) component.getAttributes().get("currentRow"); dbgLog.fine("within processScrollEvent: curRow=" + curRow); int firstRow = data.getFirst(); dbgLog.fine("b: 1st row-index value=" + firstRow); int lastRow = data.getFirst() + data.getRows(); dbgLog.fine("b: tentative last row-index value=" + lastRow); if (curRow != null) { currentRow = curRow.intValue(); } dbgLog.fine("currentRow=" + currentRow); scroll(currentRow); firstRow = data.getFirst(); dbgLog.fine("a: 1st row-index value=" + firstRow); lastRow = data.getFirst() + data.getRows(); dbgLog.fine("a: tentative last row-index value=" + lastRow); howManyVarsChecked(); } private DataPaginator dataScroller1 = new DataPaginator(); public DataPaginator getDataScroller1() { return dataScroller1; } public void setDataScroller1(DataPaginator dataScroller1) { this.dataScroller1 = dataScroller1; } public void processDataScroller1(ActionEvent ae){ dbgLog.fine("***** processDataScroller1: start *****"); dbgLog.fine("current page index="+dataScroller1.getPageIndex()); checkboxSelectUnselectAll.setSelected(false); dbgLog.fine("***** processDataScroller1: end *****"); } // ----------------------------------------------------------------------- // select-all checkbox // ----------------------------------------------------------------------- /** * The Checkbox object backing the binding attribute of * HtmlSelectBooleanCheckbox * component that renders the select/unselect-all variable checkbox * in the first column of the header of the variable table */ //private Checkbox checkboxSelectUnselectAll = new Checkbox(); private HtmlSelectBooleanCheckbox checkboxSelectUnselectAll = new com.icesoft.faces.component.ext.HtmlSelectBooleanCheckbox(); /** * Getter for component checkboxSelectUnselectAll * * @return the Checkbox object backing the * select/unselect-all variable checkbox */ public HtmlSelectBooleanCheckbox getCheckboxSelectUnselectAll() { return checkboxSelectUnselectAll; } /** * Setter for component checkboxSelectUnselectAll * * @param c the Checkbox object that backs the * select/unselect-all variable checkbox */ public void setCheckboxSelectUnselectAll(HtmlSelectBooleanCheckbox c) { checkboxSelectUnselectAll = c; } /** * To avoid serialization-related errors, the component-binding of * checkboxSelectUnselectAll should not be used for state-keeping * The two attributes of this checkbox object, * selected and rendered, must be separately handled by two new * Boolean properties. * attribute Boolean property * --.value checkboxSelectUnselectAllSelected * --.rendered checkboxSelectUnselectAllRendered */ /** * The Boolean object backing the selected attribute of * checkboxSelectUnselectAll */ private Boolean checkboxSelectUnselectAllSelected; /** * Getter for property checkboxSelectUnselectAllSelected * * @return the selected attribute of checkboxSelectUnselectAll */ public Boolean getCheckboxSelectUnselectAllSelected(){ return checkboxSelectUnselectAllSelected; } /** * Setter for property checkboxSelectUnselectAllSelected * * @param The Boolean object that backs the selected * attribute of checkboxSelectUnselectAll */ public void setCheckboxSelectUnselectAllSelected(Boolean c){ checkboxSelectUnselectAllSelected=c; } /** * The Boolean object backing the rendered attribute of * checkboxSelectUnselectAll */ private Boolean checkboxSelectUnselectAllRendered; /** * Getter for property checkboxSelectUnselectAllRendered * * @return the rendered attribute of checkboxSelectUnselectAll */ public Boolean getCheckboxSelectUnselectAllRendered(){ return checkboxSelectUnselectAllRendered; } /** * Setter for property checkboxSelectUnselectAllRendered * * @param The Boolean object that backs the rendered * attribute of checkboxSelectUnselectAll */ public void setCheckboxSelectUnselectAllRendered(Boolean c){ checkboxSelectUnselectAllRendered = c; } /** * Updates the Boolean state of the select/unselect-all checkbox * via its backing attribute checkboxSelectUnselectAllSelected and * saves this Boolean state in the sessionMap object */ public void howManyVarsChecked() { dbgLog.fine("***** howManyVarsChecked: start *****"); // get the 1st and last ones of the displayed rows int firstRow = data.getFirst(); dbgLog.fine("1st row-index value=" + firstRow); int lastRow = data.getFirst() + data.getRows(); dbgLog.fine("tentative last row-index value=" + lastRow); int remain = data.getRowCount() - firstRow; if (remain < data.getRows()) { lastRow = data.getFirst() + remain; dbgLog.fine("adjusted last row-index value=" + lastRow); } dbgLog.fine("how many rows are displayed=" + data.getRows()); int counter = 0; for (int i = firstRow; i < lastRow; i++) { List<Object> rw = new ArrayList<Object>(); rw = (ArrayList) dt4Display.get(i); if ((Boolean) rw.get(0)) { counter++; } } int diff = lastRow - firstRow; dbgLog.fine("how many rows to be displayed=" + diff); dbgLog.fine("how many rows are checked=" + counter); if (counter == diff) { // check the checkbox checkboxSelectUnselectAll.setSelected(Boolean.TRUE); dbgLog.fine("set the select/unselect-all checkbox checked"); } else { // uncheck the checkbox checkboxSelectUnselectAll.setSelected(Boolean.FALSE); dbgLog.fine("set the select/unselect-all checkbox UN-checked"); } // Stores the objects that represents the properties of the component // instead of the component itsefl in the session map /* deprecated FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("checkboxSelectUnselectAll", checkboxSelectUnselectAll); */ checkboxSelectUnselectAllSelected = (Boolean)checkboxSelectUnselectAll.getValue(); FacesContext.getCurrentInstance().getExternalContext() .getSessionMap().put("checkboxSelectUnselectAllSelected", checkboxSelectUnselectAllSelected); dbgLog.fine("***** howManyVarsChecked: end *****"); } /** * Updates backing objects and components after an end-user * checked/unchecked the checkbox checkboxSelectUnselectAll. * Attached to the valueChangeListener attribute of checkbox * component whose id is checkboxSelectUnselectAll * * @param vce ValueChangeEvent event */ public void selectUnselectAllCheckbox(ValueChangeEvent vce) { dbgLog.fine("***** selectUnselectAllCheckbox: start *****"); // toggle false to true or vice versa FacesContext cntxt = FacesContext.getCurrentInstance(); Boolean oldState = (Boolean) vce.getOldValue(); dbgLog.fine("oldState=" + oldState); Boolean currentState = (Boolean) vce.getNewValue(); dbgLog.fine("newState=" + currentState); // clear the error message if it still exists resetMsgVariableSelection(); // hide the download button and // show the create button dwnldButton.setRendered(true); dwnloadSubsetButton.setRendered(false); // check the displayed rows int firstRow = data.getFirst(); dbgLog.fine("1st-row index value=" + firstRow); int lastRow = data.getFirst() + data.getRows(); dbgLog.fine("tentative last row-index value=" + lastRow); int remain = data.getRowCount() - firstRow; if (remain < data.getRows()) { lastRow = data.getFirst() + remain; dbgLog.fine("adjusted last row-index value=" + lastRow); } dbgLog.fine("how many rows are to be displayed=" + data.getRows()); Set<String> bvIdSet = new HashSet<String>(); Set<String> rmIdSet = new HashSet<String>(); int bvcnt = 0; for (int i = firstRow; i < lastRow; i++) { List<Object> rw = new ArrayList<Object>(); rw = (ArrayList) dt4Display.get(i); String varId = (String) rw.get(2); // check this var is a base-var for recoded vars if (!baseVarToDerivedVar.containsKey(varId)) { // recoded var's Id may also pass this block rw.set(0, currentState); if(!isRecodedVar(varId)){ // if this id is not recoded var's id dbgLog.fine(varId + " is not a recoded varId"); rmIdSet.add(varId); } else { dbgLog.fine(varId + " is a recoded varId"); bvcnt++; bvIdSet.add(varId); } } else { // keep this var's checkbox checked rw.set(0, Boolean.TRUE); bvcnt++; bvIdSet.add(varId); } dt4Display.set(i, rw); } dbgLog.fine("conents:bvIdSet=" + bvIdSet); dbgLog.fine("number of recoded vars=" + bvcnt); if (currentState) { // select-all case dbgLog.fine("select all case: add all variable to varCart, etc."); for (int i = firstRow; i < lastRow; i++) { String keyS = (String) ((ArrayList) dt4Display.get(i)).get(2); String valueS = (String) ((ArrayList) dt4Display.get(i)).get(3); // Long newKey= Long.valueOf(keyS); // if (!varCart.containsKey(newKey)){ if (!varCart.containsKey(keyS)) { // varCart.put( newKey, valueS ); varCart.put(keyS, valueS); getVarSetAdvStat().add(new SelectItem(keyS, valueS)); } } // activate buttons activateButtons(); checkboxSelectUnselectAll.setSelected(Boolean.TRUE); } else { // unselect-all case dbgLog.fine("unselect all case"); if (bvcnt == 0) { // no recoded var case dbgLog.fine("un-select-all case: no recoding vars"); // backing Map object varCart.clear(); // LHS listbox varSetAdvStat.clear(); // RHS listboxes advStatVarRBox1.clear(); advStatVarRBox2.clear(); advStatVarRBox3.clear(); // RHS simulation option: unchecked simulationPanel.setSelected(false); // simulation-type radio button group radioSimTypeChoice.setValue("0"); //groupPanel20.setRendered(false); groupPanelSimTypeChoice.setRendered(false); //groupPanel22.setRendered(false); groupPanelSimNonDefault.setRendered(false); // deactivate buttons deactivateButtons(); // clear the recodeTable area clearRecodeTargetVarInfo(); // hide recode Area hideRecodeTableArea(); } else { // at least one recoded variable exists dbgLog.fine("un-select-all case: "+ "some variables are used for recoding and they are kept"); // clear varCart(Map) except for base vars for recoding for (String v : rmIdSet) { dbgLog.fine("to be removed="+v); varCart.remove(v); } dbgLog.fine("pass the block for varCart"); // clear varSetAdvStat except for base vars for recoding // LHS listbox object (Collection ArrayList<Option>) List<SelectItem> tmpvs = new ArrayList<SelectItem>(); for (Iterator i = varSetAdvStat.iterator(); i.hasNext();) { SelectItem el = (SelectItem) i.next(); if (bvIdSet.contains((String) el.getValue())) { tmpvs.add(new SelectItem(el.getValue(), el.getLabel())); } else if (isRecodedVar((String) el.getValue())){ dbgLog.fine("recoded varId to be re-attached="+ el.getValue()); tmpvs.add(new SelectItem(el.getValue(), el.getLabel())); } } dbgLog.fine("To-be-re-attached selectItem set:tmpvs(size)=" + tmpvs.size()); for (SelectItem tmpvsi : tmpvs){ dbgLog.fine("value="+tmpvsi.getValue()+" label="+tmpvsi.getLabel()); } varSetAdvStat.clear(); varSetAdvStat.addAll(tmpvs); dbgLog.fine("pass the block for varSetAdvState"); // RHS listbox1 List<SelectItem> tmpRBox1 = new ArrayList<SelectItem>(); for (Iterator i = advStatVarRBox1.iterator(); i.hasNext();) { SelectItem el = (SelectItem) i.next(); if (!bvIdSet.contains((String) el.getValue())) { tmpRBox1.add(new SelectItem(el.getValue(), el.getLabel())); } } advStatVarRBox1.clear(); advStatVarRBox1.addAll(tmpRBox1); dbgLog.fine("pass the block for advStatVarRBox1"); // RHS listbox2 List<SelectItem> tmpRBox2 = new ArrayList<SelectItem>(); for (Iterator i = advStatVarRBox2.iterator(); i.hasNext();) { SelectItem el = (SelectItem) i.next(); if (bvIdSet.contains((String) el.getValue())) { tmpRBox2.add(new SelectItem(el.getValue(), el.getLabel())); } } advStatVarRBox2.clear(); advStatVarRBox2.addAll(tmpRBox2); // RHS listbox3 List<SelectItem> tmpRBox3 = new ArrayList<SelectItem>(); for (Iterator i = advStatVarRBox3.iterator(); i.hasNext();) { SelectItem el = (SelectItem) i.next(); if (bvIdSet.contains((String) el.getValue())) { tmpRBox3.add(new SelectItem(el.getValue(), el.getLabel())); } } advStatVarRBox3.clear(); advStatVarRBox3.addAll(tmpRBox3); msgVariableSelection.setVisible(true); msgVariableSelection.setValue( "At least one variable is used for recoding;<br />"+ "Remove its recoded variable(s) first."); } } cntxt.renderResponse(); dbgLog.fine("***** selectUnselectAllCheckbox: end *****"); } // ----------------------------------------------------------------------- // variable-table: Checkboxes in the first column // ----------------------------------------------------------------------- /** * h:HtmlSelectBooleanCheckbox component backing the binding attribute of * a HtmlSelectBooleanCheckbox in the first column of the variable table in * the subsetting page and whose id is varCheckbox */ private HtmlSelectBooleanCheckbox varCheckbox = new com.icesoft.faces.component.ext.HtmlSelectBooleanCheckbox(); /** * Getter for component varCheckbox * * @return HtmlSelectBooleanCheckbox object */ public HtmlSelectBooleanCheckbox getVarCheckbox() { return varCheckbox; } /** * Setter for component varCheckbox * * @param c HtmlSelectBooleanCheckbox object */ public void setVarCheckbox(HtmlSelectBooleanCheckbox c) { this.varCheckbox = c; } /** * Updates backing objects and components after * an end-user checked/unchecked a checkbox in each of the variable table. * Attached to the valueChangeListener attribute of HtmlSelectBooleanCheckbox * component whose id is varCheckbox * * @param vce ValueChangeEvent event */ public void updateCheckBoxState(ValueChangeEvent vce) { dbgLog.fine("***** updateCheckBoxState:starts here *****"); int cr = 0; List<Object> tmpDataLine = (List<Object>) data.getRowData(); dbgLog.fine("current varName=" + tmpDataLine.get(3)); dbgLog.fine("current varId=" + tmpDataLine.get(2)); String varId = (String) tmpDataLine.get(2); resetMsgVariableSelection(); // remove vars from RHS boxes resetMsgDwnldButton(); resetMsgMoveRecodeVarBttn(); resetMsgSaveRecodeBttn(); resetMsgEdaButton(); resetMsg4MoveVar(); resetMsgAdvStatButton(); resetMsgVariableSelection(); if ((Boolean) tmpDataLine.get(0)) { dbgLog.fine("row Id=" + tmpDataLine.get(2) + ":current checkbox value is [true]"); } else { dbgLog.fine("row Id=" + tmpDataLine.get(2) + ":current checkbox value is [false]"); } Boolean currentState = (Boolean) vce.getNewValue(); dbgLog.fine("currentState="+currentState); dbgLog.fine("selected="+ varCheckbox.isSelected()); // update the state of the selected value of this row if (currentState) { tmpDataLine.set(0, currentState); // put // varCart.put(dt4Display.get(cr).getVarId(), // dt4Display.get(cr).getVarName()); // ID and Variable Name // varCart.put(Long.valueOf((String) tmpDataLine.get(2)), (String) // tmpDataLine.get(3)); varCart.put((String) tmpDataLine.get(2), (String) tmpDataLine .get(3)); getVarSetAdvStat().add( new SelectItem((String) tmpDataLine.get(2), (String) tmpDataLine .get(3))); dbgLog.fine("selected(case 1)="+ varCheckbox.isSelected()); } else { // remove // varCart.remove(Long.valueOf((String) tmpDataLine.get(2))); // check this var is used for recoded var if (baseVarToDerivedVar.containsKey(varId)) { // Case: Used for recoding dbgLog.fine("this var is already used for recoding and cannot be unchekced"); // flips back the checkbox [checked] tmpDataLine.set(0, Boolean.TRUE); dbgLog.fine("flip the boolean value"); // shows the error message msgVariableSelection.setVisible(true); dbgLog.fine("selected(case 2)="+ varCheckbox.isSelected()); varCheckbox.setValue(Boolean.TRUE); dbgLog.fine("selected(case 2)="+ varCheckbox.isSelected()); msgVariableSelection.setValue( "The variable (" + tmpDataLine.get(3)+ ") is used for recoding;<br />"+ "Check "+tmpDataLine.get(3)+" again <br />"+ "and remove its recoded variable(s) first."); //FacesContext.getCurrentInstance().renderResponse(); } else { tmpDataLine.set(0, currentState); // Case: Not used for recoding // Removes this variable varCart.remove(varId); // Removes this variable from a variable box if (removeOption((String) tmpDataLine.get(2), getVarSetAdvStat()) == null) { // Rbox1 if (removeOption((String) tmpDataLine.get(2), getAdvStatVarRBox1()) == null) { // Rbox2 if (removeOption((String) tmpDataLine.get(2), getAdvStatVarRBox2()) == null) { // Rbox3 if (removeOption((String) tmpDataLine.get(2), getAdvStatVarRBox3()) == null) { dbgLog.fine("Unchecked var is not found in these boxes"); } } } } // clear uncommitted recoding data clearRecodeTableBlock(); dbgLog.fine("recoded var is=" + getCurrentRecodeVariableId()); dbgLog.fine("checkboxSelectUnselectAll(b)="+ checkboxSelectUnselectAll.isSelected()); if (checkboxSelectUnselectAll.isSelected()){ checkboxSelectUnselectAll.setSelected(false); checkboxSelectUnselectAllSelected=false; //FacesContext.getCurrentInstance().renderResponse(); dbgLog.fine("checkboxSelectUnselectAll(a)="+ checkboxSelectUnselectAll.isSelected()); } } } // hide the download button and // show the create button dwnldButton.setRendered(true); dwnloadSubsetButton.setRendered(false); // Checkes the number of the currently selected variables and // if positive, enable command buttons; disable them otherwise if (!varCart.isEmpty()) { // enable buttons activateButtons(); } else { // disable buttons deactivateButtons(); // reset recode field } dbgLog.fine("***** updateCheckBoxState:ends here *****"); } /** * ice:outputText component that is under the subsetting instruction * to show an error message when a base-variable for a recoded variable * is unchecked. Exposed to the subsetting page and * the component id is the same as this property */ private com.icesoft.faces.component.ext.HtmlOutputText msgVariableSelection = new com.icesoft.faces.component.ext.HtmlOutputText(); /** * Getter for property msgVariableSelection * * @return an unchecked-error message */ public com.icesoft.faces.component.ext.HtmlOutputText getMsgVariableSelection() { return msgVariableSelection; } /** * Setter for property msgVariableSelection * * @param txt an uncheck-error message to be displayed */ public void setMsgVariableSelection(com.icesoft.faces.component.ext.HtmlOutputText txt) { this.msgVariableSelection = txt; } /** * Rests message components that display a wrong-variable-selection * error messages */ public void resetMsgVariableSelection() { dbgLog.fine("***** resetMsgVariableSelection: start *****"); msgVariableSelection.setVisible(false); msgVariableSelection.setValue(" "); dbgLog.fine("***** resetMsgVariableSelection: end *****"); } /** * Enables command buttons in the subsetting page after * at least one variable selected by an end-user */ public void activateButtons() { dwnldButton.setDisabled(false); recodeButton.setDisabled(false); moveRecodeVarBttn.setDisabled(false); edaButton.setDisabled(false); advStatButton.setDisabled(false); } /** * Disables command buttons in the subsetting page until * at least one variable is selected by an end-user */ public void deactivateButtons() { dwnldButton.setDisabled(true); recodeButton.setDisabled(true); moveRecodeVarBttn.setDisabled(true); edaButton.setDisabled(true); advStatButton.setDisabled(true); } // ----------------------------------------------------------------------- // Summary Statistics // ----------------------------------------------------------------------- /** * A Collection of summary statistics of each variable in the * requested data file. Used in the recoding-GUI rendering process */ private Collection<SummaryStatistic> summaryStatistics; /** * Getter for property summaryStatistics * * @return a Collection of summaryStatistic objects */ public Collection<SummaryStatistic> getSummaryStatistics() { return this.summaryStatistics; } /** * Setter for property summaryStatistics * * @param summaryStatistics a Collection of summaryStatistic objects */ public void setSummaryStatistics( Collection<SummaryStatistic> summaryStatistics) { this.summaryStatistics = summaryStatistics; } /** * A Collection of category data of each variable in the * requested data file. Used in the recoding-GUI rendering proces */ private Collection<VariableCategory> categories; /** * Getter for property categories * * @return a Collection of VariableCategory objects */ public Collection<VariableCategory> getCategories() { return this.categories; } /** * Setter for property categories * * @param categories A Collection of VariableCategory objects */ public void setCategories(Collection<VariableCategory> categories) { this.categories = categories; } // ----------------------------------------------------------------------- // data for the Variable Table // ----------------------------------------------------------------------- /** * ArrayList object that stores major metadata of all variables in * the requested data file and backs the value attribute of * h:dataTable (id = dataTable1) in the variable table of the jsp page. */ private List<Object> dt4Display = new ArrayList<Object>(); /** * Getter for property dt4Display * * @return a List object of major metadata of all varibles */ public List<Object> getDt4Display() { return (dt4Display); } /** * Setter for property dt4Display * * @param dt a List object of major metadata of all variables */ public void setDt4Display(List<Object> dt) { dt4Display = dt; } /** * Adds major metadata of all variables in the requested data file into * dt4Display. The six cells of each row are as follows: * * boolean: checkbox state, * String: variable type, * Long: variable Id, * String: variable name, * String: variable label, * String: blank cell for summary statistics * * @see #dt4Display */ private void initDt4Display() { int counter = 0; int dbglns = 25; for (Iterator el = dataVariables.iterator(); el.hasNext();) { DataVariable dv = (DataVariable) el.next(); counter++; if (counter <= dbglns) { dbgLog.fine("dtId=" + dtId + " : within initDt4Display: row no=" + counter); } List<Object> rw = new ArrayList<Object>(); // 0-th: boolean (checked/unchecked) rw.add(new Boolean(false)); // 1st: variable type if (dv.getVariableFormatType().getName().equals("numeric")) { if (dv.getVariableIntervalType() == null) { rw.add("Continuous"); } else { if (dv.getVariableIntervalType().getId().intValue() == 2) { rw.add("Continuous"); } else { rw.add("Discrete"); } } } else { // Special labels for character variables that represent dates // and times: String formatCategory = dv.getFormatCategory(); if (formatCategory != null) { if (dv.getFormatCategory().toLowerCase().equals("date")) { rw.add("Character (Date Value)"); } else if (dv.getFormatCategory().toLowerCase().equals("time")) { rw.add("Character (Time Value)"); } else { rw.add("Character"); } } else { rw.add("Character"); } } // 2nd: ID rw.add(dv.getId().toString()); // 3rd: Variable Name rw.add(dv.getName()); // 4th: Variable Label if (dv.getLabel() != null) { rw.add(dv.getLabel()); } else { rw.add("[label missing]"); } // 5th: summary statistics(blank) // the content is generated by an AJAX call upon request rw.add(""); /* // 6th: fileorder number rw.add(dv.getFileOrder()); */ // add a row dt4Display.add(rw); } } // <---------------------------------------------------------------------- // </editor-fold> // ----------------------------------------------------------------------- // Constructor and Init method // ----------------------------------------------------------------------- // <editor-fold desc="Constructor and Init method"> // defaultstate="collapsed" /** * The default constructor * */ public AnalysisPage() { } /** * Returns a reference to the application-scoped bean * * @return a bean that stores zelig-model-related information */ public AnalysisApplicationBean getAnalysisApplicationBean() { return (AnalysisApplicationBean) getBean("AnalysisApplicationBean"); } /** * Prepares the state-keeping html components * and their backing java objects for rendering SubsettingPage.xhtml * */ public void init() { dbgLog.fine("\n***** init():start "+ "(edu.harvard.iq.dvn.core.web.subsetting.AnalysisPage) *****"); super.init(); try { // sets default values to html components _init(); dbgLog.fine("pass _init() in init()"); // gets the FacesContext instance FacesContext cntxt = FacesContext.getCurrentInstance(); // gets the ExternalContext ExternalContext exCntxt = FacesContext.getCurrentInstance().getExternalContext(); // gets session data from the ExternalContext Map<String, Object> sessionMap = exCntxt.getSessionMap(); dbgLog.finer("\ncontents of RequestParameterMap:\n" + exCntxt.getRequestParameterMap()); dbgLog.finer("\ncontents of SessionMap:\n" +sessionMap); // gets the request header data Map<String, String> rqustHdrMp = exCntxt.getRequestHeaderMap(); dbgLog.fine("\nRequest Header Values Map:\n" + rqustHdrMp); dbgLog.fine("\nRequest Header Values Map(user-agent):" + rqustHdrMp.get("user-agent")); // gets an end-user's browser type if (isBrowserFirefox(rqustHdrMp.get("user-agent"))) { dbgLog.fine("user's browser is firefox"); browserType = "Firefox"; } else { browserType = "notFirefox"; } // gets the current view state value (for post-back-checking) String currentViewStateValue = exCntxt.getRequestParameterMap() .get(ResponseStateManager.VIEW_STATE_PARAM); dbgLog.fine("ViewState value=" + currentViewStateValue); dbgLog.fine("VDCRequestBean: current VDC URL =" + getVDCRequestBean().getCurrentVDCURL()); // Stores the URL of the requested study setStudyURL(getVDCRequestBean().getCurrentVDCURL()); dbgLog.fine("VDCRequestBean: studyId =" + getVDCRequestBean().getStudyId()); dbgLog.fine("VDCRequestBean =" + getVDCRequestBean()); // dbgLog.fine("selected tab(init())="+getTabSet1().getSelected()); // set tab if it was it was sent as pamameter or part of request bean // if (getTab() != null) { // getTabSet1().setSelected(getTab()); // dbgLog.fine("getTab()= "+getTab()); // } else if (getVDCRequestBean().getSelectedTab() != null) { // dbgLog.fine("tab from the requestBean="+getVDCRequestBean().getSelectedTab()); // // getTabSet1().setSelected(getVDCRequestBean().getSelectedTab()); // } /* // Deletes session-scoped objects if this page is rendered // for the first time, i.e. not post-back */ if (currentViewStateValue == null || getVDCRequestBean().getDtId() != null) { // The first time visit to the SubsettingPage.xhtml List<String> sessionObjects = new ArrayList<String>(); Collections.addAll(sessionObjects, "dt4Display", "varCart", "varSetAdvStat", "groupPanel8belowRendered", "advStatVarRBox1", "advStatVarRBox2", "advStatVarRBox3", "setxDiffVarBox1", "setxDiffVarBox2", "checkboxSelectUnselectAllSelected", "checkboxSelectUnselectAllRendered", "currentModelName", "currentRecodeVariableId","currentRecodeVariableName", "recodedVarSet","recodeSchema", "baseVarToDerivedVar", "derivedVarToBaseVar", "recodeVarNameSet", "selectedNoRows", "msgEdaButtonTxt", "msgDwnldButtonTxt", "msgAdvStatButtonTxt","gridPanelModelInfoBox", "resultInfo", "wrapSubsettingInstructionRendered", "wrapNonSubsettingInstructionRendered", "modelHelpLinkURL" ); for (String obj : sessionObjects) { if (sessionMap.containsKey(obj)) { cntxt.getExternalContext().getSessionMap().remove(obj); } } dbgLog.fine("left-over objects of the previous session" +" have been removed"); } // Gets the datatable Id if we're coming from editVariabePage if (dtId == null) { dtId = getVDCRequestBean().getDtId(); dbgLog.fine("dtId(null case: came from editVariablePage)=" +dtId); } // we need to create the VariableServiceBean if (dtId == null) { // dtId is not available case dbgLog.severe("ERROR: AnalysisPage.java: without dtId supplied"); throw new FacesException("AnalysisPage called without DataTable id"); } dbgLog.fine("Init() enters non-null-dtId case: dtId=" + dtId); // Gets the requested data table by its Id dataTable = variableService.getDataTable(dtId); if (versionNumber == null) { versionNumber = getVDCRequestBean().getStudyVersionNumber(); } // Exposes the data file name to SubsettingPage.xhtml setFileName(dataTable.getStudyFile().getFileName(versionNumber)); // (if versionNumber is still null at this point, getFileName() // will default to the latest version of the file metadata -- L.A. dbgLog.fine("file Name=" + fileName); // Retrieves each var's data from the data table // and saves them in Collection<DataVariable> dataVariables dataVariables.addAll(dataTable.getDataVariables()); dbgLog.fine("pass the addAll line"); // Gets VDCUser-related data VDCUser user = null; if (getVDCSessionBean().getLoginBean() != null) { user = getVDCSessionBean().getLoginBean().getUser(); } VDC vdc = getVDCRequestBean().getCurrentVDC(); dbgLog.fine("VDCUser instnce=" + user); dbgLog.fine("VDC instnce=" + vdc); // Gets the StudyFile object via the dataTable object. // This StudyFile determines whether // Subsetting functionalities are rendered or not // in SubsettingPage.xhtml dbgLog.fine("checking this end-user's permission status"); StudyFile sf = dataTable.getStudyFile(); HttpServletRequest request = (HttpServletRequest)this.getExternalContext().getRequest(); if (sf.isSubsetRestrictedForUser(user, getVDCSessionBean().getIpUserGroup())){ dbgLog.fine("restricted=yes: this user "+ "does not have the subsetting permission"); subsettingPageAccess = Boolean.FALSE; txtNonSubsettingInstruction.setRendered(true); wrapNonSubsettingInstructionRendered=Boolean.TRUE; wrapSubsettingInstructionRendered=Boolean.FALSE; hideSubsettingFunctions(); } else { // Sets the state of the Subsetting Page to subsettable subsettingPageAccess = Boolean.TRUE; // sets the default rendering state of the checkbox // checkboxSelectUnselectAll shown (TRUE) checkboxSelectUnselectAllRendered=Boolean.TRUE; checkboxSelectUnselectAllSelected=Boolean.FALSE; wrapNonSubsettingInstructionRendered=Boolean.FALSE; wrapSubsettingInstructionRendered=Boolean.TRUE; dbgLog.fine("restricted=no: " + "this user has the subsetting permission"); } dbgLog.fine("Number of vars in this data table(" + dtId + ")=" + dataTable.getVarQuantity()); // Sets data for the variable table in the subsetting page. // Variable data are stored in List<Object> dt4Display if (!sessionMap.containsKey("dt4Display")) { // dt4Display does not exist => // the page was rendered for the first time // not a post-back case dbgLog.fine("This is the 1st-time visit to this page:"+ "(dt4Display does not exist in the session map)"); // Fills List<Object> dt4Display with data // and newly creaded data initDt4Display(); dbgLog.fine("how many variables in dt4Display=" + getDt4Display().size()); // Adds state-keeping objects to the session Map // // List<Object>: The data for the variable table sessionMap.put("dt4Display", dt4Display); // Map<String, String>: The currently selected variables sessionMap.put("varCart", varCart); // List<SelectItem> varSetAdvStat: user-selected // variables behind the LHS variable list box sessionMap.put("varSetAdvStat", varSetAdvStat); dbgLog.fine("varSetAdvStat:\n"+varSetAdvStat); // PanelGroup component that shows/hides the pane for // the advanced statistics. // The rendered attribute of this PanelGroup object // must be state-kept // deprecated: serialization-unsafe approach // sessionMap.put("groupPanel8below", groupPanel8below); // Hides the pane groupPanel8belowRendered=Boolean.FALSE; sessionMap.put("groupPanel8belowRendered", groupPanel8belowRendered); // h:panelGrid component that contains the model help // information box in the advanced statistics pane. // The rendered attribute of this HtmlPanelGrid object // must be state-kept // deprecated: // sessionMap.put("gridPanelModelInfoBox", // gridPanelModelInfoBox); /**/ // Hides the pane gridPanelModelInfoBoxRendered = Boolean.FALSE; sessionMap.put("gridPanelModelInfoBoxRendered", gridPanelModelInfoBoxRendered); // to do // accessors: get/set // JSP rendered="#{AnalysisPage.gridPanelModelInfoBoxRendered}" // List<SelectItem> advStatVarRBox1 sessionMap.put("advStatVarRBox1", advStatVarRBox1); sessionMap.put("advStatVarRBox2", advStatVarRBox2); sessionMap.put("advStatVarRBox3", advStatVarRBox3); // sessionMap.put("lastSimCndtnSelected", "0"); // ice:selectBooleanCheckbox // // Saves the selected attribute sessionMap.put("checkboxSelectUnselectAllSelected", checkboxSelectUnselectAllSelected); // Saves the rendered attribute sessionMap.put("checkboxSelectUnselectAllRendered", checkboxSelectUnselectAllRendered); sessionMap.put("wrapSubsettingInstructionRendered", wrapSubsettingInstructionRendered); sessionMap.put("wrapNonSubsettingInstructionRendered", wrapNonSubsettingInstructionRendered); // String selectedNoRows selectedNoRows = Integer.toString(INITIAL_ROW_NO); //howManyRowsOptions.setSelectedValue(selectedNoRows); howManyRows.setValue(selectedNoRows); sessionMap.put("selectedNoRows", selectedNoRows); dbgLog.fine("selectedNoRows=" + selectedNoRows); dbgLog.fine("1st time visit: "+ "selected value for howManyRows=" + howManyRows.getValue()); currentTabIndex = 0; } else { // Postback cases (not 1st-time visit to this page) // Applies the stored data to the key page-scoped objects dbgLog.fine("Postback(non-1st-time) case: "+ "dt4Display was found in the session map=>"); // Gets the stored object backing the value attribute // of h:dataTable for the variable table setDt4Display((List<Object>) cntxt.getExternalContext() .getSessionMap().get("dt4Display")); // Gets the stored object that records // the currently selected variables varCart = (Map<String, String>) sessionMap.get("varCart"); dbgLog.fine("varCart:\n"+varCart); // Gets the stored object backing the items attribute of // ice:selectManyListbox for the LHS list-box component, which is // located in each tab varSetAdvStat = (List<SelectItem>) sessionMap .get("varSetAdvStat"); dbgLog.fine("varSetAdvStat:\n"+varSetAdvStat); // Gets the stored object backing the items attribute of // ice:selectManyListbox for the 1st RHS variable box // located in the advanced statistics tab advStatVarRBox1 = (List<SelectItem>) sessionMap .get("advStatVarRBox1"); // ditto (2nd) advStatVarRBox2 = (List<SelectItem>) sessionMap .get("advStatVarRBox2"); // ditto (3rd) advStatVarRBox3 = (List<SelectItem>) sessionMap .get("advStatVarRBox3"); dbgLog.fine("advStatVarRBox1:\n"+advStatVarRBox1); dbgLog.fine("advStatVarRBox2:\n"+advStatVarRBox2); dbgLog.fine("advStatVarRBox3:\n"+advStatVarRBox3); // radioButtonGroup1DefaultOptions.setSelectedValue( (String)sessionMap.get("lastSimCndtnSelected")); // dbgLog.fine("lastSimCndtnSelected= "+ sessionMap.get("lastSimCndtnSelected")); // Gets the stored object backing the items attribute // of ice:selectOneMenu for the 1st setx variable selector setxDiffVarBox1 = (List<SelectItem>) sessionMap .get("setxDiffVarBox1"); // ditto (2nd) setxDiffVarBox2 = (List<SelectItem>) sessionMap .get("setxDiffVarBox2"); // String object backing the currently selected model name currentModelName = (String) sessionMap .get("currentModelName"); dbgLog.fine("\nSelected model name(after post-back)=" + currentModelName+"\n"); // new approach // Updates the following two attributes at least // class method tag attr // setSelected selectedValue // setRendered rendered // Gets the selected attribute checkboxSelectUnselectAllSelected = (Boolean) sessionMap .get("checkboxSelectUnselectAllSelected"); checkboxSelectUnselectAll.setSelected( checkboxSelectUnselectAllSelected); // Gets the rendered attribute checkboxSelectUnselectAllRendered = (Boolean) sessionMap .get("checkboxSelectUnselectAllRendered"); checkboxSelectUnselectAll.setRendered( checkboxSelectUnselectAllRendered); wrapSubsettingInstructionRendered = (Boolean) sessionMap .get("wrapSubsettingInstructionRendered"); wrapNonSubsettingInstructionRendered = (Boolean) sessionMap .get("wrapNonSubsettingInstructionRendered"); // Gets the stored object backing the selected attribute // of ice:selectOneMenu for the menu of choosing // an option of how many row per table selectedNoRows = (String)sessionMap.get("selectedNoRows"); dbgLog.fine("post-back case: "+ "returned the selected value for howManyRows=" + selectedNoRows); howManyRows.setValue(selectedNoRows); dbgLog.fine("post-back case:"+ " selected value for howManyRows=" + howManyRows.getValue()); if (currentRecodeVariableId == null) { dbgLog.fine("currentRecodeVariableId is null"); } else { dbgLog.fine("currentRecodeVariableId=" + currentRecodeVariableId); } dbgLog.fine("currentRecodeVariableId: "+ "received value from sessionMap=" + (String) sessionMap .get("currentRecodeVariableId")); currentRecodeVariableId = (String) sessionMap .get("currentRecodeVariableId"); dbgLog.fine("new currentRecodeVariableId=" + currentRecodeVariableId); // Gets the stored object backing the rendered attribute // of PaneGroup for groupPanel8below groupPanel8belowRendered =(Boolean) sessionMap.get("groupPanel8belowRendered"); dbgLog.fine("groupPanel8belowRendered(map)="+ sessionMap.get("groupPanel8belowRendered")); dbgLog.fine("groupPanel8belowRendered(result)="+ groupPanel8belowRendered); // deprecated approach // Gets the stored object backing the binding attribute of // PanelGroup for groupPanel8below // cntxt.getExternalContext().getSessionMap() // .get("groupPanel8below")); // Gets the stored object backing the value attribute of // h:outputText (id=recodeHdrVariable) for the currently // selected recode variable name that is used in the // column header of the recode variable editing table if (!sessionMap.containsKey("currentRecodeVariableName")) { sessionMap.put("currentRecodeVariableName", currentRecodeVariableName); } else { currentRecodeVariableName = (String) sessionMap .get("currentRecodeVariableName"); } dbgLog.fine("new currentRecodeVariableName=" + currentRecodeVariableName); // deprecated (component-binding is used now) // Gets the stored object backing the value attribute // of h:inputText for the label of the recode variable // (id= recodeTargetVarLabel) /* if (!sessionMap.containsKey("recodeVariableLabel")) { sessionMap.put("recodeVariableLabel", recodeVariableLabel); } else { recodeVariableLabel = (String) sessionMap .get("recodeVariableLabel"); } */ // Gets the stored object backing the value attribute of // h:dataTable for the recoding table // whose id is "recodeTable" if (!sessionMap.containsKey("recodeDataList")) { sessionMap.put("recodeDataList", recodeDataList); } else { recodeDataList = (List<Object>) sessionMap .get("recodeDataList"); } // Gets the stored object for recodeSchema that // stores each recode variable's recodeDataList // as a hash table. Not exposed to SubsettingPage.xhtml if (!sessionMap.containsKey("recodeSchema")) { sessionMap.put("recodeSchema", recodeSchema); } else { recodeSchema = (Map<String, List<Object>>) sessionMap .get("recodeSchema"); } // Gets the stored object for the value attribute // of h:dataTable for the table of recode variables // whose id is "recodedVarTable" if (!sessionMap.containsKey("recodedVarSet")) { sessionMap.put("recodedVarSet",recodedVarSet); } else { recodedVarSet = (List<Object>) sessionMap .get("recodedVarSet"); } // Gets the stored object for derivedVarToBaseVar // that maps a new variable to its base one. // No exposed to SubsettingPage.xhtml if (!sessionMap.containsKey("derivedVarToBaseVar")) { sessionMap.put("derivedVarToBaseVar", derivedVarToBaseVar); } else { derivedVarToBaseVar = (Map<String, String>) sessionMap .get("derivedVarToBaseVar"); } // Gets the stored object for baseVarToDerivedVar // that maps a base variable to its derived variables. // Not exposed to SubsettingPage.xhtml if (!sessionMap.containsKey("baseVarToDerivedVar")) { sessionMap.put("baseVarToDerivedVar", baseVarToDerivedVar); } else { baseVarToDerivedVar = (Map<String, Set<String>>) sessionMap.get("baseVarToDerivedVar"); } // Gets the stored object for recodeVarNameSet that // checks the uniqueness of a name // for a new recode-variable. // Not exposed to SubsettingPage.xhtml if (!sessionMap.containsKey("recodeVarNameSet")) { sessionMap.put("recodeVarNameSet", recodeVarNameSet); } else { recodeVarNameSet = (Set<String>) sessionMap .get("recodeVarNameSet"); } resetMsgMoveRecodeVarBttn(); // Resets the properties (rendered and text) of // msgSaveRecodeBttn (ice:outputText) that shows // error messages for the action of SaveRecodeBttn resetMsgSaveRecodeBttn(); // Rests the properties (rendered and text) of // msgVariableSelection (ice:outputText) that shows // error message when the base varaible for // a recoded variable is un-selected in the variable table resetMsgVariableSelection(); // Gets the stored object backing msgDwnldButtonTxt that // shows error messages for the action of dwnldButton if (!sessionMap.containsKey("msgDwnldButtonTxt")) { sessionMap.put("msgDwnldButtonTxt", msgDwnldButtonTxt); } else { msgDwnldButtonTxt = (String) sessionMap .get("msgDwnldButtonTxt"); } // Hides the error message text for dwnldButton msgDwnldButton.setVisible(false); // Gets the stored object backing msgEdaButtonTxt that // shows error messages for the action of edaButton if (!sessionMap.containsKey("msgEdaButtonTxt")) { sessionMap.put("msgEdaButtonTxt", msgEdaButtonTxt); } else { msgEdaButtonTxt = (String) sessionMap .get("msgEdaButtonTxt"); } // Hides the error message text for edaButton msgEdaButton.setVisible(false); // Gets the stored object backing msgAdvStatButtonTxt that // shows error messages for the action of edaButton if (!sessionMap.containsKey("msgAdvStatButtonTxt")) { sessionMap.put("msgAdvStatButtonTxt", msgAdvStatButtonTxt); } else { msgAdvStatButtonTxt = (String) sessionMap .get("msgAdvStatButtonTxt"); } // Hides the error message text for edaButton msgAdvStatButton.setVisible(false); // if (sessionMap.containsKey("modelHelpLinkURL")) { // dbgLog.fine("modelHelpLinkURL="+sessionMap.get("modelHelpLinkURL")); // modelHelpLinkURL= (String) sessionMap.get("modelHelpLinkURL"); // } // end of post-back cases } //} /* if (versionNumber == null) { thisStudyVersion = thisStudy.getReleasedVersion(); } else { thisStudyVersion = thisStudy.getStudyVersionByNumber(versionNumber); } if (thisStudyVersion == null) { dbgLog.severe("ERROR: Could not find a valid Version of this study"); throw new FacesException("Could not find a valid Version of this study"); } */ Study thisStudy = dataTable.getStudyFile().getStudy(); if (versionNumber==null) { studyUI = new StudyUI(thisStudy); } else { StudyVersion thisStudyVersion = thisStudy.getStudyVersionByNumber(versionNumber); if (thisStudyVersion == null) { dbgLog.severe("ERROR: Could not find a valid Version of this study"); throw new FacesException("Could not find a valid Version of this study, studyId = " +thisStudy.getId()+" versionNumber= "+versionNumber); } studyUI = new StudyUI(thisStudyVersion,user); } dbgLog.finer("\nSpec Map:\n"+ getAnalysisApplicationBean().getSpecMap()); dbgLog.finer("\nMenu Option List:\n"+ getAnalysisApplicationBean().getModelMenuOptions()); dbgLog.finer("\ncontents of the cart:\n" + varCart); } catch (Exception e) { dbgLog.severe("AnalysisPage Initialization Failure"); e.printStackTrace(); throw e instanceof FacesException ? (FacesException) e : new FacesException(e); } // end of try-catch block // dbgLog.fine("init(): current tab id=" + tabSet1.getSelected()); this.setDvnVersionNumber(versionPageClass.getVersionNumber()); dbgLog.fine("***** init():end *****\n\n"); } // end of doInit() ------------------------------------------------------- public void preprocess() { } public void prerender() { } public void destroy() { } // </editor-fold> // ----------------------------------------------------------------------- // Access control methods // ----------------------------------------------------------------------- public String gotoEditVariableAction() { String dvFilter = ""; for (SelectItem item : getVarSetAdvStat()) { dvFilter += (String) item.getValue() + ","; } getVDCRequestBean().setDtId(dtId); getVDCRequestBean().setDvFilter(dvFilter); return "/study/ditVariablePage?faces-redirect=true"; //"editVariable"; } public boolean isEditVariableActionRendered() { boolean render = false; if (getVDCSessionBean().getLoginBean() != null) { Study study = dataTable.getStudyFile().getStudy(); boolean authorized = study .isUserAuthorizedToEdit(getVDCSessionBean().getLoginBean() .getUser()); boolean locked = study.getStudyLock() != null; render = authorized && !locked; } return render; } // hide subsetting functions according to the user's status /** * Hides the subsetting related components when an end-user does not * have permission to subset a data file * */ public void hideSubsettingFunctions() { // Sets the rendered attribute of the following components as follows: // 1. Hides tabSet above the variable table tabSet1.setRendered(false); // 2. Hides the subsetting intruction text //txtSubsettingInstruction.setRendered(false); // 3. Shows the non-Subsetting intruction text //txtNonSubsettingInstruction.setRendered(true); // 4. Hides the select-all checkbox in the header(1st column) of // the variable table checkboxSelectUnselectAll.setRendered(false); // Stores this hide state in a Boolean object checkboxSelectUnselectAllRendered=Boolean.FALSE; // 5. Hides the variable-checkboxes in the 1st column of // the variable table varCheckbox.setRendered(false); // 6. Hides the title of the recoded-var table recodedVarTableTitle.setRendered(false); // 7. Hides the panel grid that contains the recoded-variable table //pgRecodedVarTable.setRendered(false); groupPanelRecodeTableArea.setRendered(false); } // <---------------------------------------------------------------------- // service-request-related methods // <---------------------------------------------------------------------- // <editor-fold desc="service-request-related methods"> /** * Returns a List object that stores major metadata for all variables * selected by an end-user * * @return List of DataVariable objects that stores metadata */ public List<DataVariable> getDataVariableForRequest() { List<DataVariable> dvs = new ArrayList<DataVariable>(); for (Iterator el = dataVariables.iterator(); el.hasNext();) { DataVariable dv = (DataVariable) el.next(); // dv.; dv.getCategories(); // dv.getD // dv.get for (DataVariableMapping dvm : dv.getDataVariableMappings()) { } for (VariableCategory v : dv.getCategories()) { } String keyS = dv.getId().toString(); if (varCart.containsKey(keyS)) { dvs.add(dv); } } return dvs; } /** * Returns the name of a given variable whose id is known. * Because dt4Display is not a HashMap but a List, * loop-through is necessary * * @param varId the id of a given variable * @return the name of a given variable */ public String getVariableNamefromId(String varId) { for (int i = 0; i < dt4Display.size(); i++) { if (((String) ((ArrayList) dt4Display.get(i)).get(2)).equals(varId)) { return (String) ((ArrayList) dt4Display.get(i)).get(3); } } return null; } /** * Returns the label of a given variable whose id is known. * Because dt4Display is not a HashMap but a List, * loop-through is necessary * * @param varId the id of a given variable * @return the label of a given variable */ public String getVariableLabelfromId(String varId) { for (int i = 0; i < dt4Display.size(); i++) { if (((String) ((ArrayList) dt4Display.get(i)).get(2)).equals(varId)) { return (String) ((ArrayList) dt4Display.get(i)).get(4); } } return null; } /** * Returns the file-order of a given variable whose id is known. * Because dt4Display is not a HashMap but a List, * loop-through is necessary * * @param varId the id of a given variable * @return the file-order number of a given variable */ /* public String getVariableFileOderfromId(String varId) { for (int i = 0; i < dt4Display.size(); i++) { if (((String) ((ArrayList) dt4Display.get(i)).get(2)).equals(varId)) { return (String) ((ArrayList) dt4Display.get(i)).get(6); } } return null; } */ /** * Gets the row of metadata of a variable whose Id is given by a String * object * * @param varId a given variable's ID as a String object * @return a DataVariable instance that contains major metadata of the * requested variable */ public DataVariable getVariableById(String varId) { DataVariable dv = null; for (Iterator el = dataVariables.iterator(); el.hasNext();) { dv = (DataVariable) el.next(); // Id is Long if (dv.getId().toString().equals(varId)) { return dv; } } return dv; } /** * * * @param dvs * @return */ public List<String> generateVariableIdList(List<String> dvs) { List<String> variableIdList = new ArrayList<String>(); if (dvs != null) { for (String el : dvs){ variableIdList.add("v" + el); } } return variableIdList; } /** * * * @param * @return */ public List<String> getVariableListForRequest(){ List<String> variableList = new ArrayList(); if (getDataVariableForRequest() != null) { Iterator iter = getDataVariableForRequest().iterator(); while (iter.hasNext()) { DataVariable dv = (DataVariable) iter.next(); variableList.add(dv.getId().toString()); } } return variableList; } public List<String> getVariableIdListForRequest(){ List<String> ids = generateVariableIdList(getVariableListForRequest()); return ids; } public String getVariableIdsForRequest() { String variableIdString = ""; List<String> vi = new ArrayList<String>(); if (getDataVariableForRequest() != null) { Iterator iter = getDataVariableForRequest().iterator(); while (iter.hasNext()) { DataVariable dv = (DataVariable) iter.next(); vi.add(dv.getId().toString()); } variableIdString = StringUtils.join(vi, ","); } return variableIdString; } /** * * * @param * @return */ public List<String> getVariableOrderForRequest(){ List<String> variableOrder = new ArrayList(); if (getDataVariableForRequest() != null) { Iterator iter = getDataVariableForRequest().iterator(); while (iter.hasNext()) { DataVariable dv = (DataVariable) iter.next(); // the susbsetting parameter starts from 1 not 0, // add 1 to the number variableOrder.add( Integer.toString(dv.getFileOrder()+1) ); } } return variableOrder; } /** * * * @return A List of file-order numbers */ public List<Integer> getFileOrderForRequest() { List<DataVariable> dvs = new ArrayList<DataVariable>(); List<Integer> fileOrderForRequest = new ArrayList<Integer>(); for (Iterator el = dataVariables.iterator(); el.hasNext();) { DataVariable dv = (DataVariable) el.next(); String keyS = dv.getId().toString(); if (varCart.containsKey(keyS)) { fileOrderForRequest.add(dv.getFileOrder()); } } Collections.sort(fileOrderForRequest); return fileOrderForRequest; } /** * * * @return */ public Map<Long, List<List<Integer>>> getSubsettingMetaData(Long noRecords){ Map<Long, List<List<Integer>>> varMetaSet = new LinkedHashMap<Long, List<List<Integer>>>(); List<DataVariable> dvs = getDataVariableForRequest(); //populate the initial, empty varMetaSet: for (Long count = new Long((long)0); count < noRecords; count++){ List<List<Integer>> cardVarMetaSet = new LinkedList<List<Integer>>(); varMetaSet.put((count+1), cardVarMetaSet); } if (dvs != null) { for (int i = 0 ; i < dvs.size();i++ ){ DataVariable dv = dvs.get(i); List<Integer> varMeta = new ArrayList<Integer>(); varMeta.add( Integer.valueOf(dv.getFileStartPosition().toString()) ); varMeta.add( Integer.valueOf(dv.getFileEndPosition().toString()) ); // raw data: 1: numeric 2: character=> 0: numeric; 1 character varMeta.add( Integer.valueOf( (int)(dv.getVariableFormatType().getId()-1) ) ); if ( dv.getNumberOfDecimalPoints() == null ) { varMeta.add ( 0 ); } else if ( dv.getNumberOfDecimalPoints().toString().equals ("") ) { varMeta.add ( 0 ); } else { varMeta.add( Integer.valueOf(dv.getNumberOfDecimalPoints().toString()) ); } Long recordSegmentNumber = dv.getRecordSegmentNumber(); //if ( varMetaSet.get(recordSegmentNumber) == null ) { // List<List<Integer>> cardVarMetaSet = new LinkedList<List<Integer>>(); // varMetaSet.put(recordSegmentNumber, cardVarMetaSet); //} varMetaSet.get(recordSegmentNumber).add(varMeta); } } return varMetaSet; } public Map<String, String> getValueTableForRequestedVariable(DataVariable dv){ List<VariableCategory> varCat = new ArrayList<VariableCategory>(); varCat.addAll(dv.getCategories()); Map<String, String> vl = new HashMap<String, String>(); for (VariableCategory vc : varCat){ vl.put(vc.getValue(), vc.getLabel()); } return vl; } public Map<String, List<String>> getCategoryValueOrdersForAllRequestedVariables(){ List<DataVariable> dvs = getDataVariableForRequest(); Map<String, List<String>> catOrderMap = null; for (DataVariable dv : dvs) { List<VariableCategory> varCat = new ArrayList<VariableCategory>(); varCat.addAll(dv.getCategories()); List<String> orderedValuesList = new ArrayList<String>(varCat.size()); // Fill the orderedValuesList with NULLs to capacity: // (this way we can use .set on arbitrary index locations, before // the list gets fully populated). for (int i = 0; i < varCat.size(); i++) { orderedValuesList.add(null); } for (VariableCategory vc : varCat) { if (!vc.isMissing()) { dbgLog.info("adding category value \"" + vc.getValue() + "\" with the defined order " + vc.getOrder()); try { orderedValuesList.set(vc.getOrder(), vc.getValue()); } catch (IndexOutOfBoundsException ex) { dbgLog.warning("Could not populate the ordered category values map; \"out of bounds\" exception"); return null; } } } if (orderedValuesList.size() > 0) { // initialize the map, if this hasn't been done yet: if (dv.isOrderedCategorical()) { if (catOrderMap == null) { catOrderMap = new LinkedHashMap<String, List<String>>(); } catOrderMap.put("v" + dv.getId(), orderedValuesList); } } } return catOrderMap; } public Map<String, Map<String, String>> getValueTableForRequestedVariables(List<DataVariable> dvs){ Map<String, Map<String, String>> vls = new LinkedHashMap<String, Map<String, String>>(); for (DataVariable dv : dvs){ List<VariableCategory> varCat = new ArrayList<VariableCategory>(); varCat.addAll(dv.getCategories()); Map<String, String> vl = new HashMap<String, String>(); for (VariableCategory vc : varCat){ if (vc.getLabel() != null){ dbgLog.fine("adding label \"" + vc.getLabel() + "\" for variable v"+dv.getId()); vl.put(vc.getValue(), vc.getLabel()); } else { dbgLog.fine("no label for variable v"+dv.getId()); } } if (vl.size() > 0){ vls.put("v"+dv.getId(), vl); } } return vls; } public Map<String, Map<String, String>> getValueTablesOfRecodedVariables(){ Map<String, Map<String, String>> vls = new LinkedHashMap<String, Map<String, String>>(); List<String> varId = getRawRecodedVarIdSet(); for (int i=0; i< varId.size();i++){ Map<String, String> vl = new HashMap<String, String>(); // get the outer-list by Id List<Object> rdtbl = (List<Object>) recodeSchema.get(varId.get(i)); // loop through inner lists for (int j=0; j< rdtbl.size();j++){ List<Object> rw = (List<Object>)rdtbl.get(j); if (rw.get(2) !=null /* Experiment! -- L.A., v3.6 */ && !"".equals((String)rw.get(2))){ vl.put((String)rw.get(1), (String)rw.get(2)); } } if (vl.size() > 0){ vls.put("v"+varId.get(i),vl); } } return vls; } public Map<String, Map<String, String>> getValueTablesForAllRequestedVariables(){ Map<String, Map<String, String>> vls = getValueTableForRequestedVariables(getDataVariableForRequest()); Map<String, Map<String, String>> vln = getValueTablesOfRecodedVariables(); vls.putAll(vln); return vls; } public List<String> getRecodedVarIdSet() { List<String> vi = new ArrayList<String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); vi.add("v" + (String) rvs.get(2)); } return vi; } public List<String> getRawRecodedVarIdSet() { List<String> vi = new ArrayList<String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); vi.add((String) rvs.get(2)); } return vi; } public List<String> getRecodedVarNameSet() { List<String> vn = new ArrayList<String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); vn.add((String) rvs.get(0)); } return vn; } public List<String> getBaseVarIdSetFromRecodedVarIdSet() { List<String> vi = new ArrayList<String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); vi.add("v" + derivedVarToBaseVar.get( (String) rvs.get(2) ) ); } return vi; } public List<String> getBaseVarNameSetFromRecodedVarIdSet() { List<String> vn = new ArrayList<String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); vn.add( getVariableNamefromId( derivedVarToBaseVar.get( (String) rvs.get(2) ) ) ); } return vn; } private Map<String, String> getRecodedVarToBaseVarName() { Map<String, String> recodedVarToBaseVarName = new HashMap<String,String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); String recodedVarName = (String)rvs.get(0); String recodedVarId = (String)rvs.get(2); String baseVarId = derivedVarToBaseVar.get(recodedVarId); String baseVarName = getVariableNamefromId(baseVarId); recodedVarToBaseVarName.put(recodedVarName, baseVarName); } return recodedVarToBaseVarName; } public List<String> getRecodedVarLabelSet() { List<String> vl = new ArrayList<String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); vl.add((String) rvs.get(1)); } return vl; } // get variable type (int) from a given row of the dataTable public List<String> getRecodedVariableType() { List<String> vt = new ArrayList<String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); dbgLog.fine("rvs="+rvs); String newVarId = (String) rvs.get(2); int rawType = getVariableType( getVariableById( derivedVarToBaseVar.get(newVarId) ) ) ; if (rawType == 2){ rawType = 1; } vt.add( Integer.toString(rawType)); } return vt; } // get variable type (int) from a given row of the dataTable public List<String> getBaseVariableTypeForRecodedVariable() { List<String> vt = new ArrayList<String>(); for (int i = 0; i < recodedVarSet.size(); i++) { List<Object> rvs = (List<Object>) recodedVarSet.get(i); vt.add( Integer.toString(getVariableType( getVariableById( derivedVarToBaseVar.get((String) rvs.get(2)) ) ) ) ); } return vt; } public String getVariableHeaderForSubset() { String varHeader = null; List<DataVariable> dvs = getDataVariableForRequest(); List<String> vn = new ArrayList<String>(); if (dvs != null) { for (Iterator el = dvs.iterator(); el.hasNext();) { DataVariable dv = (DataVariable) el.next(); vn.add(dv.getName()); } varHeader = StringUtils.join(vn, "\t"); varHeader = varHeader + "\n"; } return varHeader; } public Set<Integer> getFieldNumbersForSubsetting(){ // create var ids for subsetting // data(int) are taken from DB's studyfile table -- FileOrder column Set<Integer> fields = new LinkedHashSet<Integer>(); List<DataVariable> dvs = getDataVariableForRequest(); if (dvs != null) { for (Iterator el = dvs.iterator(); el.hasNext();) { DataVariable dv = (DataVariable) el.next(); fields.add(dv.getFileOrder()); } } return fields; } public String getVariableNamesForSubset() { String varHeader = ""; List<DataVariable> dvs = getDataVariableForRequest(); List<String> vn = new ArrayList<String>(); if (dvs != null) { for (Iterator el = dvs.iterator(); el.hasNext();) { DataVariable dv = (DataVariable) el.next(); vn.add(dv.getName()); } varHeader = StringUtils.join(vn, ","); } return varHeader; } // </editor-fold> // ----------------------------------------------------------------------- // misc. methods // ----------------------------------------------------------------------- // <editor-fold desc="misc. methods"> /** * Returns true if an end-user's brower is Firefox * * @param userAgent hash value of the user-agent key in the request * header's map * @return true if an end-user's brower is Firefox; false otherwise */ public boolean isBrowserFirefox(String userAgent) { boolean rtvl = false; String regex = "Firefox"; Pattern p = null; try { p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); } catch (PatternSyntaxException pex) { pex.printStackTrace(); } Matcher matcher = p.matcher(userAgent); rtvl = matcher.find(); return rtvl; } /** * * @return The url of the DSB */ public String getDsbUrl(){ String dsbUrl = System.getProperty("vdc.dsb.host"); String dsbPort = System.getProperty("vdc.dsb.port"); if (dsbPort != null) { dsbUrl += ":" + dsbPort; } if (dsbUrl == null) { dsbUrl = System.getProperty("vdc.dsb.url"); } return dsbUrl; } // <---------------------------------------------------------------------- public void writeRhistory(File frh, String rh){ OutputStream outs = null; try { outs = new BufferedOutputStream(new FileOutputStream(frh)); PrintWriter pw = new PrintWriter(new OutputStreamWriter(outs, "utf8"), true); pw.println(rh); outs.close(); } catch (IOException ex) { ex.printStackTrace(); } } public void zipFiles(OutputStream out, List<File> fllst) { ZipOutputStream zout = null; //BufferedInputStream infile = null; FileInputStream infile = null; zout = new ZipOutputStream(out); for (int i = 0; i< fllst.size(); i++) { try { infile = new FileInputStream(fllst.get(i));//new BufferedInputStream() } catch (FileNotFoundException e) { err.println("input file is not found"); e.printStackTrace(); try { zout.close(); } catch (ZipException ze) { err.println("zip file invalid"); ze.printStackTrace(); } catch (IOException ex) { err.println("closing output file"); ex.printStackTrace(); } } ZipEntry ze = new ZipEntry(fllst.get(i).getName()); try { zout.putNextEntry(ze); /* int len; while ((len = infile.read())> 0) { zout.write(len); } */ byte[] dataBuffer = new byte[8192]; int k = 0; while ( ( k = infile.read (dataBuffer) ) > 0 ) { zout.write(dataBuffer,0,k); //fileSize += i; out.flush(); } } catch (ZipException zpe) { zpe.printStackTrace(); err.println("zip file is invalid"); } catch (IOException ie) { ie.printStackTrace(); err.println("output file io-error"); } try { infile.close(); } catch (IOException ie) { err.println("error: closing input file"); } } try { zout.close(); } catch (ZipException zpe) { err.println("zip file invalid"); zpe.printStackTrace(); } catch (IOException ioe) { err.println("error closing zip file"); ioe.printStackTrace(); } } // </editor-fold> // end of this class private File getOriginalFileSystemLocation () { // Get the Study File from the dataTable private variable // This points StudyFile sf = dataTable.getStudyFile(); // File inFile = new File(dataTable.getStudyFile().getFileSystemLocation()); return new File(inFile.getParent(), "_" + sf.getFileSystemName()); } }