/** * <a href="http://www.openolat.org"> * OpenOLAT - Online Learning and Training</a><br> * <p> * Licensed under the Apache License, Version 2.0 (the "License"); <br> * you may not use this file except in compliance with the License.<br> * You may obtain a copy of the License at the * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a> * <p> * Unless required by applicable law or agreed to in writing,<br> * software distributed under the License is distributed on an "AS IS" BASIS, <br> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br> * See the License for the specific language governing permissions and <br> * limitations under the License. * <p> * Initial code contributed and copyrighted by<br> * frentix GmbH, http://www.frentix.com * <p> */ package org.olat.repository.ui.author; import java.io.File; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.olat.NewControllerFactory; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.FileElement; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.SpacerElement; import org.olat.core.gui.components.form.flexible.elements.StaticTextElement; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.form.flexible.impl.elements.FormSubmit; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.logging.activity.LearningResourceLoggingAction; import org.olat.core.logging.activity.OlatResourceableType; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.fileresource.types.ResourceEvaluation; import org.olat.repository.RepositoryEntry; import org.olat.repository.RepositoryManager; import org.olat.repository.handlers.RepositoryHandler; import org.olat.repository.handlers.RepositoryHandlerFactory; import org.olat.util.logging.activity.LoggingResourceable; import org.springframework.beans.factory.annotation.Autowired; /** * * Initial date: 30.04.2014<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class ImportRepositoryEntryController extends FormBasicController { private String[] limitTypes; private RepositoryEntry importedEntry; private List<ResourceHandler> handlerForUploadedResources; private SpacerElement spacerEl; private FormSubmit importButton; private SingleSelection selectType; private FileElement uploadFileEl; private StaticTextElement typeEl; private TextElement displaynameEl; private MultipleSelectionElement referencesEl; private final static String[] refKeys = new String[]{ "checked" }; @Autowired private RepositoryManager repositoryManager; @Autowired private RepositoryHandlerFactory repositoryHandlerFactory; public ImportRepositoryEntryController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); setTranslator(Util.createPackageTranslator(RepositoryManager.class, getLocale(), getTranslator())); initForm(ureq); } public ImportRepositoryEntryController(UserRequest ureq, WindowControl wControl, String[] limitTypes) { super(ureq, wControl); setTranslator(Util.createPackageTranslator(RepositoryManager.class, getLocale(), getTranslator())); this.limitTypes = limitTypes; initForm(ureq); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { setFormDescription("cmd.import.ressource.desc"); uploadFileEl = uifactory.addFileElement(getWindowControl(), "upload", "import.file", formLayout); uploadFileEl.addActionListener(FormEvent.ONCHANGE); spacerEl = uifactory.addSpacerElement("spacer1", formLayout, false); spacerEl.setVisible(false); typeEl = uifactory.addStaticTextElement("cif.type", "cif.type", "", formLayout); typeEl.setElementCssClass("o_sel_author_type"); typeEl.setVisible(false); selectType = uifactory.addDropdownSingleselect("cif.types", "cif.type", formLayout, new String[0], new String[0], null); selectType.addActionListener(FormEvent.ONCHANGE); selectType.setVisible(false); displaynameEl = uifactory.addTextElement("cif.displayname", "cif.displayname", 100, "", formLayout); displaynameEl.setDisplaySize(30); displaynameEl.setMandatory(true); displaynameEl.setVisible(false); displaynameEl.setElementCssClass("o_sel_author_imported_name"); String[] refValues = new String[]{ translate("references.expl") }; referencesEl = uifactory.addCheckboxesHorizontal("references", "references", formLayout, refKeys, refValues); referencesEl.setVisible(false); FormLayoutContainer buttonContainer = FormLayoutContainer.createButtonLayout("buttonContainer", getTranslator()); formLayout.add("buttonContainer", buttonContainer); buttonContainer.setElementCssClass("o_sel_repo_save_details"); importButton = uifactory.addFormSubmitButton("cmd.import.ressource", buttonContainer); importButton.setEnabled(false); uifactory.addFormCancelButton("cancel", buttonContainer, ureq, getWindowControl()); } @Override protected void doDispose() { // } public RepositoryEntry getImportedEntry() { return importedEntry; } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if(uploadFileEl == source) { doAnalyseUpload(); } else if(selectType == source) { if(selectType.isOneSelected()) { String type = selectType.getSelectedKey(); for(ResourceHandler handler:handlerForUploadedResources) { if(type.equals(handler.getHandler().getSupportedType())) { boolean references = handler.getEval().isReferences(); referencesEl.setVisible(references); if(references && !referencesEl.isSelected(0)) { referencesEl.select(refKeys[0], true); } } } } } super.formInnerEvent(ureq, source, event); } @Override protected void formOK(UserRequest ureq) { if(handlerForUploadedResources != null) { doImport(); fireEvent(ureq, Event.DONE_EVENT); } } @Override protected void formCancelled(UserRequest ureq) { fireEvent(ureq, Event.CANCELLED_EVENT); } @Override protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = true; if (!StringHelper.containsNonWhitespace(displaynameEl.getValue())) { displaynameEl.setErrorKey("cif.error.displayname.empty", new String[] {}); allOk = false; } else if (displaynameEl.hasError()) { allOk = false; } else { displaynameEl.clearError(); } allOk &= validLimitationOnType(handlerForUploadedResources); allOk &= handlerForUploadedResources != null && handlerForUploadedResources.size() > 0; return allOk & super.validateFormLogic(ureq); } private boolean validLimitationOnType(List<ResourceHandler> handlers) { boolean allOk = true; if(limitTypes != null && handlers != null) { for(Iterator<ResourceHandler> handlerIt=handlers.iterator(); handlerIt.hasNext(); ) { boolean match = false; ResourceHandler handler = handlerIt.next(); for(String limitType:limitTypes) { if(limitType.equals(handler.getHandler().getSupportedType())) { match = true; } } if(!match) { handlerIt.remove(); } } if(handlers.isEmpty()) { allOk = false; uploadFileEl.setErrorKey("add.failed", new String[] {}); } } return allOk; } private void doImport() { RepositoryHandler handler; if(handlerForUploadedResources == null || handlerForUploadedResources.isEmpty()) { handler = null; } else if(handlerForUploadedResources.size() == 1) { handler = handlerForUploadedResources.get(0).getHandler(); } else if(selectType.isOneSelected()){ String type = selectType.getSelectedKey(); handler = repositoryHandlerFactory.getRepositoryHandler(type); } else { handler = null; } if(handler != null) { String displayname = displaynameEl.getValue(); File uploadedFile = uploadFileEl.getUploadFile(); String uploadedFilename = uploadFileEl.getUploadFileName(); boolean withReferences = referencesEl.isAtLeastSelected(1); importedEntry = handler.importResource(getIdentity(), null, displayname, "", withReferences, getLocale(), uploadedFile, uploadedFilename); if(importedEntry == null) { showWarning("error.import"); } else { ThreadLocalUserActivityLogger.log(LearningResourceLoggingAction.LEARNING_RESOURCE_CREATE, getClass(), LoggingResourceable.wrap(importedEntry, OlatResourceableType.genRepoEntry)); repositoryManager.triggerIndexer(importedEntry); } } } private void doAnalyseUpload() { File uploadedFile = uploadFileEl.getUploadFile(); if(uploadedFile == null) {//OO-1320 typeEl.setVisible(false); selectType.setVisible(false); uploadFileEl.reset(); importButton.setEnabled(false); } else { String uploadedFilename = uploadFileEl.getUploadFileName(); List<ResourceHandler> handlers = new ArrayList<>(3); for(String type:repositoryHandlerFactory.getSupportedTypes()) { RepositoryHandler handler = repositoryHandlerFactory.getRepositoryHandler(type); ResourceEvaluation eval = handler.acceptImport(uploadedFile, uploadedFilename); if(eval != null && eval.isValid()) { handlers.add(new ResourceHandler(handler, eval)); } } updateResourceInfos(handlers); validLimitationOnType(handlers); } } private void updateResourceInfos(List<ResourceHandler> handlers) { handlerForUploadedResources = handlers; String displayName = ""; boolean references = false; if (handlers != null && handlers.size() > 0) { // add image and typename code ResourceHandler handler = handlers.get(0); displayName = handler.getEval().getDisplayname(); references = handler.getEval().isReferences(); if(handlers.size() == 1) { String resourceType = handler.getHandler().getSupportedType(); String tName = NewControllerFactory.translateResourceableTypeName(resourceType, getLocale()); typeEl.setValue(tName); typeEl.setVisible(true); selectType.setVisible(false); } else { int numOfHandlers = handlers.size(); String[] keys = new String[numOfHandlers]; String[] values = new String[numOfHandlers]; for(int i=0; i<numOfHandlers; i++) { String type = handlers.get(i).getHandler().getSupportedType(); keys[i] = type; values[i] = NewControllerFactory.translateResourceableTypeName(type, getLocale()); } selectType.setKeysAndValues(keys, values, null); selectType.select(keys[0], true); selectType.setVisible(true); typeEl.setVisible(false); references = handlers.get(0).getEval().isReferences(); } } else { typeEl.setValue(translate("cif.type.na")); typeEl.setVisible(true); selectType.setVisible(false); } displaynameEl.setVisible(true); displaynameEl.setValue(displayName); referencesEl.setVisible(references); if(references) { referencesEl.select(refKeys[0], true); } importButton.setEnabled(handlers.size() > 0); } private class ResourceHandler { private final RepositoryHandler handler; private final ResourceEvaluation eval; public ResourceHandler(RepositoryHandler handler, ResourceEvaluation eval) { this.handler = handler; this.eval = eval; } public RepositoryHandler getHandler() { return handler; } public ResourceEvaluation getEval() { return eval; } } }