Search in sources :

Example 96 with MetaInfo

use of org.olat.core.commons.modules.bc.meta.MetaInfo in project openolat by klemens.

the class CmdUnzip method doUnzip.

private boolean doUnzip(VFSLeaf vfsItem, VFSContainer currentContainer, UserRequest ureq, WindowControl wControl) {
    String name = vfsItem.getName();
    if (!name.toLowerCase().endsWith(".zip")) {
        wControl.setError(translator.translate("FileUnzipFailed", new String[] { vfsItem.getName() }));
        return false;
    }
    // we make a new folder with the same name as the zip file
    String sZipContainer = name.substring(0, name.length() - 4);
    boolean versioning = FolderConfig.versionsEnabled(currentContainer);
    VFSContainer zipContainer = currentContainer.createChildContainer(sZipContainer);
    if (zipContainer == null) {
        if (versioning) {
            zipContainer = (VFSContainer) currentContainer.resolve(sZipContainer);
        } else {
            // folder already exists... issue warning
            wControl.setError(translator.translate("unzip.alreadyexists", new String[] { sZipContainer }));
            return false;
        }
    } else if (zipContainer instanceof MetaTagged) {
        MetaInfo info = ((MetaTagged) zipContainer).getMetaInfo();
        if (info != null && ureq.getIdentity() != null) {
            info.setAuthor(ureq.getIdentity());
            info.write();
        }
    }
    if (!ZipUtil.unzipNonStrict(vfsItem, zipContainer, ureq.getIdentity(), versioning)) {
        // operation failed - rollback
        zipContainer.delete();
        wControl.setError(translator.translate("failed"));
        return false;
    } else {
        // check quota
        long quotaLeftKB = VFSManager.getQuotaLeftKB(currentContainer);
        if (quotaLeftKB != Quota.UNLIMITED && quotaLeftKB < 0) {
            // quota exceeded - rollback
            zipContainer.delete();
            wControl.setError(translator.translate("QuotaExceeded"));
            return false;
        }
    }
    return true;
}
Also used : VFSContainer(org.olat.core.util.vfs.VFSContainer) MetaTagged(org.olat.core.commons.modules.bc.meta.tagged.MetaTagged) MetaInfo(org.olat.core.commons.modules.bc.meta.MetaInfo)

Example 97 with MetaInfo

use of org.olat.core.commons.modules.bc.meta.MetaInfo in project openolat by klemens.

the class CmdCreateFile method formOK.

