Skip to content
Snippets Groups Projects
Commit d6b5bccd authored by srosse's avatar srosse
Browse files

Merge remote-tracking branch 'origin/OpenOLAT_14.0'

parents 7377ac4d 174f6a21
No related branches found
No related tags found
No related merge requests found
Showing
with 92 additions and 43 deletions
......@@ -73,7 +73,7 @@ public class DocEditorSecurityCallbackBuilder {
* @param canClose
* @return
*/
public DocEditorSecurityCallbackBuilder canClose(boolean canClose) {
public DocEditorSecurityCallbackBuilder withCanClose(boolean canClose) {
this.canClose = canClose;
return this;
}
......@@ -96,7 +96,7 @@ public class DocEditorSecurityCallbackBuilder {
.withMode(secCallback.getMode())
.withHasMeta(secCallback.hasMeta())
.withVersionControlled(secCallback.isVersionControlled())
.canClose(secCallback.canClose());
.withCanClose(secCallback.canClose());
}
private DocEditorSecurityCallbackBuilder() {
......
......@@ -96,7 +96,7 @@ class AccessDAO {
return accesses.isEmpty() ? null : accesses.get(0);
}
Access loadAccess(VFSMetadata metadata, Identity identity, String app) {
Access loadAccess(VFSMetadata metadata, Identity identity, String app, boolean canEdit) {
if (metadata == null || identity == null) return null;
QueryBuilder sb = new QueryBuilder();
......@@ -107,12 +107,14 @@ class AccessDAO {
sb.and().append("access.metadata.key = :metadataKey");
sb.and().append("access.identity.key = :identityKey");
sb.and().append("access.app = :app");
sb.and().append("access.canEdit = :canEdit");
List<Access> accesses = dbInstance.getCurrentEntityManager()
.createQuery(sb.toString(), Access.class)
.setParameter("metadataKey", metadata.getKey())
.setParameter("identityKey", identity.getKey())
.setParameter("app", app)
.setParameter("canEdit", canEdit)
.getResultList();
return accesses.isEmpty() ? null : accesses.get(0);
}
......
......@@ -121,7 +121,7 @@ public class WopiServiceImpl implements WopiService {
@Override
public Access getOrCreateAccess(VFSMetadata vfsMetadata, Identity identity, DocEditorSecurityCallback secCallback,
String app, Date expiresAt) {
Access access = accessDao.loadAccess(vfsMetadata, identity, app);
Access access = accessDao.loadAccess(vfsMetadata, identity, app, getCanEdit(secCallback));
if (access != null) {
if (accessUnchanged(access, secCallback) && !expired(access)) {
access = accessDao.updateExpiresAt(access, expiresAt);
......@@ -135,7 +135,6 @@ public class WopiServiceImpl implements WopiService {
}
private boolean accessUnchanged(Access access, DocEditorSecurityCallback secCallback) {
if (access.isCanEdit() != getCanEdit(secCallback)) return false;
if (access.isCanClose() != secCallback.canClose()) return false;
if (access.isVersionControlled() != secCallback.isVersionControlled()) return false;
return true;
......
......@@ -98,6 +98,7 @@ public class EdubaseBookSectionListController extends FormBasicController {
// BookSections
List<BookSection> bookSections = new ArrayList<>(config.getList(EdubaseCourseNode.CONFIG_BOOK_SECTIONS, BookSectionImpl.class));
bookSections.stream()
.map(bs -> edubaseManager.appendCoverUrl(bs))
.sorted(new PositionComparator())
.forEach(this::wrapBookSection);
ensureBookSectionWrappersHaveAnEntry();
......@@ -313,7 +314,7 @@ public class EdubaseBookSectionListController extends FormBasicController {
private void showDetails(UserRequest ureq, BookSectionWrapper wrapper) {
String bookId = setParsedBookId(wrapper);
BookDetails bookDetails = edubaseManager.fetchBookDetails(bookId);
setCoverUrl(wrapper, bookDetails);
edubaseManager.appendCoverUrl(wrapper.getBookSection());
detailsController = new EdubaseBookSectionDetailsController(
ureq,
getWindowControl(),
......@@ -332,9 +333,8 @@ public class EdubaseBookSectionListController extends FormBasicController {
private void setBookIdsAndCovers() {
for (BookSectionWrapper wrapper: bookSectionWrappers) {
String bookId = setParsedBookId(wrapper);
BookDetails bookDetails = edubaseManager.fetchBookDetails(bookId);
setCoverUrl(wrapper, bookDetails);
setParsedBookId(wrapper);
edubaseManager.appendCoverUrl(wrapper.getBookSection());
}
}
......@@ -344,14 +344,6 @@ public class EdubaseBookSectionListController extends FormBasicController {
return bookId;
}
private void setCoverUrl(BookSectionWrapper wrapper, BookDetails bookDetails) {
String coverUrl = bookDetails.getCoverUrl();
if (coverUrl != null && coverUrl.substring(0, 5).equals("http:")) {
coverUrl = coverUrl.replace("http:", "https:");
}
wrapper.getBookSection().setCoverUrl(coverUrl);
}
private void wrapBookSection(BookSection bookSection) {
String bookSectionId = "" + countBookSections++;
......
......@@ -34,7 +34,9 @@ import org.olat.core.gui.control.controller.BasicController;
import org.olat.course.nodes.EdubaseCourseNode;
import org.olat.modules.ModuleConfiguration;
import org.olat.modules.edubase.BookSection;
import org.olat.modules.edubase.EdubaseManager;
import org.olat.modules.edubase.model.PositionComparator;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
......@@ -48,6 +50,9 @@ public class EdubasePeekViewController extends BasicController {
private final static int NUMBER_BOOK_SECTION_DESC_DISABLED = 4;
private final String nodeId;
@Autowired
private EdubaseManager edubaseManager;
public EdubasePeekViewController(UserRequest ureq, WindowControl wControl, ModuleConfiguration modulConfiguration,
String nodeId) {
......@@ -64,6 +69,7 @@ public class EdubasePeekViewController extends BasicController {
// BookSections
List<BookSection> bookSections =
modulConfiguration.getList(EdubaseCourseNode.CONFIG_BOOK_SECTIONS, BookSection.class).stream()
.map(bs -> edubaseManager.appendCoverUrl(bs))
.sorted(new PositionComparator())
.limit(NUMBER_BOOK_SECTION_DESC_DISABLED)
.collect(Collectors.toList());
......
......@@ -38,8 +38,10 @@ import org.olat.course.nodes.EdubaseCourseNode;
import org.olat.modules.ModuleConfiguration;
import org.olat.modules.edubase.BookSection;
import org.olat.modules.edubase.EdubaseLoggingAction;
import org.olat.modules.edubase.EdubaseManager;
import org.olat.modules.edubase.model.PositionComparator;
import org.olat.util.logging.activity.LoggingResourceable;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
......@@ -58,6 +60,9 @@ public class EdubaseRunController extends BasicController {
private Component overviewContainer;
private Controller viewerController;
private List<BookSection> bookSections;
@Autowired
private EdubaseManager edubaseManager;
public EdubaseRunController(UserRequest ureq, WindowControl wControl, ModuleConfiguration modulConfiguration) {
super(ureq, wControl);
......@@ -79,6 +84,7 @@ public class EdubaseRunController extends BasicController {
bookSections =
modulConfiguration.getList(EdubaseCourseNode.CONFIG_BOOK_SECTIONS, BookSection.class).stream()
.map(bs -> edubaseManager.appendCoverUrl(bs))
.sorted(new PositionComparator())
.collect(Collectors.toList());
container.contextPut("bookSections", bookSections);
......
......@@ -64,6 +64,14 @@ public interface EdubaseManager {
*/
public String getLtiLaunchUrl(BookSection bookSection);
/**
* Appends the static cover url.
*
* @param bookSection
* @return the modified bookSection
*/
public BookSection appendCoverUrl(BookSection bookSection);
/**
* The application url is the target url of the edubase reader. The url is
* depending on the module configuration unique per identity.
......@@ -72,7 +80,7 @@ public interface EdubaseManager {
* @return
*/
public String getApplicationUrl(Identity identity);
/**
* Request details of a book version from the Edubase InfoDocVers Service.
*
......
......@@ -43,6 +43,7 @@ public class EdubaseModule extends AbstractSpringModule implements ConfigOnOff {
public static final String EDUBASE_READER_URL_UNIQUE = "edubase.readerUrl.unique";
public static final String EDUBASE_LTI_LAUNCH_URL = "edubase.ltiLaunchUrl";
public static final String EDUBASE_INFOVER_URL = "edubase.infoverUrl";
public static final String EDUBASE_COVER_URL = "edubase.coverUrl";
@Value("${edubase.enabled:false}")
private boolean enabled;
......@@ -56,6 +57,8 @@ public class EdubaseModule extends AbstractSpringModule implements ConfigOnOff {
private String ltiLaunchUrl;
@Value("${edubase.infoverUrl}")
private String infoverUrl;
@Value("${edubase.coverUrl}")
private String coverUrl;
@Autowired
public EdubaseModule(CoordinatorManager coordinatorManager) {
......@@ -103,6 +106,11 @@ public class EdubaseModule extends AbstractSpringModule implements ConfigOnOff {
if (StringHelper.containsNonWhitespace(infoverUrlObj)) {
infoverUrl = infoverUrlObj;
}
String coverUrlObj = getStringPropertyValue(EDUBASE_COVER_URL, true);
if (StringHelper.containsNonWhitespace(coverUrlObj)) {
coverUrl = coverUrlObj;
}
}
@Override
......@@ -163,6 +171,15 @@ public class EdubaseModule extends AbstractSpringModule implements ConfigOnOff {
setStringProperty(EDUBASE_INFOVER_URL, infoverUrl, true);
}
public String getCoverUrl() {
return coverUrl;
}
public void setCoverUrl(String coverUrl) {
this.coverUrl = coverUrl;
setStringProperty(EDUBASE_COVER_URL, coverUrl, true);
}
public void setEnabled(boolean enabled) {
this.enabled = enabled;
setStringProperty(EDUBASE_ENABLED, Boolean.toString(enabled), true);
......
......@@ -141,6 +141,15 @@ public class EdubaseManagerImpl implements EdubaseManager {
return url.toString();
}
@Override
public BookSection appendCoverUrl(BookSection bookSection) {
if (StringHelper.containsNonWhitespace(bookSection.getBookId())) {
String coverUrl = String.format(edubaseModule.getCoverUrl(), bookSection.getBookId());
bookSection.setCoverUrl(coverUrl);
}
return bookSection;
}
@Override
public String getApplicationUrl(Identity identity) {
String readerUrl = edubaseModule.getReaderUrl();
......
......@@ -48,6 +48,7 @@ public class EdubaseAdminController extends FormBasicController {
private TextElement edubaseReaderUrlEl;
private MultipleSelectionElement edubaseReaderUrlUniqueEl;
private TextElement edubaseInfoverUrlEl;
private TextElement edubaseCoverUrlEl;
@Autowired
private EdubaseModule edubaseModule;
......@@ -97,6 +98,10 @@ public class EdubaseAdminController extends FormBasicController {
String edubaseInfoverUrl = edubaseModule.getInfoverUrl();
edubaseInfoverUrlEl = uifactory.addTextElement("admin.edubase.infover.url", "admin.edubase.infover.url", 128, edubaseInfoverUrl, edubaseCont);
edubaseInfoverUrlEl.setMandatory(true);
String edubaseCoverUrl = edubaseModule.getCoverUrl();
edubaseCoverUrlEl = uifactory.addTextElement("admin.edubase.cover.url", "admin.edubase.cover.url", 128, edubaseCoverUrl, edubaseCont);
edubaseCoverUrlEl.setMandatory(true);
// Edubook
FormLayoutContainer edubookCont = FormLayoutContainer.createDefaultFormLayout("edubook_admin", getTranslator());
......@@ -121,6 +126,7 @@ public class EdubaseAdminController extends FormBasicController {
edubaseModule.setReaderUrl(edubaseReaderUrlEl.getValue());
edubaseModule.setReaderUrlUnique(edubaseReaderUrlUniqueEl.isAtLeastSelected(1));
edubaseModule.setInfoverUrl(edubaseInfoverUrlEl.getValue());
edubaseModule.setCoverUrl(edubaseCoverUrlEl.getValue());
}
@Override
......@@ -134,6 +140,7 @@ public class EdubaseAdminController extends FormBasicController {
allOk &= validateIsMandatory(edubaseLtiLaunchUrlEl);
allOk &= validateIsMandatory(edubaseReaderUrlEl);
allOk &= validateIsMandatory(edubaseInfoverUrlEl);
allOk &= validateIsMandatory(edubaseCoverUrlEl);
}
return allOk & super.validateFormLogic(ureq);
......
admin.edubase.coverver.url=URL "coverver" service
admin.edubase.description=Edubase ist die integrale Komplettlsung fr digitale und gedruckte Publikationen. Mit dem OpenOlat Edubase Modul kann der Edubase Reader in Kurse eingebunden werden. Weitere Informationen sind auf der <a href\="http\://www.edubase.ch" target\=_blank>Webseite</a> von Edubase zu finden
admin.edubase.cover.url=URL "cover" service
admin.edubase.description=Edubase ist die integrale Komplettl\u00f6sung f\u00fcr digitale und gedruckte Publikationen. Mit dem OpenOlat Edubase Modul kann der Edubase Reader in Kurse eingebunden werden. Weitere Informationen sind auf der <a href\="http\://www.edubase.ch" target\=_blank>Webseite</a> von Edubase zu finden
admin.edubase.enabled="Edubase" Kursbaustein
admin.edubase.infover.url=URL "infover" service
admin.edubase.lti.launch.url=URL LTI Start
......
admin.edubase.coverver.url=URL "coverver" service
admin.edubase.cover.url=URL "cover" service
admin.edubase.description=Edubase is the integral solution for digital and printed publications. The OpenOlat Edubase module enables you to integrate the Edubase Reader in courses. Further information is available on the <a href\="http\://www.edubase.ch" target\=_blank>website</a> of Edubase.
admin.edubase.enabled="Edubase" course element
admin.edubase.infover.url=URL "infover" service
......
#Thu May 31 16:12:53 CEST 2018
admin.edubase.coverver.url=URL du service "coverver"
admin.edubase.description=Edubase est une solution compl\u00E8te pour les publications digitales et imprim\u00E9es. Avec le module OpenOlat Edubase, l0Edubase Reader peut \u00EAtre int\u00E9gr\u00E9 \u00E0 un cours. Vous trouverez de plus amples informations sur le site Edubase <a href\="http\://www.edubase.ch" target\=_blank>http\://www.edubase.ch</a>.
admin.edubase.enabled=El\u00E9ment de cours "Edubase"
admin.edubase.cover.url=URL du service "cover"
admin.edubase.description=Edubase est une solution compl\u00e8te pour les publications digitales et imprim\u00e9es. Avec le module OpenOlat Edubase, l0Edubase Reader peut \u00eatre int\u00e9gr\u00e9 \u00e0 un cours. Vous trouverez de plus amples informations sur le site Edubase <a href\="http\://www.edubase.ch" target\=_blank>http\://www.edubase.ch</a>.
admin.edubase.enabled=El\u00e9ment de cours "Edubase"
admin.edubase.infover.url=URL du service "infover"
admin.edubase.lti.launch.url=URL de d\u00E9marrage LTI
admin.edubase.oauth.key=Cl\u00E9
admin.edubase.lti.launch.url=URL de d\u00e9marrage LTI
admin.edubase.oauth.key=Cl\u00e9
admin.edubase.oauth.secret=Secret
admin.edubase.reader.url=URL Edubase Reader
admin.edubase.reader.url.unique=URL unique Edubase Reader
admin.edubase.reader.url.unique.help=L'URL Edubase Reader est form\u00E9e d'un param\u00E8tre sp\u00E9cifique \u00E0 l'utilisateur pour \u00E9viter les probl\u00E8mes li\u00E9s au nombres d'appareils.
admin.edubase.reader.url.unique.help=L'URL Edubase Reader est form\u00e9e d'un param\u00e8tre sp\u00e9cifique \u00e0 l'utilisateur pour \u00e9viter les probl\u00e8mes li\u00e9s au nombres d'appareils.
admin.edubase.title=Edubase
admin.expert.settings=Configuration avanc\u00E9e
admin.expert.settings=Configuration avanc\u00e9e
admin.menu.title=Edubase/Edubook
admin.menu.title.alt=Element de cours Edubase et Edubook
#Tue Jun 19 21:45:29 CEST 2018
admin.edubase.coverver.url=Servi\u00E7o de "coverver" de URL
admin.edubase.description=Edubase \u00E9 a solu\u00E7\u00E3o integral para publica\u00E7\u00F5es digitais e impressas. O m\u00F3dulo OpenOlat Edubase permite integrar o leitor Edubase em cursos. Mais informa\u00E7\u00F5es est\u00E3o dispon\u00EDveis no <a href\="http\://www.edubase.ch" target\=_blank>Website</a> da Edubase.
admin.edubase.cover.url=Servi\u00e7o de "cover" de URL
admin.edubase.description=Edubase \u00e9 a solu\u00e7\u00e3o integral para publica\u00e7\u00f5es digitais e impressas. O m\u00f3dulo OpenOlat Edubase permite integrar o leitor Edubase em cursos. Mais informa\u00e7\u00f5es est\u00e3o dispon\u00edveis no <a href\="http\://www.edubase.ch" target\=_blank>Website</a> da Edubase.
admin.edubase.enabled=Elemento de curso "Edubase"
admin.edubase.infover.url=Servi\u00E7o URL "infover"
admin.edubase.lti.launch.url=Lan\u00E7ar URL LTI
admin.edubase.infover.url=Servi\u00e7o URL "infover"
admin.edubase.lti.launch.url=Lan\u00e7ar URL LTI
admin.edubase.oauth.key=Chave
admin.edubase.oauth.secret=Segredo
admin.edubase.reader.url=Leitor URL Edubase
admin.edubase.reader.url.unique=URL Edubase Reader exclusivo
admin.edubase.reader.url.unique.help=O URL do Leitor do Edubase \u00E9 alterado por um token espec\u00EDfico do usu\u00E1rio para evitar problemas com o n\u00FAmero de dispositivos.
admin.edubase.reader.url.unique.help=O URL do Leitor do Edubase \u00e9 alterado por um token espec\u00edfico do usu\u00e1rio para evitar problemas com o n\u00famero de dispositivos.
admin.edubase.title=Edubase
admin.expert.settings=Configura\u00E7\u00F5es avan\u00E7adas
admin.expert.settings=Configura\u00e7\u00f5es avan\u00e7adas
admin.menu.title=Edubase/Edubook
admin.menu.title.alt=Elementos de curso Edubase e Edubook
......@@ -124,7 +124,7 @@ public class DocumentEditorDelegate implements WebDocumentCreateDelegate, WebDoc
DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
.withMode(Mode.EDIT)
.canClose(false)
.withCanClose(false)
.build();
return new DocEditorController(ureq, wControl, document, secCallback, none(), "o_web_document_edit");
}
......
......@@ -103,7 +103,7 @@ public class WebDocumentRunController extends BasicController {
} else if (docEditorService.hasEditor(getIdentity(), ureq.getUserSession().getRoles(), extension, Mode.VIEW, true)) {
DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder()
.withMode(Mode.VIEW)
.canClose(false)
.withCanClose(false)
.build();
Controller editCtrl = new DocEditorController(ureq, wControl, document, secCallback, none(), "o_web_document");
listenTo(editCtrl);
......
......@@ -1495,6 +1495,7 @@ edubase.readerUrl=https://app.edubase.ch/
edubase.readerUrl.unique=true
edubase.ltiLaunchUrl=https://reader.silkcodeapps.de/lookup/srv/v2/lti/basicLaunch/
edubase.infoverUrl=https://reader.silkcodeapps.de/lookup/srv/v2/information/infodocvers/%s
edubase.coverUrl=https://reader.silkcodeapps.de/lookup/srv/v2/information/coververdesktop/%s
########################################
# Options for edu-sharing
......
......@@ -126,11 +126,13 @@ public class AccessDAOTest extends OlatTestCase {
Identity identity2 = JunitTestHelper.createAndPersistIdentityAsRndUser("wopi2");
VFSMetadata vfsMetadata = vfsMetadataDAO.createMetadata(random(), "relPath", "file.name", new Date(), 1000l, false, "", "file", null);
String app = random();
Access access = sut.createAccess(vfsMetadata, identity, app, random(), true, true, true, null);
sut.createAccess(vfsMetadata, identity2, app, random(), true, true, true, null);
boolean canEdit = true;
Access access = sut.createAccess(vfsMetadata, identity, app, random(), canEdit, true, true, null);
sut.createAccess(vfsMetadata, identity2, app, random(), canEdit, true, true, null);
sut.createAccess(vfsMetadata, identity, app, random(), !canEdit, true, true, null);
dbInstance.commitAndCloseSession();
Access reloadedAccess = sut.loadAccess(vfsMetadata, identity, app);
Access reloadedAccess = sut.loadAccess(vfsMetadata, identity, app, canEdit);
assertThat(reloadedAccess).isEqualTo(access);
}
......
......@@ -111,11 +111,11 @@ public class WopiServiceTest extends OlatTestCase {
public void shouldNotReuseAccessIfCanCloseChanged() {
VFSMetadata metadata = randomMetadata();
Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("wopi");
DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder().canClose(true).build();
DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder().withCanClose(true).build();
Access access = sut.getOrCreateAccess(metadata, identity, secCallback, "App1", null);
dbInstance.commitAndCloseSession();
DocEditorSecurityCallback secCallbackChanged = DocEditorSecurityCallbackBuilder.builder().canClose(false).build();
DocEditorSecurityCallback secCallbackChanged = DocEditorSecurityCallbackBuilder.builder().withCanClose(false).build();
Access accessChanged = sut.getOrCreateAccess(metadata, identity, secCallbackChanged, "App1", null);
dbInstance.commitAndCloseSession();
......@@ -156,9 +156,9 @@ public class WopiServiceTest extends OlatTestCase {
public void shouldDeleteAccessIfChanged() {
VFSMetadata metadata = randomMetadata();
Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("wopi");
DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.EDIT).build();
DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder().withCanClose(true).build();
Access access = sut.getOrCreateAccess(metadata, identity, secCallback, "App1", null);
DocEditorSecurityCallback secCallbackChanged = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.VIEW).build();
DocEditorSecurityCallback secCallbackChanged = DocEditorSecurityCallbackBuilder.builder().withCanClose(false).build();
sut.getOrCreateAccess(metadata, identity, secCallbackChanged, "App1", null);
dbInstance.commitAndCloseSession();
......
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