/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo 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.
*
* OpenFlexo 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 OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.action;
import java.io.File;
import java.io.IOException;
import java.rmi.RemoteException;
import java.util.Arrays;
import java.util.Comparator;
import java.util.EventObject;
import java.util.logging.Logger;
import javax.swing.Icon;
import org.openflexo.AdvancedPrefs;
import org.openflexo.components.AskParametersDialog;
import org.openflexo.components.ProgressWindow;
import org.openflexo.foundation.FlexoException;
import org.openflexo.foundation.action.FlexoActionFinalizer;
import org.openflexo.foundation.action.FlexoActionInitializer;
import org.openflexo.foundation.action.FlexoExceptionHandler;
import org.openflexo.foundation.imported.action.UploadPrjAction;
import org.openflexo.foundation.param.CheckboxParameter;
import org.openflexo.foundation.param.LabelParameter;
import org.openflexo.foundation.param.ParameterDefinition;
import org.openflexo.foundation.param.RadioButtonListParameter;
import org.openflexo.foundation.rm.SaveResourceException;
import org.openflexo.icon.WKFIconLibrary;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.view.controller.ActionInitializer;
import org.openflexo.view.controller.ControllerActionInitializer;
import org.openflexo.view.controller.FlexoController;
import org.openflexo.view.controller.FlexoServerInstanceManager;
import org.openflexo.ws.client.PPMWebService.CLProjectDescriptor;
import org.openflexo.ws.client.PPMWebService.PPMWebServiceAuthentificationException;
import org.openflexo.ws.client.PPMWebService.PPMWebServiceClient;
public class UploadPrjInitializer extends ActionInitializer {
private class ChangeServerException extends Exception {
}
@SuppressWarnings("unused")
private static final Logger logger = Logger.getLogger(ControllerActionInitializer.class.getPackage().getName());
public UploadPrjInitializer(ControllerActionInitializer actionInitializer) {
super(UploadPrjAction.actionType, actionInitializer);
}
@Override
protected FlexoActionInitializer<UploadPrjAction> getDefaultInitializer() {
return new FlexoActionInitializer<UploadPrjAction>() {
@Override
public boolean run(EventObject e, UploadPrjAction action) {
boolean isFirst = true;
PPMWebServiceClient client = null;
CLProjectDescriptor[] targetProjects = null;
boolean proceed = true;
while (proceed) {
ProgressWindow.showProgressWindow(FlexoLocalization.localizedForKey("connecting_to_server"), -1);
try {
while (targetProjects == null) {
client = getController().getWSClient(!isFirst);
isFirst = false;
if (client == null) {
return false;// Cancelled
}
try {
targetProjects = client.getAvailableProjects();
} catch (PPMWebServiceAuthentificationException e1) {
getController().handleWSException(e1);
} catch (RemoteException e1) {
getController().handleWSException(e1);
}
}
} finally {
ProgressWindow.hideProgressWindow();
}
CLProjectDescriptor target = null;
try {
proceed = false;
target = selectTarget(targetProjects);
} catch (ChangeServerException e3) {
targetProjects = null;
proceed = true;
continue;
}
if (target != null) {
action.setTargetProject(target);
ProgressWindow.showProgressWindow(FlexoLocalization.localizedForKey("saving"), 5);
File zipFile = null;
try {
zipFile = File.createTempFile("tmp_" + System.currentTimeMillis(), "tmp_" + System.currentTimeMillis());
zipFile.deleteOnExit();
} catch (IOException e2) {
e2.printStackTrace();
FlexoController.showError(e2.getMessage());
return false;
}
try {
getProject().saveAsZipFile(zipFile, ProgressWindow.instance(), true, true);
} catch (SaveResourceException e1) {
FlexoController.showError(e1.getMessage());
e1.printStackTrace();
return false;
}
ProgressWindow.hideProgressWindow();
action.setFile(zipFile);
action.setClientWS(client);
String s = FlexoController.askForString(FlexoLocalization.localizedForKey("please_provide_some_comments"));
if (s == null) {
return false;
}
action.setComments(s);
return true;
}
return false;
}
return false;
}
};
}
@Override
protected FlexoExceptionHandler<UploadPrjAction> getDefaultExceptionHandler() {
return new FlexoExceptionHandler<UploadPrjAction>() {
@Override
public boolean handleException(FlexoException exception, UploadPrjAction action) {
Throwable e = exception;
if (exception.getCause() != null) {
e = exception.getCause();
}
if (e instanceof PPMWebServiceAuthentificationException) {
getController().handleWSException((PPMWebServiceAuthentificationException) e);
} else if (e instanceof RemoteException) {
getController().handleWSException((RemoteException) e);
} else {
FlexoController.notify(FlexoLocalization.localizedForKey("upload_project_failed") + ": " + e.getMessage());
}
return false;
}
};
}
private CLProjectDescriptor selectTarget(CLProjectDescriptor[] targetProjects) throws ChangeServerException {
Arrays.sort(targetProjects, new Comparator<CLProjectDescriptor>() {
@Override
public int compare(CLProjectDescriptor o1, CLProjectDescriptor o2) {
if (o1.getProjectName() == null) {
if (o2.getProjectName() == null) {
return 0;
} else {
return -1;
}
} else if (o2.getProjectName() == null) {
return 1;
} else {
return o1.getProjectName().compareTo(o2.getProjectName());
}
}
});
if (targetProjects.length == 0) {
FlexoController.showError(FlexoLocalization.localizedForKey("sorry_but_there_is_no_projects_where_this_prj_can_be_uploaded"));
return null;
}
ParameterDefinition[] parameters = new ParameterDefinition[3];
LabelParameter info = new LabelParameter("info", "", "<html>"
+ FlexoLocalization.localizedForKey("selected_server")
+ " <b>"
+ FlexoServerInstanceManager.getInstance().getAddressBook().getInstanceWithID(AdvancedPrefs.getWebServiceInstance())
.getName() + "</b></html>", false);
info.setAlign("center");
RadioButtonListParameter<CLProjectDescriptor> p = new RadioButtonListParameter<CLProjectDescriptor>("selectedProject",
"choose_project", targetProjects[0], targetProjects);
p.setDepends("change");
p.setConditional("change=false");
CheckboxParameter changeServer = new CheckboxParameter("change", "change_server", false);
parameters[0] = info;
parameters[1] = p;
parameters[2] = changeServer;
AskParametersDialog dialog = AskParametersDialog.createAskParametersDialog(getProject(),
FlexoLocalization.localizedForKey("import_processes"), FlexoLocalization.localizedForKey("select_project"), parameters);
if (dialog.getStatus() == AskParametersDialog.VALIDATE) {
if (changeServer.getValue()) {
throw new ChangeServerException();
}
return p.getValue();
} else {
return null;
}
}
@Override
protected FlexoActionFinalizer<UploadPrjAction> getDefaultFinalizer() {
return new FlexoActionFinalizer<UploadPrjAction>() {
@Override
public boolean run(EventObject e, UploadPrjAction action) {
if (action.getUploadReport() != null && action.getUploadReport().trim().length() > 0) {
FlexoController.notify(action.getUploadReport());
}
return true;
}
};
}
@Override
protected Icon getEnabledIcon() {
return WKFIconLibrary.PROCESS_ICON;
}
}