Skip to content
Snippets Groups Projects
Verified Commit ec34f50c authored by Timm Fitschen's avatar Timm Fitschen
Browse files

WIP: refactoring

parent e96851f1
Branches
No related tags found
No related merge requests found
......@@ -27,6 +27,7 @@ import caosdb.server.accessControl.OneTimeTokenRealm;
import caosdb.server.accessControl.Principal;
import caosdb.server.accessControl.SessionToken;
import caosdb.server.accessControl.SessionTokenRealm;
import caosdb.server.converter.misc.HttpStatusConverter;
import caosdb.server.converter.misc.MultipartContainerConverter;
import caosdb.server.converter.xml.EntityXMLConverterHelper;
import caosdb.server.database.BackendTransaction;
......@@ -100,6 +101,7 @@ import org.restlet.data.Reference;
import org.restlet.data.ServerInfo;
import org.restlet.data.Status;
import org.restlet.engine.Engine;
import org.restlet.engine.converter.DefaultConverter;
import org.restlet.routing.Route;
import org.restlet.routing.Router;
import org.restlet.routing.Template;
......@@ -345,8 +347,13 @@ public class CaosDBServer extends Application {
init.release();
Engine.getInstance().getRegisteredConverters().add(new EntityXMLConverterHelper());
Engine.getInstance().getRegisteredConverters().clear();
Engine.getInstance().getRegisteredConverters().add(new DefaultConverter());
// add XML Converters
EntityXMLConverterHelper xmlConverter = new EntityXMLConverterHelper();
Engine.getInstance().getRegisteredConverters().add(xmlConverter);
Engine.getInstance().getRegisteredConverters().add(new MultipartContainerConverter());
Engine.getInstance().getRegisteredConverters().add(new HttpStatusConverter(xmlConverter));
if (INSECURE) {
runHTTPServer(port_http, initialConnections, maxTotalConnections);
......
package caosdb.server.converter.misc;
import org.restlet.service.StatusService;
public class CaosDBStatusService extends StatusService {
}
package caosdb.server.converter.misc;
import java.io.IOException;
import java.util.List;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.restlet.data.Status;
import org.restlet.engine.application.StatusInfo;
import org.restlet.engine.converter.ConverterHelper;
import org.restlet.engine.resource.VariantInfo;
import org.restlet.representation.Representation;
import org.restlet.representation.Variant;
import org.restlet.resource.Resource;
import caosdb.server.entity.Message;
import caosdb.server.entity.container.TransactionContainer;
import caosdb.server.utils.ServerMessages;
public class HttpStatusConverter extends ConverterHelper {
private AbstractContainerHelper containerConverter;
private TransactionContainer dummyContainer;
public HttpStatusConverter(AbstractContainerHelper converter) {
this.containerConverter = converter;
this.dummyContainer = new TransactionContainer();
}
@Override
public List<Class<?>> getObjectClasses(Variant source) {
// the server does not need this.
return null;
}
@Override
public List<VariantInfo> getVariants(Class<?> source) throws IOException {
if (isCompatible(source)) {
return containerConverter.getVariants(TransactionContainer.class);
}
return null;
}
private boolean isCompatible(Class<?> source) {
return source != null && source.isAssignableFrom(StatusInfo.class);
}
@Override
public float score(Object source, Variant target, Resource resource) {
return containerConverter.score(dummyContainer, target, resource);
}
@Override
public <T> float score(Representation source, Class<T> target, Resource resource) {
// no implementation for this direction of the conversion
return -1.0F;
}
@Override
public <T> T toObject(Representation source, Class<T> target, Resource resource)
throws IOException {
// the server does not need this.
return null;
}
@Override
public Representation toRepresentation(Object source, Variant target, Resource resource)
throws IOException {
Representation result = null;
if (source != null && StatusInfo.class.isAssignableFrom(source.getClass())) {
StatusInfo status = (StatusInfo) source;
result = toJdomRepresentation(status, target, resource);
}
return result;
}
private Representation toJdomRepresentation(StatusInfo status, Variant target, Resource resource)
throws IOException {
Subject owner = SecurityUtils.getSubject();
Long timestamp = null;
String requestId = null;
if (resource != null) {
timestamp = resource.getRequest().getDate().getTime();
requestId = resource.getRequestAttributes().get("SRID").toString();
}
TransactionContainer t = new TransactionContainer(owner, timestamp, requestId);
if (status.getCode() == 500) {
t.addMessage(ServerMessages.UNKNOWN_ERROR(requestId));
} else {
t.addMessage(new Message((Status.valueOf(status.getCode()).isError() ? "Error" : "Info"),
status.getCode(), status.getReasonPhrase(), status.getDescription()));
}
return containerConverter.toRepresentation(t, target, resource);
}
}
package caosdb.server.converter.xml;
import caosdb.server.converter.misc.AbstractContainerHelper;
import caosdb.server.entity.Message;
import caosdb.server.entity.container.TransactionContainer;
import java.io.IOException;
import java.util.List;
import org.restlet.engine.converter.ConverterHelper;
import org.restlet.engine.resource.VariantInfo;
import org.restlet.representation.Representation;
import org.restlet.representation.Variant;
import org.restlet.resource.Resource;
public class MessageConverter extends ConverterHelper {
private final AbstractContainerHelper containerConverter;
public MessageConverter(AbstractContainerHelper containerConverter) {
this.containerConverter = containerConverter;
}
@Override
public List<Class<?>> getObjectClasses(Variant source) {
// no conversion to message needed.
return null;
}
@Override
public List<VariantInfo> getVariants(Class<?> source) throws IOException {
// TODO Auto-generated method stub
return null;
}
@Override
public float score(Object source, Variant target, Resource resource) {
if (source instanceof Message) {
return getContainerConverter().score(wrapp(source), target, resource);
}
// TODO Auto-generated method stub
return -1.0F;
}
private TransactionContainer wrapp(Object source) {
return null;
}
@Override
public <T> float score(Representation source, Class<T> target, Resource resource) {
// TODO Auto-generated method stub
return -1.0F;
}
@Override
public <T> T toObject(Representation source, Class<T> target, Resource resource)
throws IOException {
// no implementation needed.
return null;
}
@Override
public Representation toRepresentation(Object source, Variant target, Resource resource)
throws IOException {
// TODO Auto-generated method stub
return null;
}
public AbstractContainerHelper getContainerConverter() {
return containerConverter;
}
}
......@@ -22,8 +22,9 @@
*/
package caosdb.server.entity;
import caosdb.server.entity.xml.ToElementable;
import org.jdom2.Element;
import org.restlet.data.Status;
import caosdb.server.entity.xml.ToElementable;
public class Message extends Exception implements Comparable<Message>, ToElementable {
......@@ -40,6 +41,10 @@ public class Message extends Exception implements Comparable<Message>, ToElement
Info
};
public Message(Status status) {
this(status.isError()? "Error" : "Info", status.getCode(), status.getReasonPhrase(), status.getDescription());
}
@Override
public int hashCode() {
return toString().hashCode();
......
......@@ -23,11 +23,18 @@
*/
package caosdb.server.resource;
import caosdb.server.utils.WebinterfaceUtils;
import java.io.IOException;
import java.util.List;
import java.util.logging.Level;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.engine.application.StatusInfo;
import org.restlet.representation.Representation;
import org.restlet.representation.Variant;
import org.restlet.resource.ServerResource;
import caosdb.server.utils.WebinterfaceUtils;
/**
* Base class for all CaosDB Server Resources.
......@@ -86,4 +93,38 @@ public abstract class AbstractCaosDBServerResource extends ServerResource {
public final String getSRID() {
return getRequest().getAttributes().get("SRID").toString();
}
/*
* Stolen from Restlet and adapted to our needs.
*/
@Override
protected void doCatch(Throwable throwable) {
Level level = Level.INFO;
Status status = getStatusService().toStatus(throwable, this);
if (status.isServerError()) {
level = Level.SEVERE;
} else if (status.isConnectorError()) {
level = Level.INFO;
} else if (status.isClientError()) {
level = Level.FINE;
}
getLogger().log(level, "Exception or error caught in server resource",
throwable);
if (getResponse() != null) {
getResponse().setStatus(status);
List<Variant> variants = getVariants(getMethod());
Variant preferredVariant = getPreferredVariant(variants);
try {
Representation errorEntity;
errorEntity = toRepresentation(new StatusInfo(status), preferredVariant);
getResponse().setEntity(errorEntity);
} catch (IOException e) {
getLogger().log(Level.SEVERE, "Exception during serialization of another error.", e);
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment