package org.openslx.dozmod.gui.activity; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Box; import javax.swing.JCheckBox; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.thrift.TException; import org.openslx.bwlp.thrift.iface.SscMode; import org.openslx.bwlp.thrift.iface.TAuthorizationException; import org.openslx.bwlp.thrift.iface.TInvalidTokenException; import org.openslx.bwlp.thrift.iface.UploadOptions; import org.openslx.dozmod.gui.Gui; import org.openslx.dozmod.gui.helper.I18n; import org.openslx.dozmod.gui.helper.MessageType; import org.openslx.dozmod.gui.helper.QuitNotification; import org.openslx.dozmod.state.UploadWizardState; import org.openslx.dozmod.thrift.Session; import org.openslx.dozmod.thrift.UploadInitiator; import org.openslx.sat.thrift.version.Feature; import org.openslx.thrifthelper.ThriftManager; import org.openslx.util.QuickTimer; import org.openslx.util.QuickTimer.Task; public class UploadPanel extends TransferPanel implements QuitNotification { /** * Version for serialization. */ private static final long serialVersionUID = -8905745015422520339L; private static final Logger LOGGER = LogManager.getLogger(UploadPanel.class); private UploadInitiator state; private final UploadPanel panel = this; private final JCheckBox chkServerSideCopy; public UploadPanel(UploadWizardState state) { super(state.upload.getUploadTask(), state.name, state.diskFile.getName()); if (!Session.hasFeature(Feature.SERVER_SIDE_COPY) || Session.getSatelliteConfig().serverSideCopy != SscMode.USER) { chkServerSideCopy = null; } else { chkServerSideCopy = new JCheckBox(I18n.ACTIVITY.getString("UploadPanel.CheckBox.serverSideCopy.text")); footer.add(Box.createHorizontalStrut(15)); footer.add(chkServerSideCopy); chkServerSideCopy.addActionListener(new SscToggle()); } btnClose.addActionListener(new ButtonAction()); this.state = state.upload; state.upload.getUploadTask().addListener(this); } /** * Cancel/Close pressed */ private class ButtonAction implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (state != null) { if (!state.getUploadTask().isCanceled()) { if (!Gui.showMessageBox(panel, I18n.ACTIVITY.getString("UploadPanel.Message.yesNo.cancelTransfer"), MessageType.QUESTION_YESNO, null, null)) return; final UploadInitiator fstate = state; QuickTimer.scheduleOnce(new Task() { @Override public void fire() { fstate.cancelError("UploadPanel: Requested by user through button press"); } }); } state.getUploadTask().removeListener(panel); state = null; } close(); } } private class SscToggle implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if (state == null) return; final UploadOptions options = new UploadOptions(chkServerSideCopy.isSelected()); final UploadInitiator fstate = state; QuickTimer.scheduleOnce(new Task() { @Override public void fire() { boolean dis = false; UploadOptions newOpt = null; try { newOpt = ThriftManager.getSatClient().setUploadOptions(Session.getSatelliteToken(), fstate.getToken(), options); } catch (TAuthorizationException | TInvalidTokenException e) { dis = true; } catch (TException e) { Gui.asyncMessageBox(I18n.ACTIVITY.getString("UploadPanel.Message.error.setUploadOptions"), MessageType.ERROR, LOGGER, e); } final UploadOptions newOptions = newOpt; final boolean disableBox = dis; Gui.asyncExec(new Runnable() { @Override public void run() { chkServerSideCopy.setEnabled(!disableBox); if (newOptions == null) { // Most likely error, revert chkServerSideCopy.setSelected(!chkServerSideCopy.isSelected()); } else if (newOptions.isSetServerSideCopying()) { chkServerSideCopy.setSelected(newOptions.serverSideCopying); } progress.showOptimisticComplete(newOptions != null && newOptions.isSetServerSideCopying() && newOptions.serverSideCopying); } }); } }); } } @Override public void onApplicationQuit() { // Application quit, tell server we cancel if (state == null) return; state.cancelError("Application quit (via UploadPanel)"); } @Override protected void releaseResources() { state = null; } }