View Javadoc

1   package gov.bnl.gums.configuration;
2   
3   import java.io.BufferedWriter;
4   import java.io.ByteArrayInputStream;
5   import java.io.IOException;
6   import java.io.StringWriter;
7   import java.net.URL;
8   import java.text.DateFormat;
9   import java.text.ParseException;
10  import java.text.SimpleDateFormat;
11  import java.util.Collection;
12  import java.util.Date;
13  import java.util.Iterator;
14  
15  import javax.xml.parsers.ParserConfigurationException;
16  
17  import org.apache.log4j.Logger;
18  import org.xml.sax.SAXException;
19  
20  import gov.bnl.gums.GUMS;
21  import gov.bnl.gums.configuration.Configuration;
22  import gov.bnl.gums.db.ConfigurationDB;
23  import gov.bnl.gums.persistence.HibernatePersistenceFactory;
24  import gov.bnl.gums.persistence.LocalPersistenceFactory;
25  import gov.bnl.gums.persistence.PersistenceFactory;
26  
27  /** Implements the logic to store the configuration in a database except for the bare
28   * configuration to specify the persistence factory at which to store the configuration.
29   *
30   * @author Jay Packard
31   */
32  public class DBConfigurationStore extends ConfigurationStore {
33  	private Logger log = Logger.getLogger(FileConfigurationStore.class);
34  	private ConfigurationDB configDB;
35  	private Configuration conf;
36  	private Date mostRecentModification = null;
37  
38  	public DBConfigurationStore(ConfigurationDB configDB) {
39  		this.configDB = configDB;
40  	}
41  
42  	public void deleteBackupConfiguration(String name) {
43  		if (!configDB.deleteBackupConfiguration(name))
44  			throw new RuntimeException("Could not delete backup configuration '"+name+"' from database");
45  	}
46  
47  	public boolean isActive() {
48  		return configDB.isActive();
49  	}
50  
51  	public Collection getBackupNames() {
52  		return configDB.getBackupNames(format);
53  	}
54  
55  	public Date getLastModification() {
56  		Date date = configDB.getLastModification();
57  		if (log.isTraceEnabled())
58  			log.trace("Last modification from database: "+date.toString());
59  		return date;
60  	}
61  
62  	public synchronized Configuration retrieveConfiguration() throws Exception {
63  		ByteArrayInputStream stream = null;
64  		try {
65  			Date lastModification = getLastModification(); 
66  			if (mostRecentModification==null || mostRecentModification.before(lastModification)) {
67  				String configText = configDB.retrieveCurrentConfiguration();
68  				this.conf = ConfigurationToolkit.parseConfiguration(configText, false);
69  				log.debug("Configuration "+conf+" reloaded from database");
70  				mostRecentModification = lastModification;
71  				return conf;
72  			}
73  		} catch (Exception e) {
74  			throw new RuntimeException(e.getMessage());
75  		} finally {
76  			if (stream != null)
77  				stream.close();
78  		}
79  		return conf;
80  	}
81  
82  	public synchronized Configuration restoreConfiguration(String name) throws Exception {
83  		ByteArrayInputStream stream = null;
84  		try {
85  			String configText = configDB.restoreConfiguration(name);
86  			this.conf = ConfigurationToolkit.parseConfiguration(configText, false);
87  			log.debug("Configuration '" + name + "', "+conf+" restored from database");
88  			mostRecentModification = getLastModification();
89  			return conf;
90  		} catch (Exception e) {
91  			throw new RuntimeException(e.getMessage());
92  		} finally {
93  			if (stream != null)
94  				stream.close();
95  		}
96  	}
97  
98  	public synchronized void setConfiguration(Configuration conf, boolean backupCopy, String name, Date date) throws Exception {
99                  if (date==null)
100                         date = new Date();
101 
102 		if (backupCopy && (name==null || name.length()==0))
103 			name = format.format(date); 
104 		
105 		configDB.setConfiguration(conf.toXml(), backupCopy, name, date);
106 		log.debug("Configuration "+conf+" saved to database");
107 		this.conf = conf;
108 		mostRecentModification = date;
109 	}
110 
111 }