@Override
protected void formOK(UserRequest ureq) {
    // create the file
    fileName = textElement.getValue();
    VFSContainer currentContainer = folderComponent.getCurrentContainer();
    VFSItem item = currentContainer.createChildLeaf(fileName);
    if (item == null) {
        status = FolderCommandStatus.STATUS_FAILED;
        notifyFinished(ureq);
    } else {
        if (item instanceof MetaTagged) {
            MetaInfo meta = ((MetaTagged) item).getMetaInfo();
            meta.setAuthor(ureq.getIdentity());
            if (licenseModule.isEnabled(licenseHandler)) {
                License license = licenseService.createDefaultLicense(licenseHandler, getIdentity());
                meta.setLicenseTypeKey(String.valueOf(license.getLicenseType().getKey()));
                meta.setLicenseTypeName(license.getLicenseType().getName());
                meta.setLicensor(license.getLicensor());
                meta.setLicenseText(LicenseUIFactory.getLicenseText(license));
            }
            meta.write();
        }
        // start HTML editor with the folders root folder as base and the file
        // path as a relative path from the root directory. But first check if the
        // root directory is wirtable at all (e.g. not the case in users personal
        // briefcase), and seach for the next higher directory that is writable.
        String relFilePath = "/" + fileName;
        // add current container path if not at root level
        if (!folderComponent.getCurrentContainerPath().equals("/")) {
            relFilePath = folderComponent.getCurrentContainerPath() + relFilePath;
        }
        VFSContainer writableRootContainer = folderComponent.getRootContainer();
        ContainerAndFile result = VFSManager.findWritableRootFolderFor(writableRootContainer, relFilePath);
        if (result != null) {
            writableRootContainer = result.getContainer();
            relFilePath = result.getFileName();
        } else {
            // use fallback that always work: current directory and current file
            relFilePath = fileName;
            writableRootContainer = folderComponent.getCurrentContainer();
        }
        if (relFilePath.endsWith(".html") || relFilePath.endsWith(".htm")) {
            editorCtr = WysiwygFactory.createWysiwygController(ureq, getWindowControl(), writableRootContainer, relFilePath, true, true);
            ((HTMLEditorController) editorCtr).setNewFile(true);
        } else {
            editorCtr = new PlainTextEditorController(ureq, getWindowControl(), (VFSLeaf) writableRootContainer.resolve(relFilePath), "utf-8", true, true, null);
        }
        listenTo(editorCtr);
        initialPanel.setContent(editorCtr.getInitialComponent());
    }
}
Also used : VFSLeaf(org.olat.core.util.vfs.VFSLeaf) HTMLEditorController(org.olat.core.commons.editor.htmleditor.HTMLEditorController) VFSContainer(org.olat.core.util.vfs.VFSContainer) PlainTextEditorController(org.olat.core.commons.editor.plaintexteditor.PlainTextEditorController) MetaTagged(org.olat.core.commons.modules.bc.meta.tagged.MetaTagged) MetaInfo(org.olat.core.commons.modules.bc.meta.MetaInfo) License(org.olat.core.commons.services.license.License) VFSItem(org.olat.core.util.vfs.VFSItem) ContainerAndFile(org.olat.core.util.vfs.util.ContainerAndFile)

Example 98 with MetaInfo

use of org.olat.core.commons.modules.bc.meta.MetaInfo in project openolat by klemens.

the class ListRenderer method appendRenderedFile.

// getRenderedDirectoryContent
/**
 * Render a single file or folder.
 *
 * @param	f			The file or folder to render
 * @param	sb		StringOutput to append generated html code
 */
