Changeset 3734 in main


Ignore:
Timestamp:
04/20/12 02:05:33 (10 years ago)
Author:
Garth Braithwaite
Message:

java and webapps - oracle file store script. Did some stream closing and jdbc template close code. Changed publishing path from system id to string and hard coded path sep as "/" as file is okay with this and blob will now be consistent. Finished first round of publishing to blob. Coded the jdbc to use resource-ref to be consistent.

Location:
trunk/src/main
Files:
3 added
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/main/java/org/ibisph/chart/agileblox/AbstractChart.java

    r3535 r3734  
    235235
    236236    baseChart.buildSVG(abi, outputStream);
     237
     238    // don't need to worry about closing the outputstream as this responsibility
     239    // of the controller/view dispatcher servlet.  Doesn't hurt but shouldn't be
     240    // done here in this code.
     241    // outputStream.close();
    237242  } //-------------------------- End of Method ------------------------------
    238243
  • trunk/src/main/java/org/ibisph/chart/jfreechart/AbstractIBISJFreeChart.java

    r3535 r3734  
    306306    svgGen.stream(writer, DefCommons.USE_CSS);
    307307
    308     // Flush the output stream -- DO NOT CLOSE the output stream as it happens to be the view writer and will
    309     // be used later
     308    // Flush the output stream -- DO NOT CLOSE the output stream as it is the
     309    // view writer and will be used later.  The dispatcher servlet will close.
    310310    outstream.flush();
    311311
    312     // Close the WRITER but NOT the output stream
    313     //writer.close();
     312    // Close the WRITER but NOT the output stream.  Not sure why this was
     313    // commented out.  Uncommented 4/2012.
     314    writer.close();
    314315  }
    315316}
  • trunk/src/main/java/org/ibisph/databean/springmvc/PublishCollectionToXMLFileController.java

    r3536 r3734  
    22
    33import java.io.File;
    4 import java.io.FileWriter;
    54
    65import org.dom4j.Document;
    76
    87import org.ibisph.filebackup.FileBackupFactory;
    9 import org.ibisph.systemid.SystemID;
    108
    119
     
    1816 */
    1917public class PublishCollectionToXMLFileController extends GetCollectionXMLController {
    20 
    2118  protected static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(PublishCollectionToXMLFileController.class);
    2219
    23   protected String   initReturnMessage = null;
    24   protected SystemID destinationXMLSystemID;
     20  protected String initReturnMessage  = null;
     21  protected String xmlPathAndFilename = "";
     22  protected org.ibisph.xml.service.Document xmlDocumentService = null;
     23
    2524  protected FileBackupFactory fileBackupFactory = null;
    2625
     
    3837
    3938  /**
    40    * Sets the XML file System ID to be used to save the databean collection to.
    41    * @param destinationXMLSystemID complete system ID string for the XML file.
     39   * Sets the Base XML file name and path to save the contents to.  This is
     40   * needed when saving the XML to a db table. 
     41   * @param xmlPathAndFilename full path with filename for the xml document
     42   *   service.
    4243   */
    43   public void setDestinationXMLSystemID(org.ibisph.systemid.SystemID destinationXMLSystemID) {
    44     this.destinationXMLSystemID = destinationXMLSystemID;
     44  public void setXMLPathAndFilename(String xmlPathAndFilename) {
     45    this.xmlPathAndFilename = xmlPathAndFilename;
    4546  } //-------------------------- End of Method ------------------------------
    4647
    47  
     48
     49  /**
     50   * Sets the DAO object that will be used to get/save the XML content with. 
     51   * This simply keeps with the plugable Spring framework.
     52   * @param xmlDocumentService XML Document DAO type service used to persist
     53   *   the XML document.
     54   */
     55  public void setXMLDocumentService(org.ibisph.xml.service.Document xmlDocumentService) {
     56    this.xmlDocumentService = xmlDocumentService;
     57  } //-------------------------- End of Method ------------------------------
     58
    4859  /**
    4960   * Optional file backup factory that provides a file backup used to backup
     
    7485    boolean continueProcessing  = true;
    7586
    76     if(this.initReturnMessage != null)
     87    if(null != this.initReturnMessage)
    7788      returnMessage.append(this.initReturnMessage);
    7889    else
    7990      returnMessage.append("Saving collection of ")
    8091        .append(this.dataBeanClassName)
    81         .append(" to system id: ")
    82         .append(this.destinationXMLSystemID)
     92        .append(" to: ")
     93        .append(this.xmlPathAndFilename)
    8394        .append(" with root XML element named: ")
    8495        .append(this.rootXMLElementName)
     
    113124    StringBuffer returnMessage = new StringBuffer();
    114125
    115     java.net.URI uri = new java.net.URI(this.destinationXMLSystemID.toString());
    116     File file = new java.io.File(uri);
    117 
    118126    // if a backup factory exists, then backup the file first before saving.
    119127    org.ibisph.filebackup.FileBackup fileBackup = null;
    120128    if(this.fileBackupFactory != null) {
     129      File file = new java.io.File(this.xmlPathAndFilename);
    121130      try {
    122131        fileBackup = fileBackupFactory.newFileBackup(file);
     
    124133      catch(Exception e) {
    125134        returnMessage.append(" File save problem - file backup for: ")
    126           .append(this.destinationXMLSystemID)
     135          .append(this.xmlPathAndFilename)
    127136          .append(" failed. ");
    128137        logger.error(returnMessage.toString(), e);
     
    130139      }
    131140      returnMessage.append(" Backed up source file ")
    132         .append(this.destinationXMLSystemID)
     141        .append(this.xmlPathAndFilename)
    133142        .append(" to ")
    134143        .append(fileBackup.getBackupFile().getName())
     
    137146
    138147    try {
    139       FileWriter fileWriter = new FileWriter(file);
    140       document.write(fileWriter);
    141       fileWriter.close();
     148      this.xmlDocumentService.save(document, this.xmlPathAndFilename);
    142149      returnMessage.append(" Saved collection to XML file: ")
    143         .append(this.destinationXMLSystemID)
    144         .append(", size: ")
    145         .append(file.length())
     150        .append(this.xmlPathAndFilename)
    146151        .append(". ");
    147152      logger.info(returnMessage.toString());
     
    149154    catch(Exception e) {
    150155      returnMessage.append(" Save failed - problem saving the XML file: ")
    151         .append(this.destinationXMLSystemID)
     156        .append(this.xmlPathAndFilename)
    152157        .append(". ");
    153158      logger.error(returnMessage.toString(), e);
    154159 
    155       if(fileBackup != null) {
     160      if(null != fileBackup) {
    156161        fileBackup.restore();
    157162        returnMessage.append(" Backup file restored. ");
  • trunk/src/main/java/org/ibisph/indicatorprofile/service/PublishedIndicatorsXML.java

    r3727 r3734  
    77import org.dom4j.Element;
    88
     9import org.ibisph.util.FileLib;
    910import org.ibisph.util.IOPath;
    1011import org.ibisph.util.StrLib;
     
    2526
    2627  protected String publishedIndicatorsPathAndFilename = null;
    27   protected String indicatorProfileXMLPath = null;
     28  protected String xmlPath = null;
    2829
    2930  protected org.ibisph.xml.service.Document xmlDocumentService = null;
     
    3334
    3435  /**
    35    * Sets System ID to the published indicator profiles XML file.
    36    * @param publishedIndicatorProfilesSystemID Complete system ID string for
    37    *   the published indicator profiles XML file.
    38    */
    39   public void setPublishedIndicatorProfilesSystemID(
    40     org.ibisph.systemid.SystemID publishedIndicatorProfilesSystemID
    41   ) throws java.net.URISyntaxException {
    42     java.net.URI uri = new java.net.URI(publishedIndicatorProfilesSystemID.toString());
    43 //    this.publishedIndicatorsPathAndFilename = new java.io.File(uri);
     36   * Sets path and filename of the published indicator profiles XML file.
     37   * @param publishedIndicatorsPathAndFilename directory path and filename
     38   *   for the published indicator profiles XML file.
     39   */
     40  public void setPublishedIndicatorsPathAndFilename(String publishedIndicatorsPathAndFilename) {
     41    this.publishedIndicatorsPathAndFilename = publishedIndicatorsPathAndFilename;
    4442  } //-------------------------- End of Method ------------------------------
    4543
     
    4745   * Sets the Indicator Profile XML Path to be used when rebuilding the published
    4846   * indicator profiles XML file from the IP files.
    49    * @param indicatorProfileXMLPath Complete IP XML file path.
    50    */
    51   public void setIndicatorProfileXMLPath(String indicatorProfileXMLPath) {
    52     this.indicatorProfileXMLPath = indicatorProfileXMLPath;
     47   * @param xmlPath directory path to the Indicator Profile XML files.
     48   */
     49  public void setXMLPath(String xmlPath) {
     50    this.xmlPath = xmlPath;
    5351  } //-------------------------- End of Method ------------------------------
    5452
     
    9088  public Document getPublishedIndicators() throws Exception {
    9189    Document document = xmlDocumentService.get(this.publishedIndicatorsPathAndFilename);
    92     if(document == null) document = XMLLib.newDocument("INDICATORS");
     90    if(null == document) document = XMLLib.newDocument("INDICATORS");
    9391    return(document);
    9492  } //-------------------------- End of Method ------------------------------
     
    185183    StringBuffer actionsReturnMessage = new StringBuffer();
    186184    org.ibisph.filebackup.FileBackup fileBackup = null;
    187     if(this.fileBackupFactory != null) fileBackup = this.fileBackupFactory.newFileBackup(publishedIndicatorsPathAndFilename);
     185    if(null != this.fileBackupFactory) fileBackup = this.fileBackupFactory.newFileBackup(publishedIndicatorsPathAndFilename);
    188186    try {
    189187      // Note: used null output format so that the pretty printer would be used.
     
    197195      actionsReturnMessage.append("Problem saving the published indicator profiles file.  ");
    198196      if(fileBackup != null) {
    199 //        publishedIndicatorsPathAndFilename.delete();
     197        FileLib.delete(publishedIndicatorsPathAndFilename);
    200198        fileBackup.restore();
    201199      }
     
    216214  public synchronized String verifyPublishedIndicatorsXMLFile() throws Exception {
    217215    StringBuffer statusMessage = new StringBuffer();
    218 //    statusMessage.append("Checking Published Indicators XML File ").append(this.publishedIndicatorsPathAndFilename.getName());
    219 //    if(this.publishedIndicatorsPathAndFilename.exists()) {
    220 //      statusMessage.append(".  File exists.");
    221 //    }
    222 //    else {
    223 //      statusMessage.append(".  File DOES NOT EXIST.  Recreating it.  Status: ");
    224 //      statusMessage.append(createPublishedIndicatorsXMLFile());
    225 //    }
     216    statusMessage.append("Checking Published Indicators XML File ").append(this.publishedIndicatorsPathAndFilename);
     217
     218    if(xmlDocumentService.exists(this.publishedIndicatorsPathAndFilename)) {
     219      statusMessage.append(".  File exists.");
     220    }
     221    else {
     222      statusMessage.append(".  File DOES NOT EXIST.  Recreating it.  Status: ");
     223      statusMessage.append(createPublishedIndicatorsXMLFile());
     224    }
    226225    logger.info(".verifyPublishedIndicatorsXMLFile - status: {}", statusMessage);
    227226    return(statusMessage.toString());
     
    237236    StringBuffer actionsReturnMessage = new StringBuffer();
    238237
    239     String directoryPath = this.indicatorProfileXMLPath;
    240 //    if(directoryPath == null) directoryPath = IOPath.getPath( this.publishedIndicatorsPathAndFilename.getAbsolutePath() );
     238    String directoryPath = this.xmlPath;
     239    if(!StrLib.isSomething(directoryPath)) directoryPath = IOPath.getPath(this.publishedIndicatorsPathAndFilename);
     240
     241    File publishedIndicatorsPathAndFile = new File(this.publishedIndicatorsPathAndFilename);
    241242    File directory = new File(directoryPath);
    242243    String[] xmlFiles = directory.list( new XMLFileNameFilter() );
     
    246247      if(this.fileBackupFactory != null)
    247248        fileBackup = this.fileBackupFactory.newFileBackup(publishedIndicatorsPathAndFilename);
    248 //      else if(this.publishedIndicatorsPathAndFilename.exists())
    249 //        this.publishedIndicatorsPathAndFilename.delete();
     249      else if(publishedIndicatorsPathAndFile.exists())
     250        publishedIndicatorsPathAndFile.delete();
    250251      Document publishedProfilesDocument = getPublishedIndicators();
    251252      Document indicatorProfileDocument;
    252  
     253
    253254      try {
    254255        for(int i=0; i < xmlFiles.length; i++) {
     
    265266        actionsReturnMessage.append("Problem saving the published indicator profiles file.  ");
    266267        if(fileBackup != null) {
    267 //          this.publishedIndicatorsPathAndFilename.delete();
     268          publishedIndicatorsPathAndFile.delete();
    268269          fileBackup.restore();
    269270        }
  • trunk/src/main/java/org/ibisph/indicatorprofile/springmvc/databean/PublishIndicatorToXMLFileController.java

    r3536 r3734  
    11package org.ibisph.indicatorprofile.springmvc.databean;
    22
    3 import java.io.File;
    43import java.io.FileNotFoundException;
    5 import java.io.FileWriter;
    64import java.util.List;
    75
     
    3129  protected static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(PublishIndicatorToXMLFileController.class);
    3230
    33   protected DataBeanDAOService                dataBeanDAOService                = null;
     31  protected DataBeanDAOService         dataBeanDAOService                = null;
    3432  protected IndicatorDataBeanToXML     indicatorDataBeanToXMLService     = null;
    3533  protected IndicatorViewDataBeanToXML indicatorViewDataBeanToXMLService = null;
    36   protected PublishedIndicatorsXML        publishedIndicatorsService        = null;
    37 
    38   protected String saveXMLToDirectory = "";
     34  protected PublishedIndicatorsXML     publishedIndicatorsService        = null;
     35  protected org.ibisph.xml.service.Document xmlDocumentService           = null;
     36
     37  protected String xmlPath = "";
    3938  protected org.ibisph.filebackup.FileBackupFactory fileBackupFactory = null;
    4039
     
    7574
    7675  /**
     76   * Sets the DAO object that will be used to get/save the XML content with. 
     77   * This simply keeps with the plugable Spring framework.
     78   * @param xmlDocumentService XML Document DAO type service used to persist
     79   *   the XML document.
     80   */
     81  public void setXMLDocumentService(org.ibisph.xml.service.Document xmlDocumentService) {
     82    this.xmlDocumentService = xmlDocumentService;
     83  } //-------------------------- End of Method ------------------------------
     84
     85
     86  /**
    7787   * Sets the Base XML file save directory.
    78    * @param saveXMLToDirectory
    79    */
    80   public void setSaveXMLToDirectory(String saveXMLToDirectory) {
    81     this.saveXMLToDirectory = saveXMLToDirectory;
     88   * @param xmlPath directory path to save the XML files to.
     89   */
     90  public void setXMLPath(String xmlPath) {
     91    this.xmlPath = xmlPath;
    8292  } //-------------------------- End of Method ------------------------------
    8393
     
    187197
    188198    // if here then try and save the xml doc to a file.
    189     FileLib.createDir(this.saveXMLToDirectory);
     199    FileLib.createDir(this.xmlPath);
    190200    try {
    191201      returnMessage.append(publishXMLFile(indicatorDataBean.getName(), indicatorDocument));
     
    240250   */
    241251  protected String publishXMLFile(String name, Document document) throws Exception {
    242     String filenameAndPath = org.ibisph.util.IOPath.concat(this.saveXMLToDirectory, name + ".xml");
     252    String filenameAndPath = org.ibisph.util.IOPath.concat(this.xmlPath, name + ".xml", "/");
    243253    StringBuffer returnMessage = new StringBuffer();
    244254
     
    258268
    259269    try {
    260       File file = new java.io.File(filenameAndPath);
    261       FileWriter fileWriter = new java.io.FileWriter(file);
    262       document.write(fileWriter);
    263       fileWriter.close();
     270      this.xmlDocumentService.save(document, filenameAndPath);
    264271      returnMessage.append(" Published ").append(name).append(" to XML file: ")
    265         .append(filenameAndPath).append(", size: ").append(file.length()).append(". ");
     272        .append(filenameAndPath).append(". ");
    266273      logger.info(returnMessage.toString());
    267274    }
  • trunk/src/main/java/org/ibisph/jdbc/JDBCTemplate.java

    r3727 r3734  
    115115  } //-------------------------- End of Method ------------------------------
    116116
    117   public void dispose() {
    118     close();
    119   } //-------------------------- End of Method ------------------------------
     117  public void dispose()  { close(); }
     118  public void finalize() { close(); }
    120119
    121120
     
    213212  } //-------------------------- End of Method ------------------------------
    214213
    215 
    216   public boolean setPreparedStatementInputStream(int position, InputStream inputStream) {
    217     try {
    218       preparedStatement.setBinaryStream(position, inputStream);
     214  public boolean setPreparedStatementInputStream(int position, InputStream inputStream, int length) {
     215    try {
     216      preparedStatement.setBinaryStream(position, inputStream, length);
     217      inputStream.close();
    219218      return(true);
    220219    }
     
    222221      logException("setPreparedStatementInputStream", "Position: "+ position+ ", inputStream: "+inputStream, ex);
    223222    }
    224     return(false);
    225   } //-------------------------- End of Method ------------------------------
    226 
     223    catch(IOException ioe) {
     224      logException("setPreparedStatementInputStream", "Position: "+ position+ ", inputStream: "+inputStream, ioe);
     225    }
     226   
     227    return(false);
     228  } //-------------------------- End of Method ------------------------------
     229
     230  /**
     231   * Byte array based blob.  This can have issues with some rdbms engines but
     232   * works for MySQL - at least for small data.  The recommended method is to
     233   * use an input stream/binary stream.
     234   * @param position
     235   * @param byteArray
     236   * @return
     237   */
    227238  public boolean setPreparedStatementBlob(int position, byte[] byteArray) {
    228239    ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
    229240    return(
    230       setPreparedStatementInputStream(position, bais)
     241      setPreparedStatementInputStream(position, bais, byteArray.length)
    231242    );
    232243  } //-------------------------- End of Method ------------------------------
     
    783794
    784795
    785 
     796/* Temp code put in just in case
    786797  public byte[] selectBlob(int rowid) {
    787798
     
    835846          // Close the binary input stream:
    836847          bis.close();
     848          baos.close();
    837849        }
    838850        catch(IOException ioe) {
     
    856868    return(returnData);
    857869  } //-------------------------- End of Method ------------------------------
    858  
     870*/
     871
    859872} //============================ END OF CLASS =================================
    860873
  • trunk/src/main/java/org/ibisph/modelmap/AddModelDateModelToModelMap.java

    r3710 r3734  
    44import java.text.DateFormat;
    55import java.util.Date;
     6import java.util.List;
    67import java.util.Map;
    78
     
    910
    1011import org.ibisph.systemid.FileSystemID;
    11 import org.ibisph.systemid.SystemID;
    1212import org.ibisph.util.StrLib;
    1313import org.ibisph.util.XMLLib;
     
    2424  protected String sourceModelModelMapKey   = "XML";
    2525  protected String formattedDateModelMapKey = "XMLDate";
    26   protected String sourceModelDateXPath     = "/QUERY_MODULE/FILE_LAST_MODIFIED_DTS";
     26  protected List<String> sourceModelDateXPathList = null;
    2727
    2828  protected DateFormat dateFormat        = null;
     
    5858
    5959  /**
    60    * XPath to get the desired date to be added to the model.
    61    * @param sourceModelDateXPath xpath to the date field.
     60   * List of XPaths to get the desired date to be added to the model.
     61   * @param sourceModelDateXPathList xpath to the date field.
    6262   */
    63   public void setSourceModelDateXPath(String sourceModelDateXPath) {this.sourceModelDateXPath = sourceModelDateXPath;}
     63  public void setSourceModelDateXPathList(List<String> sourceModelDateXPathList) {
     64    this.sourceModelDateXPathList = sourceModelDateXPathList;
     65  } //-------------------------- End of Method ------------------------------
    6466
    6567
     
    105107
    106108    long date = 0;
     109
     110    // If the model is an XML document then loop through all the xpaths.
     111    // if a fully qualified xpath (e.g. starts with a slash) then start
     112    // lookup the element based on the document.  Else look for element
     113    // based off of the root element.  If something found then get and
     114    // parse the date and break the loop.
    107115    if(sourceModel instanceof Document) {
    108116      Document document = (Document)sourceModel;
    109       String s = XMLLib.getText(document, this.sourceModelDateXPath);
    110       if(StrLib.isSomething(s)) date = Long.parseLong(s);
     117      for(String sourceModelDateXPath : this.sourceModelDateXPathList) {
     118        String s = null;
     119        if(sourceModelDateXPath.startsWith("/"))
     120          s = XMLLib.getText(document, sourceModelDateXPath);
     121        else
     122          s = XMLLib.getText(document.getRootElement(), sourceModelDateXPath);
     123
     124        if(StrLib.isSomething(s)) {
     125          date = Long.parseLong(s);
     126          break;
     127        }
     128      }
    111129    }
     130
     131    // else system id so get the file's modified date value.
    112132    else if(sourceModel instanceof FileSystemID) {
    113133      File file = ((FileSystemID)sourceModel).getFile();
     
    115135      if(date < 1) date = file.getAbsoluteFile().lastModified();
    116136    }
     137
     138    // finally format the date and put into the model map.
    117139    String dateString = this.defaultDateString;
    118140    if(date > 0) dateString = this.getFormattedDate(date);
  • trunk/src/main/java/org/ibisph/user/modelmap/AbstractUserStatus.java

    r3716 r3734  
    5454  protected void setStatus(Document userProfileDocument, String status) {
    5555    Element statusElement = XMLLib.newElement("STATUS", status);
    56     Element dateElement   = XMLLib.newElement("UPDATED_DTS", (new Date()).toString());
     56    Element dateElement   = XMLLib.newElement("MODIFIED_DTS", (new Date()).toString());
    5757    XMLLib.replaceElement(userProfileDocument.getRootElement(), statusElement);
    5858    XMLLib.replaceElement(userProfileDocument.getRootElement(), dateElement);
  • trunk/src/main/java/org/ibisph/user/service/UserProfileXML.java

    r3727 r3734  
    2727   * Sets the DAO object that will be used to get/save the XML content with. 
    2828   * This simply keeps with the plugable Spring framework.
    29    * @param xmlDocumentService Standard Document DAO used to persist the XML document.
     29   * @param xmlDocumentService XML Document DAO type service used to persist
     30   *   the XML document.
    3031   */
    3132  public void setXMLDocumentService(org.ibisph.xml.service.Document xmlDocumentService) {
  • trunk/src/main/java/org/ibisph/xml/service/BLOBStoredDocument.java

    r3728 r3734  
    1515import org.ibisph.jdbc.JDBCTemplate;
    1616import org.ibisph.jdbc.JDBCTemplateFactory;
     17import org.ibisph.util.StrLib;
    1718import org.ibisph.util.XMLLib;
    1819
     
    3334  ;
    3435
     36  protected String fileStoreSQLExistsQuery =
     37      "select NAME " +
     38      "from FILE_STORE " +
     39      "where NAME=? "
     40  ;
     41
    3542  protected String fileStoreSQLInsert =
    3643    "insert into FILE_STORE " +
     
    4350      "set CONTENT = ?, MODIFIED_DTS = ? " +
    4451      "where NAME = ?"
    45     ;
     52  ;
    4653
    4754  protected String fileStoreSQLDelete = "delete from FILE_STORE where NAME=?";
     55
     56  protected String fileStoreSQLUpdateAccessDate =
     57      "update FILE_STORE " +
     58      "set ACCESSED_DTS = ? " +
     59      "where NAME = ?"
     60  ;
    4861
    4962
     
    7588    this.fileStoreSQLDelete = fileStoreSQLDelete;
    7689  } //-------------------------- End of Method ------------------------------
    77  
     90
     91  /**
     92   * Prepared statement used for updating the record's ACCESSED_DTS when it is
     93   * read.  This was developed for MassChip so that they could maintain/delete
     94   * old, unused records.  If set to blank this step is skipped which helps
     95   * with performance.
     96   * @param fileStoreSQLUpdateAccessDate update SQL prepared statement.  The
     97   *   first "?" is the ACCESSED_DTS value.  The 2nd is the file path which
     98   *   is the record's key.
     99   */
     100  public void setFileStoreSQLUpdateAccessDate(String fileStoreSQLUpdateAccessDate) {
     101    this.fileStoreSQLUpdateAccessDate = fileStoreSQLUpdateAccessDate;
     102  } //-------------------------- End of Method ------------------------------
     103
    78104
    79105  //-------------------------------------------- P U B L I C   S E R V I C E S
    80106
    81107
    82   public org.dom4j.Document get(String completePathAndFilename)
     108  /**
     109   * Get an XML document from the db (contents stored as a BLOB). 
     110   * @param xmlPathAndFilename db record key.
     111   * @return loaded, parsed xml document.
     112   */
     113  public org.dom4j.Document get(String xmlPathAndFilename)
    83114    throws SQLException, DocumentException
    84115  {
     
    86117    JDBCTemplate jdbcTemplate = this.jdbcTemplateFactory.get();
    87118    jdbcTemplate.setPreparedStatement(this.fileStoreSQLQuery);
    88     jdbcTemplate.setPreparedStatementString(1, completePathAndFilename);
     119    jdbcTemplate.setPreparedStatementString(1, xmlPathAndFilename);
    89120    jdbcTemplate.executePreparedStatementQuery();
    90     while(jdbcTemplate.next()) {
     121    if(jdbcTemplate.next()) {
    91122      Blob blob = jdbcTemplate.getBlob("CONTENT");
    92       Timestamp accessedDTS = jdbcTemplate.getTimestamp("ACCESSED_DTS");
    93123      Timestamp modifiedDTS = jdbcTemplate.getTimestamp("MODIFIED_DTS");
    94124      byte[] xmlBytes = blob.getBytes(1, (int)blob.length());
    95125      document = XMLLib.parseToNewDocument(xmlBytes);
     126
     127      // add in the modified dts so that the modelmap will put this value in
     128      // for the xslt view to access and present to the user.
     129      XMLLib.replaceElement(document.getRootElement(),
     130        XMLLib.newElement("MODIFIED_DTS", modifiedDTS.toString())
     131      );
     132
     133      // next update the record with the access date.  This is a Masschip
     134      // requirement.
     135      if(StrLib.isSomething(this.fileStoreSQLUpdateAccessDate)) {
     136        jdbcTemplate.setPreparedStatement(this.fileStoreSQLUpdateAccessDate);
     137        jdbcTemplate.setPreparedStatementTimestamp(1, now());
     138        jdbcTemplate.setPreparedStatementString(2, xmlPathAndFilename);
     139        jdbcTemplate.executePreparedStatement();
     140      }
    96141    }
     142    jdbcTemplate.close();
     143
    97144    return(document);
    98145  } //-------------------------- End of Method ------------------------------
    99146
    100147
    101 
    102 //on read need to update the record's access DTS.  This can also possibly
    103 // help in getting the blob handle - NOPE - not needed for reading...
    104 // need to add the access and modify date to the document's root element
    105 // if doesn't already exist...
    106 
    107  
    108   public void save(org.dom4j.Document document, String completePathAndFilename)
     148  /**
     149   * Saves the supplied XML document to the db (contents stored in a BLOB). 
     150   * This code first tries to update based on the key (supplied path).  If it
     151   * can't update then the record is inserted.
     152   *
     153   * @param document XML Document to be saved.
     154   * @param xmlPathAndFilename db record key.
     155   * @see: http://www.herongyang.com/JDBC/Oracle-BLOB-setBinaryStream.html
     156   */
     157  public void save(org.dom4j.Document document, String xmlPathAndFilename)
    109158    throws IOException, UnsupportedEncodingException
    110159  {
    111160    byte[] xmlBytes = getDocumentXMLAsByteArray(document);
    112     Date now = new Date();
    113     Timestamp timestamp = new Timestamp(now.getTime());
     161    Timestamp timestamp = now();
    114162    JDBCTemplate jdbcTemplate = this.jdbcTemplateFactory.get();
    115163
     
    118166    jdbcTemplate.setPreparedStatementBlob     (1, xmlBytes);
    119167    jdbcTemplate.setPreparedStatementTimestamp(2, timestamp);
    120     jdbcTemplate.setPreparedStatementString   (3, completePathAndFilename);
     168    jdbcTemplate.setPreparedStatementString   (3, xmlPathAndFilename);
    121169    int updatedCount = jdbcTemplate.executePreparedStatementUpdate();
    122170
     
    124172    if(0 == updatedCount) {
    125173      jdbcTemplate.setPreparedStatement(this.fileStoreSQLInsert);
    126       jdbcTemplate.setPreparedStatementString   (1, completePathAndFilename);
     174      jdbcTemplate.setPreparedStatementString   (1, xmlPathAndFilename);
    127175      jdbcTemplate.setPreparedStatementBlob     (2, xmlBytes);
    128176      jdbcTemplate.setPreparedStatementTimestamp(3, timestamp);
     
    130178      jdbcTemplate.executePreparedStatement();
    131179    }
     180    jdbcTemplate.close();
    132181  } //-------------------------- End of Method ------------------------------
    133182
     
    168217   *
    169218   */
    170   public boolean delete(String documentPathAndName) {
     219  public boolean delete(String xmlPathAndFilename) {
    171220    JDBCTemplate jdbcTemplate = this.jdbcTemplateFactory.get();
    172221    jdbcTemplate.setPreparedStatement(this.fileStoreSQLDelete);
    173     jdbcTemplate.setPreparedStatementString(1, documentPathAndName);
     222    jdbcTemplate.setPreparedStatementString(1, xmlPathAndFilename);
    174223    jdbcTemplate.executePreparedStatement();
     224    jdbcTemplate.close();
    175225    return(true);
    176226  } //-------------------------- End of Method ------------------------------
     227
     228
     229  public boolean exists(String xmlPathAndFilename) {
     230    JDBCTemplate jdbcTemplate = this.jdbcTemplateFactory.get();
     231    jdbcTemplate.setPreparedStatement(this.fileStoreSQLExistsQuery);
     232    jdbcTemplate.setPreparedStatementString(1, xmlPathAndFilename);
     233    jdbcTemplate.executePreparedStatement();
     234    boolean exists = jdbcTemplate.next();
     235    jdbcTemplate.close();
     236    return(exists);
     237  } //-------------------------- End of Method ------------------------------
    177238 
     239   
     240
     241  /**
     242   * Localizes the current date/time.
     243   * @return timestamp based on the current system time.
     244   */
     245  protected Timestamp now() {
     246    Date now = new Date();
     247    Timestamp timestamp = new Timestamp(now.getTime());
     248    return(timestamp);
     249  } //-------------------------- End of Method ------------------------------
     250
    178251} //============================ END OF CLASS =================================
  • trunk/src/main/java/org/ibisph/xml/service/Document.java

    r3727 r3734  
    22
    33/**
    4  * Interface for all XML type DAO services. 
     4 * Interface for XML type DAO services. 
    55 * <br/><br/>
    66 *
     
    1111  /**
    1212   * Gets a XML Document based on the path and name. 
    13    * @param documentPathAndName either a file disk path or a file disk path
     13   * @param xmlPathAndFilename either a file disk path or a file disk path
    1414   *   that the rdbms uses to locate the blob stored xml.
    1515   * @return loaded XML document or null if not found.
    1616   * @throws Exception
    1717   */
    18   public org.dom4j.Document get(String documentPathAndName) throws Exception;
     18  public org.dom4j.Document get(String xmlPathAndFilename) throws Exception;
    1919
    20   public boolean load(String documentPathAndName, org.dom4j.Document document) throws Exception;
     20  public boolean load(String xmlPathAndFilename, org.dom4j.Document document) throws Exception;
    2121
    2222  /**
    2323   * Saves the supplied XML document to the supplied path and name.
    2424   * @param xmlDocument source document to be persisted.
    25    * @param documentPathAndName either a file disk path or a file disk path
     25   * @param xmlPathAndFilename either a file disk path or a file disk path
    2626   *   that the rdbms uses to save the xml to.
    2727   * @throws Exception
    2828   */
    29   public void save(org.dom4j.Document xmlDocument, String documentPathAndName) throws Exception;
     29  public void save(org.dom4j.Document xmlDocument, String xmlPathAndFilename) throws Exception;
    3030
    3131  /**
    3232   * Deletes a XML Document based on the path and name. 
    33    * @param documentPathAndName either a file disk path or a file disk path
     33   * @param xmlPathAndFilename either a file disk path or a file disk path
    3434   *   that the rdbms uses to delete the xml from.
    3535   * @return true if XML document was successfully removed, otherwise false.
    3636   * @throws Exception
    3737   */
    38   public boolean delete(String documentPathAndName) throws Exception;
     38  public boolean delete(String xmlPathAndFilename) throws Exception;
     39
     40
     41  /**
     42   * Tests if a XML Document exists - based on the path and name. 
     43   * @param xmlPathAndFilename either a file disk path or a file disk path
     44   *   that the rdbms uses to select the xml from.
     45   * @return true if XML document exists, otherwise false.
     46   * @throws Exception
     47   */
     48  public boolean exists(String xmlPathAndFilename) throws Exception;
    3949} //--------------------------- END OF INTERFACE -----------------------------
  • trunk/src/main/java/org/ibisph/xml/service/FileStoredDocument.java

    r3727 r3734  
    4747    return(null);
    4848  } //-------------------------- End of Method ------------------------------
    49   public org.dom4j.Document get(String filename) throws DocumentException {
    50     return( get(new File(filename)) );
     49  public org.dom4j.Document get(String xmlPathAndFilename) throws DocumentException {
     50    return( get(new File(xmlPathAndFilename)) );
    5151  } //-------------------------- End of Method ------------------------------
    5252
     
    107107    writer.setEscapeText(this.escapeTextWhenSaving);
    108108    writer.write(document);
    109     writer.flush();
    110109    writer.close();
    111110  } //-------------------------- End of Method ------------------------------
     
    113112  public void save(
    114113    org.dom4j.Document document,
    115     String completePathAndFilename,
     114    String xmlPathAndFilename,
    116115    OutputFormat outputFormat
    117116  ) throws IOException, UnsupportedEncodingException {
    118     FileLib.createDir( IOPath.getPath(completePathAndFilename) );
    119     save(document, new java.io.FileOutputStream(completePathAndFilename), outputFormat);
     117    FileLib.createDir( IOPath.getPath(xmlPathAndFilename) );
     118    save(document, new java.io.FileOutputStream(xmlPathAndFilename), outputFormat);
    120119  } //-------------------------- End of Method ------------------------------
    121120  public void save(
    122121    org.dom4j.Document document,
    123     String completePathAndFilename
     122    String xmlPathAndFilename
    124123  ) throws IOException, UnsupportedEncodingException {
    125     save(document, completePathAndFilename, outputFormat);
     124    save(document, xmlPathAndFilename, outputFormat);
    126125  } //-------------------------- End of Method ------------------------------
    127126
     
    148147  } //-------------------------- End of Method ------------------------------
    149148
     149
     150  public boolean exists(String documentPathAndName) {
     151    File file = new File(documentPathAndName);
     152    boolean exists = file.exists();
     153    return(exists);
     154  } //-------------------------- End of Method ------------------------------
     155
    150156} //============================ END OF CLASS =================================
    151157
  • trunk/src/main/webapps/ibisph-admin/WEB-INF/config/spring/common.xml

    r3688 r3734  
    173173        -->     
    174174        <bean id="Common.DataSource.JNDI" class="org.springframework.jndi.JndiObjectFactoryBean">
     175                <description>
     176                        JNDI based datasource.  Note the jndiName property value can be
     177                        configured several ways:
     178                        1) If the web.xml has a resource-ref AND the resourceRef=true then
     179                           the shorter name defined can be used (note that both names must
     180                           match).  See comments in the web.xml for more info on resource-ref.
     181                        2) Not using a resource-ref.  In this case you must use a full JNDI
     182                           DataSource name of the form java:comp/env/jdbc/hl_ibisph (explicit
     183                           JNDI name).  When using some enterprise app servers the value is
     184                           implemented as a resource ref so the fully qualified value can
     185                           not be used e.g. jdbc/hl_ibisph.
     186
     187                        The JNDI value MUST match the value specified in the app's context
     188                        - either if defined within the META-INF/context.xml or within an
     189                        app server's config etc.
     190                </description>
    175191                <property name="jndiName" value="jdbc/doh_ibisph"/>
    176192                <property name="resourceRef" value="true"/>
    177         </bean>
    178 
    179         <!--
    180                 IBIS-PH Schema JNDI DataSource name (FULL NAME: java:comp/env/jdbc/hl_ibisph_admin)
    181                 NOTE: when using iplanet at ITS, the value of jdbc/hl_ibisph_admin must be used.
    182                 This value MUST match the value specified in the app's context - either if
    183                 defined within the META-INF/context.xml or within an app server's config.
    184         -->
     193                <property name="lookupOnStartup" value="true"/>
     194                <property name="cache" value="true"/>
     195        </bean>
     196
    185197        <bean id="Common.JDBCTemplate.Factory" class="org.ibisph.jdbc.JDBCTemplateFactory">
    186198                <property name="dataSource" ref="Common.DataSource.JNDI"/>
     
    248260        </bean>
    249261
    250         <bean id="Common.XML.DAO" class="org.ibisph.xml.dao.Document">
     262        <bean id="Common.FileStoredXML.Service" class="org.ibisph.xml.service.FileStoredDocument">
    251263                <property name="outputFormat" ref="Common.XML.OutputFormat"/>
    252264                <property name="escapeTextWhenSaving" value="${XML.EscapeText}"/>
    253         </bean>
     265        </bean>
    254266
    255267        <bean id="Common.DataBeanToXML.Service" class="org.ibisph.databean.DataBeanToXMLService">
  • trunk/src/main/webapps/ibisph-admin/WEB-INF/config/spring/publish-direct.xml

    r3688 r3734  
    4040
    4141        <!--  R E S O U R C E S   /   S E R V I C E S  -->
    42   <!-- Used when app wired for publishing IPs directly to dir.  This bean
    43     provides published_indicators.xml file management.
    44   -->
    45         <bean id="Publish.CategorizedIndex.XML.SystemID" class="org.ibisph.systemid.FileSystemID">     
    46                 <constructor-arg ref="Common.Context.Servlet.RootPath"/>
    47                 <constructor-arg value="../ibisph-view/xml/indicator/categorized_index.xml"/>
     42        <!-- Used when app wired for publishing IPs directly to dir.  This bean
     43          provides published_indicators.xml file management.
     44        -->
     45        <bean id="Publish.CategorizedIndex.XML.PathAndFilename" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">     
     46                <description>used by indicator indexes</description>
     47                <property name="targetObject" ref="Common.Context.Servlet"/>
     48                <property name="targetMethod" value="getRealPath"/>
     49                <property name="arguments"><list><value>../ibisph-view/xml/indicator/categorized_index.xml</value></list></property>
    4850        </bean>
    49         <bean id="Publish.OrgUnits.XML.SystemID" class="org.ibisph.systemid.FileSystemID">     
    50                 <constructor-arg ref="Common.Context.Servlet.RootPath"/>
    51                 <constructor-arg value="../ibisph-view/xml/org_units.xml"/>
     51        <bean id="Publish.OrgUnits.XML.PathAndFilename" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">     
     52                <description>used by indicator indexes</description>
     53                <property name="targetObject" ref="Common.Context.Servlet"/>
     54                <property name="targetMethod" value="getRealPath"/>
     55                <property name="arguments"><list><value>../ibisph-view/xml/org_units.xml</value></list></property>
     56        </bean>
     57        <bean id="Publish.PublishedIndicatorProfilesXML.PathAndFilename" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">   
     58                <description>used by indicator indexes</description>
     59                <property name="targetObject" ref="Common.Context.Servlet"/>
     60                <property name="targetMethod" value="getRealPath"/>
     61                <property name="arguments"><list><value>../ibisph-view/xml/indicator/published_profiles.xml</value></list></property>
    5262        </bean>
    5363        <bean id="Publish.IndicatorProfile.XML.Path" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
     
    5666                <property name="arguments"><list><value>../ibisph-view/xml/indicator/profile</value></list></property>
    5767        </bean>
    58         <bean id="Publish.PublishedIndicatorProfiles.XML.SystemID" class="org.ibisph.systemid.FileSystemID">    <!-- used by indicator indexes -->
    59                 <constructor-arg ref="Common.Context.Servlet.RootPath"/>
    60                 <constructor-arg value="../ibisph-view/xml/indicator/published_profiles.xml"/>
    61         </bean>
    6268
    6369        <bean id="Publish.PublishedIndicators.Service" class="org.ibisph.indicatorprofile.service.PublishedIndicatorsXML">
    64                 <property name="publishedIndicatorProfilesSystemID" ref="Publish.PublishedIndicatorProfiles.XML.SystemID"/>
    65                 <property name="documentDAO"               ref="Common.XML.DAO"/>
    66                 <property name="fileBackupFactory"         ref="Common.Versioned.FileBackupFactory"/>
    67                 <property name="indicatorProfileXMLPath"   ref="Publish.IndicatorProfile.XML.Path"/>
     70                <property name="publishedIndicatorsPathAndFilename" ref="Publish.PublishedIndicatorProfilesXML.PathAndFilename"/>
     71                <property name="XMLPath" ref="Publish.IndicatorProfile.XML.Path"/>
     72                <property name="XMLDocumentService" ref="Common.FileStoredXML.Service"/>
     73                <property name="fileBackupFactory"  ref="Common.Versioned.FileBackupFactory"/>
    6874        </bean>
    6975
     
    7480                <property name="dataBeanDAOService"   ref="Common.DataBeanDAO.Service"/>
    7581                <property name="dataBeanToXMLService" ref="Common.DataBeanToXML.Service"/>
     82                <property name="XMLDocumentService"   ref="Common.FileStoredXML.Service"/>
    7683                <property name="fileBackupFactory"    ref="Common.Versioned.FileBackupFactory"/>
    7784        </bean>
     
    8188                class="org.ibisph.databean.springmvc.PublishCollectionToXMLFileController"
    8289        >
    83                 <property name="destinationXMLSystemID" ref="Publish.CategorizedIndex.XML.SystemID"/>
     90                <property name="XMLPathAndFilename" ref="Publish.CategorizedIndex.XML.PathAndFilename"/>
    8491                <property name="dataBeanClassName"  value="org.ibisph.indicatorprofile.databean.CategorizedIndex"/>
    8592                <property name="rootXMLElementName" value="CATEGORIZED_INDEXES"/>
     
    9097                class="org.ibisph.databean.springmvc.PublishCollectionToXMLFileController"
    9198        >
    92                 <property name="destinationXMLSystemID"  ref="Publish.OrgUnits.XML.SystemID"/>
     99                <property name="XMLPathAndFilename"  ref="Publish.OrgUnits.XML.PathAndFilename"/>
    93100                <property name="dataBeanClassName"  value="org.ibisph.indicatorprofile.databean.OrgUnit"/>
    94101                <property name="rootXMLElementName" value="ORG_UNITS"/>
     
    98105        <bean id="Publish.Indicator.ToXMLFile.CommonProperties" abstract="true">
    99106                <property name="dataBeanDAOService"            ref="Common.DataBeanDAO.Service"/>
    100                 <property name="indicatorDataBeanToXMLService"     ref="Indicator.DataBeanToXML.Service"/>
     107                <property name="indicatorDataBeanToXMLService" ref="Indicator.DataBeanToXML.Service"/>
    101108                <property name="indicatorViewDataBeanToXMLService" ref="IndicatorView.DataBeanToXML.Service"/>
    102109                <property name="publishedIndicatorsService"    ref="Publish.PublishedIndicators.Service"/>
    103                 <property name="saveXMLToDirectory"            ref="Publish.IndicatorProfile.XML.Path"/>
     110                <property name="XMLPath"                       ref="Publish.IndicatorProfile.XML.Path"/>
     111                <property name="XMLDocumentService"            ref="Common.FileStoredXML.Service"/>
    104112                <property name="fileBackupFactory"             ref="Common.Versioned.FileBackupFactory"/>
    105113        </bean>
     
    114122
    115123</beans>
     124
  • trunk/src/main/webapps/ibisph-admin/WEB-INF/web.xml

    r3726 r3734  
    190190                mechanism so it is used because if setup correctly is will allow for the
    191191                resource object to be named one thing yet referenced via the IBIS name
    192                 so no additional configuration is needed by an adopter.
     192                so no additional configuration is needed by an adopter.  If the resouce-ref
     193                is not used then the fully qualified JNDI "might" need to be specified -
     194                depends on the container.
    193195
    194196                BASIC STEPS ON HOW TO SETUP A RESOURCE:
     
    209211                xml configuration file. 
    210212                4) Make sure the JNDI name set within the app's Spring bean file(s)
    211                 match the name specified in the above.  Note also that the app's
    212                 META-INF/context.xml entry can be used for some definitions.
     213                match the name specified in the above.  The jndi object reference
     214                also needs the property name="resourceRef" value="true". 
     215               
     216                Again, another mechanism is to use the app's META-INF/context.xml
     217                but then what's the point - might as well configure the spring bean.
    213218        -->
    214219        <resource-ref>
     
    462467                                /WEB-INF/config/spring/system.xml
    463468
    464                                 /WEB-INF/config/spring/publish-direct.xml
     469/WEB-INF/config/spring/publish-blob.xml
    465470
    466471                                /WEB-INF/config/spring/dispatcher_servlet.xml
  • trunk/src/main/webapps/ibisph-view/WEB-INF/config/spring/common.xml

    r3727 r3734  
    168168                <property name="formattedDateModelMapKey" ref="Common.ModifiedDateModelMapKey"/>
    169169                <property name="dateFormat"               ref="Common.DateFormat"/>
     170                <property name="sourceModelDateXPathList">
     171                        <list>
     172                                <value>MODIFIED_DTS</value>
     173                        </list>
     174                </property>
    170175        </bean>
    171176
     
    190195                                <property name="dataSource">
    191196                                        <bean class="org.springframework.jndi.JndiObjectFactoryBean">
    192                                                 <property name="jndiName" value="java:comp/env/jdbc/doh_ibisph"/>
     197                                                <property name="jndiName" value="jdbc/doh_ibisph"/>
     198                                                <property name="resourceRef" value="true"/>
     199                                                <property name="lookupOnStartup" value="true"/>
     200                                                <property name="cache" value="true"/>
    193201                                        </bean>
    194202                                </property>
  • trunk/src/main/webapps/ibisph-view/WEB-INF/config/spring/publish-remote.xml

    r3727 r3734  
    5757        </bean>
    5858
     59        <bean id="Publish.PublishedIndicatorProfilesXML.PathAndFilename" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">    <!-- used by indicator indexes -->
     60                <property name="targetObject" ref="Common.Context.Servlet"/>
     61                <property name="targetMethod" value="getRealPath"/>
     62                <property name="arguments"><list><value>../ibisph-view/xml/indicator/published_profiles.xml</value></list></property>
     63        </bean>
     64
    5965
    6066
     
    8793
    8894        <bean id="Publish.PublishedIndicators.Service" class="org.ibisph.indicatorprofile.service.PublishedIndicatorsXML">
    89                 <property name="publishedIndicatorProfilesSystemID" ref="Indicator.PublishedIndicatorProfiles.XML.SystemID"/>
    90 <property name="XMLDocumentService"         ref="Common.FileStoredXML.Service"/>
    91                 <property name="fileBackupFactory"          ref="Publish.Versioned.FileBackupFactory"/>
    92                 <property name="indicatorProfileXMLPath"    ref="Indicator.Profile.XML.Path"/>
     95                <property name="publishedIndicatorsPathAndFilename" ref="Publish.PublishedIndicatorProfilesXML.PathAndFilename"/>
     96                <property name="XMLPath" ref="Indicator.Profile.XML.Path"/>
     97<property name="XMLDocumentService" ref="Common.FileStoredXML.Service"/>
     98<!--
     99                <property name="fileBackupFactory"  ref="Publish.Versioned.FileBackupFactory"/>
     100-->
    93101        </bean>
    94102
  • trunk/src/main/webapps/ibisph-view/WEB-INF/config/spring/query.xml

    r3727 r3734  
    104104                <property name="sourceModelModelMapKey"   ref="Common.XML.ModelMapKey"/>
    105105                <property name="formattedDateModelMapKey" ref="Common.ModifiedDateModelMapKey"/>
    106                 <property name="sourceModelDateXPath"     value="/QUERY_MODULE/FILE_LAST_MODIFIED_DTS"/>
    107                 <property name="dateFormat"               ref="Common.DateFormat"/>
     106                <property name="sourceModelDateXPathList">
     107                        <list><value>/QUERY_MODULE/FILE_LAST_MODIFIED_DTS</value></list>
     108                </property>
     109                <property name="dateFormat" ref="Common.DateFormat"/>
    108110        </bean>
    109111
Note: See TracChangeset for help on using the changeset viewer.