org.hippoecm.frontend.plugins.jquery.upload.multiple.FileUploadWidget.java Source code

Java tutorial

Introduction

Here is the source code for org.hippoecm.frontend.plugins.jquery.upload.multiple.FileUploadWidget.java

Source

/*
 * Copyright 2014-2017 Hippo B.V. (http://www.onehippo.com)
 *
 * Licensed 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.hippoecm.frontend.plugins.jquery.upload.multiple;

import java.util.HashMap;
import java.util.Map;

import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.IBehaviorListener;
import org.apache.wicket.markup.html.form.upload.FileUpload;
import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
import org.apache.wicket.request.IRequestParameters;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.interpolator.MapVariableInterpolator;
import org.apache.wicket.util.upload.FileItem;
import org.hippoecm.frontend.plugin.config.IPluginConfig;
import org.hippoecm.frontend.plugins.jquery.upload.AbstractFileUploadWidget;
import org.hippoecm.frontend.plugins.jquery.upload.FileUploadViolationException;
import org.hippoecm.frontend.plugins.jquery.upload.behaviors.AjaxCallbackUploadDoneBehavior;
import org.hippoecm.frontend.plugins.jquery.upload.behaviors.AjaxFileUploadBehavior;
import org.hippoecm.frontend.plugins.jquery.upload.behaviors.FileUploadInfo;
import org.hippoecm.frontend.plugins.yui.upload.validation.FileUploadValidationService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * The multi-files upload widget.
 * @see AbstractFileUploadWidget
 */
public abstract class FileUploadWidget extends AbstractFileUploadWidget {

    private static final Logger log = LoggerFactory.getLogger(FileUploadWidget.class);

    private static final String UPLOADING_SCRIPT_TEMPLATE = "$('#${componentMarkupId}').data('blueimp-fileupload').uploadFiles()";

    private FileUploadBar fileUploadBar;

    private AbstractDefaultAjaxBehavior ajaxCallbackUploadDoneBehavior;
    private AjaxFileUploadBehavior ajaxFileUploadBehavior;
    private AbstractDefaultAjaxBehavior ajaxCallbackSelectionChangeBehavior;

    private int numberOfValidFiles;
    private int numberOfSelectedFiles;

    protected void onFileUploadResponse(final ServletWebRequest request,
            final Map<String, FileUploadInfo> uploadedFiles) {
    }

    public FileUploadWidget(final String uploadPanel, final IPluginConfig pluginConfig,
            final FileUploadValidationService validator) {
        super(uploadPanel, pluginConfig, validator);

        createComponents();
    }

    public String getUploadScript() {
        Map<String, Object> variables = new HashMap<>();
        variables.put("componentMarkupId", fileUploadBar.getMarkupId());

        return MapVariableInterpolator.interpolate(UPLOADING_SCRIPT_TEMPLATE, variables);
    }

    private void createComponents() {
        add(ajaxFileUploadBehavior = new AjaxFileUploadBehavior(this) {
            @Override
            protected void onBeforeUpload(final FileUploadInfo fileUploadInfo) {
                FileUploadWidget.this.onBeforeUpload(fileUploadInfo);
            }

            @Override
            protected void process(final FileUpload fileUpload) throws FileUploadViolationException {
                FileUploadWidget.this.process(fileUpload);
            }

            @Override
            protected void onResponse(final ServletWebRequest request,
                    final Map<String, FileUploadInfo> uploadedFiles) {
                FileUploadWidget.this.onFileUploadResponse(request, uploadedFiles);
            }

            @Override
            protected void onAfterUpload(final FileItem file, final FileUploadInfo fileUploadInfo) {
                FileUploadWidget.this.onAfterUpload(file, fileUploadInfo);
            }

            protected void onUploadError(final FileUploadInfo fileUploadInfo) {
                FileUploadWidget.this.onUploadError(fileUploadInfo);
            }

        });

        add(ajaxCallbackUploadDoneBehavior = new AjaxCallbackUploadDoneBehavior() {
            @Override
            protected void onNotify(final AjaxRequestTarget target, final int numberOfFiles, final boolean error) {
                FileUploadWidget.this.onFinished(target, numberOfFiles, error);
                // backward compatible call
                FileUploadWidget.this.onFinished();
            }
        });

        add(ajaxCallbackSelectionChangeBehavior = new AbstractDefaultAjaxBehavior() {
            @Override
            protected void respond(final AjaxRequestTarget target) {
                final IRequestParameters parameters = RequestCycle.get().getRequest().getRequestParameters();
                numberOfValidFiles = parameters.getParameterValue("numberOfValidFiles").toInt(0);
                numberOfSelectedFiles = parameters.getParameterValue("numberOfSelectedFiles").toInt(0);
                FileUploadWidget.this.onSelectionChange(target);
            }
        });

        // The buttons toolbar. Mandatory
        fileUploadBar = new FileUploadBar("fileUploadBar", settings);
        add(fileUploadBar);

        // The template used by jquery.fileupload-ui.js to show the files
        // scheduled for upload (i.e. the added files).
        // Optional
        FileUploadTemplate uploadTemplate = new FileUploadTemplate("uploadTemplate");
        add(uploadTemplate);

        // The template used by jquery.fileupload-ui.js to show the uploaded files
        // Optional
        FileDownloadTemplate downloadTemplate = new FileDownloadTemplate("downloadTemplate");
        add(downloadTemplate);
    }

    @Override
    protected void onBeforeRender() {
        // Obtain callback urls used for uploading files & notification
        final String uploadUrl = urlFor(ajaxFileUploadBehavior, IBehaviorListener.INTERFACE, new PageParameters())
                .toString();
        settings.setUploadUrl(uploadUrl);

        final String uploadDoneNotificationUrl = ajaxCallbackUploadDoneBehavior.getCallbackUrl().toString();
        settings.setUploadDoneNotificationUrl(uploadDoneNotificationUrl);

        final String selectionChangeNotificationUrl = ajaxCallbackSelectionChangeBehavior.getCallbackUrl()
                .toString();
        settings.setSelectionChangeNotificationUrl(selectionChangeNotificationUrl);
        super.onBeforeRender();
    }

    @Override
    protected void onAfterUpload(final FileItem file, final FileUploadInfo fileUploadInfo) {
        log.debug("Uploaded file: {}", fileUploadInfo.getFileName());
    }

    /**
     * The event is fired when the file selection list was changed
     * @param target
     */
    protected void onSelectionChange(final AjaxRequestTarget target) {
    }

    public int getNumberOfValidFiles() {
        return numberOfValidFiles;
    }

    public int getNumberOfSelectedFiles() {
        return numberOfSelectedFiles;
    }

    public FileUploadBar getFileUploadBar() {
        return fileUploadBar;
    }

    public void setFileUploadBar(final FileUploadBar fileUploadBar) {
        this.fileUploadBar = fileUploadBar;
    }
}