private void appendRenderedFile(FolderComponent fc, VFSItem child, String currentContainerPath, StringOutput sb, URLBuilder ubu, Translator translator, boolean iframePostEnabled, boolean canContainerVersion, int pos) {
    // assume full access unless security callback tells us something different.
    boolean canWrite = child.getParentContainer().canWrite() == VFSConstants.YES;
    // special case: virtual folders are always read only. parent of child =! the current container
    canWrite = canWrite && !(fc.getCurrentContainer() instanceof VirtualContainer);
    boolean isAbstract = (child instanceof AbstractVirtualContainer);
    Versions versions = null;
    if (canContainerVersion && child instanceof Versionable) {
        Versionable versionable = (Versionable) child;
        if (versionable.getVersions().isVersioned()) {
            versions = versionable.getVersions();
        }
    }
    boolean canVersion = versions != null && !versions.getRevisions().isEmpty();
    boolean canAddToEPortfolio = FolderConfig.isEPortfolioAddEnabled();
    VFSLeaf leaf = null;
    if (child instanceof VFSLeaf) {
        leaf = (VFSLeaf) child;
    }
    // if not a leaf, it must be a container...
    boolean isContainer = (leaf == null);
    MetaInfo metaInfo = null;
    if (child instanceof MetaTagged) {
        metaInfo = ((MetaTagged) child).getMetaInfo();
    }
    boolean lockedForUser = lockManager.isLockedForMe(child, fc.getIdentityEnvironnement().getIdentity(), fc.getIdentityEnvironnement().getRoles());
    String name = child.getName();
    boolean xssErrors = StringHelper.xssScanForErrors(name);
    String pathAndName;
    if (xssErrors) {
        pathAndName = null;
    } else {
        pathAndName = currentContainerPath;
        if (pathAndName.length() > 0 && !pathAndName.endsWith("/")) {
            pathAndName += "/";
        }
        pathAndName += name;
    }
    // tr begin
    sb.append("<tr><td>").append("<input type=\"checkbox\" name=\"").append(FileSelection.FORM_ID).append("\" value=\"");
    if (xssErrors) {
        sb.append(StringHelper.escapeHtml(name)).append("\" disabled=\"disabled\"");
    } else {
        sb.append(name).append("\" ");
    }
    sb.append("/> ");
    // browse link pre
    if (xssErrors) {
        sb.append("<i class='o_icon o_icon-fw o_icon_banned'> </i> ");
        sb.append(StringHelper.escapeHtml(name));
        log.error("XSS Scan found something suspicious in: " + child);
    } else {
        sb.append("<a id='o_sel_doc_").append(pos).append("'");
        if (isContainer) {
            // for directories... normal module URIs
            // needs encoding, not done in buildHrefAndOnclick!
            // FIXME: SR: refactor encode: move to ubu.buildHrefAndOnclick
            String pathAndNameEncoded = ubu.encodeUrl(pathAndName);
            ubu.buildHrefAndOnclick(sb, pathAndNameEncoded, iframePostEnabled, false, true);
        } else {
            // for files, add PARAM_SERV command
            sb.append(" href=\"");
            ubu.buildURI(sb, new String[] { PARAM_SERV }, new String[] { "x" }, pathAndName, AJAXFlags.MODE_NORMAL);
            sb.append("\"");
            boolean download = FolderManager.isDownloadForcedFileType(name);
            if (download) {
                sb.append(" download=\"").append(StringHelper.escapeHtml(name)).append("\"");
            } else {
                sb.append(" target=\"_blank\"");
            }
        }
        sb.append(">");
        // icon css
        sb.append("<i class=\"o_icon o_icon-fw ");
        if (isContainer)
            sb.append(CSSHelper.CSS_CLASS_FILETYPE_FOLDER);
        else
            sb.append(CSSHelper.createFiletypeIconCssClassFor(name));
        sb.append("\"></i> ");
        // name
        if (isAbstract)
            sb.append("<i>");
        sb.append(StringHelper.escapeHtml(name));
        if (isAbstract)
            sb.append("</i>");
        sb.append("</a>");
    }
    // file metadata as tooltip
    if (metaInfo != null) {
        boolean hasMeta = false;
        sb.append("<div id='o_sel_doc_tooltip_").append(pos).append("' class='o_bc_meta' style='display:none;'>");
        if (StringHelper.containsNonWhitespace(metaInfo.getTitle())) {
            String title = StringHelper.escapeHtml(metaInfo.getTitle());
            sb.append("<h5>").append(Formatter.escapeDoubleQuotes(title)).append("</h5>");
            hasMeta = true;
        }
        if (StringHelper.containsNonWhitespace(metaInfo.getComment())) {
            sb.append("<div class=\"o_comment\">");
            String comment = StringHelper.escapeHtml(metaInfo.getComment());
            sb.append(Formatter.escapeDoubleQuotes(comment));
            sb.append("</div>");
            hasMeta = true;
        }
        // boolean hasThumbnail = false;
        if (metaInfo.isThumbnailAvailable() && !xssErrors) {
            sb.append("<div class='o_thumbnail' style='background-image:url(");
            ubu.buildURI(sb, new String[] { PARAM_SERV_THUMBNAIL }, new String[] { "x" }, pathAndName, AJAXFlags.MODE_NORMAL);
            sb.append("); background-repeat:no-repeat; background-position:50% 50%;'></div>");
            hasMeta = true;
        // hasThumbnail = true;
        }
        // first try author info from metadata (creator)
        // boolean hasMetaAuthor = false;
        String author = metaInfo.getCreator();
        // fallback use file author (uploader)
        if (StringHelper.containsNonWhitespace(author)) {
        // hasMetaAuthor = true;
        } else {
            author = metaInfo.getAuthor();
            if (!"-".equals(author)) {
                author = UserManager.getInstance().getUserDisplayName(author);
            } else {
                author = null;
            }
        }
        author = StringHelper.escapeHtml(author);
        if (StringHelper.containsNonWhitespace(author)) {
            sb.append("<p class=\"o_author\">").append(Formatter.escapeDoubleQuotes(translator.translate("mf.author")));
            sb.append(": ").append(Formatter.escapeDoubleQuotes(author)).append("</p>");
            hasMeta = true;
        }
        sb.append("</div>");
        if (hasMeta) {
            // render tooltip only when it contains something
            sb.append("<script type='text/javascript'>").append("/* <![CDATA[ */").append("jQuery(function() {\n").append("  jQuery('#o_sel_doc_").append(pos).append("').tooltip({\n").append("	   html: true,\n").append("	   container: 'body',\n").append("    title: function(){ return jQuery('#o_sel_doc_tooltip_").append(pos).append("').html(); }\n").append("  });\n").append("  jQuery('#o_sel_doc_").append(pos).append("').on('click', function(){\n").append("	   jQuery('#o_sel_doc_").append(pos).append("').tooltip('hide');\n").append("  });\n").append("});").append("/* ]]> */").append("</script>");
        }
    }
    sb.append("</td><td>");
    // filesize
    if (!isContainer) {
        // append filesize
        sb.append("<span class='text-muted small'>");
        sb.append(Formatter.formatBytes(leaf.getSize()));
        sb.append("</span>");
    }
    sb.append("</td><td>");
    // last modified
    long lastModified = child.getLastModified();
    sb.append("<span class='text-muted small'>");
    if (lastModified != VFSConstants.UNDEFINED)
        sb.append(DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, translator.getLocale()).format(new Date(lastModified)));
    else
        sb.append("-");
    sb.append("</span></td><td>");
    // license
    if (licensesEnabled) {
        MetaInfoFactory metaInfoFactory = CoreSpringFactory.getImpl(MetaInfoFactory.class);
        License license = metaInfoFactory.getLicense(metaInfo);
        LicenseRenderer licenseRenderer = new LicenseRenderer(translator.getLocale());
        licenseRenderer.render(sb, license, true);
        sb.append("</td><td>");
    }
    if (canContainerVersion) {
        if (canVersion)
            if (versions != null) {
                sb.append("<span class='text-muted small'>");
                sb.append(versions.getRevisionNr());
                sb.append("</span>");
            }
        sb.append("</td><td>");
    }
    // locked
    boolean locked = lockManager.isLocked(child);
    if (locked) {
        LockInfo lock = lockManager.getLock(child);
        sb.append("<i class=\"o_icon o_icon_locked\" title=\"");
        if (lock != null && lock.getLockedBy() != null) {
            String fullname = userManager.getUserDisplayName(lock.getLockedBy());
            String date = "";
            if (lock.getCreationDate() != null) {
                date = fc.getDateTimeFormat().format(lock.getCreationDate());
            }
            String msg = translator.translate("Locked", new String[] { fullname, date });
            if (lock.isWebDAVLock()) {
                msg += " (WebDAV)";
            }
            sb.append(msg);
        }
        sb.append("\">&#160;</i>");
    }
    sb.append("</td><td>");
    // Info link
    if (canWrite) {
        int actionCount = 0;
        if (canVersion) {
            actionCount++;
        }
        String nameLowerCase = name.toLowerCase();
        // OO-57 only display edit link if it's not a folder
        boolean isLeaf = (child instanceof VFSLeaf);
        boolean isEditable = (isLeaf && !lockedForUser && !xssErrors && (nameLowerCase.endsWith(".html") || nameLowerCase.endsWith(".htm") || nameLowerCase.endsWith(".txt") || nameLowerCase.endsWith(".css") || nameLowerCase.endsWith(".csv	")));
        if (isEditable)
            actionCount++;
        boolean canEP = canAddToEPortfolio && !isContainer;
        if (canEP)
            actionCount++;
        boolean canMetaData = canMetaInfo(child);
        if (canMetaData)
            actionCount++;
        if (actionCount == 1 && canMetaData) {
            // when only one action is available, don't render menu
            sb.append("<a ");
            ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, false, false, new NameValuePair(PARAM_EDTID, pos)).append(" title=\"").append(StringHelper.escapeHtml(translator.translate("mf.edit"))).append("\"><i class=\"o_icon o_icon-fw o_icon_edit_metadata\"></i></a>");
        } else if (actionCount > 1) {
            // add actions to menu if multiple actions available
            sb.append("<a id='o_sel_actions_").append(pos).append("' href='javascript:;'><i class='o_icon o_icon-lg o_icon_actions'></i></a>").append("<div id='o_sel_actions_pop_").append(pos).append("' style='display:none;'><ul class='list-unstyled'>");
            // meta edit action (rename etc)
            if (canMetaData) {
                // Metadata edit link... also handles rename for non-OlatRelPathImpls
                sb.append("<li><a ");
                ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, false, false, new NameValuePair(PARAM_EDTID, pos)).append("><i class=\"o_icon o_icon-fw o_icon_edit_metadata\"></i> ").append(StringHelper.escapeHtml(translator.translate("mf.edit"))).append("</a></li>");
            }
            // content edit action
            if (isEditable) {
                sb.append("<li><a ");
                ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, false, false, new NameValuePair(PARAM_CONTENTEDITID, pos)).append("><i class=\"o_icon o_icon-fw o_icon_edit_file\"></i> ").append(StringHelper.escapeHtml(translator.translate("editor"))).append("</a></li>");
            }
            // versions action
            if (canVersion) {
                // Versions link
                sb.append("<li><a ");
                ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, false, false, new NameValuePair(PARAM_VERID, pos)).append("><i class=\"o_icon o_icon-fw o_icon_version\"></i> ").append(StringHelper.escapeHtml(translator.translate("versions"))).append("</a></li>");
            }
            // get a link for adding a file to ePortfolio, if file-owner is the current user
            if (canEP) {
                if (metaInfo != null) {
                    Identity author = metaInfo.getAuthorIdentity();
                    if (author != null && fc.getIdentityEnvironnement().getIdentity().getKey().equals(author.getKey())) {
                        sb.append("<li><a ");
                        ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, false, false, new NameValuePair(PARAM_EPORT, pos)).append("><i class=\"o_icon o_icon-fw o_icon_eportfolio_add\"></i> ").append(StringHelper.escapeHtml(translator.translate("eportfolio"))).append("</a></li>");
                    }
                }
            }
            sb.append("</ul></div>").append("<script type='text/javascript'>").append("/* <![CDATA[ */").append("jQuery(function() {\n").append("  o_popover('o_sel_actions_").append(pos).append("','o_sel_actions_pop_").append(pos).append("','left');\n").append("});").append("/* ]]> */").append("</script>");
        }
    }
    sb.append("</td></tr>");
}
Also used : VFSLeaf(org.olat.core.util.vfs.VFSLeaf) NameValuePair(org.olat.core.gui.components.form.flexible.impl.NameValuePair) AbstractVirtualContainer(org.olat.core.util.vfs.AbstractVirtualContainer) MetaInfo(org.olat.core.commons.modules.bc.meta.MetaInfo) MetaTagged(org.olat.core.commons.modules.bc.meta.tagged.MetaTagged) License(org.olat.core.commons.services.license.License) MetaInfoFactory(org.olat.core.commons.modules.bc.meta.MetaInfoFactory) Date(java.util.Date) Versionable(org.olat.core.util.vfs.version.Versionable) Versions(org.olat.core.util.vfs.version.Versions) LockInfo(org.olat.core.util.vfs.lock.LockInfo) Identity(org.olat.core.id.Identity) AbstractVirtualContainer(org.olat.core.util.vfs.AbstractVirtualContainer) VirtualContainer(org.olat.core.util.vfs.VirtualContainer) LicenseRenderer(org.olat.core.commons.services.license.ui.LicenseRenderer)

