001: /*
002:
003: Derby - Class org.apache.derby.iapi.services.io.FormatableProperties
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.io;
023:
024: import org.apache.derby.iapi.services.io.ArrayInputStream;
025:
026: import org.apache.derby.iapi.services.io.FormatIdUtil;
027: import org.apache.derby.iapi.services.io.Formatable;
028: import org.apache.derby.iapi.services.io.StoredFormatIds;
029:
030: import java.util.Enumeration;
031: import java.util.Properties;
032:
033: import java.io.IOException;
034: import java.io.ObjectOutput;
035: import java.io.ObjectInput;
036:
037: /**
038: * A formatable holder for a java.util.Properties.
039: * Used to avoid serializing Properties.
040: */
041: public class FormatableProperties extends Properties implements
042: Formatable {
043: /********************************************************
044: **
045: ** This class implements Formatable. That means that it
046: ** can write itself to and from a formatted stream. If
047: ** you add more fields to this class, make sure that you
048: ** also write/read them with the writeExternal()/readExternal()
049: ** methods.
050: **
051: ** If, inbetween releases, you add more fields to this class,
052: ** then you should bump the version number emitted by the getTypeFormatId()
053: ** method.
054: **
055: ********************************************************/
056:
057: /**
058: * Niladic constructor for formatable
059: */
060: public FormatableProperties() {
061: this (null);
062: }
063:
064: /**
065: * Creates an empty property list with the specified
066: * defaults.
067: *
068: * @param defaults the defaults
069: */
070: public FormatableProperties(Properties defaults) {
071: super (defaults);
072: }
073:
074: /**
075: Clear the defaults from this Properties set.
076: This sets the default field to null and thus
077: breaks any link with the Properties set that
078: was the default.
079: */
080: public void clearDefaults() {
081: defaults = null;
082: }
083:
084: //////////////////////////////////////////////
085: //
086: // FORMATABLE
087: //
088: //////////////////////////////////////////////
089: /**
090: * Write the properties out. Step through
091: * the enumeration and write the strings out
092: * in UTF.
093: *
094: * @param out write bytes here
095: *
096: * @exception IOException thrown on error
097: */
098: public void writeExternal(ObjectOutput out) throws IOException {
099: out.writeInt(size());
100: for (Enumeration e = keys(); e.hasMoreElements();) {
101: String key = (String) e.nextElement();
102: out.writeUTF(key);
103: out.writeUTF(getProperty(key));
104: }
105: }
106:
107: /**
108: * Read the properties from a stream of stored objects.
109: *
110: * @param in read this.
111: *
112: * @exception IOException thrown on error
113: */
114: public void readExternal(ObjectInput in) throws IOException {
115: int size = in.readInt();
116: for (; size > 0; size--) {
117: put(in.readUTF(), in.readUTF());
118: }
119: }
120:
121: public void readExternal(ArrayInputStream in) throws IOException {
122: int size = in.readInt();
123: for (; size > 0; size--) {
124: put(in.readUTF(), in.readUTF());
125: }
126: }
127:
128: /**
129: * Get the formatID which corresponds to this class.
130: *
131: * @return the formatID of this class
132: */
133: public int getTypeFormatId() {
134: return StoredFormatIds.FORMATABLE_PROPERTIES_V01_ID;
135: }
136: }
|