org.apache.openmeetings.web.room.sidebar.UploadDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.apache.openmeetings.web.room.sidebar.UploadDialog.java

Source

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License") +  you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package org.apache.openmeetings.web.room.sidebar;

import static org.apache.openmeetings.util.OpenmeetingsVariables.getMaxUploadSize;
import static org.apache.openmeetings.web.app.WebSession.getUserId;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.apache.openmeetings.core.data.file.FileProcessor;
import org.apache.openmeetings.db.dao.file.FileItemLogDao;
import org.apache.openmeetings.db.entity.file.BaseFileItem;
import org.apache.openmeetings.db.entity.file.FileItem;
import org.apache.openmeetings.util.process.ProcessResult;
import org.apache.openmeetings.util.process.ProcessResultList;
import org.apache.openmeetings.web.room.RoomPanel;
import org.apache.openmeetings.web.util.upload.BootstrapFileUploadBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormSubmitBehavior;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
import org.apache.wicket.extensions.ajax.markup.html.form.upload.UploadProgressBar;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.PriorityHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.form.CheckBox;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.HiddenField;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.markup.html.form.upload.FileUploadField;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.lang.Bytes;
import org.apache.wicket.util.string.Strings;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.googlecode.wicket.jquery.core.Options;
import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;

public class UploadDialog extends AbstractFormDialog<String> {
    private static final long serialVersionUID = 1L;
    private static final Logger log = LoggerFactory.getLogger(UploadDialog.class);
    private final KendoFeedbackPanel feedback = new KendoFeedbackPanel("feedback", new Options("button", true));
    private final Form<String> form;
    private DialogButton upload;
    private DialogButton cancel;
    private final FileUploadField uploadField;
    private final HiddenField<String> fileName;
    private final CheckBox toWb = new CheckBox("to-wb", Model.of(false));
    private final WebMarkupContainer cleanBlock = new WebMarkupContainer("clean-block");
    private final CheckBox cleanWb = new CheckBox("clean-wb", Model.of(false));
    private final RoomFilePanel roomFiles;
    private final RoomPanel room;
    @SpringBean
    private FileProcessor processor;
    @SpringBean
    private FileItemLogDao fileLogDao;

    public UploadDialog(String id, RoomPanel room, RoomFilePanel roomFiles) {
        super(id, "");
        this.roomFiles = roomFiles;
        this.room = room;
        add(form = new Form<>("form"));
        toWb.add(new OnChangeAjaxBehavior() {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                target.add(cleanBlock.setVisible(toWb.getModelObject()));
            }
        });
        form.add(feedback.setOutputMarkupId(true), toWb.setOutputMarkupId(true), cleanBlock
                .add(cleanWb.setOutputMarkupId(true)).setVisible(false).setOutputMarkupPlaceholderTag(true))
                .setOutputMarkupId(true);

        form.setMultiPart(true);
        form.setMaxSize(Bytes.bytes(getMaxUploadSize()));
        // Model is necessary here to avoid writing image to the User object
        form.add(uploadField = new FileUploadField("file", new IModel<List<FileUpload>>() {
            private static final long serialVersionUID = 1L;

            @Override
            public void setObject(List<FileUpload> object) {
                //no-op
            }

            @Override
            public List<FileUpload> getObject() {
                return new ArrayList<>();
            }
        }));
        Form<String> nameForm = new Form<>("name-form");
        fileName = new HiddenField<>("name", Model.of(""));
        fileName.add(new AjaxFormSubmitBehavior(nameForm, "change") {
            private static final long serialVersionUID = 1L;

            @Override
            protected void onSubmit(AjaxRequestTarget target) {
                if (!Strings.isEmpty(getComponent().getDefaultModelObjectAsString())) {
                    upload.setEnabled(true, target);
                }
            }
        }).setOutputMarkupId(true);
        form.add(new UploadProgressBar("progress", form, uploadField));
        add(nameForm.add(fileName.setOutputMarkupId(true)));
        add(BootstrapFileUploadBehavior.INSTANCE);
    }

    @Override
    protected void onInitialize() {
        getTitle().setObject(getString("304"));
        upload = new DialogButton("upload", getString("593"), false) {
            private static final long serialVersionUID = 1L;

            @Override
            public boolean isIndicating() {
                return true;
            }
        };
        cancel = new DialogButton("close", getString("85"));
        super.onInitialize();
    }

    @Override
    public void onClick(AjaxRequestTarget target, DialogButton button) {
        if (button == null || button.match("close")) {
            super.onClick(target, button);
        }
    }

    @Override
    protected List<DialogButton> getButtons() {
        return Arrays.asList(upload, cancel);
    }

    @Override
    public DialogButton getSubmitButton() {
        return upload;
    }

    @Override
    public Form<?> getForm() {
        return form;
    }

    @Override
    protected void onOpen(IPartialPageRequestHandler handler) {
        super.onOpen(handler);
        upload.setEnabled(true, handler);
        uploadField.setModelObject(new ArrayList<>());
        handler.add(form, fileName);
        handler.appendJavaScript(
                String.format("bindUpload('%s', '%s');", form.getMarkupId(), fileName.getMarkupId()));
    }

    @Override
    protected void onError(AjaxRequestTarget target, DialogButton btn) {
        target.add(feedback);
    }

    @Override
    protected void onSubmit(AjaxRequestTarget target, DialogButton btn) {
        List<FileUpload> ful = uploadField.getFileUploads();
        if (ful != null) {
            boolean clean = cleanWb.getModelObject();
            for (FileUpload fu : ful) {
                FileItem f = new FileItem();
                f.setSize(fu.getSize());
                f.setName(fu.getClientFileName());
                f.setExternalType(room.getRoom().getExternalType());
                BaseFileItem parent = roomFiles.getLastSelected();
                if (parent == null || !(parent instanceof FileItem)) {
                    f.setOwnerId(getUserId());
                } else {
                    f.setRoomId(parent.getRoomId());
                    f.setOwnerId(parent.getOwnerId());
                    f.setGroupId(parent.getGroupId());
                    if (parent.getId() != null) {
                        f.setParentId(BaseFileItem.Type.Folder == parent.getType() ? parent.getId()
                                : parent.getParentId());
                    }
                }
                f.setInsertedBy(getUserId());

                try {
                    ProcessResultList logs = processor.processFile(f, fu.getInputStream());
                    for (ProcessResult res : logs.getJobs()) {
                        fileLogDao.add(res.getProcess(), f, res);
                    }
                    room.getSidebar().updateFiles(target);
                    if (logs.hasError()) {
                        form.error(getString("convert.errors.file"));
                    } else {
                        if (toWb.getModelObject()) {
                            room.getWb().sendFileToWb(f, clean);
                            clean = false;
                        }
                    }
                } catch (Exception e) {
                    log.error("Unexpected error while processing uploaded file", e);
                    form.error(e.getMessage() == null ? "Unexpected error" : e.getMessage());
                } finally {
                    fu.closeStreams();
                    fu.delete();
                }
            }
            if (form.hasError()) {
                onError(target, null);
            } else {
                close(target, null);
            }
        }
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        super.renderHead(response);
        response.render(new PriorityHeaderItem(JavaScriptHeaderItem
                .forReference(new JavaScriptResourceReference(UploadDialog.class, "upload.js"))));
    }
}