/** * <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.modules.portfolio.ui.media; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.olat.core.commons.modules.bc.meta.MetaInfoController; 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.DateChooser; import org.olat.core.gui.components.form.flexible.elements.RichTextElement; import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextBoxListElement; 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.control.Controller; import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.id.context.BusinessControlFactory; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; import org.olat.core.util.Util; import org.olat.modules.portfolio.Category; import org.olat.modules.portfolio.CitationSourceType; import org.olat.modules.portfolio.Media; import org.olat.modules.portfolio.PortfolioService; import org.olat.modules.portfolio.handler.CitationHandler; import org.olat.modules.portfolio.manager.MetadataXStream; import org.olat.modules.portfolio.model.CitationXml; import org.olat.modules.portfolio.model.MediaPart; import org.olat.modules.portfolio.ui.PortfolioHomeController; import org.olat.modules.portfolio.ui.editor.AddElementInfos; import org.olat.modules.portfolio.ui.editor.PageElement; import org.olat.modules.portfolio.ui.editor.PageElementAddController; import org.springframework.beans.factory.annotation.Autowired; /** * * itemType * creators, edition, volume, series * * webpage: authorString, title, url<br> * book: authorString, title, volume, series, edition, place, publisher, date, url<br> * journalArticle: authorString, title, publicationTitle, issue, date, pages, url<br> * report: title, place, institution, date, url * film: authorString, title, date, url * * Initial date: 18.07.2016<br> * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com * */ public class CollectCitationMediaController extends FormBasicController implements PageElementAddController { private TextElement titleEl; private RichTextElement descriptionEl, textEl; private TextBoxListElement categoriesEl; private SingleSelection sourceTypeEl; private TextElement urlEl, sourceEl, languageEl; private TextElement creatorsEl, placeEl, publisherEl; private DateChooser publicationDateEl, lastVisitDateEl; private TextElement editorEl, editionEl, volumeEl, seriesEl, publicationTitleEl, isbnEl, issueEl, pagesEl, institutionEl; private CitationXml citation; private Media mediaReference; private Map<String,String> categories = new HashMap<>(); private final String businessPath; private AddElementInfos userObject; @Autowired private CitationHandler citationHandler; @Autowired private PortfolioService portfolioService; public CollectCitationMediaController(UserRequest ureq, WindowControl wControl) { super(ureq, wControl); setTranslator(Util.createPackageTranslator(MetaInfoController.class, getLocale(), getTranslator())); setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator())); businessPath = "[HomeSite:" + getIdentity().getKey() + "][PortfolioV2:0][MediaCenter:0]"; initForm(ureq); updateCitationFieldsVisibility(); } public CollectCitationMediaController(UserRequest ureq, WindowControl wControl, Media media) { super(ureq, wControl); setTranslator(Util.createPackageTranslator(MetaInfoController.class, getLocale(), getTranslator())); setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator())); businessPath = media.getBusinessPath(); mediaReference = media; List<Category> categoryList = portfolioService.getCategories(media); for(Category category:categoryList) { categories.put(category.getName(), category.getName()); } initForm(ureq); updateCitationFieldsVisibility(); } public Media getMediaReference() { return mediaReference; } @Override public AddElementInfos getUserObject() { return userObject; } @Override public void setUserObject(AddElementInfos userObject) { this.userObject = userObject; } @Override public PageElement getPageElement() { MediaPart part = new MediaPart(); part.setMedia(mediaReference); return part; } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { formLayout.setElementCssClass("o_sel_pf_collect_citation_form"); String title = mediaReference == null ? null : mediaReference.getTitle(); titleEl = uifactory.addTextElement("artefact.title", "artefact.title", 255, title, formLayout); titleEl.setElementCssClass("o_sel_pf_collect_title"); titleEl.setMandatory(true); String desc = mediaReference == null ? null : mediaReference.getDescription(); descriptionEl = uifactory.addRichTextElementForStringDataMinimalistic("artefact.descr", "artefact.descr", desc, 6, 60, formLayout, getWindowControl()); descriptionEl.getEditorConfiguration().setPathInStatusBar(false); String text = mediaReference == null ? null : mediaReference.getContent(); textEl = uifactory.addRichTextElementForStringData("citation", "citation", text, 10, 6, false, null, null, formLayout, ureq.getUserSession(), getWindowControl()); textEl.setElementCssClass("o_sel_pf_collect_citation"); categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categories, formLayout, getTranslator()); categoriesEl.setHelpText(translate("categories.hint")); categoriesEl.setElementCssClass("o_sel_ep_tagsinput"); categoriesEl.setAllowDuplicates(false); String[] typeKeys = new String[CitationSourceType.values().length]; String[] typeValues = new String[CitationSourceType.values().length]; int i = 0; for(CitationSourceType type : CitationSourceType.values()) { typeKeys[i] = type.name(); typeValues[i++] = translate("mf.sourceType." + type.name()); } sourceTypeEl = uifactory.addDropdownSingleselect("mf.sourceType", formLayout, typeKeys, typeValues, null); sourceTypeEl.addActionListener(FormEvent.ONCHANGE); String sourceType = (citation != null && citation.getItemType() != null ? citation.getItemType().name() : CitationSourceType.book.name()); for(String typeKey:typeKeys) { if(typeKey.equals(sourceType)) { sourceTypeEl.select(typeKey, true); } } initMetadataForm(formLayout); initCitationForm(formLayout); Date collectDate = mediaReference == null ? new Date() : mediaReference.getCollectionDate(); String date = Formatter.getInstance(getLocale()).formatDate(collectDate); uifactory.addStaticTextElement("artefact.collect.date", "artefact.collect.date", date, formLayout); if(StringHelper.containsNonWhitespace(businessPath)) { String link = BusinessControlFactory.getInstance().getURLFromBusinessPathString(businessPath); uifactory.addStaticTextElement("artefact.collect.link", "artefact.collect.link", link, formLayout); } FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); formLayout.add(buttonsCont); uifactory.addFormSubmitButton("save", "save", buttonsCont); uifactory.addFormCancelButton("cancel", buttonsCont, ureq, getWindowControl()); } protected void initMetadataForm(FormItemContainer formLayout) { String creators = (mediaReference != null ? mediaReference.getCreators() : null); creatorsEl = uifactory.addTextElement("creator", "mf.creator", -1, creators, formLayout); String place = (mediaReference != null ? mediaReference.getPlace() : null); placeEl = uifactory.addTextElement("place", "mf.city", -1, place, formLayout); String publisherVal = (mediaReference != null ? mediaReference.getPublisher() : null); publisherEl = uifactory.addTextElement("publisher", "mf.publisher", -1, publisherVal, formLayout); String url = (mediaReference != null ? mediaReference.getUrl() : null); urlEl = uifactory.addTextElement("url", "mf.url", -1, url, formLayout); String source = (mediaReference != null ? mediaReference.getSource() : null); sourceEl = uifactory.addTextElement("source", "mf.source", -1, source, formLayout); String language = (mediaReference != null ? mediaReference.getLanguage() : null); languageEl = uifactory.addTextElement("language", "mf.language", -1, language, formLayout); Date pubDate = (mediaReference != null ? mediaReference.getPublicationDate() : null); publicationDateEl = uifactory.addDateChooser("publicationDate", "mf.publicationDate", pubDate, formLayout); } protected void initCitationForm(FormItemContainer formLayout) { String editor = (citation != null ? citation.getEditor() : null); editorEl = uifactory.addTextElement("editor", "mf.editor", -1, editor, formLayout); String edition = (citation != null ? citation.getEdition() : null); editionEl = uifactory.addTextElement("edition", "mf.edition", -1, edition, formLayout); String volume = (citation != null ? citation.getVolume() : null); volumeEl = uifactory.addTextElement("volume", "mf.volume", -1, volume, formLayout); String series = (citation != null ? citation.getSeries() : null); seriesEl = uifactory.addTextElement("series", "mf.series", -1, series, formLayout); String isbn = (citation != null ? citation.getIsbn() : null); isbnEl = uifactory.addTextElement("isbn", "mf.isbn", -1, isbn, formLayout); String publicationTitle = (citation != null ? citation.getPublicationTitle() : null); publicationTitleEl = uifactory.addTextElement("publicationTitle", "mf.publicationTitle", -1, publicationTitle, formLayout); String issue = (citation != null ? citation.getIssue() : null); issueEl = uifactory.addTextElement("issue", "mf.issue", -1, issue, formLayout); String pages = (citation != null ? citation.getPages() : null); pagesEl = uifactory.addTextElement("pages", "mf.pages", -1, pages, formLayout); String institution = (citation != null ? citation.getInstitution() : null); institutionEl = uifactory.addTextElement("institution", "mf.institution", -1, institution, formLayout); Date visitDate = (citation != null ? citation.getLastVisit() : null); lastVisitDateEl = uifactory.addDateChooser("lastVisitDate", "mf.lastVisitDate", visitDate, formLayout); } /** * <ul> * <li>webpage: authorString, title, url. last visit</li> * <li>book: authorString, title, volume, series, edition, editor, isbn, place, publisher, date, url</li> * <li>journalArticle: authorString, title, publicationTitle, issue, date, pages, url</li> * <li>report: title, place, institution, date, url</li> * <li>film: authorString, title, date, url</li> * </ul> */ private void updateCitationFieldsVisibility() { CitationSourceType sourceType = CitationSourceType.valueOf(sourceTypeEl.getSelectedKey()); editorEl.setVisible(sourceType == CitationSourceType.book); editionEl.setVisible(sourceType == CitationSourceType.book); volumeEl.setVisible(sourceType == CitationSourceType.book); seriesEl.setVisible(sourceType == CitationSourceType.book); isbnEl.setVisible(sourceType == CitationSourceType.book); publicationTitleEl.setVisible(sourceType == CitationSourceType.journalArticle); issueEl.setVisible(sourceType == CitationSourceType.journalArticle); pagesEl.setVisible(sourceType == CitationSourceType.journalArticle || sourceType == CitationSourceType.book); institutionEl.setVisible(sourceType == CitationSourceType.report); lastVisitDateEl.setVisible(sourceType == CitationSourceType.webpage); } @Override protected void doDispose() { // } @Override protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = true; return allOk & super.validateFormLogic(ureq); } @Override protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if(source == sourceTypeEl) { updateCitationFieldsVisibility(); } super.formInnerEvent(ureq, source, event); } @Override protected void formOK(UserRequest ureq) { if(mediaReference == null) { String title = titleEl.getValue(); String description = descriptionEl.getValue(); String content = textEl.getValue(); mediaReference = citationHandler.createMedia(title, description, content, businessPath, getIdentity()); } citation = new CitationXml(); citation.setEdition(editionEl.getValue()); citation.setInstitution(institutionEl.getValue()); citation.setIssue(issueEl.getValue()); CitationSourceType sourceType = CitationSourceType.valueOf(sourceTypeEl.getSelectedKey()); citation.setItemType(sourceType); citation.setPages(pagesEl.getValue()); citation.setPublicationTitle(publicationTitleEl.getValue()); citation.setSeries(seriesEl.getValue()); citation.setVolume(volumeEl.getValue()); citation.setEditor(editorEl.getValue()); citation.setIsbn(isbnEl.getValue()); citation.setLastVisit(lastVisitDateEl.getDate()); mediaReference.setMetadataXml(MetadataXStream.get().toXML(citation)); // dublin core mediaReference.setCreators(creatorsEl.getValue()); mediaReference.setPlace(placeEl.getValue()); mediaReference.setPublisher(publisherEl.getValue()); mediaReference.setPublicationDate(publicationDateEl.getDate()); mediaReference.setUrl(urlEl.getValue()); mediaReference.setSource(sourceEl.getValue()); mediaReference.setLanguage(languageEl.getValue()); mediaReference = portfolioService.updateMedia(mediaReference); List<String> updatedCategories = categoriesEl.getValueList(); portfolioService.updateCategories(mediaReference, updatedCategories); fireEvent(ureq, Event.DONE_EVENT); } @Override protected void formCancelled(UserRequest ureq) { fireEvent(ureq, Event.CANCELLED_EVENT); } }