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);
41 SWIGTYPE_p_p_char cp = null;
42 SWIGTYPE_p_p_char addinfo = null;
43 int errorCode = yaz4jlib.ZOOM_connection_error(zoomConnection, cp, addinfo);
44 checkErrorCodeAndThrow(errorCode);
47 public void finalize() {
51 private void checkErrorCodeAndThrow(int errorCode) {
54 if (errorCode == yaz4jlibConstants.ZOOM_ERROR_NONE) {
56 } else if (errorCode == yaz4jlib.ZOOM_ERROR_CONNECT) {
57 message = String.format("Connection could not be made to %s:%d", host, port);
58 throw new ConnectionUnavailableException(message);
59 } else if (errorCode == yaz4jlib.ZOOM_ERROR_INVALID_QUERY) {
60 message = String.format("The query requested is not valid or not supported");
61 throw new InvalidQueryException(message);
62 } else if (errorCode == yaz4jlib.ZOOM_ERROR_INIT) {
63 message = String.format("Server %s:%d rejected our init request", host, port);
64 throw new InitRejectedException(message);
65 } else if (errorCode == yaz4jlib.ZOOM_ERROR_TIMEOUT) {
66 message = String.format("Server %s:%d timed out handling our request", host, port);
67 throw new ConnectionTimeoutException(message);
68 } 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)) {
69 message = yaz4jlib.ZOOM_connection_errmsg(zoomConnection);
70 throw new ZoomImplementationException("A fatal error occurred in Yaz: " + errorCode + " - " + message);
72 String errMsgBib1 = "Bib1Exception: Error Code = " + errorCode + " (" + Bib1Diagnostic.getError(errorCode) + ")";
73 throw new Bib1Exception(errMsgBib1);
77 private enum QueryType {
82 public ResultSet search(PrefixQuery query) {
83 return search(query.getQueryString(), QueryType.PrefixQuery);
86 public ResultSet search(CQLQuery query) {
87 return search(query.getQueryString(), QueryType.CQLQuery);
90 private ResultSet search(String query, QueryType queryType) {
93 SWIGTYPE_p_ZOOM_query_p yazQuery = yaz4jlib.ZOOM_query_create();
94 ResultSet resultSet = null;
97 if (queryType == QueryType.CQLQuery) {
98 yaz4jlib.ZOOM_query_cql(yazQuery, query);
99 } else if (queryType == QueryType.PrefixQuery) {
100 yaz4jlib.ZOOM_query_prefix(yazQuery, query);
102 throw new InvalidQueryException("queryType");
105 SWIGTYPE_p_ZOOM_resultset_p yazResultSet = yaz4jlib.ZOOM_connection_search(zoomConnection, yazQuery);
107 int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
108 if (errorCode != yaz4jlib.ZOOM_ERROR_NONE) {
109 yaz4jlib.ZOOM_resultset_destroy(yazResultSet);
111 checkErrorCodeAndThrow(errorCode);
113 resultSet = new ResultSet(yazResultSet, zoomConnection);
115 yaz4jlib.ZOOM_query_destroy(yazQuery); // deallocate yazQuery also when exceptions
121 public ScanSet scan(String query) {
123 SWIGTYPE_p_ZOOM_scanset_p yazScanSet = yaz4jlib.ZOOM_connection_scan(zoomConnection, query);
125 int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
126 if (errorCode != yaz4jlib.ZOOM_ERROR_NONE) {
127 yaz4jlib.ZOOM_scanset_destroy(yazScanSet);
129 checkErrorCodeAndThrow(errorCode);
131 ScanSet scanSet = new ScanSet(yazScanSet, this);
135 public ConnectionOptionsCollection getOptions() {
139 protected void ensureConnected() {
145 public void connect() {
146 yaz4jlib.ZOOM_connection_connect(zoomConnection, host, port);
147 int errorCode = yaz4jlib.ZOOM_connection_errcode(zoomConnection);
148 checkErrorCodeAndThrow(errorCode);
152 public void dispose() {
154 yaz4jlib.ZOOM_connection_destroy(zoomConnection);
155 zoomConnection = null;
160 public String getSyntax() {
161 return options.get("preferredRecordSyntax");
164 public void setSyntax(String value) {
165 options.set("preferredRecordSyntax", value);
168 public String getDatabaseName() {
169 return options.get("databaseName");
172 public void setDatabaseName(String value) {
173 options.set("databaseName", value);
176 public String getUsername() {
177 return options.get("user");
180 public void setUsername(String value) {
181 options.set("user", value);
184 public String getPassword() {
185 return options.get("password");
188 public void setPassword(String value) {
189 options.set("password", value);