Example 99 with MetaInfo

use of org.olat.core.commons.modules.bc.meta.MetaInfo in project openolat by klemens.

the class FileCopyController method finishSuccessfullUpload.

private void finishSuccessfullUpload(String fileName, UserRequest ureq) {
    VFSContainer currentContainer = folderComponent.getCurrentContainer();
    VFSItem item = currentContainer.resolve(fileName);
    if (item instanceof OlatRootFileImpl) {
        OlatRootFileImpl relPathItem = (OlatRootFileImpl) item;
        // create meta data
        MetaInfo meta = CoreSpringFactory.getImpl(MetaInfoFactory.class).createMetaInfoFor(relPathItem);
        meta.setAuthor(ureq.getIdentity());
        // if overwrite an older file
        meta.clearThumbnails();
        meta.write();
    }
    ThreadLocalUserActivityLogger.log(FolderLoggingAction.FILE_COPIED, getClass(), CoreLoggingResourceable.wrapUploadFile(fileName));
    // Notify listeners about upload
    fireEvent(ureq, new FolderEvent(FolderEvent.NEW_FILE_EVENT, newFile.getName()));
    fireEvent(ureq, FolderCommand.FOLDERCOMMAND_FINISHED);
}
Also used : VFSContainer(org.olat.core.util.vfs.VFSContainer) MetaInfo(org.olat.core.commons.modules.bc.meta.MetaInfo) VFSItem(org.olat.core.util.vfs.VFSItem) MetaInfoFactory(org.olat.core.commons.modules.bc.meta.MetaInfoFactory) OlatRootFileImpl(org.olat.core.commons.modules.bc.vfs.OlatRootFileImpl)

