package net.sourceforge.seqware.webservice.resources.queries;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sourceforge.seqware.common.factory.DBAccess;
import net.sourceforge.seqware.queryengine.webservice.model.SampleHierarchies;
import net.sourceforge.seqware.queryengine.webservice.model.SampleHierarchy;
import net.sourceforge.seqware.webservice.resources.BasicRestlet;
import org.apache.commons.dbutils.ResultSetHandler;
import org.json.JSONException;
import org.json.JSONObject;
import org.restlet.Context;
import org.restlet.Request;
import org.restlet.Response;
import org.restlet.data.Method;
import org.restlet.ext.json.JsonRepresentation;
import org.restlet.representation.Representation;
public class SampleHierarchyResource extends BasicRestlet {
public SampleHierarchyResource(Context context) {
super(context);
}
@Override
public void handle(Request request, Response response) {
authenticate(request.getChallengeResponse().getIdentifier());
if (request.getMethod().compareTo(Method.GET) == 0) {
List<SampleHierarchy> shs;
try {
shs = DBAccess.get().executeQuery("select sample_id, parent_id from sample_hierarchy",
new ResultSetHandler<List<SampleHierarchy>>() {
@Override
public List<SampleHierarchy> handle(ResultSet rs) throws SQLException {
List<SampleHierarchy> shs = new ArrayList<>();
while (rs.next()) {
SampleHierarchy sh = new SampleHierarchy();
sh.setSampleId(rs.getInt("sample_id"));
if (null == rs.getString("parent_id")) {
sh.setParentId(-1);
} else {
sh.setParentId(rs.getInt("parent_id"));
}
shs.add(sh);
}
return shs;
}
});
} catch (SQLException e) {
throw new RuntimeException(e);
} finally {
DBAccess.close();
}
SampleHierarchies ret = new SampleHierarchies();
ret.setSampleHierarchies(shs);
Representation rep = new JsonRepresentation(ret);
response.setEntity(rep);
} else if (request.getMethod().compareTo(Method.PUT) == 0) {
Representation entity = request.getEntity();
try {
JsonRepresentation represent = new JsonRepresentation(entity);
JSONObject obj = represent.getJsonObject();
org.json.JSONArray array = (org.json.JSONArray) obj.get("sampleHierarchies");
String insertSql = this.jsonArrayToSql(array);
// delete all rows in db, then insert them again
String deleteAll = "delete from sample_hierarchy";
DBAccess.get().executeUpdate(deleteAll);
DBAccess.get().executeUpdate(insertSql);
} catch (IOException | JSONException | SQLException ex) {
Logger.getLogger(SampleHierarchyResource.class.getName()).log(Level.SEVERE, null, ex);
} finally {
DBAccess.close();
}
}
}
private String jsonArrayToSql(org.json.JSONArray array) throws JSONException {
StringBuilder sb = new StringBuilder("insert into sample_hierarchy (\"sample_id\", \"parent_id\") values ");
for (int i = 0; i < array.length(); i++) {
if (i > 0) {
sb.append(",");
}
JSONObject obj = (JSONObject) array.get(i);
sb.append("(").append(obj.getInt("sampleId")).append(",");
if (-1 != obj.getInt("parentId")) {
sb.append(obj.getInt("parentId"));
} else {
sb.append("null");
}
sb.append(")");
}
return sb.toString();
}
}