Code development platform for open source projects from the European Union institutions :large_blue_circle: EU Login authentication by SMS will be completely phased out by mid-2025. To see alternatives please check here

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

[EDELIVERY-14110] fix document property validation for non string types

parent 0b56ed4d
No related branches found
No related tags found
No related merge requests found
Pipeline #216007 failed
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