Code development platform for open source projects from the European Union institutions

Skip to content
Snippets Groups Projects
Commit 27599c74 authored by Joze RIHTARSIC's avatar Joze RIHTARSIC
Browse files

Pull request #162: [EDELIVERY-14110] fix document property validation for non string types

Merge in EDELIVERY/smp from bugfix/EDELIVERY-14110-property-update-for-non-string-xml-types to development

* commit 'ab08009c':
  [EDELIVERY-14110] fix document property validation for non string types
parents d3c6e01f ab08009c
No related branches found
No related tags found
No related merge requests found
Showing
with 81 additions and 54 deletions
......@@ -180,8 +180,12 @@ public class SMPExtensionInitializer implements InitializingBean {
resourceDef.setName(resourceDefinitionSpi.name());
resourceDef.setDescription(resourceDefinitionSpi.description());
resourceDef.setMimeType(resourceDefinitionSpi.mimeType());
resourceDef.setUrlSegment(resourceDefinitionSpi.defaultUrlSegment());
//resourceDef.setUrlSegment(resourceDefinitionSpi.defaultUrlSegment());
resourceDef.setHandlerImplementationName(getHandlerSPIName(resourceDefinitionSpi.getResourceHandler()));
// update only if new subresource
if (resourceDef.getId() == null) {
resourceDef.setUrlSegment(resourceDefinitionSpi.defaultUrlSegment());
}
resourceDefinitionSpi.getSubresourceSpiList().forEach(
subresourceDefinitionSpi -> validateSubresourceDefinition(subresourceDefinitionSpi, resourceDef)
);
......@@ -207,13 +211,13 @@ public class SMPExtensionInitializer implements InitializingBean {
subresourceDef.setName(subresourceDefinitionSpi.name());
subresourceDef.setDescription(subresourceDefinitionSpi.description());
subresourceDef.setMimeType(subresourceDefinitionSpi.mimeType());
subresourceDef.setUrlSegment(subresourceDefinitionSpi.urlSegment());
subresourceDef.setHandlerImplementationName(getHandlerSPIName(subresourceDefinitionSpi.getResourceHandler()));
// update only if new subresource
if (subresourceDef.getId() == null) {
subresourceDef.setUrlSegment(subresourceDefinitionSpi.urlSegment());
}
}
public void updateExtension(String extensionName, ExtensionInfo extensionInfo, DBExtension extension) {
LOG.debug("Update extension for implementationName [{}]", extensionInfo);
extension.setName(extensionInfo.name());
......
......@@ -55,6 +55,10 @@ public class DocumentDao extends BaseDao<DBDocument> {
* @return document for the resource or empty if not found
*/
public Optional<DBDocument> getDocumentForResource(DBResource dbResource) {
if (dbResource == null || dbResource.getId() == null) {
LOG.debug("Can not get document for resource, because resource is not persisted to the database");
return Optional.empty();
}
try {
// expected is only one domain,
TypedQuery<DBDocument> query = memEManager.createNamedQuery(QUERY_DOCUMENT_FOR_RESOURCE, DBDocument.class);
......@@ -74,6 +78,10 @@ public class DocumentDao extends BaseDao<DBDocument> {
* @return document for the resource or empty if not found
*/
public Optional<DBDocument> getDocumentForSubresource(DBSubresource dbSubresource) {
if (dbSubresource == null|| dbSubresource.getId() == null) {
LOG.debug("Can not get document for subresource, because resource is not persisted to the database");
return Optional.empty();
}
try {
// expected is only one domain,
TypedQuery<DBDocument> query = memEManager.createNamedQuery(QUERY_DOCUMENT_FOR_SUBRESOURCE, DBDocument.class);
......@@ -192,7 +200,7 @@ public class DocumentDao extends BaseDao<DBDocument> {
public long getDocumentReviewListForUserCount(Long dbUserId) {
TypedQuery<Long> query = createDocumentReviewListForUserQuery(Long.class, dbUserId);
return query.getSingleResult().longValue();
return query.getSingleResult();
}
/**
......
......@@ -59,7 +59,7 @@ public class DBDocumentProperty extends BaseEntity {
@Column(name = "PROPERTY_NAME")
protected String property;
@Column(name = "PROPERTY_VALUE", length = CommonColumnsLengths.MAX_MEDIUM_TEXT_LENGTH)
@Column(name = "PROPERTY_VALUE", length = CommonColumnsLengths.MAX_FREE_TEXT_LENGTH)
private String value;
@Column(name = "DESCRIPTION", length = CommonColumnsLengths.MAX_FREE_TEXT_LENGTH)
......
......@@ -115,26 +115,31 @@ public class AbstractResourceHandler {
if (content == null || content.length == 0) {
throw new SMPRuntimeException(ErrorCode.RESOURCE_DOCUMENT_MISSING, resource.getIdentifierValue(), resource.getIdentifierScheme());
}
// read and replace properties
Map<String, String> docProp = resourceStorage.getResourceProperties(resource);
return buildRequestDataForResource(domain, resource, new ByteArrayInputStream(content));
}
public RequestData buildRequestDataForResource(DBDomain domain, DBResource resource, InputStream inputStream) {
Map<String, String> docProp = resourceStorage.getResourceProperties(resource);
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
StringNamedSubstitutor.resolve(new ByteArrayInputStream(content), docProp, baos, EXPECTED_RESOURCE_CHARSET);
ByteArrayInputStream inputStream = new ByteArrayInputStream(baos.toByteArray());
return buildRequestDataForResource(domain,
resource,
inputStream);
if (inputStream != null && inputStream.available() != 0) {
StringNamedSubstitutor.resolve(inputStream, docProp, baos, EXPECTED_RESOURCE_CHARSET);
}
return new SpiRequestData(domain.getDomainCode(),
SPIUtils.toUrlIdentifier(resource),
new ByteArrayInputStream(baos.toByteArray()));
} catch (IOException e) {
throw new SMPRuntimeException(ErrorCode.RESOURCE_DOCUMENT_MISSING, resource.getIdentifierValue(), resource.getIdentifierScheme());
}
}
public RequestData buildRequestDataForResource(DBDomain domain, DBResource resource, InputStream inputStream) {
return new SpiRequestData(domain.getDomainCode(),
SPIUtils.toUrlIdentifier(resource),
inputStream);
}
/**
* Build handler RequestData and add resource from the database for the subresource
* It reads the content of the subresource from the database and replaces the properties in the document.
* @param domain
* @param resource
* @param subresource
* @return
*/
public RequestData buildRequestDataForSubResource(DBDomain domain, DBResource resource,
DBSubresource subresource) {
byte[] content = resourceStorage.getDocumentContentForSubresource(subresource);
......@@ -143,11 +148,24 @@ public class AbstractResourceHandler {
subresource.getIdentifierValue(), subresource.getIdentifierScheme(),
resource.getIdentifierValue(), resource.getIdentifierScheme());
}
return buildRequestDataForSubResource(domain, resource, subresource, new ByteArrayInputStream(content));
}
/**
* Build handler RequestData and add resource from the database. The input stream is used to replace the properties
* in the document and the new bytearrays is used as stream to create the RequestData.
* @param domain of the resource
* @param resource the parent resource of the subresource
* @param subresource an entity with the subresource data
* @param inputStream the input stream to replace the properties in the document
* @return request data for the subresource
*/
public RequestData buildRequestDataForSubResource(DBDomain domain, DBResource resource, DBSubresource subresource, InputStream inputStream) {
Map<String, String> docProp = resourceStorage.getSubresourceProperties(resource, subresource);
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
StringNamedSubstitutor.resolve(new ByteArrayInputStream(content), docProp, baos, EXPECTED_RESOURCE_CHARSET);
if (inputStream != null && inputStream.available() != 0) {
StringNamedSubstitutor.resolve(inputStream, docProp, baos, EXPECTED_RESOURCE_CHARSET);
}
return new SpiRequestData(domain.getDomainCode(),
SPIUtils.toUrlIdentifier(resource),
SPIUtils.toUrlIdentifier(subresource),
......@@ -157,13 +175,6 @@ public class AbstractResourceHandler {
}
}
public RequestData buildRequestDataForSubResource(DBDomain domain, DBResource resource, DBSubresource subresource, InputStream inputStream) {
return new SpiRequestData(domain.getDomainCode(),
SPIUtils.toUrlIdentifier(resource),
SPIUtils.toUrlIdentifier(subresource),
inputStream);
}
public void handleReadResource(ResourceHandlerSpi handlerSpi, RequestData requestData, ResponseData responseData, ResourceResponse resourceResponse) {
try {
handlerSpi.readResource(requestData, responseData);
......
......@@ -73,8 +73,8 @@ public class ResourceStorage {
@Transactional
public byte[] getDocumentContentForResource(DBResource dbResource) {
LOG.debug("getDocumentContentForResource: [{}]", dbResource);
DBDocument document = documentDao.getDocumentForResource(dbResource).orElseGet(null);
return getDocumentContent(document, true);
Optional<DBDocument> document = documentDao.getDocumentForResource(dbResource);
return document.isPresent() ? getDocumentContent(document.get(), true) : null;
}
public byte[] getDocumentContent(DBDocument document, boolean followReference) {
......@@ -93,23 +93,23 @@ public class ResourceStorage {
LOG.debug("getDocumentContent: [{}]", document);
Optional<DBDocumentVersion> documentVersion = documentDao.getCurrentDocumentVersionForDocument(document);
return documentVersion.isPresent() ? documentVersion.get().getContent() : null;
return documentVersion.map(DBDocumentVersion::getContent).orElse(null);
}
public byte[] getDocumentContentForSubresource(DBSubresource subresource) {
LOG.debug("getDocumentContentForSubresource: [{}]", subresource);
DBDocument document = documentDao.getDocumentForSubresource(subresource).orElseGet(null);
return getDocumentContent(document, true);
Optional<DBDocument> document = documentDao.getDocumentForSubresource(subresource);
return document.isPresent() ? getDocumentContent(document.get(), true) : null;
}
@Transactional
public Map<String, String> getResourceProperties(DBResource resource) {
DBDocument document = documentDao.getDocumentForResource(resource).orElseGet(null);
if (document == null) {
Optional<DBDocument> optDocument = documentDao.getDocumentForResource(resource);
if (!optDocument.isPresent()) {
LOG.debug("Document not found for resource [{}]", resource);
return Collections.emptyMap();
}
Map<String, String> documentProperties = getDocumentProperties(document, true);
Map<String, String> documentProperties = getDocumentProperties(optDocument.get(), true);
// then overwrite with document properties
documentProperties.put(TransientDocumentPropertyType.RESOURCE_IDENTIFIER_VALUE.getPropertyName(), resource.getIdentifierValue());
if (resource.getIdentifierScheme() != null) {
......@@ -121,13 +121,13 @@ public class ResourceStorage {
@Transactional
public Map<String, String> getSubresourceProperties(DBResource resource, DBSubresource subresource) {
DBDocument document = documentDao.getDocumentForSubresource(subresource).orElseGet(null);
if (document == null) {
Optional<DBDocument> optDocument = documentDao.getDocumentForSubresource(subresource);
if (!optDocument.isPresent()) {
LOG.debug("Document not found for subresource [{}]", resource);
return Collections.emptyMap();
}
Map<String, String> documentProperties = getDocumentProperties(document, true);
Map<String, String> documentProperties = getDocumentProperties(optDocument.get(), true);
// add resource and subresource properties
documentProperties.put(TransientDocumentPropertyType.RESOURCE_IDENTIFIER_VALUE.getPropertyName(), resource.getIdentifierValue());
if (resource.getIdentifierScheme() != null) {
......
......@@ -41,7 +41,7 @@ create table SMP_DOCUMENT_PROPERTY (
DESCRIPTION varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin comment 'Property description',
PROPERTY_NAME varchar(255) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_TYPE varchar(64) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_VALUE varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_VALUE varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin,
FK_DOCUMENT_ID bigint,
primary key (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
......@@ -55,7 +55,7 @@ create table SMP_DOCUMENT_PROPERTY_AUD (
DESCRIPTION varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_NAME varchar(255) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_TYPE varchar(64) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_VALUE varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_VALUE varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin,
FK_DOCUMENT_ID bigint,
primary key (ID, REV)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
......
......@@ -35,7 +35,7 @@ create table SMP_DOCUMENT_PROPERTY (
DESCRIPTION varchar2(4000 char),
PROPERTY_NAME varchar2(255 char),
PROPERTY_TYPE varchar2(64 char),
PROPERTY_VALUE varchar2(1024 char),
PROPERTY_VALUE varchar2(4000 char),
FK_DOCUMENT_ID number(19,0),
primary key (ID)
);
......@@ -55,7 +55,7 @@ create table SMP_DOCUMENT_PROPERTY_AUD (
DESCRIPTION varchar2(4000 char),
PROPERTY_NAME varchar2(255 char),
PROPERTY_TYPE varchar2(64 char),
PROPERTY_VALUE varchar2(1024 char),
PROPERTY_VALUE varchar2(4000 char),
FK_DOCUMENT_ID number(19,0),
primary key (ID, REV)
);
......
-- ------------------------------------------------------------------------
-- This file was generated by hibernate for SMP version 5.1-SNAPSHOT.
-- This file was generated by hibernate for SMP version 5.1-RC2-SNAPSHOT.
-- ------------------------------------------------------------------------
......
-- ------------------------------------------------------------------------
-- This file was generated by hibernate for SMP version 5.1-SNAPSHOT.
-- This file was generated by hibernate for SMP version 5.1-RC2-SNAPSHOT.
-- ------------------------------------------------------------------------
......@@ -192,7 +192,7 @@
DESCRIPTION varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin comment 'Property description',
PROPERTY_NAME varchar(255) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_TYPE varchar(64) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_VALUE varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_VALUE varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin,
FK_DOCUMENT_ID bigint,
primary key (ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
......@@ -206,7 +206,7 @@
DESCRIPTION varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_NAME varchar(255) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_TYPE varchar(64) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_VALUE varchar(1024) CHARACTER SET utf8 COLLATE utf8_bin,
PROPERTY_VALUE varchar(4000) CHARACTER SET utf8 COLLATE utf8_bin,
FK_DOCUMENT_ID bigint,
primary key (ID, REV)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
......
-- ------------------------------------------------------------------------
-- This file was generated by hibernate for SMP version 5.1-SNAPSHOT.
-- This file was generated by hibernate for SMP version 5.1-RC2-SNAPSHOT.
-- ------------------------------------------------------------------------
......
-- ------------------------------------------------------------------------
-- This file was generated by hibernate for SMP version 5.1-SNAPSHOT.
-- This file was generated by hibernate for SMP version 5.1-RC2-SNAPSHOT.
-- ------------------------------------------------------------------------
create sequence SMP_ALERT_PROP_SEQ start with 1 increment by 1;
......@@ -318,7 +318,7 @@ create sequence SMP_USER_SEQ start with 1 increment by 1;
DESCRIPTION varchar2(4000 char),
PROPERTY_NAME varchar2(255 char),
PROPERTY_TYPE varchar2(64 char),
PROPERTY_VALUE varchar2(1024 char),
PROPERTY_VALUE varchar2(4000 char),
FK_DOCUMENT_ID number(19,0),
primary key (ID)
);
......@@ -338,7 +338,7 @@ create sequence SMP_USER_SEQ start with 1 increment by 1;
DESCRIPTION varchar2(4000 char),
PROPERTY_NAME varchar2(255 char),
PROPERTY_TYPE varchar2(64 char),
PROPERTY_VALUE varchar2(1024 char),
PROPERTY_VALUE varchar2(4000 char),
FK_DOCUMENT_ID number(19,0),
primary key (ID, REV)
);
......
......@@ -37,7 +37,7 @@ smp.jdbc.password=secret123
#smp.jdbc.driver = oracle.jdbc.driver.OracleDriver
#smp.jdbc.url=jdbc:oracle:thin:@localhost:1521/xe
#smp.jdbc.user=smp
#smp.jdbc.password=secret123
#smp.jdbc.password=****
# *********************************
......@@ -48,6 +48,10 @@ smp.jdbc.password=secret123
# tomcat datasource JNDI example
# smp.datasource.jndi=java:comp/env/jdbc/eDeliverySmpDs
# *********************************
# security folder
# *********************************
# smp.security.folder=./smp/
# *********************************
# Logging properties
......@@ -69,4 +73,4 @@ smp.jdbc.password=secret123
# Locale folder
# *********************************
# The locale folder contains the translations for the SMP web application.
# smp.libraries.folder=/data/smp/locales
# smp.locale.folder=/data/smp/locales
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment