/webportal/src/main/java/au/org/emii/portal/util/ReloadablePropertiesImpl.java

http://alageospatialportal.googlecode.com/ · Java · 124 lines · 78 code · 14 blank · 32 comment · 14 complexity · b6f4ab7783cd28dce2f84211bb76c2df MD5 · raw file

  1. /*
  2. * To change this template, choose Tools | Templates
  3. * and open the template in the editor.
  4. */
  5. package au.org.emii.portal.util;
  6. import au.org.emii.portal.aspect.CheckNotNull;
  7. import java.io.File;
  8. import java.io.FileInputStream;
  9. import java.io.FileNotFoundException;
  10. import java.io.IOException;
  11. import java.io.InputStream;
  12. import java.util.Date;
  13. import java.util.Properties;
  14. import org.apache.log4j.Logger;
  15. /**
  16. *
  17. * @author geoff
  18. */
  19. public class ReloadablePropertiesImpl implements ReloadableProperties {
  20. protected Logger logger = Logger.getLogger(getClass());
  21. private String filename = null;
  22. private Properties properties = null;
  23. /**
  24. * Date of last reload or null if properties have never been reloaded
  25. */
  26. protected Date lastReloaded = null;
  27. /**
  28. * Get the properties field - perform an initial load or reread if file
  29. * modified as required
  30. * @return properties field or null if it could not be loaded
  31. */
  32. @Override
  33. public Properties getProperties() {
  34. if (updateNeeded()) {
  35. reloadPropertiesNow();
  36. }
  37. return properties;
  38. }
  39. @Override
  40. public String getFilename() {
  41. return filename;
  42. }
  43. @CheckNotNull
  44. @Override
  45. public void setFilename(String filename) {
  46. this.filename = filename;
  47. }
  48. /**
  49. * Reload properties immediately
  50. */
  51. private void reloadPropertiesNow() {
  52. InputStream is = null;
  53. try {
  54. is = new FileInputStream(filename);
  55. if (is != null) {
  56. Properties newProperties = new Properties();
  57. newProperties.load(is);
  58. lastReloaded = new Date();
  59. properties = newProperties;
  60. logger.debug("properties reloaded");
  61. }
  62. } catch (FileNotFoundException e) {
  63. logger.error("file not found: " + filename);
  64. } catch (IOException e) {
  65. logger.error("error loading properties", e);
  66. } finally {
  67. try {
  68. if (is != null) {
  69. is.close();
  70. }
  71. }
  72. // discard error closing input stream
  73. catch (IOException e) {}
  74. }
  75. }
  76. /**
  77. * Block execution until safe to read file
  78. * @param filename
  79. * @param lastReloaded
  80. * @param updating
  81. * @param motd
  82. */
  83. protected boolean updateNeeded() {
  84. boolean updateNeeded = false;
  85. if (filename == null) {
  86. logger.error("Internal error inspecting properties file - no filename specified", new NullPointerException());
  87. } else {
  88. File file = new File(filename);
  89. if (file.exists() && file.canRead()) {
  90. if ((lastReloaded == null) || (file.lastModified() > lastReloaded.getTime())) {
  91. // initial load or update
  92. updateNeeded = true;
  93. }
  94. } else {
  95. logger.error("properties file not found or not readable: " + filename);
  96. }
  97. }
  98. return updateNeeded;
  99. }
  100. /**
  101. * Set properties, update lastReloaded timestamp
  102. * @param properties
  103. */
  104. @CheckNotNull
  105. @Override
  106. public void setProperties(Properties properties) {
  107. this.properties = properties;
  108. lastReloaded = new Date();
  109. }
  110. }