Use Java naming conventions
[yaz4j-moved-to-github.git] / src / main / java / org / yaz4j / Connection.java
1 package org.yaz4j;
2
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;
10
11 public class Connection {
12
13     private String host;
14     private int port;
15     private ConnectionOptionsCollection options = null;
16     protected SWIGTYPE_p_ZOOM_connection_p zoomConnection = null;
17     private boolean connected = false;
18     private boolean disposed = false;
19
20     static {
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";
24         try {
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) + "'");
29             e.printStackTrace();
30         }
31     }
32
33     public Connection(String host, int port) {
34         this.host = host;
35         this.port = port;
36
37         options = new ConnectionOptionsCollection();
38         zoomConnection = yaz4jlib.ZOOM_connection_create(options.zoomOptions);
39
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);
44     }
45
46     public void finalize() {
47         dispose();
48     }
49
50     private void checkErrorCodeAndThrow(int errorCode) {
51         String message;
52
53         if (errorCode == yaz4jlibConstants.ZOOM_ERROR_NONE) {
54             return;
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);
70         } else {
71             String errMsgBib1 = "Bib1Exception: Error Code = " + errorCode + " (" + Bib1Diagnostic.getError(errorCode) + ")";
72             throw new Bib1Exception(errMsgBib1);
73         }
74     }
75
76     private enum QueryType {
77
78         CQLQuery, PrefixQuery
79     };
80
81     public ResultSet search(PrefixQuery query) {
82         return search(query.getQueryString(), QueryType.PrefixQuery);
83     }
84
85     public ResultSet search(CQLQuery query) {
86         return search(query.getQueryString(), QueryType.CQLQuery);
87     }
88
89     private ResultSet search(String query, QueryType queryType) {
90         ensureConnected();
91
92         SWIGTYPE_p_ZOOM_query_p yazQuery = yaz4jlib.ZOOM_query_create();
93         ResultSet resultSet = null;
94
95         try {
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);
100             } else {
101                 throw new InvalidQueryException("queryType");
102             }
103
104             SWIGTYPE_p_ZOOM_resultset_p yazResultSet = yaz4jlib.ZOOM_connection_search(zoomConnection, yazQuery);
105
106             int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
107             if (errorCode != yaz4jlib.ZOOM_ERROR_NONE) {
108                 yaz4jlib.ZOOM_resultset_destroy(yazResultSet);
109             }
110             checkErrorCodeAndThrow(errorCode);
111
112             resultSet = new ResultSet(yazResultSet, zoomConnection);
113         } finally {
114             yaz4jlib.ZOOM_query_destroy(yazQuery); // deallocate yazQuery also when exceptions
115             yazQuery = null;
116         }
117         return resultSet;
118     }
119
120     public ScanSet scan(String query) {
121         ensureConnected();
122         SWIGTYPE_p_ZOOM_scanset_p yazScanSet = yaz4jlib.ZOOM_connection_scan(zoomConnection, query);
123
124         int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
125         if (errorCode != yaz4jlib.ZOOM_ERROR_NONE) {
126             yaz4jlib.ZOOM_scanset_destroy(yazScanSet);
127         }
128         checkErrorCodeAndThrow(errorCode);
129
130         ScanSet scanSet = new ScanSet(yazScanSet, this);
131         return scanSet;
132     }
133
134     public ConnectionOptionsCollection getOptions() {
135         return options;
136     }
137
138     protected void ensureConnected() {
139         if (!connected) {
140             connect();
141         }
142     }
143
144     public void connect() {
145         yaz4jlib.ZOOM_connection_connect(zoomConnection, host, port);
146         int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
147         checkErrorCodeAndThrow(errorCode);
148         connected = true;
149     }
150
151     public void dispose() {
152         if (!disposed) {
153             yaz4jlib.ZOOM_connection_destroy(zoomConnection);
154             zoomConnection = null;
155             disposed = true;
156         }
157     }
158
159     public String getSyntax() {
160         return options.get("preferredRecordSyntax");
161     }
162
163     public void setSyntax(String value) {
164         options.set("preferredRecordSyntax", value);
165     }
166
167     public String getDatabaseName() {
168         return options.get("databaseName");
169     }
170
171     public void setDatabaseName(String value) {
172         options.set("databaseName", value);
173     }
174
175     public String getUsername() {
176         return options.get("user");
177     }
178
179     public void setUsername(String value) {
180         options.set("user", value);
181     }
182
183     public String getPassword() {
184         return options.get("password");
185     }
186
187     public void setPassword(String value) {
188         options.set("password", value);
189     }
190 }