Example 100 with MetaInfo

use of org.olat.core.commons.modules.bc.meta.MetaInfo in project openolat by klemens.

the class FileUploadController method finishSuccessfullUpload.

/**
 * Internal helper to finish the upload and add metadata
 */
private void finishSuccessfullUpload(String filePath, VFSItem item, UserRequest ureq) {
    if (item instanceof OlatRootFileImpl) {
        OlatRootFileImpl relPathItem = (OlatRootFileImpl) item;
        // create meta data
        MetaInfo meta = metaInfoFactory.createMetaInfoFor(relPathItem);
        if (metaDataCtr != null) {
            meta = metaDataCtr.getMetaInfo(meta);
        }
        meta.setAuthor(getIdentity());
        // if overwrite an older file
        meta.clearThumbnails();
        meta.write();
    }
    if (item == null) {
        logError("File cannot be uploaded: " + filePath, null);
    } else {
        ThreadLocalUserActivityLogger.log(FolderLoggingAction.FILE_UPLOADED, getClass(), CoreLoggingResourceable.wrapUploadFile(filePath));
        // Notify listeners about upload
        fireEvent(ureq, new FolderEvent(FolderEvent.UPLOAD_EVENT, item));
    }
}
Also used : MetaInfo(org.olat.core.commons.modules.bc.meta.MetaInfo) OlatRootFileImpl(org.olat.core.commons.modules.bc.vfs.OlatRootFileImpl)

