001: /*
002:
003: Derby - Class org.apache.derby.iapi.services.property.PropertyValidation
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.iapi.services.property;
023:
024: import org.apache.derby.iapi.reference.Attribute;
025: import org.apache.derby.iapi.reference.Property;
026: import org.apache.derby.iapi.reference.SQLState;
027:
028: import org.apache.derby.iapi.services.property.PropertyUtil;
029: import org.apache.derby.iapi.error.StandardException;
030: import org.apache.derby.iapi.services.daemon.Serviceable;
031: import org.apache.derby.iapi.services.property.PropertySetCallback;
032: import org.apache.derby.iapi.store.access.TransactionController;
033: import org.apache.derby.iapi.store.access.conglomerate.TransactionManager;
034: import java.io.Serializable;
035: import java.util.Dictionary;
036: import java.util.Enumeration;
037: import java.util.Properties;
038: import java.util.Vector;
039:
040: public class PropertyValidation implements PropertyFactory {
041: private Vector notifyOnSet;
042:
043: /* Constructors for This class: */
044: public PropertyValidation() {
045:
046: }
047:
048: public Serializable doValidateApplyAndMap(TransactionController tc,
049: String key, Serializable value, Dictionary d,
050: boolean dbOnlyProperty) throws StandardException {
051: Serializable mappedValue = null;
052: if (notifyOnSet != null) {
053: synchronized (this ) {
054:
055: for (int i = 0; i < notifyOnSet.size(); i++) {
056: PropertySetCallback psc = (PropertySetCallback) notifyOnSet
057: .elementAt(i);
058: if (!psc.validate(key, value, d))
059: continue;
060:
061: // if this property should not be used then
062: // don't call apply. This depends on where
063: // the old value comes from
064: // SET_IN_JVM - property will not be used
065: // SET_IN_DATABASE - propery will be used
066: // SET_IN_APPLICATION - will become SET_IN_DATABASE
067: // NOT_SET - will become SET_IN_DATABASE
068:
069: if (!dbOnlyProperty && key.startsWith("derby.")) {
070: if (PropertyUtil.whereSet(key, d) == PropertyUtil.SET_IN_JVM)
071: continue;
072: }
073:
074: Serviceable s;
075: if ((s = psc.apply(key, value, d)) != null)
076: ((TransactionManager) tc).addPostCommitWork(s);
077: if (mappedValue == null)
078: mappedValue = psc.map(key, value, d);
079: }
080: }
081: }
082: return mappedValue;
083: }
084:
085: /**
086: Call the property set callbacks to map a proposed property value
087: to a value to save.
088: <P>
089: The caller must run this in a block synchronized on this
090: to serialize validations with changes to the set of
091: property callbacks
092: */
093: public Serializable doMap(String key, Serializable value,
094: Dictionary set) throws StandardException {
095: Serializable mappedValue = null;
096: if (notifyOnSet != null) {
097: for (int i = 0; i < notifyOnSet.size()
098: && mappedValue == null; i++) {
099: PropertySetCallback psc = (PropertySetCallback) notifyOnSet
100: .elementAt(i);
101: mappedValue = psc.map(key, value, set);
102: }
103: }
104:
105: if (mappedValue == null)
106: return value;
107: else
108: return mappedValue;
109: }
110:
111: public void validateSingleProperty(String key, Serializable value,
112: Dictionary set) throws StandardException {
113: // RESOLVE: log device cannot be changed on the fly right now
114: if (key.equals(Attribute.LOG_DEVICE)) {
115: throw StandardException
116: .newException(SQLState.RAWSTORE_CANNOT_CHANGE_LOGDEVICE);
117: }
118:
119: if (notifyOnSet != null) {
120: for (int i = 0; i < notifyOnSet.size(); i++) {
121: PropertySetCallback psc = (PropertySetCallback) notifyOnSet
122: .elementAt(i);
123: psc.validate(key, value, set);
124: }
125: }
126: }
127:
128: public synchronized void addPropertySetNotification(
129: PropertySetCallback who) {
130:
131: if (notifyOnSet == null)
132: notifyOnSet = new Vector(1, 1);
133: notifyOnSet.addElement(who);
134:
135: }
136:
137: public synchronized void verifyPropertySet(Properties p,
138: Properties ignore) throws StandardException {
139: for (Enumeration e = p.propertyNames(); e.hasMoreElements();) {
140: String pn = (String) e.nextElement();
141: //
142: //Ignore the ones we are told to ignore.
143: if (ignore.getProperty(pn) != null)
144: continue;
145: Serializable pv = p.getProperty(pn);
146: validateSingleProperty(pn, pv, p);
147: }
148: }
149: }
|