
org.sdmlib.modelcouch.CouchDBAdapter Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of SDMLib Show documentation
Show all versions of SDMLib Show documentation
SDMLib is a light weight modeling library. SDMLib intentionally comes without any tool or editor.
package org.sdmlib.modelcouch;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collection;
import java.util.LinkedList;
import org.sdmlib.modelcouch.connection.ContentType;
import org.sdmlib.modelcouch.connection.HTTPConnectionHandler;
import org.sdmlib.modelcouch.connection.RequestObject;
import org.sdmlib.modelcouch.connection.RequestType;
import org.sdmlib.modelcouch.connection.ReturnObject;
import org.sdmlib.modelcouch.connection.authentication.CookieAuthenticator;
import de.uniks.networkparser.json.JsonArray;
import de.uniks.networkparser.json.JsonObject;
public class CouchDBAdapter {
private String userName = "";
private String hostName = "localhost";
private int port = 5984;
HTTPConnectionHandler connectionHandler;
public HTTPConnectionHandler getConnectionHandler() {
if (connectionHandler == null) {
connectionHandler = new HTTPConnectionHandler(getURL());
}
return connectionHandler;
}
private String getURL() {
return "http://" + getHostName() + ":" + getPort() + "/";
}
public String getHostName() {
return hostName;
}
public int getPort() {
return port;
}
public String getUserName() {
return userName;
}
public void setHostName(String hostName) {
this.hostName = hostName;
}
public CouchDBAdapter withHostName(String hostName) {
this.hostName = hostName;
return this;
}
public void setPort(int port) {
this.port = port;
}
public CouchDBAdapter withPort(int port) {
this.port = port;
return this;
}
public void setUserName(String username) {
this.userName = username;
}
public CouchDBAdapter withUserName(String username) {
this.userName = username;
return this;
}
public ReturnObject replicate(ModelCouch modelCouch, String source, String target) {
RequestObject request = createRequestObject();
request.setPath("_replicate");
request.setRequestType(RequestType.POST);
/*
* {"source":"http://example.org/example-database","target":
* "http://admin:[email protected]:5984/example-database"}
*/
JsonObject replicateObject = new JsonObject();
replicateObject.add("create_target", true);
replicateObject.add("source", source);
replicateObject.add("target", target);
replicateObject.add("retries_per_request", 2);
request.setOutput(replicateObject.toString().getBytes());
return send(request);
}
private ReturnObject send(RequestObject request) {
return request.send();
}
public ReturnObject setUserPrivileges(String database, Collection adminNames, Collection adminRoles,
Collection memberNames, Collection memberRoles) {
RequestObject request = createRequestObject();
request.setPath(database + "/_security");
request.setRequestType(RequestType.PUT);
request.setShouldHandleInput(true);
JsonObject json = new JsonObject();
JsonObject admins = new JsonObject();
JsonArray adminNamesJson = new JsonArray();
adminNamesJson.addAll(adminNames);
admins.add("names", adminNamesJson);
JsonArray adminRolesJson = new JsonArray();
adminRolesJson.addAll(adminRoles);
admins.add("roles", adminRolesJson);
json.put("admins", admins);
JsonObject members = new JsonObject();
JsonArray memberNamesJson = new JsonArray();
memberNamesJson.addAll(memberNames);
members.add("names", memberNamesJson);
JsonArray memberRolesJson = new JsonArray();
memberRolesJson.addAll(memberRoles);
members.add("roles", memberRolesJson);
json.put("members", members);
request.setOutput(json.toString().getBytes(Charset.forName("UTF-8")));
return send(request);
}
public RequestObject createRequestObject() {
return getConnectionHandler().createRequestObject();
}
public ReturnObject createEmptyDocument(String path) {
RequestObject newDoc = createRequestObject();
newDoc.setPath(path);
newDoc.setShouldHandleInput(true);
newDoc.setRequestType(RequestType.POST);
JsonObject jsonObject = new JsonObject();
newDoc.setOutput(jsonObject.toString().getBytes());
return send(newDoc);
}
public ReturnObject addAttachment(ReturnObject lastRes, Path path, ContentType contentType) {
ReturnObject res = null;
byte[] content = lastRes.getContentAsBytes();
if (content != null && content.length > 0) {
JsonObject jsonObject = new JsonObject();
try {
jsonObject.withValue(new String(content, "UTF-8"));
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
// ...
RequestObject attachRequest = createRequestObject();
attachRequest.setShouldHandleInput(true);
attachRequest.setContentType(contentType);
attachRequest.setRequestType(RequestType.PUT);
String id = (String) jsonObject.getValue("id");
String rev = (String) jsonObject.getValue("rev");
attachRequest.setServer(lastRes.getHeaderFields().get("Location").get(0));
String filename = path.getFileName().toString();
attachRequest.setPath("/" + filename + "?rev=" + rev);
try {
attachRequest.setOutput(Files.readAllBytes(path));
res = send(attachRequest);
} catch (IOException e) {
e.printStackTrace();
}
}
if (res == null)
res = new ReturnObject();
return res;
}
public byte[] getAttachment(String location) {
byte[] res = null;
RequestObject attachRequest = createRequestObject();
attachRequest.setShouldHandleInput(true);
attachRequest.setRequestType(RequestType.GET);
attachRequest.setServer(location);
attachRequest.setPath("");
ReturnObject send = getConnectionHandler().send(attachRequest);
// FIXME: We don't want Strings...
res = send.getContentAsBytes();
if (res == null)
res = new byte[0];
return res;
}
public byte[] getAttachment(ReturnObject lastRes) {
byte[] res = null;
LinkedList content = lastRes.getContentAsString();
if (content != null && content.size() > 0) {
JsonObject jsonObject = new JsonObject();
jsonObject.withValue(content.toArray(new String[content.size()]));
String rev = (String) jsonObject.getValue("rev");
return getAttachment(lastRes.getHeaderFields().get("Location").get(0) + "?rev=" + rev);
}
return new byte[0];
}
// public ReturnObject send(RequestObject request) {
// ReturnObject res = new ReturnObject();
// try {
// URL obj = new URL(request.getServer() + request.getPath());
// HttpURLConnection con = (HttpURLConnection) obj.openConnection();
// con.setRequestMethod(request.getRequestType().toString());
// con.setDoInput(true);
//
// con.addRequestProperty("Content-Type",
// request.getContentType().getValue());
//
// for (Entry entry :
// request.getRequestProperties().entrySet()) {
// con.addRequestProperty(entry.getKey(), entry.getValue());
// }
// authenticate(con);
// // Write to DB
// if ((request.getOutput() != null && request.getOutput().length > 0)) {
// con.setDoOutput(true);
// con.getOutputStream().write(request.getOutput());
// }
//
// // Get the Results
// res.setResponseCode(con.getResponseCode());
// res.setResponseMessage(con.getResponseMessage());
// res.setHeaderFields(con.getHeaderFields());
//
// if (res.getResponseCode() >= 400 && con.getErrorStream() != null) {
// InputStream errorStream = (InputStream) con.getErrorStream();
// BufferedReader reader = new BufferedReader(new
// InputStreamReader(errorStream));
// try {
// LinkedList lines = new LinkedList<>();
// String readLine = null;
// do {
// readLine = reader.readLine();
// if (readLine == null) {
// break;
// }
// lines.add(readLine);
// // System.out.println(readLine);
// } while (readLine != null);
// res.setError(lines);
// } catch (IOException e) {
// // e.printStackTrace();
// }
// } else {
// if (request.isShouldHandleInput()) {
// InputStream content = (InputStream) con.getContent();
// ByteArrayOutputStream buffer = new ByteArrayOutputStream();
// int nRead;
// byte[] data = new
// byte[Integer.parseInt(res.getHeaderFields().get("Content-Length").get(0))];
// while ((nRead = content.read(data, 0, data.length)) != -1) {
// buffer.write(data, 0, nRead);
// }
// buffer.flush();
// BufferedInputStream reader = new BufferedInputStream(content);
// byte[] bytes = buffer.toByteArray();
// res.setContent(bytes);
// }
// }
// con.disconnect();
// } catch (Exception e) {
// res.setResponseCode(400);
// e.printStackTrace();
// }
// return res;
// }
public boolean testConnection() {
String urlString = "http://" + getHostName() + ":" + port;
try {
URL urlObj = new URL(urlString);
URLConnection openConnection = urlObj.openConnection();
openConnection.connect();
} catch (IOException e) {
return false;
}
return true;
}
public boolean testConnection(String databaseName) {
return getConnectionHandler().testConnection(this.getHostName(), this.getPort(), databaseName);
}
public ReturnObject createDB(String dbName) {
RequestObject create = createRequestObject();
create.setRequestType(RequestType.PUT);
create.setPath(dbName);
return send(create);
}
public ReturnObject deleteDatabase(String databaseName) {
RequestObject delete = createRequestObject();
delete.setPath(databaseName);
delete.setRequestType(RequestType.DELETE);
return send(delete);
}
/**
* Must be called after setting credentials (and authenticator)
*
* You can get the Return from the Server by asking the Authenticator for
* the loginRequest
*
* @param password
* The Password
* @return ThisComponent
* @throws Exception
* any Errors for login
*/
public CouchDBAdapter login(String password) throws Exception {
getConnectionHandler().login(getUserName(), password);
return this;
}
public CouchDBAdapter withAuthenticator(CookieAuthenticator authenticator) {
getConnectionHandler().setAuthenticator(authenticator);
return this;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy