1 /* 2 * Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 package javax.sql.rowset.serial; 27 28 import java.sql.*; 29 import java.io.*; 30 import java.net.URL; 31 32 33 /** 34 * A serialized mapping in the Java programming language of an SQL 35 * <code>DATALINK</code> value. A <code>DATALINK</code> value 36 * references a file outside of the underlying data source that the 37 * data source manages. 38 * <P> 39 * <code>RowSet</code> implementations can use the method <code>RowSet.getURL</code> 40 * to retrieve a <code>java.net.URL</code> object, which can be used 41 * to manipulate the external data. 42 * <pre> 43 * java.net.URL url = rowset.getURL(1); 44 * </pre> 45 * 46 * <h3> Thread safety </h3> 47 * 48 * A SerialDatalink is not safe for use by multiple concurrent threads. If a 49 * SerialDatalink is to be used by more than one thread then access to the 50 * SerialDatalink should be controlled by appropriate synchronization. 51 * 52 * @since 1.5 53 */ 54 public class SerialDatalink implements Serializable, Cloneable { 55 56 /** 57 * The extracted URL field retrieved from the DATALINK field. 58 * @serial 59 */ 60 private URL url; 61 62 /** 63 * The SQL type of the elements in this <code>SerialDatalink</code> 64 * object. The type is expressed as one of the constants from the 65 * class <code>java.sql.Types</code>. 66 * @serial 67 */ 68 private int baseType; 69 70 /** 71 * The type name used by the DBMS for the elements in the SQL 72 * <code>DATALINK</code> value that this SerialDatalink object 73 * represents. 74 * @serial 75 */ 76 private String baseTypeName; 77 78 /** 79 * Constructs a new <code>SerialDatalink</code> object from the given 80 * <code>java.net.URL</code> object. 81 * 82 * @param url the {@code URL} to create the {@code SerialDataLink} from 83 * @throws SerialException if url parameter is a null 84 */ 85 public SerialDatalink(URL url) throws SerialException { 86 if (url == null) { 87 throw new SerialException("Cannot serialize empty URL instance"); 88 } 89 this.url = url; 90 } 91 92 /** 93 * Returns a new URL that is a copy of this <code>SerialDatalink</code> 94 * object. 95 * 96 * @return a copy of this <code>SerialDatalink</code> object as a 97 * <code>URL</code> object in the Java programming language. 98 * @throws SerialException if the <code>URL</code> object cannot be de-serialized 99 */ 100 public URL getDatalink() throws SerialException { 101 102 URL aURL = null; 103 104 try { 105 aURL = new URL((this.url).toString()); 106 } catch (java.net.MalformedURLException e) { 107 throw new SerialException("MalformedURLException: " + e.getMessage()); 108 } 109 return aURL; 110 } 111 112 /** 113 * Compares this {@code SerialDatalink} to the specified object. 114 * The result is {@code true} if and only if the argument is not 115 * {@code null} and is a {@code SerialDatalink} object whose URL is 116 * identical to this object's URL 117 * 118 * @param obj The object to compare this {@code SerialDatalink} against 119 * 120 * @return {@code true} if the given object represents a {@code SerialDatalink} 121 * equivalent to this SerialDatalink, {@code false} otherwise 122 * 123 */ 124 public boolean equals(Object obj) { 125 if (this == obj) { 126 return true; 127 } 128 if (obj instanceof SerialDatalink) { 129 SerialDatalink sdl = (SerialDatalink) obj; 130 return url.equals(sdl.url); 131 } 132 return false; 133 } 134 135 /** 136 * Returns a hash code for this {@code SerialDatalink}. The hash code for a 137 * {@code SerialDatalink} object is taken as the hash code of 138 * the {@code URL} it stores 139 * 140 * @return a hash code value for this object. 141 */ 142 public int hashCode() { 143 return 31 + url.hashCode(); 144 } 145 146 /** 147 * Returns a clone of this {@code SerialDatalink}. 148 * 149 * @return a clone of this SerialDatalink 150 */ 151 public Object clone() { 152 try { 153 SerialDatalink sdl = (SerialDatalink) super.clone(); 154 return sdl; 155 } catch (CloneNotSupportedException ex) { 156 // this shouldn't happen, since we are Cloneable 157 throw new InternalError(); 158 } 159 } 160 161 /** 162 * readObject and writeObject are called to restore the state 163 * of the {@code SerialDatalink} 164 * from a stream. Note: we leverage the default Serialized form 165 */ 166 167 /** 168 * The identifier that assists in the serialization of this 169 * {@code SerialDatalink} object. 170 */ 171 static final long serialVersionUID = 2826907821828733626L; 172 }