package org.sigmah.shared.file; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import org.sigmah.client.page.PageManager; import org.sigmah.client.page.RequestParameter; import org.sigmah.client.security.AuthenticationProvider; import org.sigmah.client.util.ClientUtils; import org.sigmah.offline.status.ApplicationState; import org.sigmah.shared.dto.value.FileVersionDTO; import org.sigmah.shared.servlet.ServletConstants; import org.sigmah.shared.servlet.ServletUrlBuilder; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.FormEvent; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.widget.form.FormPanel; import com.google.gwt.http.client.Response; import com.google.gwt.user.client.rpc.AsyncCallback; import org.sigmah.client.event.EventBus; import org.sigmah.client.event.OfflineEvent; import org.sigmah.client.event.handler.OfflineHandler; import org.sigmah.shared.util.FileType; /** * Download and upload files with classic http requests. * * @author Raphaƫl Calabro (rcalabro@ideia.fr) * @author Denis Colliot (dcolliot@ideia.fr) */ class DirectTransfertManager implements TransfertManager { private final AuthenticationProvider authenticationProvider; private final PageManager pageManager; private ApplicationState state; public DirectTransfertManager(AuthenticationProvider authenticationProvider, PageManager pageManager, EventBus eventBus) { this.authenticationProvider = authenticationProvider; this.pageManager = pageManager; eventBus.addHandler(OfflineEvent.getType(), new OfflineHandler() { @Override public void handleEvent(OfflineEvent event) { state = event.getState(); } }); } @Override public void download(FileVersionDTO fileVersionDTO, final ProgressListener progressListener) { final ServletUrlBuilder urlBuilder = new ServletUrlBuilder(authenticationProvider, pageManager, ServletConstants.Servlet.FILE, ServletConstants.ServletMethod.DOWNLOAD_FILE); urlBuilder.addParameter(RequestParameter.ID, fileVersionDTO.getId()); ClientUtils.launchDownload(urlBuilder.toString()); } @Override public void cache(FileVersionDTO fileVersionDTO) { // Not supported } @Override public void isCached(FileVersionDTO fileVersionDTO, AsyncCallback<Boolean> callback) { callback.onSuccess(Boolean.FALSE); } @Override public void upload(final FormPanel formPanel, final ProgressListener progressListener) { upload(formPanel, progressListener, ServletConstants.ServletMethod.UPLOAD); } @Override public void uploadAvatar(final FormPanel formPanel, final ProgressListener progressListener) { upload(formPanel, progressListener, ServletConstants.ServletMethod.UPLOAD_AVATAR); } private void upload(final FormPanel formPanel, final ProgressListener progressListener, ServletConstants.ServletMethod servletMethod) { ServletUrlBuilder urlBuilder = new ServletUrlBuilder(authenticationProvider, pageManager, ServletConstants.Servlet.FILE, servletMethod); formPanel.setAction(urlBuilder.toString()); formPanel.setEncoding(FormPanel.Encoding.MULTIPART); formPanel.setMethod(FormPanel.Method.POST); formPanel.addListener(Events.Submit, new Listener<FormEvent>() { @Override public void handleEvent(FormEvent formEvent) { formPanel.removeListener(Events.Submit, this); final String result = formEvent.getResultHtml(); switch (ServletConstants.getErrorCode(result)) { case Response.SC_OK: progressListener.onLoad(result); break; case Response.SC_NO_CONTENT: progressListener.onFailure(Cause.EMPTY_FILE); break; case Response.SC_REQUEST_ENTITY_TOO_LARGE: progressListener.onFailure(Cause.FILE_TOO_LARGE); break; case Response.SC_PRECONDITION_FAILED: progressListener.onFailure(Cause.BAD_REQUEST); break; default: progressListener.onFailure(Cause.SERVER_ERROR); break; } } }); formPanel.submit(); } @Override public void canDownload(FileVersionDTO fileVersionDTO, AsyncCallback<Boolean> callback) { callback.onSuccess(state == ApplicationState.ONLINE && fileVersionDTO.isAvailable()); } @Override public boolean canUpload() { return state == ApplicationState.ONLINE; } }