Aggregations

MetaInfo (org.olat.core.commons.modules.bc.meta.MetaInfo)108 MetaTagged (org.olat.core.commons.modules.bc.meta.tagged.MetaTagged)86 VFSLeaf (org.olat.core.util.vfs.VFSLeaf)58 VFSItem (org.olat.core.util.vfs.VFSItem)52 VFSContainer (org.olat.core.util.vfs.VFSContainer)40 Date (java.util.Date)18 OutputStream (java.io.OutputStream)14 File (java.io.File)12 IOException (java.io.IOException)12 Versionable (org.olat.core.util.vfs.version.Versionable)12 InputStream (java.io.InputStream)10 ArrayList (java.util.ArrayList)10 FolderEvent (org.olat.core.commons.modules.bc.FolderEvent)10 MediaResource (org.olat.core.gui.media.MediaResource)10 Identity (org.olat.core.id.Identity)10 VFSMediaResource (org.olat.core.util.vfs.VFSMediaResource)10 FileInfo (org.olat.core.commons.modules.bc.FileInfo)8 OlatRootFolderImpl (org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl)8 SubscriptionListItem (org.olat.core.commons.services.notifications.model.SubscriptionListItem)8 VFSSecurityCallback (org.olat.core.util.vfs.callbacks.VFSSecurityCallback)8