/** createODMfile, added by tbh, 01/2009 */
  public HashMap<String, Integer> createODMFile(
      String odmVersion,
      long sysTimeBegin,
      String generalFileDir,
      DatasetBean datasetBean,
      StudyBean currentStudy,
      String generalFileDirCopy,
      ExtractBean eb,
      Integer currentStudyId,
      Integer parentStudyId,
      String studySubjectNumber) {

    Integer ssNumber = getStudySubjectNumber(studySubjectNumber);
    MetaDataCollector mdc = new MetaDataCollector(ds, datasetBean, currentStudy);
    AdminDataCollector adc = new AdminDataCollector(ds, datasetBean, currentStudy);
    ClinicalDataCollector cdc = new ClinicalDataCollector(ds, datasetBean, currentStudy);
    MetaDataCollector.setTextLength(200);
    if (odmVersion != null) {
      // by default odmVersion is 1.2
      if ("1.3".equals(odmVersion)) {
        ODMBean odmb = new ODMBean();
        odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3 ODM1-3-0.xsd");
        ArrayList<String> xmlnsList = new ArrayList<String>();
        xmlnsList.add("xmlns=\"http://www.cdisc.org/ns/odm/v1.3\"");
        odmb.setXmlnsList(xmlnsList);
        odmb.setODMVersion("1.3");
        mdc.setODMBean(odmb);
        adc.setOdmbean(odmb);
        cdc.setODMBean(odmb);
      } else if ("oc1.2".equals(odmVersion)) {
        ODMBean odmb = new ODMBean();
        // odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.2 OpenClinica-ODM1-2-1.xsd");
        odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.2 OpenClinica-ODM1-2-1-OC1.xsd");
        ArrayList<String> xmlnsList = new ArrayList<String>();
        xmlnsList.add("xmlns=\"http://www.cdisc.org/ns/odm/v1.2\"");
        xmlnsList.add("xmlns:OpenClinica=\"http://www.openclinica.org/ns/openclinica_odm/v1.2\"");
        odmb.setXmlnsList(xmlnsList);
        odmb.setODMVersion("oc1.2");
        mdc.setODMBean(odmb);
        adc.setOdmbean(odmb);
        cdc.setODMBean(odmb);
      } else if ("oc1.3".equals(odmVersion)) {
        ODMBean odmb = mdc.getODMBean();
        // odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3 OpenClinica-ODM1-3-0.xsd");
        odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3 OpenClinica-ODM1-3-0-OC1.xsd");
        ArrayList<String> xmlnsList = new ArrayList<String>();
        xmlnsList.add("xmlns=\"http://www.cdisc.org/ns/odm/v1.3\"");
        xmlnsList.add("xmlns:OpenClinica=\"http://www.openclinica.org/ns/openclinica_odm/v1.3\"");
        odmb.setXmlnsList(xmlnsList);
        odmb.setODMVersion("oc1.3");
        mdc.setODMBean(odmb);
        adc.setOdmbean(odmb);
        cdc.setODMBean(odmb);
      }
    }

    //////////////////////////////////////////
    ////////// MetaData Extraction //////////
    mdc.collectFileData();
    MetaDataReportBean metaReport = new MetaDataReportBean(mdc.getOdmStudyMap());
    metaReport.setODMVersion(odmVersion);
    metaReport.setOdmBean(mdc.getODMBean());
    metaReport.createChunkedOdmXml(Boolean.TRUE);

    long sysTimeEnd = System.currentTimeMillis() - sysTimeBegin;
    String ODMXMLFileName = mdc.getODMBean().getFileOID() + ".xml";
    int fId =
        this.createFileK(
            ODMXMLFileName,
            generalFileDir,
            metaReport.getXmlOutput().toString(),
            datasetBean,
            sysTimeEnd,
            ExportFormatBean.XMLFILE,
            false);
    if (!"".equals(generalFileDirCopy)) {
      int fId2 =
          this.createFileK(
              ODMXMLFileName,
              generalFileDirCopy,
              metaReport.getXmlOutput().toString(),
              datasetBean,
              sysTimeEnd,
              ExportFormatBean.XMLFILE,
              false);
    }
    //////////////////////////////////////////
    ////////// AdminData Extraction //////////

    adc.collectFileData();
    AdminDataReportBean adminReport = new AdminDataReportBean(adc.getOdmAdminDataMap());
    adminReport.setODMVersion(odmVersion);
    adminReport.setOdmBean(mdc.getODMBean());
    adminReport.createChunkedOdmXml(Boolean.TRUE);

    sysTimeEnd = System.currentTimeMillis() - sysTimeBegin;
    fId =
        this.createFileK(
            ODMXMLFileName,
            generalFileDir,
            adminReport.getXmlOutput().toString(),
            datasetBean,
            sysTimeEnd,
            ExportFormatBean.XMLFILE,
            false);
    if (!"".equals(generalFileDirCopy)) {
      int fId2 =
          this.createFileK(
              ODMXMLFileName,
              generalFileDirCopy,
              adminReport.getXmlOutput().toString(),
              datasetBean,
              sysTimeEnd,
              ExportFormatBean.XMLFILE,
              false);
    }

    //////////////////////////////////////////
    ////////// ClinicalData Extraction ///////

    DatasetDAO dsdao = new DatasetDAO(ds);
    String sql = eb.getDataset().getSQLStatement();
    String st_sed_in = dsdao.parseSQLDataset(sql, true, true);
    String st_itemid_in = dsdao.parseSQLDataset(sql, false, true);
    int datasetItemStatusId = eb.getDataset().getDatasetItemStatus().getId();
    String ecStatusConstraint = dsdao.getECStatusConstraint(datasetItemStatusId);
    String itStatusConstraint = dsdao.getItemDataStatusConstraint(datasetItemStatusId);

    Iterator<OdmStudyBase> it = cdc.getStudyBaseMap().values().iterator();
    while (it.hasNext()) {
      OdmStudyBase u = it.next();
      ArrayList newRows =
          dsdao.selectStudySubjects(
              u.getStudy().getId(),
              0,
              st_sed_in,
              st_itemid_in,
              dsdao.genDatabaseDateConstraint(eb),
              ecStatusConstraint,
              itStatusConstraint);

      ///////////////
      int fromIndex = 0;
      boolean firstIteration = true;
      while (fromIndex < newRows.size()) {
        int toIndex =
            fromIndex + ssNumber < newRows.size() ? fromIndex + ssNumber : newRows.size() - 1;
        List x = newRows.subList(fromIndex, toIndex + 1);
        fromIndex = toIndex + 1;
        String studySubjectIds = "";
        for (int i = 0; i < x.size(); i++) {
          StudySubjectBean sub = new StudySubjectBean();
          sub = (StudySubjectBean) x.get(i);
          studySubjectIds += "," + sub.getId();
        } // for
        studySubjectIds = studySubjectIds.replaceFirst(",", "");

        ClinicalDataUnit cdata =
            new ClinicalDataUnit(
                ds,
                datasetBean,
                cdc.getOdmbean(),
                u.getStudy(),
                cdc.getCategory(),
                studySubjectIds);
        cdata.setCategory(cdc.getCategory());
        cdata.collectOdmClinicalData();

        FullReportBean report = new FullReportBean();
        report.setClinicalData(cdata.getOdmClinicalData());
        report.setOdmStudyMap(mdc.getOdmStudyMap());
        report.setODMVersion(odmVersion);
        // report.setOdmStudy(mdc.getOdmStudy());
        report.setOdmBean(mdc.getODMBean());
        if (firstIteration && fromIndex >= newRows.size()) {
          report.createChunkedOdmXml(Boolean.TRUE, true, true);
          firstIteration = false;
        } else if (firstIteration) {
          report.createChunkedOdmXml(Boolean.TRUE, true, false);
          firstIteration = false;
        } else if (fromIndex >= newRows.size()) {
          report.createChunkedOdmXml(Boolean.TRUE, false, true);
        } else {
          report.createChunkedOdmXml(Boolean.TRUE, false, false);
        }
        fId =
            this.createFileK(
                ODMXMLFileName,
                generalFileDir,
                report.getXmlOutput().toString(),
                datasetBean,
                sysTimeEnd,
                ExportFormatBean.XMLFILE,
                false);
        if (!"".equals(generalFileDirCopy)) {
          int fId2 =
              this.createFileK(
                  ODMXMLFileName,
                  generalFileDirCopy,
                  report.getXmlOutput().toString(),
                  datasetBean,
                  sysTimeEnd,
                  ExportFormatBean.XMLFILE,
                  false);
        }
      }
    }

    sysTimeEnd = System.currentTimeMillis() - sysTimeBegin;
    fId =
        this.createFileK(
            ODMXMLFileName,
            generalFileDir,
            "</ODM>",
            datasetBean,
            sysTimeEnd,
            ExportFormatBean.XMLFILE,
            true);
    if (!"".equals(generalFileDirCopy)) {
      int fId2 =
          this.createFileK(
              ODMXMLFileName,
              generalFileDirCopy,
              "</ODM>",
              datasetBean,
              sysTimeEnd,
              ExportFormatBean.XMLFILE,
              false);
    }

    //////////////////////////////////////////
    ////////// pre pagination extraction /////
    /*
    mdc.collectFileData();
    adc.collectOdmAdminDataMap();
    cdc.collectOdmClinicalDataMap();
    FullReportBean report = new FullReportBean();
    report.setClinicalDataMap(cdc.getOdmClinicalDataMap());
    report.setAdminDataMap(adc.getOdmAdminDataMap());
    report.setOdmStudyMap(mdc.getOdmStudyMap());
    report.setOdmBean(mdc.getODMBean());
    report.setODMVersion(odmVersion);
    report.createOdmXml(Boolean.TRUE);
    long sysTimeEnd = System.currentTimeMillis() - sysTimeBegin;
    String ODMXMLFileName = mdc.getODMBean().getFileOID() + ".xml";
    int fId = this.createFile(ODMXMLFileName, generalFileDir, report.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE, true);
    if (!"".equals(generalFileDirCopy)) {
    	int fId2 = this.createFile(ODMXMLFileName, generalFileDirCopy, report.getXmlOutput().toString(), datasetBean, sysTimeEnd, ExportFormatBean.XMLFILE, false);
    } */

    // return ODMXMLFileName;
    HashMap answerMap = new HashMap<String, Integer>();
    answerMap.put(ODMXMLFileName, new Integer(fId));
    return answerMap;
  }
  @RequestMapping(value = "/studies/{study}/metadata", method = RequestMethod.GET)
  public ModelAndView studyMetadata(
      Model model,
      HttpSession session,
      @PathVariable("study") String studyOid,
      HttpServletResponse response)
      throws Exception {
    ResourceBundleProvider.updateLocale(new Locale("en_US"));
    StudyBean currentStudy = (StudyBean) session.getAttribute("study");
    UserAccountBean userAccount = (UserAccountBean) session.getAttribute("userBean");

    UserAccountDAO userAccountDao = new UserAccountDAO(dataSource);
    userAccount = (UserAccountBean) userAccountDao.findByUserName("root");

    StudyDAO studyDao = new StudyDAO(dataSource);
    currentStudy = studyDao.findByOid(studyOid);

    MetaDataCollector mdc = new MetaDataCollector(dataSource, currentStudy, getRuleSetRuleDao());
    AdminDataCollector adc = new AdminDataCollector(dataSource, currentStudy);
    // RulesDataCollector rdc = new RulesDataCollector(sm.getDataSource(),
    // currentStudy,getRuleSetRuleDao());
    MetaDataCollector.setTextLength(200);

    ODMBean odmb = mdc.getODMBean();
    odmb.setSchemaLocation("http://www.cdisc.org/ns/odm/v1.3 OpenClinica-ODM1-3-0-OC2-0.xsd");
    ArrayList<String> xmlnsList = new ArrayList<String>();
    xmlnsList.add("xmlns=\"http://www.cdisc.org/ns/odm/v1.3\"");
    // xmlnsList.add("xmlns:OpenClinica=\"http://www.openclinica.org/ns/openclinica_odm/v1.3\"");
    xmlnsList.add("xmlns:OpenClinica=\"http://www.openclinica.org/ns/odm_ext_v130/v3.1\"");
    xmlnsList.add("xmlns:OpenClinicaRules=\"http://www.openclinica.org/ns/rules/v3.1\"");
    odmb.setXmlnsList(xmlnsList);
    odmb.setODMVersion("oc1.3");
    mdc.setODMBean(odmb);
    adc.setOdmbean(odmb);
    // rdc.setOdmbean(odmb);

    mdc.collectFileData();
    MetaDataReportBean metaReport = new MetaDataReportBean(mdc.getOdmStudyMap(), coreResources);
    metaReport.setODMVersion("oc1.3");
    metaReport.setOdmBean(mdc.getODMBean());
    metaReport.createChunkedOdmXml(Boolean.FALSE);

    adc.collectFileData();
    AdminDataReportBean adminReport = new AdminDataReportBean(adc.getOdmAdminDataMap());
    adminReport.setODMVersion("oc1.3");
    adminReport.setOdmBean(mdc.getODMBean());
    adminReport.createChunkedOdmXml(Boolean.FALSE);

    // rdc.collectFileData();
    // RulesDataReportBean rulesReport = new
    // RulesDataReportBean(rdc.getOdmRulesDataMap(),getCoreResources());
    // rulesReport.setODMVersion("oc1.3");
    // rulesReport.setOdmBean(mdc.getODMBean());
    // rulesReport.createChunkedOdmXml(Boolean.FALSE);

    FullReportBean report = new FullReportBean();
    report.setAdminDataMap(adc.getOdmAdminDataMap());
    report.setOdmStudyMap(mdc.getOdmStudyMap());
    report.setCoreResources(coreResources);
    // report.setRulesDataMap(rdc.getOdmRulesDataMap());
    report.setOdmBean(mdc.getODMBean());
    report.setODMVersion("oc1.3");
    report.createStudyMetaOdmXml(Boolean.FALSE);

    response.setContentType("application/xml");
    PrintWriter out = response.getWriter();
    out.print(report.getXmlOutput().toString().trim());

    return null;
  }