001package gu.sql2java.store;
002
003import static gu.sql2java.store.BinaryUtils.*;
004
005import java.io.IOException;
006import java.net.URL;
007
008/**
009 * 二进制数据对象定义 
010 * @author guyadong
011 *
012 */
013public class URLInfo {
014    /**
015     * 数据文件位置
016     */
017        public URL location=null;
018
019    /**
020     * 文件后缀
021     */
022        public String extension=null;
023
024        private volatile String md5;
025        private URLInfo() {             
026        }
027    /**
028     * 返回二进制数据MD5
029     * @return 二进制数据MD5
030     */
031        public String getMD5(){
032                if( null == md5){
033                        synchronized (this) {
034                                if( null == md5){
035                                        try {
036                                                md5 = location == null ? null : getMD5String(getBytes(location));
037                                        } catch (DataNotFoundException e) {
038                                                // DO NOTHING
039                                        }catch (IOException e) {
040                                                throw new IllegalArgumentException(e);
041                                        }
042                                }
043                        }
044                }
045                return md5;
046        }
047        /**
048         * 填充{@link URLInfo}相关字段字段<br>
049         * {@link URLInfo#location}和imgURL不能 同时为null,否则抛出{@link IllegalArgumentException}
050         * @param url 数据位置
051         * @param annImage
052         * @return 
053         */
054        URLInfo fill(URL url) {
055                if(null == url){
056                        throw new NullPointerException("url is null");
057                }
058                location = url;
059                try{
060                        int lastDot = url.getFile().lastIndexOf('.');
061                        extension = lastDot < 0 ? null :  url.getFile().substring(lastDot + 1);
062                }catch (IndexOutOfBoundsException e) {
063                        extension = null;
064                }                       
065                return this;
066        }
067        /**
068         * 根据{@link URL}创建{@link URLInfo}对象,填充必要的图像参数字段<br>
069         * 异常封装到{@link RuntimeException}抛出
070         * @param url
071         * @return
072         * @see {@link #fill(URL, URLInfo)}
073         */
074        public static URLInfo wrap(URL url) {
075                return new URLInfo().fill(url);
076        }
077
078}