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

WIP: refactoring xml serialization

parent 6aa7b032
Branches
No related tags found
No related merge requests found
Showing
with 165 additions and 138 deletions
...@@ -70,6 +70,8 @@ import caosdb.server.accessControl.OneTimeTokenRealm; ...@@ -70,6 +70,8 @@ import caosdb.server.accessControl.OneTimeTokenRealm;
import caosdb.server.accessControl.Principal; import caosdb.server.accessControl.Principal;
import caosdb.server.accessControl.SessionToken; import caosdb.server.accessControl.SessionToken;
import caosdb.server.accessControl.SessionTokenRealm; import caosdb.server.accessControl.SessionTokenRealm;
import caosdb.server.converter.misc.MultipartContainerConverter;
import caosdb.server.converter.xml.EntityXMLConverterHelper;
import caosdb.server.database.BackendTransaction; import caosdb.server.database.BackendTransaction;
import caosdb.server.database.access.Access; import caosdb.server.database.access.Access;
import caosdb.server.database.backend.transaction.RetrieveDatatypes; import caosdb.server.database.backend.transaction.RetrieveDatatypes;
...@@ -343,6 +345,9 @@ public class CaosDBServer extends Application { ...@@ -343,6 +345,9 @@ public class CaosDBServer extends Application {
init.release(); init.release();
Engine.getInstance().getRegisteredConverters().add(new EntityXMLConverterHelper());
Engine.getInstance().getRegisteredConverters().add(new MultipartContainerConverter());
if (INSECURE) { if (INSECURE) {
runHTTPServer(port_http, initialConnections, maxTotalConnections); runHTTPServer(port_http, initialConnections, maxTotalConnections);
} else { } else {
......
...@@ -319,6 +319,8 @@ public class FileSystem { ...@@ -319,6 +319,8 @@ public class FileSystem {
// target is correct. // target is correct.
if (file.getFile() != null && file.getFile().equals(target)) { if (file.getFile() != null && file.getFile().equals(target)) {
return true; return true;
} else if (target.isDirectory()) {
throw ServerMessages.TARGET_PATH_EXISTS;
} else { } else {
final GetFileRecordByPath t = new GetFileRecordByPath(file.getPath()); final GetFileRecordByPath t = new GetFileRecordByPath(file.getPath());
t.setAccess(access); t.setAccess(access);
......
...@@ -2,6 +2,8 @@ package caosdb.server.converter.misc; ...@@ -2,6 +2,8 @@ package caosdb.server.converter.misc;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
...@@ -17,10 +19,10 @@ public abstract class AbstractContainerHelper extends ConverterHelper { ...@@ -17,10 +19,10 @@ public abstract class AbstractContainerHelper extends ConverterHelper {
private static final List<Class<?>> OBJECT_CLASSES = private static final List<Class<?>> OBJECT_CLASSES =
Collections.singletonList(TransactionContainer.class); Collections.singletonList(TransactionContainer.class);
private final VariantInfo[] variants; private final List<VariantInfo> variants;
public AbstractContainerHelper(VariantInfo... variants) { public AbstractContainerHelper(VariantInfo... variants) {
this.variants = variants; this.variants = Arrays.asList(variants);
} }
public final boolean isCompatibleSource(Variant source) { public final boolean isCompatibleSource(Variant source) {
...@@ -33,7 +35,7 @@ public abstract class AbstractContainerHelper extends ConverterHelper { ...@@ -33,7 +35,7 @@ public abstract class AbstractContainerHelper extends ConverterHelper {
} }
public final TransactionContainer createContainer(Resource resource) { public final TransactionContainer createContainer(Resource resource) {
final String sRID = resource.getAttribute("srid"); final String sRID = resource.getRequestAttributes().get("SRID").toString();
final long timestamp = resource.getRequest().getDate().getTime(); final long timestamp = resource.getRequest().getDate().getTime();
final Subject owner = SecurityUtils.getSubject(); final Subject owner = SecurityUtils.getSubject();
...@@ -54,11 +56,20 @@ public abstract class AbstractContainerHelper extends ConverterHelper { ...@@ -54,11 +56,20 @@ public abstract class AbstractContainerHelper extends ConverterHelper {
// this class only converts from multipart/form-data to Containers. // this class only converts from multipart/form-data to Containers.
if (TransactionContainer.class.isAssignableFrom(target) if (TransactionContainer.class.isAssignableFrom(target)
&& isCompatibleSource(source)) { && isCompatibleSource(source)) {
return 1.0F; return 2.0F;
} }
return -1.0F; return -1.0F;
} }
@Override
public List<VariantInfo> getVariants(Class<?> source) throws IOException {
if (source != null && TransactionContainer.class.isAssignableFrom(source)) {
return variants;
}
return null;
}
} }
...@@ -2,7 +2,6 @@ package caosdb.server.converter.misc; ...@@ -2,7 +2,6 @@ package caosdb.server.converter.misc;
import java.io.IOException; import java.io.IOException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.util.List;
import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.FileUploadException;
...@@ -41,11 +40,6 @@ public class MultipartContainerConverter extends AbstractContainerHelper { ...@@ -41,11 +40,6 @@ public class MultipartContainerConverter extends AbstractContainerHelper {
super(VARIANT_MULTIPART_FORMDATA); super(VARIANT_MULTIPART_FORMDATA);
} }
@Override
public List<VariantInfo> getVariants(Class<?> source) throws IOException {
return null;
}
@Override @Override
public float score(Object source, Variant target, Resource resource) { public float score(Object source, Variant target, Resource resource) {
// this class only converts from multipart/form-data to Containers. // this class only converts from multipart/form-data to Containers.
...@@ -74,13 +68,21 @@ public class MultipartContainerConverter extends AbstractContainerHelper { ...@@ -74,13 +68,21 @@ public class MultipartContainerConverter extends AbstractContainerHelper {
// Name of the form field: FileRepresentation // Name of the form field: FileRepresentation
if (item.isFormField()) { if (item.isFormField()) {
if (item.getFieldName().equals("FileRepresentation")) { if (item.getFieldName().equals("FileRepresentation")) {
final MediaType mediaType = MediaType.valueOf(item.getContentType()); MediaType mediaType = MediaType.valueOf(item.getContentType());
if(mediaType.equals(MediaType.TEXT_PLAIN, true)) {
mediaType = MediaType.TEXT_XML;
}
Representation entities = new InputRepresentation(item.openStream(), mediaType); Representation entities = new InputRepresentation(item.openStream(), mediaType);
ConverterHelper helper = ConverterUtils.getBestHelper(entities, target, resource); ConverterHelper helper = ConverterUtils.getBestHelper(entities, target, resource);
if (helper == null) { if (helper == null) {
throw new ResourceException(new Status(Status.CLIENT_ERROR_BAD_REQUEST, "Could not parse the FileRepresentation field. Probably it has an unsupported media type."), resource.getRequest(), resource.getResponse()); throw new ResourceException(new Status(Status.CLIENT_ERROR_BAD_REQUEST, "Could not parse the FileRepresentation field. Probably it has an unsupported media type."), resource.getRequest(), resource.getResponse());
} }
result = (TransactionContainer) helper.toObject(source, target, resource); try {
result = (TransactionContainer) helper.toObject(entities, target, resource);
} catch (IOException e) {
e.printStackTrace();
throw new ResourceException(new Status(Status.CLIENT_ERROR_BAD_REQUEST, "Could not parse the FileRepresentation field. Probably it has an unsupported media type."), e, resource.getRequest(), resource.getResponse());
}
} else { } else {
throw new ResourceException(new Status(Status.CLIENT_ERROR_BAD_REQUEST, "No entities submitted."), resource.getRequest(), resource.getResponse()); throw new ResourceException(new Status(Status.CLIENT_ERROR_BAD_REQUEST, "No entities submitted."), resource.getRequest(), resource.getResponse());
} }
......
...@@ -2,7 +2,6 @@ package caosdb.server.converter.xml; ...@@ -2,7 +2,6 @@ package caosdb.server.converter.xml;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.jdom2.Document; import org.jdom2.Document;
import org.jdom2.Element; import org.jdom2.Element;
...@@ -27,20 +26,12 @@ import caosdb.server.resource.JdomRepresentation; ...@@ -27,20 +26,12 @@ import caosdb.server.resource.JdomRepresentation;
public class EntityXMLConverterHelper extends AbstractContainerHelper { public class EntityXMLConverterHelper extends AbstractContainerHelper {
private static final VariantInfo VARIANT_TEXT_XML = new VariantInfo(MediaType.TEXT_XML); public static final VariantInfo VARIANT_TEXT_XML = new VariantInfo(MediaType.TEXT_XML);
private static final VariantInfo VARIANT_APPLICATION_XML = new VariantInfo(MediaType.APPLICATION_XML); public static final VariantInfo VARIANT_APPLICATION_XML = new VariantInfo(MediaType.APPLICATION_XML);
private static final XMLParser xmlParser = new XMLParser(); private static final XMLParser xmlParser = new XMLParser();
@Override public EntityXMLConverterHelper() {
public List<VariantInfo> getVariants(Class<?> source) throws IOException { super(VARIANT_APPLICATION_XML, VARIANT_TEXT_XML);
List<VariantInfo> result = null;
if (source != null && TransactionContainer.class.isAssignableFrom(source)) {
result = addVariant(result, VARIANT_TEXT_XML);
result = addVariant(result, VARIANT_APPLICATION_XML);
}
return result;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
...@@ -72,7 +63,7 @@ public class EntityXMLConverterHelper extends AbstractContainerHelper { ...@@ -72,7 +63,7 @@ public class EntityXMLConverterHelper extends AbstractContainerHelper {
} }
private Representation toJdomRepresentation(TransactionContainer container, Resource resource) { private Representation toJdomRepresentation(TransactionContainer container, Resource resource) {
Document doc = new Document(generateRootElement(container, resource)); Document doc = toDocument(container, resource);
String xsl = resource.getAttribute("xsl"); String xsl = resource.getAttribute("xsl");
if(xsl != null) { if(xsl != null) {
...@@ -102,14 +93,17 @@ public class EntityXMLConverterHelper extends AbstractContainerHelper { ...@@ -102,14 +93,17 @@ public class EntityXMLConverterHelper extends AbstractContainerHelper {
* <li>A timestamp * <li>A timestamp
* <li>The URI to this resource. * <li>The URI to this resource.
*/ */
protected Element generateRootElement(TransactionContainer container, Resource resource) { protected Document toDocument(TransactionContainer container, Resource resource) {
final Element retRoot = new Element("Response"); final Element root = new Element("Response");
addUserInfo(retRoot, container.getOwner()); addUserInfo(root, container.getOwner());
retRoot.setAttribute("srid", container.getRequestId()); root.setAttribute("srid", container.getRequestId());
retRoot.setAttribute("timestamp", container.getTimestamp().toString()); root.setAttribute("timestamp", container.getTimestamp().toString());
retRoot.setAttribute("baseuri", resource.getRootRef().toString()); root.setAttribute("baseuri", resource.getRootRef().toString());
return retRoot;
container.addToElement(root);
return new Document(root);
} }
/** /**
......
...@@ -10,32 +10,33 @@ import org.jdom2.input.SAXBuilder; ...@@ -10,32 +10,33 @@ import org.jdom2.input.SAXBuilder;
public class XMLParser { public class XMLParser {
private final LinkedList<SAXBuilder> pool = new LinkedList<SAXBuilder>(); private static final LinkedList<SAXBuilder> pool = new LinkedList<SAXBuilder>();
private final int max = 25; private static final int max = 25;
private final int init = 5; private static final int init = 5;
private final int min = 5; private static final int min = 5;
private SAXBuilder getSAXBuilder() { private SAXBuilder getSAXBuilder() {
try { try {
synchronized (this.pool) { synchronized (pool) {
return this.pool.removeFirst(); return pool.removeFirst();
} }
} catch (final NoSuchElementException e) { } catch (final NoSuchElementException e) {
} }
preLoad(this.min); preLoad(min);
return new SAXBuilder(); return new SAXBuilder();
} }
private void release(final SAXBuilder sb) { private int release(final SAXBuilder sb) {
synchronized (this.pool) { synchronized (pool) {
if (this.pool.size() <= this.max) { if (pool.size() <= max) {
this.pool.add(sb); pool.add(sb);
} }
return pool.size();
} }
} }
public XMLParser() { public XMLParser() {
preLoad(this.init); preLoad(init);
} }
public Document parse(final InputStream is) throws JDOMException, IOException { public Document parse(final InputStream is) throws JDOMException, IOException {
...@@ -54,9 +55,10 @@ public class XMLParser { ...@@ -54,9 +55,10 @@ public class XMLParser {
new Thread() { new Thread() {
@Override @Override
public void run() { public void run() {
for (int j = 0; j < i; j++) { int j = 0;
while (j < i) {
final SAXBuilder sb = new SAXBuilder(); final SAXBuilder sb = new SAXBuilder();
release(sb); j = release(sb);
} }
} }
}; };
......
...@@ -22,6 +22,17 @@ ...@@ -22,6 +22,17 @@
*/ */
package caosdb.server.entity; package caosdb.server.entity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.subject.Subject;
import org.jdom2.Element;
import caosdb.server.CaosDBException; import caosdb.server.CaosDBException;
import caosdb.server.database.proto.SparseEntity; import caosdb.server.database.proto.SparseEntity;
import caosdb.server.database.proto.VerySparseEntity; import caosdb.server.database.proto.VerySparseEntity;
...@@ -47,17 +58,6 @@ import caosdb.server.utils.EntityStatus; ...@@ -47,17 +58,6 @@ import caosdb.server.utils.EntityStatus;
import caosdb.server.utils.ServerMessages; import caosdb.server.utils.ServerMessages;
import caosdb.server.utils.TransactionLogMessage; import caosdb.server.utils.TransactionLogMessage;
import caosdb.unit.Unit; import caosdb.unit.Unit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.AuthorizationException;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.subject.Subject;
import org.jdom2.Element;
public class Entity extends AbstractObservable implements EntityInterface { public class Entity extends AbstractObservable implements EntityInterface {
...@@ -1004,6 +1004,7 @@ public class Entity extends AbstractObservable implements EntityInterface { ...@@ -1004,6 +1004,7 @@ public class Entity extends AbstractObservable implements EntityInterface {
} }
private boolean datatypeOverride = false; private boolean datatypeOverride = false;
private EntityStatus skipOn = null;
@Override @Override
public EntityInterface setDatatypeOverride(final boolean b) { public EntityInterface setDatatypeOverride(final boolean b) {
...@@ -1094,6 +1095,11 @@ public class Entity extends AbstractObservable implements EntityInterface { ...@@ -1094,6 +1095,11 @@ public class Entity extends AbstractObservable implements EntityInterface {
@Override @Override
public boolean skipJob() { public boolean skipJob() {
return false; return skipOn != null && skipOn != getEntityStatus();
}
@Override
public void setSkip(EntityStatus e) {
this.skipOn = e;
} }
} }
...@@ -22,6 +22,9 @@ ...@@ -22,6 +22,9 @@
*/ */
package caosdb.server.entity; package caosdb.server.entity;
import java.util.List;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.subject.Subject;
import caosdb.server.database.proto.SparseEntity; import caosdb.server.database.proto.SparseEntity;
import caosdb.server.database.proto.VerySparseEntity; import caosdb.server.database.proto.VerySparseEntity;
import caosdb.server.datatype.AbstractDatatype; import caosdb.server.datatype.AbstractDatatype;
...@@ -34,12 +37,10 @@ import caosdb.server.entity.wrapper.Property; ...@@ -34,12 +37,10 @@ import caosdb.server.entity.wrapper.Property;
import caosdb.server.entity.xml.ToElementable; import caosdb.server.entity.xml.ToElementable;
import caosdb.server.jobs.JobTarget; import caosdb.server.jobs.JobTarget;
import caosdb.server.permissions.EntityACL; import caosdb.server.permissions.EntityACL;
import caosdb.server.utils.EntityStatus;
import caosdb.server.utils.Observable; import caosdb.server.utils.Observable;
import caosdb.server.utils.TransactionLogMessage; import caosdb.server.utils.TransactionLogMessage;
import caosdb.unit.Unit; import caosdb.unit.Unit;
import java.util.List;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.subject.Subject;
public interface EntityInterface public interface EntityInterface
extends JobTarget, Observable, ToElementable, WriteEntity, TransactionEntity { extends JobTarget, Observable, ToElementable, WriteEntity, TransactionEntity {
...@@ -176,4 +177,6 @@ public interface EntityInterface ...@@ -176,4 +177,6 @@ public interface EntityInterface
public abstract String getQueryTemplateDefinition(); public abstract String getQueryTemplateDefinition();
public abstract void setQueryTemplateDefinition(String query); public abstract void setQueryTemplateDefinition(String query);
public abstract void setSkip(EntityStatus e);
} }
...@@ -24,6 +24,7 @@ package caosdb.server.entity; ...@@ -24,6 +24,7 @@ package caosdb.server.entity;
import org.jdom2.Element; import org.jdom2.Element;
@Deprecated
public class WritableEntity extends Entity { public class WritableEntity extends Entity {
public WritableEntity(final Element element) { public WritableEntity(final Element element) {
......
...@@ -27,6 +27,7 @@ import org.apache.shiro.subject.Subject; ...@@ -27,6 +27,7 @@ import org.apache.shiro.subject.Subject;
import org.jdom2.Element; import org.jdom2.Element;
import caosdb.server.entity.FileProperties; import caosdb.server.entity.FileProperties;
@Deprecated
public abstract class WritableContainer extends TransactionContainer { public abstract class WritableContainer extends TransactionContainer {
private static final long serialVersionUID = -4097777313518959519L; private static final long serialVersionUID = -4097777313518959519L;
......
...@@ -22,6 +22,12 @@ ...@@ -22,6 +22,12 @@
*/ */
package caosdb.server.entity.wrapper; package caosdb.server.entity.wrapper;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.subject.Subject;
import org.jdom2.Element;
import caosdb.server.database.proto.SparseEntity; import caosdb.server.database.proto.SparseEntity;
import caosdb.server.database.proto.VerySparseEntity; import caosdb.server.database.proto.VerySparseEntity;
import caosdb.server.datatype.AbstractDatatype; import caosdb.server.datatype.AbstractDatatype;
...@@ -41,12 +47,6 @@ import caosdb.server.utils.EntityStatus; ...@@ -41,12 +47,6 @@ import caosdb.server.utils.EntityStatus;
import caosdb.server.utils.Observer; import caosdb.server.utils.Observer;
import caosdb.server.utils.TransactionLogMessage; import caosdb.server.utils.TransactionLogMessage;
import caosdb.unit.Unit; import caosdb.unit.Unit;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.subject.Subject;
import org.jdom2.Element;
public class EntityWrapper implements EntityInterface { public class EntityWrapper implements EntityInterface {
...@@ -541,4 +541,9 @@ public class EntityWrapper implements EntityInterface { ...@@ -541,4 +541,9 @@ public class EntityWrapper implements EntityInterface {
public boolean skipJob() { public boolean skipJob() {
return this.entity.skipJob(); return this.entity.skipJob();
} }
@Override
public void setSkip(EntityStatus e) {
this.entity.setSkip(e);
}
} }
...@@ -22,6 +22,15 @@ ...@@ -22,6 +22,15 @@
*/ */
package caosdb.server.jobs; package caosdb.server.jobs;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.subject.Subject;
import org.reflections.Reflections;
import caosdb.server.CaosDBException; import caosdb.server.CaosDBException;
import caosdb.server.database.BackendTransaction; import caosdb.server.database.BackendTransaction;
import caosdb.server.database.backend.transaction.GetIDByName; import caosdb.server.database.backend.transaction.GetIDByName;
...@@ -44,15 +53,6 @@ import caosdb.server.utils.EntityStatus; ...@@ -44,15 +53,6 @@ import caosdb.server.utils.EntityStatus;
import caosdb.server.utils.Observable; import caosdb.server.utils.Observable;
import caosdb.server.utils.Observer; import caosdb.server.utils.Observer;
import caosdb.server.utils.ServerMessages; import caosdb.server.utils.ServerMessages;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.Permission;
import org.apache.shiro.subject.Subject;
import org.reflections.Reflections;
public abstract class Job extends AbstractObservable implements Observer { public abstract class Job extends AbstractObservable implements Observer {
private Transaction<? extends TransactionContainer> transaction = null; private Transaction<? extends TransactionContainer> transaction = null;
...@@ -142,8 +142,12 @@ public abstract class Job extends AbstractObservable implements Observer { ...@@ -142,8 +142,12 @@ public abstract class Job extends AbstractObservable implements Observer {
return getTransaction().getContainer(); return getTransaction().getContainer();
} }
protected final boolean cache() {
return getContainer().getFlags() == null || !"false".equals(getContainer().getFlags().get("cache"));
}
protected final boolean isValidSubType(final int child, final int parent) { protected final boolean isValidSubType(final int child, final int parent) {
if (!"false".equals(getContainer().getFlags().get("cache"))) { if (cache()) {
final HashMap<String, Boolean> isSubTypeCache = getCache("isSubType"); final HashMap<String, Boolean> isSubTypeCache = getCache("isSubType");
final String key = child + "->" + parent; final String key = child + "->" + parent;
final Boolean cached = isSubTypeCache.get(key); final Boolean cached = isSubTypeCache.get(key);
......
...@@ -25,7 +25,10 @@ package caosdb.server.resource; ...@@ -25,7 +25,10 @@ package caosdb.server.resource;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.restlet.data.Header;
import org.restlet.data.MediaType;
import org.restlet.resource.ServerResource; import org.restlet.resource.ServerResource;
import org.restlet.util.Series;
import caosdb.server.utils.WebinterfaceUtils; import caosdb.server.utils.WebinterfaceUtils;
/** /**
...@@ -52,7 +55,7 @@ public abstract class AbstractCaosDBServerResource extends ServerResource { ...@@ -52,7 +55,7 @@ public abstract class AbstractCaosDBServerResource extends ServerResource {
} }
/** /**
* Setup method, called by {@link org.restlet.resource.Resource#init(org.restlet.Context, * Setup method, called by {@link org.restlet.resource.Resource.init(org.restlet.Context,
* org.restlet.Request, org.restlet.Response)}. * org.restlet.Request, org.restlet.Response)}.
*/ */
@Override @Override
...@@ -68,7 +71,13 @@ public abstract class AbstractCaosDBServerResource extends ServerResource { ...@@ -68,7 +71,13 @@ public abstract class AbstractCaosDBServerResource extends ServerResource {
this.setAttribute("xsl", getXSLScript()); this.setAttribute("xsl", getXSLScript());
MediaType mediaType = getRequest().getEntity().getMediaType();
Series<Header> headers = getRequest().getHeaders();
if(mediaType == null) {
getRequest().getEntity().setMediaType(MediaType.TEXT_XML);
}
} }
@Override @Override
......
...@@ -25,48 +25,42 @@ package caosdb.server.resource; ...@@ -25,48 +25,42 @@ package caosdb.server.resource;
import java.io.IOException; import java.io.IOException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AccountException;
import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.CredentialsException;
import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.Subject;
import org.restlet.data.Form; import org.restlet.data.Form;
import org.restlet.data.Parameter;
import org.restlet.data.Reference; import org.restlet.data.Reference;
import org.restlet.data.Status; import org.restlet.data.Status;
import org.restlet.engine.application.StatusInfo;
import org.restlet.representation.Representation; import org.restlet.representation.Representation;
import org.restlet.resource.Delete; import org.restlet.resource.Delete;
import org.restlet.resource.Post; import org.restlet.resource.Post;
import org.restlet.resource.ResourceException;
import caosdb.server.CaosDBException; import caosdb.server.CaosDBException;
import caosdb.server.accessControl.AuthenticationUtils; import caosdb.server.accessControl.AuthenticationUtils;
import caosdb.server.accessControl.RealmUsernamePasswordToken; import caosdb.server.accessControl.RealmUsernamePasswordToken;
import caosdb.server.accessControl.UserSources; import caosdb.server.accessControl.UserSources;
import caosdb.server.database.backend.implementation.MySQL.ConnectionException; import caosdb.server.database.backend.implementation.MySQL.ConnectionException;
import caosdb.server.entity.Message;
import caosdb.server.utils.ServerMessages;
public class AuthenticationResource extends AbstractCaosDBServerResource { public class AuthenticationResource extends AbstractCaosDBServerResource {
@Delete @Delete
public Message logout() public StatusInfo logout()
throws ConnectionException, SQLException, CaosDBException, IOException, throws ConnectionException, SQLException, CaosDBException, IOException,
NoSuchAlgorithmException, Exception { NoSuchAlgorithmException, Exception {
final Subject user = SecurityUtils.getSubject(); final Subject user = SecurityUtils.getSubject();
if (user.isAuthenticated()) { if (user.isAuthenticated()) {
user.logout(); user.logout();
getResponse().getCookieSettings().addAll(AuthenticationUtils.getLogoutCookies()); getResponse().getCookieSettings().addAll(AuthenticationUtils.getLogoutCookies());
return ServerMessages.LOGOUT_INFO; return new StatusInfo(new Status(Status.SUCCESS_OK, "You have successfully logged out."));
} }
getResponse().setStatus(Status.CLIENT_ERROR_FORBIDDEN); return new StatusInfo(Status.CLIENT_ERROR_FORBIDDEN);
return null;
} }
@Post @Post
public Message login(final Representation entity) { public StatusInfo login(final Representation entity) {
getUser().logout(); getUser().logout();
...@@ -93,33 +87,15 @@ public class AuthenticationResource extends AbstractCaosDBServerResource { ...@@ -93,33 +87,15 @@ public class AuthenticationResource extends AbstractCaosDBServerResource {
if (referrerRef != null && !"logout".equals(referrerRef.getLastSegment())) { if (referrerRef != null && !"logout".equals(referrerRef.getLastSegment())) {
getResponse().redirectSeeOther(referrerRef); getResponse().redirectSeeOther(referrerRef);
} }
return null; return new StatusInfo(new Status(Status.SUCCESS_OK, "Hello, " + username + "!"));
} catch (final CredentialsException e) {
getLogger().log(Level.INFO, "LOGIN_FAILED", e);
} catch (final AccountException e) {
getLogger().log(Level.INFO, "LOGIN_FAILED", e);
} catch (final AuthenticationException e) { } catch (final AuthenticationException e) {
getLogger().log(Level.INFO, "LOGIN_FAILED", e); getLogger().log(Level.INFO, "LOGIN_FAILED", e);
throw new ResourceException(new Status(Status.CLIENT_ERROR_UNAUTHORIZED, "Login failed."), e, getRequest(), getResponse());
} }
} else {
throw new ResourceException(new Status(Status.CLIENT_ERROR_UNAUTHORIZED, "Login failed. Please provide a user name and a password."), getRequest(), getResponse());
} }
getResponse().setStatus(Status.CLIENT_ERROR_UNAUTHORIZED);
return null;
}
public final Map<String, String> getFlags() {
final Form queryAsForm = getRequest().getResourceRef().getQueryAsForm(true);
final Map<String, String> result = new HashMap<>();
if (queryAsForm != null) {
for (final Parameter p : queryAsForm) {
result
.put(
p.getName(),
(p.getValue() == null || p.getValue().isEmpty() ? null : p.getValue()));
}
}
return result;
} }
} }
...@@ -42,7 +42,7 @@ public abstract class AbstractEntityResource extends AbstractCaosDBServerResourc ...@@ -42,7 +42,7 @@ public abstract class AbstractEntityResource extends AbstractCaosDBServerResourc
} }
@Get @Get
protected final TransactionContainer httpGetInChildClass() throws ConnectionException, IOException, public final TransactionContainer httpGetInChildClass() throws ConnectionException, IOException,
SQLException, CaosDBException, NoSuchAlgorithmException, Exception { SQLException, CaosDBException, NoSuchAlgorithmException, Exception {
final long t1 = System.currentTimeMillis(); final long t1 = System.currentTimeMillis();
...@@ -78,6 +78,9 @@ public abstract class AbstractEntityResource extends AbstractCaosDBServerResourc ...@@ -78,6 +78,9 @@ public abstract class AbstractEntityResource extends AbstractCaosDBServerResourc
@Override @Override
public void doInit() { public void doInit() {
super.doInit();
String specifier = (String) getRequestAttributes().get("specifier"); String specifier = (String) getRequestAttributes().get("specifier");
if (specifier != null && !specifier.equals("")) { if (specifier != null && !specifier.equals("")) {
try { try {
......
...@@ -22,10 +22,8 @@ ...@@ -22,10 +22,8 @@
*/ */
package caosdb.server.resource.transaction; package caosdb.server.resource.transaction;
import org.jdom2.JDOMException;
import org.restlet.resource.Post; import org.restlet.resource.Post;
import org.restlet.resource.Put; import org.restlet.resource.Put;
import caosdb.server.database.backend.implementation.MySQL.ConnectionException;
import caosdb.server.entity.container.DeleteContainer; import caosdb.server.entity.container.DeleteContainer;
import caosdb.server.entity.container.TransactionContainer; import caosdb.server.entity.container.TransactionContainer;
import caosdb.server.resource.transaction.handlers.IDHandler; import caosdb.server.resource.transaction.handlers.IDHandler;
...@@ -43,7 +41,7 @@ public class EntityResource extends AbstractEntityResource { ...@@ -43,7 +41,7 @@ public class EntityResource extends AbstractEntityResource {
@org.restlet.resource.Delete @org.restlet.resource.Delete
protected final TransactionContainer httpDeleteInChildClass() throws Exception { public final TransactionContainer httpDeleteInChildClass() throws Exception {
final DeleteContainer entityContainer = final DeleteContainer entityContainer =
new DeleteContainer(getUser(), getTimestamp(), getSRID(), getFlags()); new DeleteContainer(getUser(), getTimestamp(), getSRID(), getFlags());
...@@ -57,10 +55,10 @@ public class EntityResource extends AbstractEntityResource { ...@@ -57,10 +55,10 @@ public class EntityResource extends AbstractEntityResource {
} }
@Post @Post
protected final TransactionContainer httpPostInChildClass(final TransactionContainer entityContainer) public final TransactionContainer httpPostInChildClass(final TransactionContainer entityContainer) throws Exception {
throws Exception {
entityContainer.setFlags(getFlags());
final Insert insert = new Insert(entityContainer); final Insert insert = new Insert(entityContainer);
insert.execute(); insert.execute();
...@@ -68,13 +66,14 @@ public class EntityResource extends AbstractEntityResource { ...@@ -68,13 +66,14 @@ public class EntityResource extends AbstractEntityResource {
} }
@Put @Put
protected final TransactionContainer httpPutInChildClass(final TransactionContainer entityContainer) public final TransactionContainer httpPutInChildClass(final TransactionContainer entityContainer) throws Exception
throws ConnectionException, JDOMException, Exception { {
entityContainer.setFlags(getFlags());
final Update update = new Update(entityContainer); final Update update = new Update(entityContainer);
update.execute(); update.execute();
return entityContainer; return entityContainer;
} }
} }
...@@ -22,6 +22,13 @@ ...@@ -22,6 +22,13 @@
*/ */
package caosdb.server.transaction; package caosdb.server.transaction;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.TimeZone;
import org.jdom2.Element;
import caosdb.datetime.UTCDateTime; import caosdb.datetime.UTCDateTime;
import caosdb.server.database.DatabaseMonitor; import caosdb.server.database.DatabaseMonitor;
import caosdb.server.database.access.Access; import caosdb.server.database.access.Access;
...@@ -30,17 +37,11 @@ import caosdb.server.database.backend.transaction.GetFileIterator; ...@@ -30,17 +37,11 @@ import caosdb.server.database.backend.transaction.GetFileIterator;
import caosdb.server.database.backend.transaction.GetFileRecordByPath; import caosdb.server.database.backend.transaction.GetFileRecordByPath;
import caosdb.server.database.backend.transaction.RetrieveAllUncheckedFiles; import caosdb.server.database.backend.transaction.RetrieveAllUncheckedFiles;
import caosdb.server.database.backend.transaction.SetFileCheckedTimestamp; import caosdb.server.database.backend.transaction.SetFileCheckedTimestamp;
import caosdb.server.database.exceptions.EntityDoesNotExistException;
import caosdb.server.database.proto.SparseEntity; import caosdb.server.database.proto.SparseEntity;
import caosdb.server.entity.Message; import caosdb.server.entity.Message;
import caosdb.server.entity.xml.ToElementable; import caosdb.server.entity.xml.ToElementable;
import caosdb.server.utils.SHA512; import caosdb.server.utils.SHA512;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map.Entry;
import java.util.TimeZone;
import org.jdom2.Element;
public class FileStorageConsistencyCheck extends Thread public class FileStorageConsistencyCheck extends Thread
implements ToElementable, TransactionInterface { implements ToElementable, TransactionInterface {
...@@ -86,12 +87,8 @@ public class FileStorageConsistencyCheck extends Thread ...@@ -86,12 +87,8 @@ public class FileStorageConsistencyCheck extends Thread
continue; continue;
} }
try {
final GetFileRecordByPath t = execute(new GetFileRecordByPath(path), this.access); final GetFileRecordByPath t = execute(new GetFileRecordByPath(path), this.access);
if (t.getEntity() == null) {
this.results.put(path, FileConsistencyCheck.UNKNOWN_FILE);
continue;
}
final int result = final int result =
execute( execute(
new FileConsistencyCheck( new FileConsistencyCheck(
...@@ -104,6 +101,11 @@ public class FileStorageConsistencyCheck extends Thread ...@@ -104,6 +101,11 @@ public class FileStorageConsistencyCheck extends Thread
} }
execute(new SetFileCheckedTimestamp(t.getId(), this.ts), this.access); execute(new SetFileCheckedTimestamp(t.getId(), this.ts), this.access);
} catch (EntityDoesNotExistException e) {
this.results.put(path, FileConsistencyCheck.UNKNOWN_FILE);
continue;
}
} }
// test all remaining file records // test all remaining file records
......
...@@ -58,6 +58,8 @@ public class Update extends WriteTransaction<TransactionContainer> { ...@@ -58,6 +58,8 @@ public class Update extends WriteTransaction<TransactionContainer> {
// collect all ids of the entities which are to be updated. // collect all ids of the entities which are to be updated.
final TransactionContainer oldContainer = new TransactionContainer(); final TransactionContainer oldContainer = new TransactionContainer();
for (final Entity entity : getContainer()) { for (final Entity entity : getContainer()) {
entity.setSkip(EntityStatus.QUALIFIED);
// entity has no id -> it cannot be updated. // entity has no id -> it cannot be updated.
if (!entity.hasId()) { if (!entity.hasId()) {
entity.addError(ServerMessages.ENTITY_HAS_NO_ID); entity.addError(ServerMessages.ENTITY_HAS_NO_ID);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment