001: /*
002:
003: Derby - Class org.apache.derby.impl.services.monitor.UpdateServiceProperties
004:
005: Licensed to the Apache Software Foundation (ASF) under one or more
006: contributor license agreements. See the NOTICE file distributed with
007: this work for additional information regarding copyright ownership.
008: The ASF licenses this file to you under the Apache License, Version 2.0
009: (the "License"); you may not use this file except in compliance with
010: the License. You may obtain a copy of the License at
011:
012: http://www.apache.org/licenses/LICENSE-2.0
013:
014: Unless required by applicable law or agreed to in writing, software
015: distributed under the License is distributed on an "AS IS" BASIS,
016: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017: See the License for the specific language governing permissions and
018: limitations under the License.
019:
020: */
021:
022: package org.apache.derby.impl.services.monitor;
023:
024: import org.apache.derby.iapi.services.monitor.PersistentService;
025: import org.apache.derby.iapi.services.sanity.SanityManager;
026:
027: import java.util.Properties;
028: import java.util.Hashtable;
029: import org.apache.derby.io.WritableStorageFactory;
030:
031: import org.apache.derby.iapi.error.StandardException;
032: import org.apache.derby.iapi.error.PassThroughException;
033: import org.apache.derby.iapi.reference.Property;
034:
035: /**
036: */
037: public class UpdateServiceProperties extends Properties {
038:
039: private PersistentService serviceType;
040: private String serviceName;
041: private WritableStorageFactory storageFactory;
042:
043: /*
044: Fix for bug 3668: Following would allow user to change properties while in the session
045: in which the database was created.
046: While the database is being created, serviceBooted would be false. What that means
047: is, don't save changes into services.properties file from here until the database
048: is created. Instead, let BaseMonitor save the properties at the end of the database
049: creation and also set serviceBooted to true at that point. From then on, the
050: services.properties file updates will be made here.
051: */
052: private boolean serviceBooted;
053:
054: public UpdateServiceProperties(PersistentService serviceType,
055: String serviceName, Properties actualSet,
056: boolean serviceBooted) {
057: super (actualSet);
058: this .serviceType = serviceType;
059: this .serviceName = serviceName;
060: this .serviceBooted = serviceBooted;
061: }
062:
063: //look at the comments for serviceBooted at the top to understand this.
064: public void setServiceBooted() {
065: serviceBooted = true;
066: }
067:
068: public void setStorageFactory(WritableStorageFactory storageFactory) {
069: this .storageFactory = storageFactory;
070: }
071:
072: public WritableStorageFactory getStorageFactory() {
073: return storageFactory;
074: }
075:
076: /*
077: ** Methods of Hashtable (overridden)
078: */
079:
080: /**
081: Put the key-value pair in the Properties set and
082: mark this set as modified.
083:
084: @see Hashtable#put
085: */
086: public Object put(Object key, Object value) {
087: Object ref = defaults.put(key, value);
088: if (!((String) key)
089: .startsWith(Property.PROPERTY_RUNTIME_PREFIX))
090: update();
091: return ref;
092: }
093:
094: /**
095: Remove the key-value pair from the Properties set and
096: mark this set as modified.
097:
098: @see Hashtable#remove
099: */
100: public Object remove(Object key) {
101: Object ref = defaults.remove(key);
102: if ((ref != null)
103: && (!((String) key)
104: .startsWith(Property.PROPERTY_RUNTIME_PREFIX)))
105: update();
106: return ref;
107: }
108:
109: /**
110: Saves the service properties to the disk.
111: */
112: public void saveServiceProperties() {
113: if (SanityManager.DEBUG)
114: SanityManager
115: .ASSERT(
116: storageFactory != null,
117: "UpdateServiceProperties.saveServiceProperties() called before storageFactory set.");
118: try {
119: serviceType.saveServiceProperties(serviceName,
120: storageFactory, BaseMonitor
121: .removeRuntimeProperties(defaults), false);
122: } catch (StandardException mse) {
123: throw new PassThroughException(mse);
124: }
125: }
126:
127: /*
128: ** Class specific methods.
129: */
130:
131: private void update() {
132:
133: try {
134: //look at the comments for serviceBooted at the top to understand this if.
135: if (serviceBooted)
136: serviceType.saveServiceProperties(serviceName,
137: storageFactory, BaseMonitor
138: .removeRuntimeProperties(defaults),
139: true);
140: } catch (StandardException mse) {
141: throw new PassThroughException(mse);
142: }
143: }
144:
145: }
|