3 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_connection_p;
4 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_query_p;
5 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_resultset_p;
6 import org.yaz4j.jni.SWIGTYPE_p_ZOOM_scanset_p;
7 import org.yaz4j.jni.SWIGTYPE_p_p_char;
8 import org.yaz4j.jni.yaz4jlib;
9 import org.yaz4j.jni.yaz4jlibConstants;
11 public class Connection {
15 private ConnectionOptionsCollection options = null;
16 protected SWIGTYPE_p_ZOOM_connection_p zoomConnection = null;
17 private boolean connected = false;
18 private boolean disposed = false;
21 // on Linux 'yaz4j' maps to 'libyaz4j.so' (i.e. 'lib' prefix & '.so' extension)
22 // on Windows 'yaz4j' maps to 'yaz4j.dll' (i.e. '.dll' extension)
23 String libName = "yaz4j";
25 // System.err.println( "Loading library '"+ System.mapLibraryName( libName ) + "'" );
26 System.loadLibrary(libName);
27 } catch (Throwable e) {
28 System.err.println("Fatal Error: Failed to load library '" + System.mapLibraryName(libName) + "'");
33 public Connection(String host, int port) {
37 options = new ConnectionOptionsCollection();
38 zoomConnection = yaz4jlib.ZOOM_connection_create(options.zoomOptions);
40 SWIGTYPE_p_p_char cp = null;
41 SWIGTYPE_p_p_char addinfo = null;
42 int errorCode = yaz4jlib.ZOOM_connection_error(zoomConnection, cp, addinfo);
43 CheckErrorCodeAndThrow(errorCode);
46 public void finalize() {
50 private void CheckErrorCodeAndThrow(int errorCode) {
53 if (errorCode == yaz4jlibConstants.ZOOM_ERROR_NONE) {
55 } else if (errorCode == yaz4jlib.ZOOM_ERROR_CONNECT) {
56 message = String.format("Connection could not be made to %s:%d", host, port);
57 throw new ConnectionUnavailableException(message);
58 } else if (errorCode == yaz4jlib.ZOOM_ERROR_INVALID_QUERY) {
59 message = String.format("The query requested is not valid or not supported");
60 throw new InvalidQueryException(message);
61 } else if (errorCode == yaz4jlib.ZOOM_ERROR_INIT) {
62 message = String.format("Server %s:%d rejected our init request", host, port);
63 throw new InitRejectedException(message);
64 } else if (errorCode == yaz4jlib.ZOOM_ERROR_TIMEOUT) {
65 message = String.format("Server %s:%d timed out handling our request", host, port);
66 throw new ConnectionTimeoutException(message);
67 } else if ((errorCode == yaz4jlib.ZOOM_ERROR_MEMORY) || (errorCode == yaz4jlib.ZOOM_ERROR_ENCODE) || (errorCode == yaz4jlib.ZOOM_ERROR_DECODE) || (errorCode == yaz4jlib.ZOOM_ERROR_CONNECTION_LOST) || (errorCode == yaz4jlib.ZOOM_ERROR_INTERNAL) || (errorCode == yaz4jlib.ZOOM_ERROR_UNSUPPORTED_PROTOCOL) || (errorCode == yaz4jlib.ZOOM_ERROR_UNSUPPORTED_QUERY)) {
68 message = yaz4jlib.ZOOM_connection_errmsg(zoomConnection);
69 throw new ZoomImplementationException("A fatal error occurred in Yaz: " + errorCode + " - " + message);
71 String errMsgBib1 = "Bib1Exception: Error Code = " + errorCode + " (" + Bib1Diagnostic.GetError(errorCode) + ")";
72 throw new Bib1Exception(errMsgBib1);
76 private enum QueryType {
81 public ResultSet Search(PrefixQuery query) {
82 return Search(query.getQueryString(), QueryType.PrefixQuery);
85 public ResultSet Search(CQLQuery query) {
86 return Search(query.getQueryString(), QueryType.CQLQuery);
89 private ResultSet Search(String query, QueryType queryType) {
92 SWIGTYPE_p_ZOOM_query_p yazQuery = yaz4jlib.ZOOM_query_create();
93 ResultSet resultSet = null;
96 if (queryType == QueryType.CQLQuery) {
97 yaz4jlib.ZOOM_query_cql(yazQuery, query);
98 } else if (queryType == QueryType.PrefixQuery) {
99 yaz4jlib.ZOOM_query_prefix(yazQuery, query);
101 throw new InvalidQueryException("queryType");
104 SWIGTYPE_p_ZOOM_resultset_p yazResultSet = yaz4jlib.ZOOM_connection_search(zoomConnection, yazQuery);
106 int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
107 if (errorCode != yaz4jlib.ZOOM_ERROR_NONE) {
108 yaz4jlib.ZOOM_resultset_destroy(yazResultSet);
110 CheckErrorCodeAndThrow(errorCode);
112 resultSet = new ResultSet(yazResultSet, zoomConnection);
114 yaz4jlib.ZOOM_query_destroy(yazQuery); // deallocate yazQuery also when exceptions
120 public ScanSet Scan(String query) {
122 SWIGTYPE_p_ZOOM_scanset_p yazScanSet = yaz4jlib.ZOOM_connection_scan(zoomConnection, query);
124 int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
125 if (errorCode != yaz4jlib.ZOOM_ERROR_NONE) {
126 yaz4jlib.ZOOM_scanset_destroy(yazScanSet);
128 CheckErrorCodeAndThrow(errorCode);
130 ScanSet scanSet = new ScanSet(yazScanSet, this);
134 public ConnectionOptionsCollection getOptions() {
138 protected void EnsureConnected() {
144 public void Connect() {
145 yaz4jlib.ZOOM_connection_connect(zoomConnection, host, port);
146 int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
147 CheckErrorCodeAndThrow(errorCode);
151 public void Dispose() {
153 yaz4jlib.ZOOM_connection_destroy(zoomConnection);
154 zoomConnection = null;
159 public String getSyntax() {
160 return options.get("preferredRecordSyntax");
163 public void setSyntax(String value) {
164 options.set("preferredRecordSyntax", value);
167 public String getDatabaseName() {
168 return options.get("databaseName");
171 public void setDatabaseName(String value) {
172 options.set("databaseName", value);
175 public String getUsername() {
176 return options.get("user");
179 public void setUsername(String value) {
180 options.set("user", value);
183 public String getPassword() {
184 return options.get("password");
187 public void setPassword(String value) {
188 options.set("password", value);