diff --git a/src/main/java/caosdb/server/CaosDBServer.java b/src/main/java/caosdb/server/CaosDBServer.java index eaf53dd4a6d904254ae66d875cd54c963756fc09..dd75071e50ceca3e868e0a5629819f109391fd06 100644 --- a/src/main/java/caosdb/server/CaosDBServer.java +++ b/src/main/java/caosdb/server/CaosDBServer.java @@ -70,6 +70,8 @@ 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.MultipartContainerConverter; +import caosdb.server.converter.xml.EntityXMLConverterHelper; import caosdb.server.database.BackendTransaction; import caosdb.server.database.access.Access; import caosdb.server.database.backend.transaction.RetrieveDatatypes; @@ -342,6 +344,9 @@ public class CaosDBServer extends Application { Integer.parseInt(getServerProperty(ServerProperties.KEY_MAX_CONNECTIONS)); init.release(); + + Engine.getInstance().getRegisteredConverters().add(new EntityXMLConverterHelper()); + Engine.getInstance().getRegisteredConverters().add(new MultipartContainerConverter()); if (INSECURE) { runHTTPServer(port_http, initialConnections, maxTotalConnections); diff --git a/src/main/java/caosdb/server/FileSystem.java b/src/main/java/caosdb/server/FileSystem.java index 6ea9222989a66647ba4e4a164f81bb4d338225e8..b87b25ea682dba78afaf49f99c9665ac70d75764 100644 --- a/src/main/java/caosdb/server/FileSystem.java +++ b/src/main/java/caosdb/server/FileSystem.java @@ -319,6 +319,8 @@ public class FileSystem { // target is correct. if (file.getFile() != null && file.getFile().equals(target)) { return true; + } else if (target.isDirectory()) { + throw ServerMessages.TARGET_PATH_EXISTS; } else { final GetFileRecordByPath t = new GetFileRecordByPath(file.getPath()); t.setAccess(access); diff --git a/src/main/java/caosdb/server/converter/misc/AbstractContainerHelper.java b/src/main/java/caosdb/server/converter/misc/AbstractContainerHelper.java index 9da3f99083fa57191fd123054dfa333bb8a00b70..6c3522115be88c6d3ebd4542fcd1a6b22764b7a0 100644 --- a/src/main/java/caosdb/server/converter/misc/AbstractContainerHelper.java +++ b/src/main/java/caosdb/server/converter/misc/AbstractContainerHelper.java @@ -2,6 +2,8 @@ package caosdb.server.converter.misc; +import java.io.IOException; +import java.util.Arrays; import java.util.Collections; import java.util.List; import org.apache.shiro.SecurityUtils; @@ -17,10 +19,10 @@ public abstract class AbstractContainerHelper extends ConverterHelper { private static final List<Class<?>> OBJECT_CLASSES = Collections.singletonList(TransactionContainer.class); - private final VariantInfo[] variants; + private final List<VariantInfo> variants; public AbstractContainerHelper(VariantInfo... variants) { - this.variants = variants; + this.variants = Arrays.asList(variants); } public final boolean isCompatibleSource(Variant source) { @@ -33,7 +35,7 @@ public abstract class AbstractContainerHelper extends ConverterHelper { } 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 Subject owner = SecurityUtils.getSubject(); @@ -54,10 +56,19 @@ public abstract class AbstractContainerHelper extends ConverterHelper { // this class only converts from multipart/form-data to Containers. if (TransactionContainer.class.isAssignableFrom(target) && isCompatibleSource(source)) { - return 1.0F; + return 2.0F; } return -1.0F; } + + @Override + public List<VariantInfo> getVariants(Class<?> source) throws IOException { + if (source != null && TransactionContainer.class.isAssignableFrom(source)) { + return variants; + } + + return null; + } diff --git a/src/main/java/caosdb/server/converter/misc/MultipartContainerConverter.java b/src/main/java/caosdb/server/converter/misc/MultipartContainerConverter.java index dc35e3dcb765355c6713a45bf4fab8cbbdb3c29c..596eb6ac5892fc999d9eec4fa6dd355f1909eb18 100644 --- a/src/main/java/caosdb/server/converter/misc/MultipartContainerConverter.java +++ b/src/main/java/caosdb/server/converter/misc/MultipartContainerConverter.java @@ -2,7 +2,6 @@ package caosdb.server.converter.misc; import java.io.IOException; import java.security.NoSuchAlgorithmException; -import java.util.List; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.FileUploadException; @@ -41,11 +40,6 @@ public class MultipartContainerConverter extends AbstractContainerHelper { super(VARIANT_MULTIPART_FORMDATA); } - @Override - public List<VariantInfo> getVariants(Class<?> source) throws IOException { - return null; - } - @Override public float score(Object source, Variant target, Resource resource) { // this class only converts from multipart/form-data to Containers. @@ -74,13 +68,21 @@ public class MultipartContainerConverter extends AbstractContainerHelper { // Name of the form field: FileRepresentation if (item.isFormField()) { 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); ConverterHelper helper = ConverterUtils.getBestHelper(entities, target, resource); 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()); } - 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 { throw new ResourceException(new Status(Status.CLIENT_ERROR_BAD_REQUEST, "No entities submitted."), resource.getRequest(), resource.getResponse()); } diff --git a/src/main/java/caosdb/server/converter/xml/EntityXMLConverterHelper.java b/src/main/java/caosdb/server/converter/xml/EntityXMLConverterHelper.java index 8aa039e2ac4637ac76043e0b60094f799a4eaf7e..9abfd27481c0bda252d6b6c789b907e05c85c7be 100644 --- a/src/main/java/caosdb/server/converter/xml/EntityXMLConverterHelper.java +++ b/src/main/java/caosdb/server/converter/xml/EntityXMLConverterHelper.java @@ -2,7 +2,6 @@ package caosdb.server.converter.xml; import java.io.IOException; import java.util.Collection; -import java.util.List; import org.apache.shiro.subject.Subject; import org.jdom2.Document; import org.jdom2.Element; @@ -27,22 +26,14 @@ import caosdb.server.resource.JdomRepresentation; public class EntityXMLConverterHelper extends AbstractContainerHelper { - private 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_TEXT_XML = new VariantInfo(MediaType.TEXT_XML); + public static final VariantInfo VARIANT_APPLICATION_XML = new VariantInfo(MediaType.APPLICATION_XML); private static final XMLParser xmlParser = new XMLParser(); - @Override - public List<VariantInfo> getVariants(Class<?> source) throws IOException { - 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; + public EntityXMLConverterHelper() { + super(VARIANT_APPLICATION_XML, VARIANT_TEXT_XML); } - + @SuppressWarnings("unchecked") @Override public <T> T toObject(Representation source, Class<T> target, Resource resource) @@ -72,7 +63,7 @@ public class EntityXMLConverterHelper extends AbstractContainerHelper { } private Representation toJdomRepresentation(TransactionContainer container, Resource resource) { - Document doc = new Document(generateRootElement(container, resource)); + Document doc = toDocument(container, resource); String xsl = resource.getAttribute("xsl"); if(xsl != null) { @@ -102,14 +93,17 @@ public class EntityXMLConverterHelper extends AbstractContainerHelper { * <li>A timestamp * <li>The URI to this resource. */ - protected Element generateRootElement(TransactionContainer container, Resource resource) { - final Element retRoot = new Element("Response"); + protected Document toDocument(TransactionContainer container, Resource resource) { + final Element root = new Element("Response"); + + addUserInfo(root, container.getOwner()); + root.setAttribute("srid", container.getRequestId()); + root.setAttribute("timestamp", container.getTimestamp().toString()); + root.setAttribute("baseuri", resource.getRootRef().toString()); + + container.addToElement(root); - addUserInfo(retRoot, container.getOwner()); - retRoot.setAttribute("srid", container.getRequestId()); - retRoot.setAttribute("timestamp", container.getTimestamp().toString()); - retRoot.setAttribute("baseuri", resource.getRootRef().toString()); - return retRoot; + return new Document(root); } /** diff --git a/src/main/java/caosdb/server/converter/xml/XMLParser.java b/src/main/java/caosdb/server/converter/xml/XMLParser.java index cd9660439f697a6ffbb4a1d67a17218ae246e426..1353ec9e5fdfc12e3643d047026c9c8124ec2e30 100644 --- a/src/main/java/caosdb/server/converter/xml/XMLParser.java +++ b/src/main/java/caosdb/server/converter/xml/XMLParser.java @@ -10,32 +10,33 @@ import org.jdom2.input.SAXBuilder; public class XMLParser { - private final LinkedList<SAXBuilder> pool = new LinkedList<SAXBuilder>(); - private final int max = 25; - private final int init = 5; - private final int min = 5; + private static final LinkedList<SAXBuilder> pool = new LinkedList<SAXBuilder>(); + private static final int max = 25; + private static final int init = 5; + private static final int min = 5; private SAXBuilder getSAXBuilder() { try { - synchronized (this.pool) { - return this.pool.removeFirst(); + synchronized (pool) { + return pool.removeFirst(); } } catch (final NoSuchElementException e) { } - preLoad(this.min); + preLoad(min); return new SAXBuilder(); } - private void release(final SAXBuilder sb) { - synchronized (this.pool) { - if (this.pool.size() <= this.max) { - this.pool.add(sb); + private int release(final SAXBuilder sb) { + synchronized (pool) { + if (pool.size() <= max) { + pool.add(sb); } + return pool.size(); } } public XMLParser() { - preLoad(this.init); + preLoad(init); } public Document parse(final InputStream is) throws JDOMException, IOException { @@ -54,9 +55,10 @@ public class XMLParser { new Thread() { @Override public void run() { - for (int j = 0; j < i; j++) { + int j = 0; + while (j < i) { final SAXBuilder sb = new SAXBuilder(); - release(sb); + j = release(sb); } } }; diff --git a/src/main/java/caosdb/server/entity/Entity.java b/src/main/java/caosdb/server/entity/Entity.java index bf1022dad1c0e6b954ea876ecce674a87ff7650e..20e84bbf17e27626c2da130cab8f1b5f312a4e75 100644 --- a/src/main/java/caosdb/server/entity/Entity.java +++ b/src/main/java/caosdb/server/entity/Entity.java @@ -22,6 +22,17 @@ */ 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.database.proto.SparseEntity; import caosdb.server.database.proto.VerySparseEntity; @@ -47,17 +58,6 @@ import caosdb.server.utils.EntityStatus; import caosdb.server.utils.ServerMessages; import caosdb.server.utils.TransactionLogMessage; 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 { @@ -1004,6 +1004,7 @@ public class Entity extends AbstractObservable implements EntityInterface { } private boolean datatypeOverride = false; + private EntityStatus skipOn = null; @Override public EntityInterface setDatatypeOverride(final boolean b) { @@ -1094,6 +1095,11 @@ public class Entity extends AbstractObservable implements EntityInterface { @Override public boolean skipJob() { - return false; + return skipOn != null && skipOn != getEntityStatus(); + } + + @Override + public void setSkip(EntityStatus e) { + this.skipOn = e; } } diff --git a/src/main/java/caosdb/server/entity/EntityInterface.java b/src/main/java/caosdb/server/entity/EntityInterface.java index 76c6c51eaabb3ee5864d9cb538f43338e96ce914..aba5654808d6f545cc842dbc0594ddf41aff0bf2 100644 --- a/src/main/java/caosdb/server/entity/EntityInterface.java +++ b/src/main/java/caosdb/server/entity/EntityInterface.java @@ -22,6 +22,9 @@ */ 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.VerySparseEntity; import caosdb.server.datatype.AbstractDatatype; @@ -34,12 +37,10 @@ import caosdb.server.entity.wrapper.Property; import caosdb.server.entity.xml.ToElementable; import caosdb.server.jobs.JobTarget; import caosdb.server.permissions.EntityACL; +import caosdb.server.utils.EntityStatus; import caosdb.server.utils.Observable; import caosdb.server.utils.TransactionLogMessage; import caosdb.unit.Unit; -import java.util.List; -import org.apache.shiro.authz.Permission; -import org.apache.shiro.subject.Subject; public interface EntityInterface extends JobTarget, Observable, ToElementable, WriteEntity, TransactionEntity { @@ -176,4 +177,6 @@ public interface EntityInterface public abstract String getQueryTemplateDefinition(); public abstract void setQueryTemplateDefinition(String query); + + public abstract void setSkip(EntityStatus e); } diff --git a/src/main/java/caosdb/server/entity/WritableEntity.java b/src/main/java/caosdb/server/entity/WritableEntity.java index 6e1c21e27ffbb4ae76a31a6c0cd444c439325cb0..4bb4c6bf411d8cd54705f00d793bcb6d50c562cb 100644 --- a/src/main/java/caosdb/server/entity/WritableEntity.java +++ b/src/main/java/caosdb/server/entity/WritableEntity.java @@ -24,6 +24,7 @@ package caosdb.server.entity; import org.jdom2.Element; +@Deprecated public class WritableEntity extends Entity { public WritableEntity(final Element element) { diff --git a/src/main/java/caosdb/server/entity/container/WritableContainer.java b/src/main/java/caosdb/server/entity/container/WritableContainer.java index 623bea6c3d1896905cd74a31d5c906c1e560d045..e1a95a6d3273539337a7f1e9f4209fc48d5def9d 100644 --- a/src/main/java/caosdb/server/entity/container/WritableContainer.java +++ b/src/main/java/caosdb/server/entity/container/WritableContainer.java @@ -27,6 +27,7 @@ import org.apache.shiro.subject.Subject; import org.jdom2.Element; import caosdb.server.entity.FileProperties; +@Deprecated public abstract class WritableContainer extends TransactionContainer { private static final long serialVersionUID = -4097777313518959519L; diff --git a/src/main/java/caosdb/server/entity/wrapper/EntityWrapper.java b/src/main/java/caosdb/server/entity/wrapper/EntityWrapper.java index 1feeafdb7c158edd35a2eddd16af85b40e35211c..4bdc78fb47462e819305200a04e55d9b2f6c5eea 100644 --- a/src/main/java/caosdb/server/entity/wrapper/EntityWrapper.java +++ b/src/main/java/caosdb/server/entity/wrapper/EntityWrapper.java @@ -22,6 +22,12 @@ */ 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.VerySparseEntity; import caosdb.server.datatype.AbstractDatatype; @@ -41,12 +47,6 @@ import caosdb.server.utils.EntityStatus; import caosdb.server.utils.Observer; import caosdb.server.utils.TransactionLogMessage; 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 { @@ -541,4 +541,9 @@ public class EntityWrapper implements EntityInterface { public boolean skipJob() { return this.entity.skipJob(); } + + @Override + public void setSkip(EntityStatus e) { + this.entity.setSkip(e); + } } diff --git a/src/main/java/caosdb/server/jobs/Job.java b/src/main/java/caosdb/server/jobs/Job.java index b3551b4dd92084e6296a57be4166b341efa68262..f22c92e1f48869863a3e6df4c3b470b69c76e5d9 100644 --- a/src/main/java/caosdb/server/jobs/Job.java +++ b/src/main/java/caosdb/server/jobs/Job.java @@ -22,6 +22,15 @@ */ 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.database.BackendTransaction; import caosdb.server.database.backend.transaction.GetIDByName; @@ -44,15 +53,6 @@ import caosdb.server.utils.EntityStatus; import caosdb.server.utils.Observable; import caosdb.server.utils.Observer; 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 { private Transaction<? extends TransactionContainer> transaction = null; @@ -141,9 +141,13 @@ public abstract class Job extends AbstractObservable implements Observer { TransactionContainer 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) { - if (!"false".equals(getContainer().getFlags().get("cache"))) { + if (cache()) { final HashMap<String, Boolean> isSubTypeCache = getCache("isSubType"); final String key = child + "->" + parent; final Boolean cached = isSubTypeCache.get(key); diff --git a/src/main/java/caosdb/server/resource/AbstractCaosDBServerResource.java b/src/main/java/caosdb/server/resource/AbstractCaosDBServerResource.java index ca683a5e7e3ad1625ef606fd671f9e70042e7331..b72f9fc56d75c254d19b3c4630f2be41828d5ac7 100644 --- a/src/main/java/caosdb/server/resource/AbstractCaosDBServerResource.java +++ b/src/main/java/caosdb/server/resource/AbstractCaosDBServerResource.java @@ -25,7 +25,10 @@ package caosdb.server.resource; import org.apache.shiro.SecurityUtils; import org.apache.shiro.subject.Subject; +import org.restlet.data.Header; +import org.restlet.data.MediaType; import org.restlet.resource.ServerResource; +import org.restlet.util.Series; import caosdb.server.utils.WebinterfaceUtils; /** @@ -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)}. */ @Override @@ -68,7 +71,13 @@ public abstract class AbstractCaosDBServerResource extends ServerResource { this.setAttribute("xsl", getXSLScript()); + MediaType mediaType = getRequest().getEntity().getMediaType(); + Series<Header> headers = getRequest().getHeaders(); + + if(mediaType == null) { + getRequest().getEntity().setMediaType(MediaType.TEXT_XML); + } } @Override diff --git a/src/main/java/caosdb/server/resource/AuthenticationResource.java b/src/main/java/caosdb/server/resource/AuthenticationResource.java index ef80acd5d3e97eea39754e524fcb0186cbcc7d93..870ad5c257e7615d2153a390f6d747dee960c935 100644 --- a/src/main/java/caosdb/server/resource/AuthenticationResource.java +++ b/src/main/java/caosdb/server/resource/AuthenticationResource.java @@ -25,48 +25,42 @@ package caosdb.server.resource; import java.io.IOException; import java.security.NoSuchAlgorithmException; import java.sql.SQLException; -import java.util.HashMap; -import java.util.Map; import java.util.logging.Level; import org.apache.shiro.SecurityUtils; -import org.apache.shiro.authc.AccountException; import org.apache.shiro.authc.AuthenticationException; -import org.apache.shiro.authc.CredentialsException; import org.apache.shiro.subject.Subject; import org.restlet.data.Form; -import org.restlet.data.Parameter; import org.restlet.data.Reference; import org.restlet.data.Status; +import org.restlet.engine.application.StatusInfo; import org.restlet.representation.Representation; import org.restlet.resource.Delete; import org.restlet.resource.Post; +import org.restlet.resource.ResourceException; import caosdb.server.CaosDBException; import caosdb.server.accessControl.AuthenticationUtils; import caosdb.server.accessControl.RealmUsernamePasswordToken; import caosdb.server.accessControl.UserSources; import caosdb.server.database.backend.implementation.MySQL.ConnectionException; -import caosdb.server.entity.Message; -import caosdb.server.utils.ServerMessages; public class AuthenticationResource extends AbstractCaosDBServerResource { @Delete - public Message logout() + public StatusInfo logout() throws ConnectionException, SQLException, CaosDBException, IOException, NoSuchAlgorithmException, Exception { final Subject user = SecurityUtils.getSubject(); if (user.isAuthenticated()) { user.logout(); 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 null; + return new StatusInfo(Status.CLIENT_ERROR_FORBIDDEN); } @Post - public Message login(final Representation entity) { + public StatusInfo login(final Representation entity) { getUser().logout(); @@ -93,33 +87,15 @@ public class AuthenticationResource extends AbstractCaosDBServerResource { if (referrerRef != null && !"logout".equals(referrerRef.getLastSegment())) { 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) { 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; } - + } diff --git a/src/main/java/caosdb/server/resource/transaction/AbstractEntityResource.java b/src/main/java/caosdb/server/resource/transaction/AbstractEntityResource.java index caf1d7c4f4a823939f39070670a8222e9b5eca67..d1f7a590f7d37aa65d218e209c924abdc363f514 100644 --- a/src/main/java/caosdb/server/resource/transaction/AbstractEntityResource.java +++ b/src/main/java/caosdb/server/resource/transaction/AbstractEntityResource.java @@ -42,7 +42,7 @@ public abstract class AbstractEntityResource extends AbstractCaosDBServerResourc } @Get - protected final TransactionContainer httpGetInChildClass() throws ConnectionException, IOException, + public final TransactionContainer httpGetInChildClass() throws ConnectionException, IOException, SQLException, CaosDBException, NoSuchAlgorithmException, Exception { final long t1 = System.currentTimeMillis(); @@ -78,6 +78,9 @@ public abstract class AbstractEntityResource extends AbstractCaosDBServerResourc @Override public void doInit() { + super.doInit(); + + String specifier = (String) getRequestAttributes().get("specifier"); if (specifier != null && !specifier.equals("")) { try { diff --git a/src/main/java/caosdb/server/resource/transaction/EntityResource.java b/src/main/java/caosdb/server/resource/transaction/EntityResource.java index 47d40918040ca85f0343d6cc5237618b1bb5d2c2..e31b748d73ea0486af820cefbd9b51dbfecc4d2b 100644 --- a/src/main/java/caosdb/server/resource/transaction/EntityResource.java +++ b/src/main/java/caosdb/server/resource/transaction/EntityResource.java @@ -22,10 +22,8 @@ */ package caosdb.server.resource.transaction; -import org.jdom2.JDOMException; import org.restlet.resource.Post; import org.restlet.resource.Put; -import caosdb.server.database.backend.implementation.MySQL.ConnectionException; import caosdb.server.entity.container.DeleteContainer; import caosdb.server.entity.container.TransactionContainer; import caosdb.server.resource.transaction.handlers.IDHandler; @@ -43,7 +41,7 @@ public class EntityResource extends AbstractEntityResource { @org.restlet.resource.Delete - protected final TransactionContainer httpDeleteInChildClass() throws Exception { + public final TransactionContainer httpDeleteInChildClass() throws Exception { final DeleteContainer entityContainer = new DeleteContainer(getUser(), getTimestamp(), getSRID(), getFlags()); @@ -57,10 +55,10 @@ public class EntityResource extends AbstractEntityResource { } @Post - protected final TransactionContainer httpPostInChildClass(final TransactionContainer entityContainer) - throws Exception { + public final TransactionContainer httpPostInChildClass(final TransactionContainer entityContainer) throws Exception { + entityContainer.setFlags(getFlags()); final Insert insert = new Insert(entityContainer); insert.execute(); @@ -68,13 +66,14 @@ public class EntityResource extends AbstractEntityResource { } @Put - protected final TransactionContainer httpPutInChildClass(final TransactionContainer entityContainer) - throws ConnectionException, JDOMException, Exception { + public final TransactionContainer httpPutInChildClass(final TransactionContainer entityContainer) throws Exception + { + entityContainer.setFlags(getFlags()); final Update update = new Update(entityContainer); - update.execute(); + update.execute(); + return entityContainer; - return entityContainer; } } diff --git a/src/main/java/caosdb/server/transaction/FileStorageConsistencyCheck.java b/src/main/java/caosdb/server/transaction/FileStorageConsistencyCheck.java index d1055b5e4c4a3bf0676883cc221e60d47442f304..4e3a604a9dc5f7fb71bfabbf83785b84ce75b008 100644 --- a/src/main/java/caosdb/server/transaction/FileStorageConsistencyCheck.java +++ b/src/main/java/caosdb/server/transaction/FileStorageConsistencyCheck.java @@ -22,6 +22,13 @@ */ 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.server.database.DatabaseMonitor; import caosdb.server.database.access.Access; @@ -30,17 +37,11 @@ import caosdb.server.database.backend.transaction.GetFileIterator; import caosdb.server.database.backend.transaction.GetFileRecordByPath; import caosdb.server.database.backend.transaction.RetrieveAllUncheckedFiles; import caosdb.server.database.backend.transaction.SetFileCheckedTimestamp; +import caosdb.server.database.exceptions.EntityDoesNotExistException; import caosdb.server.database.proto.SparseEntity; import caosdb.server.entity.Message; import caosdb.server.entity.xml.ToElementable; 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 implements ToElementable, TransactionInterface { @@ -86,12 +87,8 @@ public class FileStorageConsistencyCheck extends Thread continue; } - final GetFileRecordByPath t = execute(new GetFileRecordByPath(path), this.access); - - if (t.getEntity() == null) { - this.results.put(path, FileConsistencyCheck.UNKNOWN_FILE); - continue; - } + try { + final GetFileRecordByPath t = execute(new GetFileRecordByPath(path), this.access); final int result = execute( new FileConsistencyCheck( @@ -104,6 +101,11 @@ public class FileStorageConsistencyCheck extends Thread } 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 diff --git a/src/main/java/caosdb/server/transaction/Update.java b/src/main/java/caosdb/server/transaction/Update.java index ae39ade73ae7d4982bc36aaa793cedc1ac81fcea..0fc0e03c8cc2725d059a857a1d86fb49dd65aaa0 100644 --- a/src/main/java/caosdb/server/transaction/Update.java +++ b/src/main/java/caosdb/server/transaction/Update.java @@ -58,6 +58,8 @@ public class Update extends WriteTransaction<TransactionContainer> { // collect all ids of the entities which are to be updated. final TransactionContainer oldContainer = new TransactionContainer(); for (final Entity entity : getContainer()) { + entity.setSkip(EntityStatus.QUALIFIED); + // entity has no id -> it cannot be updated. if (!entity.hasId()) { entity.addError(ServerMessages.ENTITY_HAS_NO_ID);