From db0c90a9e6c1fcaa08ffb05e83fdcfdb36fe7e3c Mon Sep 17 00:00:00 2001 From: srosse <stephane.rosse@frentix.com> Date: Fri, 22 Mar 2019 11:11:36 +0100 Subject: [PATCH] OO-3934: more resilient metadata upgrader --- .../services/vfs/manager/MetaInfoReader.java | 33 +++++++++++-------- .../vfs/manager/VFSRepositoryServiceImpl.java | 13 ++++---- .../services/vfs/manager/VFSRevisionDAO.java | 2 ++ .../services/vfs/manager/VFSXStream.java | 14 ++++---- .../util/vfs/version/VersionsFileImpl.java | 7 ++-- .../ui/admin/UserAdminMainController.java | 2 +- .../vfs/manager/house.versions.jpg.xml | 22 +++++++++++++ 7 files changed, 62 insertions(+), 31 deletions(-) diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/MetaInfoReader.java b/src/main/java/org/olat/core/commons/services/vfs/manager/MetaInfoReader.java index 622a93851c5..6a9832aba2a 100644 --- a/src/main/java/org/olat/core/commons/services/vfs/manager/MetaInfoReader.java +++ b/src/main/java/org/olat/core/commons/services/vfs/manager/MetaInfoReader.java @@ -225,7 +225,7 @@ public class MetaInfoReader { } else if ("thumbnails".equals(qName)) { String valueStr = attributes.getValue("cannotGenerateThumbnail"); if(StringHelper.containsNonWhitespace(valueStr)) { - meta.setCannotGenerateThumbnails(Boolean.valueOf(valueStr).booleanValue()); + meta.setCannotGenerateThumbnails(Boolean.parseBoolean(valueStr)); } }else if ("thumbnail".equals(qName)) { Thumbnail thumbnail = new Thumbnail(); @@ -252,7 +252,7 @@ public class MetaInfoReader { if(current == null) return; if("comment".equals(qName)) { - meta.setComment(current.toString()); + meta.setComment(cutLenght(current.toString(), 32000)); } else if ("author".equals(qName)) { Long authorKey = getLong(); if(authorKey != null) { @@ -264,30 +264,30 @@ public class MetaInfoReader { meta.setLockedBy(securityManager.loadIdentityByKey(lockedByKey)); } } else if ("title".equals(qName)) { - meta.setTitle(current.toString()); + meta.setTitle(cutLenght(current.toString(), 2000)); } else if ("publisher".equals(qName)) { - meta.setPublisher(current.toString()); + meta.setPublisher(cutLenght(current.toString(), 2000)); } else if ("source".equals(qName)) { - meta.setSource(current.toString()); + meta.setSource(cutLenght(current.toString(), 2000)); } else if ("city".equals(qName)) { - meta.setCity(current.toString()); + meta.setCity(cutLenght(current.toString(), 256)); } else if ("pages".equals(qName)) { - meta.setPages(current.toString()); + meta.setPages(cutLenght(current.toString(), 2000)); } else if ("language".equals(qName)) { - meta.setLanguage(current.toString()); + meta.setLanguage(cutLenght(current.toString(), 16)); } else if ("downloadCount".equals(qName)) { Long key = getLong(); if(key != null) { meta.setDownloadCount(key.intValue()); } } else if ("month".equals(qName)) { - meta.setPubMonth(current.toString()); + meta.setPubMonth(cutLenght(current.toString(), 16)); } else if ("year".equals(qName)) { - meta.setPubYear(current.toString()); + meta.setPubYear(cutLenght(current.toString(), 16)); } else if (qName.equals("creator")) { - meta.setCreator(current.toString()); + meta.setCreator(cutLenght(current.toString(), 2000)); } else if (qName.equals("url")) { - meta.setUrl(current.toString()); + meta.setUrl(cutLenght(current.toString(), 1000)); } else if (qName.equals("licenseTypeKey")) { // } else if (qName.equals("licenseTypeName")) { @@ -299,7 +299,7 @@ public class MetaInfoReader { } else if (qName.equals("licenseText")) { meta.setLicenseText(current.toString()); } else if (qName.equals("licensor")) { - meta.setLicensor(current.toString()); + meta.setLicensor(cutLenght(current.toString(), 4000)); } else if (qName.equals("thumbnail")) { if(fMeta != null) { String finalName = current.toString(); @@ -321,6 +321,13 @@ public class MetaInfoReader { } return null; } + + private String cutLenght(String text, int maxLength) { + if(text == null || text.length() < maxLength) { + return text; + } + return text.substring(0, maxLength - 2); + } } public static class Thumbnail implements Serializable { diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java index 2c884c3a1ac..8dc0a770657 100644 --- a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRepositoryServiceImpl.java @@ -1138,7 +1138,7 @@ public class VFSRepositoryServiceImpl implements VFSRepositoryService, GenericEv private VFSMetadata migrateVersions(File file, File versionFile, VFSMetadata metadata) { VersionsFileImpl versions = (VersionsFileImpl)VFSXStream.read(versionFile); - List<VFSRevision> revisions = versions.getRevisions(); + List<RevisionFileImpl> revisions = versions.getRevisions(); if(revisions == null || revisions.isEmpty()) { return metadata; } @@ -1147,15 +1147,14 @@ public class VFSRepositoryServiceImpl implements VFSRepositoryService, GenericEv metadata.setRevisionNr(versions.getRevisionNr()); metadata = metadataDao.updateMetadata(metadata); - for(VFSRevision revision:revisions) { - RevisionFileImpl revisionFile = (RevisionFileImpl)revision; - String filename = revisionFile.getFilename(); + for(RevisionFileImpl revision:revisions) { + String filename = revision.getFilename(); File oldOne = new File(versionFile.getParentFile(), filename); if(oldOne.exists()) { try { - String newRevisionFilename = generateFilenameForRevision(file, revisionFile.getRevisionNr()); - revisionDao.createRevision(revisionFile.getAuthor(), newRevisionFilename, revisionFile.getRevisionNr(), - oldOne.length(), revisionFile.getFileLastModified(), revisionFile.getComment(), metadata); + String newRevisionFilename = generateFilenameForRevision(file, revision.getRevisionNr()); + revisionDao.createRevision(revision.getAuthor(), newRevisionFilename, revision.getRevisionNr(), + oldOne.length(), revision.getFileLastModified(), revision.getComment(), metadata); File target = new File(file.getParentFile(), newRevisionFilename); Files.move(oldOne.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRevisionDAO.java b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRevisionDAO.java index d702ba9ae1f..3d7463eee60 100644 --- a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRevisionDAO.java +++ b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSRevisionDAO.java @@ -84,6 +84,8 @@ public class VFSRevisionDAO { } public List<VFSRevision> getRevisions(VFSMetadataRef metadata) { + if(metadata == null) return new ArrayList<>(); + StringBuilder sb = new StringBuilder(256); sb.append("select rev from vfsrevision rev") .append(" left join fetch rev.author as author") diff --git a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSXStream.java b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSXStream.java index ea94e2f5b5a..491aba1d4b5 100644 --- a/src/main/java/org/olat/core/commons/services/vfs/manager/VFSXStream.java +++ b/src/main/java/org/olat/core/commons/services/vfs/manager/VFSXStream.java @@ -139,12 +139,14 @@ public class VFSXStream { @Override public Object fromString(String str) { Identity identity = null; - if(StringHelper.isLong(str)) { - Long identityKey = Long.valueOf(str); - identity = CoreSpringFactory.getImpl(BaseSecurity.class).loadIdentityByKey(identityKey); - } - if(identity == null) { - identity = CoreSpringFactory.getImpl(BaseSecurity.class).findIdentityByName(str); + if(StringHelper.containsNonWhitespace(str) && !"-".equals(str)) { + if(StringHelper.isLong(str)) { + Long identityKey = Long.valueOf(str); + identity = CoreSpringFactory.getImpl(BaseSecurity.class).loadIdentityByKey(identityKey); + } + if(identity == null && !"-".equals(str)) { + identity = CoreSpringFactory.getImpl(BaseSecurity.class).findIdentityByName(str); + } } return identity; } diff --git a/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java b/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java index 6b53323ef48..929b97b6733 100644 --- a/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java +++ b/src/main/java/org/olat/core/util/vfs/version/VersionsFileImpl.java @@ -22,7 +22,6 @@ package org.olat.core.util.vfs.version; import java.util.ArrayList; import java.util.List; -import org.olat.core.commons.services.vfs.VFSRevision; import org.olat.core.util.vfs.VFSLeaf; /** @@ -46,7 +45,7 @@ public class VersionsFileImpl { private String comment; private Object currentVersion; private VFSLeaf versionFile; - private List<VFSRevision> revisions; + private List<RevisionFileImpl> revisions; public VersionsFileImpl() { // @@ -76,14 +75,14 @@ public class VersionsFileImpl { this.currentVersion = currentVersion; } - public List<VFSRevision> getRevisions() { + public List<RevisionFileImpl> getRevisions() { if (revisions == null) { revisions = new ArrayList<>(); } return revisions; } - public void setRevisions(List<VFSRevision> revisions) { + public void setRevisions(List<RevisionFileImpl> revisions) { this.revisions = revisions; } diff --git a/src/main/java/org/olat/user/ui/admin/UserAdminMainController.java b/src/main/java/org/olat/user/ui/admin/UserAdminMainController.java index ac359993878..57ef907da19 100644 --- a/src/main/java/org/olat/user/ui/admin/UserAdminMainController.java +++ b/src/main/java/org/olat/user/ui/admin/UserAdminMainController.java @@ -530,7 +530,7 @@ public class UserAdminMainController extends MainLayoutBasicController implement if (isAdministrator) { appendNode("menu.authorgroup", "menu.authorgroup.alt", "authorgroup", "o_sel_useradmin_authorgroup", accessNode); appendNode("menu.coauthors", "menu.coauthors.alt", "coauthors", "o_sel_useradmin_coauthors", accessNode); - appendNode("menu.resourceowners", "menu.resourceowners.alt", "resourceowners", "o_sel_useradmin_resourceowners", accessNode); + // too slow appendNode("menu.resourceowners", "menu.resourceowners.alt", "resourceowners", "o_sel_useradmin_resourceowners", accessNode); } appendNode("menu.coursecoach", "menu.coursecoach.alt", "coursecoach", "o_sel_useradmin_coursecoach", accessNode); diff --git a/src/test/java/org/olat/core/commons/services/vfs/manager/house.versions.jpg.xml b/src/test/java/org/olat/core/commons/services/vfs/manager/house.versions.jpg.xml index 1e505ffd21d..1d3b889073c 100644 --- a/src/test/java/org/olat/core/commons/services/vfs/manager/house.versions.jpg.xml +++ b/src/test/java/org/olat/core/commons/services/vfs/manager/house.versions.jpg.xml @@ -61,5 +61,27 @@ <thumbnails/> </metadata> </revision> + <revision> + <author>-</author> + <comment>A new pink one</comment> + <name>house.jpg</name> + <uuid>acba63ce-de13-4759-bf85-a26f1833edd2</uuid> + <lastModified>1552487917000</lastModified> + <revisionNr>3</revisionNr> + <filename>c4087cf5-0ed6-4ed8-a97c-1317c963a0a8_house.jpg</filename> + <metadata class="metadata"> + <uuid>e3d63dc8595942b2801d0af9c1f61dd3</uuid> + <authorIdentKey>720898</authorIdentKey> + <comment></comment> + <licenseTypeKey>1</licenseTypeKey> + <licenseTypeName>no.license</licenseTypeName> + <downloadCount>2</downloadCount> + <locked>false</locked> + <originFile>/HotCoffee/olatdatas/openolat_110_postgresql/bcroot/homes/kanu/public/house.jpg</originFile> + <metaFile>/HotCoffee/olatdatas/openolat_110_postgresql/bcroot/.meta/homes/kanu/public/house.jpg.xml</metaFile> + <cannotGenerateThumbnail>false</cannotGenerateThumbnail> + <thumbnails/> + </metadata> + </revision> </revisions> </versions> \ No newline at end of file -- GitLab