差分発生行の前後
無視リスト:
更新日時:
2010/05/11 20:15:55 (2 年 前)
更新者:
h
ログメッセージ:

refs #2 #8 #9 #7 #6
現状のソースをコミット。一部完了。一部未完了。
関連づいてない完了チケットのチェンジセットもまとめて。
パッケージ階層も大幅に変更。

ファイル:
1 移動

凡例:

変更なし
追加
削除
  • trunk/src/org/rayflood/mikuvat/io/BaseObject.java

    r2 r4  
    99import java.io.File; 
    1010import java.io.FileInputStream; 
     11import java.io.FileNotFoundException; 
    1112import java.io.FileOutputStream; 
     13import java.io.IOException; 
    1214import java.io.InputStream; 
    1315import java.io.ObjectInputStream; 
     
    2123import java.util.zip.ZipOutputStream; 
    2224 
    23 public abstract class ImmutableObject implements Serializable, Cloneable, Comparable<ImmutableObject>{ 
    24         private static final long serialVersionUID = 768886758398033337L; 
    25  
    26         public abstract ImmutableObject setDefault(); 
    27  
    28         public abstract ImmutableObject delete(); 
    29  
     25/** 
     26 * BaseObjectはデータを格納するオブジェクトのベースとなるクラスです。<br> 
     27 * 標準でSerializable, Cloneableを実装しており、派生クラスで定義しなくても使用可能です。<br> 
     28 * シリアライズによるインスタンスのファイル化もサポートしています。<br> 
     29 * <br> 
     30 * Serializableを実装するため、オブジェクト内のフィールドは全て直列化可能なオブジェクトを使ってください。<br> 
     31 * Comparableは派生クラスでオーバーライドしてください。<br> 
     32 * @see java.io.Serializable 
     33 * @see java.lang.Cloneable 
     34 * @see java.lang.Comparable 
     35 */ 
     36public abstract class BaseObject implements Serializable, Cloneable, Comparable<BaseObject>{ 
     37 
     38        private static final long serialVersionUID = 5225438162616635387L; 
     39 
     40        /** 
     41         * このクラスのデフォルト値をセットします。<br> 
     42         * 通常は、デフォルト値がセットされたオブジェクトを返すgetDefault()メソッドも用意します。<br> 
     43         * <pre> 
     44         * public SomeObject extends BaseObject{ 
     45         *     public static SomeObject getDefault(){ 
     46         *         SomeObject someObject = new SomeObject(); 
     47         *         someObject.setDefault(); 
     48         *         return someObject; 
     49         *     } 
     50         * } 
     51         * </pre> 
     52         * 派生クラスでそれぞれの内容にあったsetDefault()メソッドをオーバーライドしてください。<br> 
     53         * @return このクラスのデフォルト値がセットされたオブジェクト 
     54         */ 
     55        public abstract BaseObject setDefault(); 
     56 
     57        /** 
     58         * このオブジェクトの内容を完全に削除します。<br> 
     59         * <br> 
     60         * 派生クラスでそれぞれの内容にあったdelete()メソッドをオーバーライドしてください。<br> 
     61         * また、このメソッド実行後はisDeleted()メソッドがtrueになるようにしてください。<br> 
     62         * @see BaseObject#isDeleted() 
     63         * @return 内容が完全に削除されたこのオブジェクト 
     64         */ 
     65        public abstract BaseObject delete(); 
     66 
     67        /** 
     68         * オブジェクトの内容が論理的に正しいか調べます。<br> 
     69         * 通常は、オブジェクトをファイルに出力しても問題ないかのチェックに使います。<br> 
     70         * <br> 
     71         * 派生クラスでそれぞれの内容にあったvalidate()メソッドをオーバーライドしてください。<br> 
     72         * @return 内容が論理的に正しい場合はtrue、正しくない場合はfalse 
     73         */ 
     74        public abstract boolean validate() throws InvalidBaseObjectException; 
     75 
     76        /** 
     77         * オブジェクトの内容が完全に削除されているか調べます。<br> 
     78         * 通常は、オブジェクトをファイルに出力する際に、省いても良いかのチェックに使います。<br> 
     79         * <br> 
     80         * 派生クラスでそれぞれの内容にあったisDeleted()メソッドをオーバーライドしてください。<br> 
     81         * @see BaseObject#delete() 
     82         * @return 削除されている場合はtrue、されていない場合はfalse 
     83         */ 
    3084        public abstract boolean isDeleted(); 
    3185 
    32         public ImmutableObject cover(Object obj){ 
     86        /** 
     87         * 指定されたオブジェクトでこのオブジェクトを上書きします。<br> 
     88         * ただし、指定されたオブジェクトのうち、値が何も設定されていないフィールドは上書きしません。<br> 
     89         * <br> 
     90         * このメソッドは通常、over()メソッドで使われるので、特別な理由がない限り派生クラスでオーバーライドする必要はありません。<br> 
     91         * @param obj 上書きするオブジェクト 
     92         * @return 上書きされたこのオブジェクト 
     93         * @throws ClassCastException 指定されたオブジェクトの型が、このオブジェクトと一致しない場合 
     94         */ 
     95        public BaseObject cover(BaseObject obj){ 
    3396                return over(obj, true, false); 
    3497        } 
    3598 
    36         public ImmutableObject heap(Object obj){ 
     99        /** 
     100         * 指定されたオブジェクトでこのオブジェクトを上書きします。<br> 
     101         * 上書きする対象は、フィールドに<strong>何らかの値が設定されているもの</strong>のみです。値が設定されていないフィールドには上書きしません。<br> 
     102         * また、指定されたオブジェクトのうち、値が何も設定されていないフィールドは上書きしません。<br> 
     103         * <br> 
     104         * このメソッドは通常、over()メソッドで使われるので、特別な理由がない限り派生クラスでオーバーライドする必要はありません。<br> 
     105         * @param obj 上書きするオブジェクト 
     106         * @return 上書きされたこのオブジェクト 
     107         * @throws ClassCastException 指定されたオブジェクトの型が、このオブジェクトと一致しない場合 
     108         */ 
     109        public BaseObject heap(BaseObject obj){ 
    37110                return over(obj, false, true); 
    38111        } 
    39112 
    40         public ImmutableObject lay(Object obj){ 
     113        /** 
     114         * 指定されたオブジェクトでこのオブジェクトを上書きします。<br> 
     115         * 上書きする対象は、フィールドに<strong>何も値が設定されていないもの</strong>のみです。値が設定されているフィールドには上書きしません。<br> 
     116         * また、指定されたオブジェクトのうち、値が何も設定されていないフィールドは上書きしません。<br> 
     117         * <br> 
     118         * このメソッドは通常、over()メソッドで使われるので、特別な理由がない限り派生クラスでオーバーライドする必要はありません。<br> 
     119         * @param obj 上書きするオブジェクト 
     120         * @return 上書きされたこのオブジェクト 
     121         * @throws ClassCastException 指定されたオブジェクトの型が、このオブジェクトと一致しない場合 
     122         */ 
     123        public BaseObject lay(BaseObject obj){ 
    41124                return over(obj, false, false); 
    42125        } 
    43126 
    44         public abstract ImmutableObject over(Object obj, boolean fill, boolean has); 
    45  
     127        /** 
     128         * 指定されたオブジェクトでこのオブジェクトを上書きします。<br> 
     129         * ただし、指定されたオブジェクトのフィールドがnullの場合は上書きしません。<br> 
     130         * 派生クラスでそれぞれの内容にあったover()メソッドをオーバーライドしてください。<br> 
     131         * <pre> 
     132         * public SomeObject extends BaseObject{ 
     133         *     String aString; 
     134         *     public SomeObject over(Object obj, boolean fill, boolean has){ 
     135         *         SomeObject someObject = ((SomeObject)obj).clone(); 
     136         *         if(someObject.hasAString() && (fill || has == hasAString())){ 
     137         *             setAString(someObject.getAString()); 
     138         *         } 
     139         *         return this; 
     140         *     } 
     141         * } 
     142         * </pre> 
     143         * @see BaseObject#cover(BaseObject) 
     144         * @see BaseObject#heap(BaseObject) 
     145         * @see BaseObject#lay(BaseObject) 
     146         * @param obj 上書きするオブジェクト 
     147         * @param fill trueは、このオブジェクトのフィールドの状態に関係なく上書きする。 
     148         * @param has trueは、このオブジェクトのフィールドがnullではない場合に上書きする。falseはnullの場合に上書きする。 
     149         * @return 上書きされたこのオブジェクト 
     150         * @throws ClassCastException 指定されたオブジェクトの型が、このオブジェクトと一致しない場合 
     151         */ 
     152        public abstract BaseObject over(BaseObject obj, boolean fill, boolean has); 
     153 
     154        /** 
     155         * オブジェクトの文字列表現を返します。<br> 
     156         * 通常、toString()メソッドはこのオブジェクトを「テキストで表現する」文字列を返します。<br> 
     157         * <br> 
     158         * 派生クラスでそれぞれの内容にあったtoString()メソッドをオーバーライドしてください。<br> 
     159         * @see java.lang.Object#toString() 
     160         */ 
     161        @Override 
    46162        public abstract String toString(); 
    47163 
    48         public abstract boolean isReadied(); 
    49  
     164        /** 
     165         * このオブジェクトと「等価」になるオブジェクトがあるかどうかを示します。<br> 
     166         * <br> 
     167         * このメソッドはお互いのオブジェクトをシリアライズしてバイト配列を取得し、そのバイト配列同士を比較します。<br> 
     168         * そのため、オブジェクト同士の、型を含めた完全一致チェックを行います。<br> 
     169         * @param obj 比較対象の参照オブジェクト 
     170         * @return 引数に指定されたオブジェクトとこのオブジェクトが等しい場合は true、そうでない場合は false 
     171         * @see java.lang.Object#equals(java.lang.Object) 
     172         * @see java.io.Serializable 
     173         */ 
     174        @Override 
    50175        public boolean equals(Object obj){ 
    51                 if(obj == null || !(obj instanceof ImmutableObject) ||  !getClass().getName().equals(obj.getClass().getName())){ 
     176                if(obj == null || !getClass().getName().equals(obj.getClass().getName())){ 
    52177                        return false; 
    53178                } 
    54179                try{ 
    55                         return Arrays.equals(encodeBytes(), ((ImmutableObject)obj).encodeBytes()); 
     180                        return Arrays.equals(encodeBytes(), ((BaseObject)obj).encodeBytes()); 
    56181                } 
    57182                catch(Exception e){ 
     
    60185        } 
    61186 
    62         public abstract int compareTo(ImmutableObject obj); 
    63  
     187        /** 
     188         * このオブジェクトのコピーを作成して返します。<br> 
     189         * <br> 
     190         * 直列化してバイト配列を取得し、そのバイト配列から新たなインスタンスを作成するため、クラスに関係なく、常に「ディープコピー」が作成されます。<br> 
     191         * このメソッドの戻り値はObjectクラスになっており、アクセス権限もprotectedになっているため、使う場合は派生クラスでオーバーライドしてください。<br> 
     192         * <pre> 
     193         * public SomeObject extends BaseObject{ 
     194         *     public SomeObject clone(){ 
     195         *         return (SomeObject)super.clone(); 
     196         *     } 
     197         * } 
     198         * </pre> 
     199         * @see BaseObject#encodeBytes() 
     200         * @see BaseObject#decodeBytes(byte[]) 
     201         * @return このインスタンスの複製 
     202         * @see java.lang.Object#clone() 
     203         * @see java.io.Serializable 
     204         */ 
     205        @Override 
     206        protected BaseObject clone(){ 
     207                try{ 
     208                        return decodeBytes(encodeBytes()); 
     209                } 
     210                catch(Exception e){ 
     211                        throw new RuntimeException(e); 
     212                } 
     213        } 
     214 
     215        /** 
     216         * このオブジェクトと指定されたオブジェクトの順序を比較します。<br> 
     217         * このオブジェクトが指定されたオブジェクトより小さい場合は負の整数、等しい場合はゼロ、大きい場合は正の整数を返します。<br> 
     218         * <br> 
     219         * 派生クラスでそれぞれの内容にあったcompareTo()メソッドをオーバーライドしてください。<br> 
     220         * @see BaseObject#compare(Comparable, Comparable) 
     221         * @param obj 比較対象の Object 
     222         * @return このオブジェクトが指定されたオブジェクトより小さい場合は負の整数、等しい場合はゼロ、大きい場合は正の整数 
     223         * @see java.lang.Comparable#compareTo(java.lang.Object) 
     224         */ 
     225        public abstract int compareTo(BaseObject obj); 
     226 
     227        /** 
     228         * 2つのオブジェクトの順序を比較します。<br> 
     229         * 一方のオブジェクトが他方のオブジェクトより小さい場合は負の整数、等しい場合はゼロ、大きい場合は正の整数を返します。<br> 
     230         * <br> 
     231         * オブジェクトがnullだった場合は、nullの方が小さいと判定します。両方nullの場合は等しいと判定します。<br> 
     232         * 引数のオブジェクトはパラメータ化されていないため、オブジェクトの型が合わない場合はClassCastExceptionが発生します。<br> 
     233         * このメソッドは通常、compareTo()メソッドで使われるので、特別な理由がない限り派生クラスでオーバーライドする必要はありません。<br> 
     234         * @see BaseObject#compareTo(BaseObject) 
     235         * @param o1 一方のオブジェクト 
     236         * @param o2 他方のオブジェクト 
     237         * @return o1がo2より小さい場合は負の整数、等しい場合はゼロ、大きい場合は正の整数 
     238         * @throws ClassCastException 指定されたオブジェクトの型が原因で、この Object と比較できない場合 
     239         */ 
     240        @SuppressWarnings("unchecked") 
    64241        protected static int compare(Comparable o1, Comparable o2){ 
    65242                if(o1 == null && o2 == null){ 
     
    75252        } 
    76253 
    77         public static Comparator<ImmutableObject> getComparator(){ 
    78                 return new Comparator<ImmutableObject>(){ 
    79                         public int compare(ImmutableObject o1, ImmutableObject o2){ 
     254        /** 
     255         * オブジェクトのコレクションで「全体順序付け」を行う比較関数です。<br> 
     256         * コンパレータ (Comparator) をソートメソッド (Collections.sort など) に渡すと、ソート順を正確に制御できます。<br> 
     257         * <br> 
     258         * このコンパレータはオブジェクトを「昇順」にソートします。比較はcompareTo()メソッドで行います。<br> 
     259         * compare()メソッドと同じく、特別な理由がない限り派生クラスでオーバーライドする必要はありません。<br> 
     260         * @see BaseObject#getComparatorR() 
     261         * @return 昇順コンパレータ 
     262         * @see java.util.Comparator 
     263         */ 
     264        public static Comparator<BaseObject> getComparator(){ 
     265                return new Comparator<BaseObject>(){ 
     266                        public int compare(BaseObject o1, BaseObject o2){ 
    80267                                return o1.compareTo(o2); 
    81268                        } 
     
    83270        } 
    84271 
    85         public static Comparator<ImmutableObject> getComparatorR(){ 
    86                 return new Comparator<ImmutableObject>(){ 
    87                         public int compare(ImmutableObject o1, ImmutableObject o2){ 
     272        /** 
     273         * オブジェクトのコレクションで「全体順序付け」を行う比較関数です。<br> 
     274         * コンパレータ (Comparator) をソートメソッド (Collections.sort など) に渡すと、ソート順を正確に制御できます。<br> 
     275         * <br> 
     276         * このコンパレータはオブジェクトを「降順」にソートします。比較はcompareTo()メソッドの戻り値 * -1 です。<br> 
     277         * compare()メソッドと同じく、特別な理由がない限り派生クラスでオーバーライドする必要はありません。<br> 
     278         * @see BaseObject#getComparator() 
     279         * @return 降順コンパレータ 
     280         * @see java.util.Comparator 
     281         */ 
     282        public static Comparator<BaseObject> getComparatorR(){ 
     283                return new Comparator<BaseObject>(){ 
     284                        public int compare(BaseObject o1, BaseObject o2){ 
    88285                                return o1.compareTo(o2) * -1; 
    89286                        } 
     
    91288        } 
    92289 
    93         protected Object clone(){ 
    94                 try{ 
    95                         return decodeBytes(encodeBytes()); 
    96                 } 
    97                 catch(Exception e){ 
    98                         throw new RuntimeException(e); 
    99                 } 
    100         } 
    101  
    102         private static Object decodeBytes(byte[] buf) throws Exception{ 
    103                 return unserialize(new ByteArrayInputStream(buf)); 
    104         } 
    105  
    106         private static Object unserialize(InputStream in) throws Exception{ 
    107                 ObjectInputStream ois = new ObjectInputStream(in); 
    108                 return ois.readObject(); 
    109         } 
    110  
    111         private byte[] encodeBytes() throws Exception{ 
     290        /** 
     291         * このオブジェクトを直列化し、指定された出力ストリームに書き込みます。<br> 
     292         * 出力ストリームは自動的に閉じられるため、再利用できません。<br> 
     293         * @see BaseObject#unserialize(InputStream) 
     294         * @param out 出力ストリーム 
     295         * @throws IOException 
     296         */ 
     297        private void serialize(OutputStream out) throws IOException{ 
     298                ObjectOutputStream oos = null; 
     299                try{ 
     300                        oos = new ObjectOutputStream(out); 
     301                        oos.writeObject(this); 
     302                } 
     303                finally{ 
     304                        if(oos != null){ 
     305                                oos.close(); 
     306                        } 
     307                        else{ 
     308                                out.close(); 
     309                        } 
     310                } 
     311        } 
     312 
     313        /** 
     314         * 指定された入力ストリームからオブジェクトを読み込みます。<br> 
     315         * 入力ストリームは自動的に閉じられるため、再利用できません。<br> 
     316         * @see BaseObject#serialize(OutputStream) 
     317         * @param in 入力ストリーム 
     318         * @return 読み込まれたオブジェクト 
     319         * @throws IOException 
     320         * @throws ClassNotFoundException 
     321         */ 
     322        private static BaseObject unserialize(InputStream in) throws IOException, ClassNotFoundException{ 
     323                ObjectInputStream ois = null; 
     324                try{ 
     325                        ois = new ObjectInputStream(in); 
     326                        return (BaseObject)ois.readObject(); 
     327                } 
     328                finally{ 
     329                        if(ois != null){ 
     330                                ois.close(); 
     331                        } 
     332                        else{ 
     333                                in.close(); 
     334                        } 
     335                } 
     336        } 
     337 
     338        /** 
     339         * このオブジェクトを直列化し、バイト配列に変換します。<br> 
     340         * @see BaseObject#decodeBytes(byte[]) 
     341         * @return オブジェクトから直列化されたバイト配列 
     342         * @throws IOException 
     343         */ 
     344        protected byte[] encodeBytes() throws IOException{ 
    112345                ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); 
    113346                serialize(byteOut); 
     
    115348        } 
    116349 
    117         private void serialize(OutputStream out) throws Exception{ 
    118                 ObjectOutputStream oos = new ObjectOutputStream(out); 
    119                 oos.writeObject(this); 
    120                 oos.close(); 
    121         } 
    122  
    123         protected static Object load(String file) throws Exception{ 
     350        /** 
     351         * オブジェクトを直列化したバイト配列を、元のオブジェクトに変換します。<br> 
     352         * @see BaseObject#encodeBytes() 
     353         * @param buf オブジェクトから変換されたバイト配列 
     354         * @return 読み込まれたオブジェクト 
     355         * @throws IOException 
     356         * @throws ClassNotFoundException 
     357         */ 
     358        protected static BaseObject decodeBytes(byte[] buf) throws IOException, ClassNotFoundException{ 
     359                return unserialize(new ByteArrayInputStream(buf)); 
     360        } 
     361 
     362        /** 
     363         * このオブジェクトを直列化し、指定された出力ファイルに書き込みます。<br> 
     364         * アクセス権限がprotectedになっているため、使う場合は派生クラスでオーバーライドしてください。<br> 
     365         * store(String)メソッド、zip(File)メソッド、zip(String)メソッドについても同様です。<br> 
     366         * <pre> 
     367         * public SomeObject extends BaseObject{ 
     368         *     public void store(File file) throws FileNotFoundException, IOException{ 
     369         *         super.store(File file); 
     370         *     } 
     371         * } 
     372         * </pre> 
     373         * @see BaseObject#load(File) 
     374         * @param file 出力ファイル 
     375         * @throws FileNotFoundException 
     376         * @throws IOException 
     377         */ 
     378        protected void store(File file) throws FileNotFoundException, IOException{ 
     379                serialize(new BufferedOutputStream(new FileOutputStream(file))); 
     380        } 
     381 
     382        /** 
     383         * ファイル名をStringとして受ける以外はstore(File)と同じです。<br> 
     384         * @see BaseObject#store(File) 
     385         * @param file 出力ファイル 
     386         * @throws FileNotFoundException 
     387         * @throws IOException 
     388         */ 
     389        protected void store(String file) throws FileNotFoundException, IOException{ 
     390                store(new File(file)); 
     391        } 
     392 
     393        /** 
     394         * 入力ファイルからオブジェクトを読み込みます。<br> 
     395         * このメソッドの戻り値はObjectクラスになっており、アクセス権限もprotectedになっているため、使う場合は派生クラスでオーバーライドしてください。<br> 
     396         * load(String)メソッド、unzip(File)メソッド、unzip(String)メソッドについても同様です。<br> 
     397         * <pre> 
     398         * public SomeObject extends BaseObject{ 
     399         *     public static SomeObject load(File file) throws FileNotFoundException, IOException, ClassNotFoundException{ 
     400         *         return (SomeObject)BaseObject.load(File file); 
     401         *     } 
     402         * } 
     403         * </pre> 
     404         * @see BaseObject#store(File) 
     405         * @param file 入力ファイル 
     406         * @return 読み込まれたオブジェクト 
     407         * @throws FileNotFoundException 
     408         * @throws IOException 
     409         * @throws ClassNotFoundException 
     410         */ 
     411        protected static BaseObject load(File file) throws FileNotFoundException, IOException, ClassNotFoundException{ 
     412                return unserialize(new BufferedInputStream(new FileInputStream(file))); 
     413        } 
     414 
     415        /** 
     416         * ファイル名をStringとして受ける以外はload(File)と同じです。<br> 
     417         * @see BaseObject#load(File) 
     418         * @throws FileNotFoundException 
     419         * @throws IOException 
     420         * @throws ClassNotFoundException 
     421         */ 
     422        protected static BaseObject load(String file) throws FileNotFoundException, IOException, ClassNotFoundException{ 
    124423                return load(new File(file)); 
    125424        } 
    126425 
    127         protected static Object load(File file) throws Exception{ 
    128                 return unserialize(new BufferedInputStream(new FileInputStream(file))); 
    129         } 
    130  
    131         protected void store(String file) throws Exception{ 
    132                 store(new File(file)); 
    133         } 
    134  
    135         protected void store(File file) throws Exception{ 
    136                 serialize(new BufferedOutputStream(new FileOutputStream(file))); 
    137         } 
    138  
    139         protected static Object unzip(String file) throws Exception{ 
    140                 return unzip(new File(file)); 
    141         } 
    142  
    143         protected static Object unzip(File file) throws Exception{ 
    144                 ZipInputStream zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(file))); 
    145                 zis.getNextEntry(); 
    146                 return unserialize(zis); 
    147         } 
    148  
    149         protected void zip(String file) throws Exception{ 
    150                 zip(new File(file)); 
    151         } 
    152  
    153         protected void zip(File file) throws Exception{ 
    154                 ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(file))); 
    155                 zos.putNextEntry(new ZipEntry(getClass().getName())); 
    156                 serialize(zos); 
    157         } 
    158  
    159         protected static Object decodeXML(String xml) throws Exception{ 
     426        /** 
     427         * このオブジェクトを直列化し、指定されたzipファイルに書き込みます。<br> 
     428         * zipエントリは1つだけで、クラス名がそのままエントリ名になります。<br> 
     429         * 派生クラスでの実装方法はstore(File)を参照してください。<br> 
     430         * @see BaseObject#store(File) 
     431         * @see BaseObject#unzip(File) 
     432         * @param zip zipファイル 
     433         * @throws IOException 
     434         */ 
     435        protected void zip(File zip) throws IOException{ 
     436                ZipOutputStream zos = null; 
     437                try{ 
     438                        zos = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(zip))); 
     439                        zos.putNextEntry(new ZipEntry(getClass().getName())); 
     440                        serialize(zos); 
     441                } 
     442                finally{ 
     443                        if(zos != null){ 
     444                                zos.close(); 
     445                        } 
     446                } 
     447        } 
     448 
     449        /** 
     450         * ファイル名をStringとして受ける以外はzip(File)と同じです。<br> 
     451         * @see BaseObject#zip(File) 
     452         * @param zip zipファイル 
     453         * @throws IOException 
     454         */ 
     455        protected void zip(String zip) throws IOException{ 
     456                zip(new File(zip)); 
     457        } 
     458 
     459        /** 
     460         * zipファイルからオブジェクトを読み込みます。<br> 
     461         * 最初のエントリのみ読み込み、オブジェクトを返した後、zipファイルを閉じます。<br> 
     462         * エントリ名とクラス名が一致しているかはチェックしません。<br> 
     463         * 派生クラスでの実装方法はload(File)を参照してください。<br> 
     464         * @see BaseObject#load(File) 
     465         * @see BaseObject#zip(File) 
     466         * @param zip zipファイル 
     467         * @return 読み込まれたオブジェクト 
     468         * @throws IOException 
     469         * @throws ClassNotFoundException 
     470         */ 
     471        protected static BaseObject unzip(File zip) throws IOException, ClassNotFoundException{ 
     472                ZipInputStream zis = null; 
     473                try{ 
     474                        zis = new ZipInputStream(new BufferedInputStream(new FileInputStream(zip))); 
     475                        zis.getNextEntry(); 
     476                        return unserialize(zis); 
     477                } 
     478                finally{ 
     479                        if(zis != null){ 
     480                                zis.close(); 
     481                        } 
     482                } 
     483        } 
     484 
     485        /** 
     486         * ファイル名をStringとして受ける以外はunzip(File)と同じです。<br> 
     487         * @see BaseObject#unzip(File) 
     488         * @param zip zipファイル 
     489         * @return 読み込まれたオブジェクト 
     490         * @throws IOException 
     491         * @throws ClassNotFoundException 
     492         */ 
     493        protected static BaseObject unzip(String zip) throws IOException, ClassNotFoundException{ 
     494                return unzip(new File(zip)); 
     495        } 
     496 
     497        /** 
     498         * このオブジェクトのJavaBeanテキスト表現を生成し、指定された出力ストリームに書き込みます。<br> 
     499         * 出力ストリームは自動的に閉じられるため、再利用できません。<br> 
     500         * @see BaseObject#decodeXML(InputStream) 
     501         * @param out 出力ストリーム 
     502         * @throws IOException 
     503         * @see java.beans.XMLEncoder 
     504         */ 
     505        private void encodeXML(OutputStream out) throws IOException{ 
     506                XMLEncoder e = null; 
     507                try{ 
     508                        e = new XMLEncoder(out); 
     509                        e.writeObject(this); 
     510                } 
     511                finally{ 
     512                        if(e != null){ 
     513                                e.close(); 
     514                        } 
     515                        else{ 
     516                                out.close(); 
     517                        } 
     518                } 
     519        } 
     520 
     521        /** 
     522         * 指定された入力ストリームからJavaBeanテキスト表現を取得し、オブジェクトを読み込みます。<br> 
     523         * 入力ストリームは自動的に閉じられるため、再利用できません。<br> 
     524         * @see BaseObject#encodeXML(OutputStream) 
     525         * @param in 入力ストリーム 
     526         * @return 読み込まれたオブジェクト 
     527         * @throws IOException 
     528         * @see java.beans.XMLDecoder 
     529         */ 
     530        private static BaseObject decodeXML(InputStream in) throws IOException{ 
     531                XMLDecoder d = null; 
     532                try{ 
     533                        d = new XMLDecoder(in); 
     534                        BaseObject result = (BaseObject)d.readObject(); 
     535                        return result; 
     536                } 
     537                finally{ 
     538                        if(d != null){ 
     539                                d.close(); 
     540                        } 
     541                        else{ 
     542                                in.close(); 
     543                        } 
     544                } 
     545        } 
     546 
     547        /** 
     548         * XMLEncoderを使って、オブジェクトをxmlファイルに書き込みます。<br> 
     549         * <br> 
     550         * ※注:このメソッドはオブジェクトがJavaBeanの仕様に準じる必要があるため、必ずしもstore(File)メソッド、zip(File)メソッドの代替にはなり得ません。<br> 
     551         * 例えばBigDecimalはXMLEncoderで保存することが出来ません。<br> 
     552         * 詳細については、『The Swing Connection』の記事「<a target="_blank" href="http://java.sun.com/products/jfc/tsc/articles/persistence4">Using XMLEncoder</a>」を参照してください。<br> 
     553         * @see BaseObject#decodeXML(File) 
     554         * @param xml xmlファイル 
     555         * @throws FileNotFoundException 
     556         * @throws IOException 
     557         * @see java.beans.XMLEncoder 
     558         */ 
     559        protected void encodeXML(File xml) throws FileNotFoundException, IOException{ 
     560                encodeXML(new BufferedOutputStream(new FileOutputStream(xml))); 
     561        } 
     562 
     563        /** 
     564         * ファイル名をStringとして受ける以外はencodeXML(File)と同じです。<br> 
     565         * @see BaseObject#encodeXML(File) 
     566         * @param xml xmlファイル 
     567         * @throws FileNotFoundException 
     568         * @throws IOException 
     569         */ 
     570        protected void encodeXML(String xml) throws FileNotFoundException, IOException{ 
     571                encodeXML(new File(xml)); 
     572        } 
     573 
     574        /** 
     575         * XMLDecoderを使って、xmlファイルからオブジェクトを読み込みます。<br> 
     576         * <br> 
     577         * ※注:このメソッドはオブジェクトがJavaBeanの仕様に準じる必要があるため、必ずしもload(File)メソッド、unzip(File)メソッドの代替にはなり得ません。<br> 
     578         * 例えばBigDecimalはXMLEncoderで保存することが出来ません。<br> 
     579         * 詳細については、『The Swing Connection』の記事「<a target="_blank" href="http://java.sun.com/products/jfc/tsc/articles/persistence4">Using XMLEncoder</a>」を参照してください。<br> 
     580         * @see BaseObject#encodeXML(File) 
     581         * @param xml xmlファイル 
     582         * @return 読み込まれたオブジェクト 
     583         * @throws FileNotFoundException 
     584         * @throws IOException 
     585         * @see java.beans.XMLDecoder 
     586         */ 
     587        protected static BaseObject decodeXML(File xml) throws FileNotFoundException, IOException{ 
     588                return decodeXML(new BufferedInputStream(new FileInputStream(xml))); 
     589        } 
     590 
     591        /** 
     592         * ファイル名をStringとして受ける以外はdecodeXML(File)と同じです。<br> 
     593         * @see BaseObject#decodeXML(File) 
     594         * @param xml xmlファイル 
     595         * @return 読み込まれたオブジェクト 
     596         * @throws FileNotFoundException 
     597         * @throws IOException 
     598         */ 
     599        protected static BaseObject decodeXML(String xml) throws FileNotFoundException, IOException{ 
    160600                return decodeXML(new File(xml)); 
    161601        } 
    162  
    163         protected static Object decodeXML(File xml) throws Exception{ 
    164                 XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream(xml))); 
    165                 Object result = d.readObject(); 
    166                 d.close(); 
    167                 return result; 
    168         } 
    169  
    170         protected void encodeXML(String xml) throws Exception{ 
    171                 encodeXML(new File(xml)); 
    172         } 
    173  
    174         protected void encodeXML(File xml) throws Exception{ 
    175                 XMLEncoder e = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(xml))); 
    176                 e.writeObject(this); 
    177                 e.close(); 
    178         } 
    179602}