/*
* (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.foundation.imported.action;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.FlexoEditor;
import org.openflexo.foundation.FlexoException;
import org.openflexo.foundation.FlexoModelObject;
import org.openflexo.foundation.action.FlexoAction;
import org.openflexo.foundation.action.FlexoActionType;
import org.openflexo.foundation.imported.dm.RoleAlreadyImportedException;
import org.openflexo.foundation.wkf.Role;
import org.openflexo.foundation.wkf.RoleList;
import org.openflexo.foundation.wkf.WorkflowModelObject;
import org.openflexo.localization.FlexoLocalization;
import org.openflexo.logging.FlexoLogger;
import org.openflexo.ws.client.PPMWebService.PPMRole;
public class ImportRolesAction extends FlexoAction<ImportRolesAction, WorkflowModelObject, WorkflowModelObject> {
private static final Logger logger = FlexoLogger.getLogger(ImportRolesAction.class.getPackage().getName());
public static final FlexoActionType<ImportRolesAction, WorkflowModelObject, WorkflowModelObject> actionType = new FlexoActionType<ImportRolesAction, WorkflowModelObject, WorkflowModelObject>(
"import_roles", FlexoActionType.defaultGroup, FlexoActionType.importMenu, FlexoActionType.ADD_ACTION_TYPE) {
@Override
public ImportRolesAction makeNewAction(WorkflowModelObject focusedObject, Vector<WorkflowModelObject> globalSelection,
FlexoEditor editor) {
return new ImportRolesAction(focusedObject, globalSelection, editor);
}
@Override
public boolean isVisibleForSelection(WorkflowModelObject object, Vector<WorkflowModelObject> globalSelection) {
return false;
}
@Override
public boolean isEnabledForSelection(WorkflowModelObject object, Vector<WorkflowModelObject> globalSelection) {
return false;
}
};
static {
FlexoModelObject.addActionForClass(actionType, RoleList.class);
FlexoModelObject.addActionForClass(actionType, Role.class);
}
private RoleImportReport importReport;
private Vector<PPMRole> rolesToImport;
public Vector<PPMRole> getRolesToImport() {
return rolesToImport;
}
public void setRolesToImport(Vector<PPMRole> rolesToImport) {
this.rolesToImport = rolesToImport;
}
public RoleImportReport getImportReport() {
return importReport;
}
protected ImportRolesAction(WorkflowModelObject focusedObject, Vector<WorkflowModelObject> globalSelection, FlexoEditor editor) {
super(actionType, focusedObject, globalSelection, editor);
}
@Override
protected void doAction(Object context) throws FlexoException {
RoleList lib = getEditor().getProject().getWorkflow().getImportedRoleList();
importReport = new RoleImportReport();
for (PPMRole p : getRolesToImport()) {
if (!isValid(p)) {
importReport.addToInvalidRoles(p);
} else {
try {
Role fip = lib.importRole(p);
importReport.addToProperlyImportedRoles(p, fip);
} catch (RoleAlreadyImportedException e) {
importReport.addToAlreadyImportedRoles(p);
if (logger.isLoggable(Level.FINE)) {
logger.log(Level.FINE, "Role " + p.getName() + " was already imported", e);
}
}
}
}
}
private boolean isValid(PPMRole role) {
return role.getUri() != null && role.getVersionUri() != null;
}
public static class RoleImportReport {
private LinkedHashMap<PPMRole, Role> properlyImported;
private Vector<PPMRole> invalidRoles;
private Vector<PPMRole> alreadyImportedRoles;
public RoleImportReport() {
properlyImported = new LinkedHashMap<PPMRole, Role>();
invalidRoles = new Vector<PPMRole>();
alreadyImportedRoles = new Vector<PPMRole>();
}
public LinkedHashMap<PPMRole, Role> getProperlyImported() {
return properlyImported;
}
public void setProperlyImported(LinkedHashMap<PPMRole, Role> properlyImported) {
this.properlyImported = properlyImported;
}
public void addToProperlyImportedRoles(PPMRole processToImport, Role matchingImportedRole) {
properlyImported.put(processToImport, matchingImportedRole);
}
public Vector<PPMRole> getInvalidRoles() {
return invalidRoles;
}
public void setInvalidRoles(Vector<PPMRole> invalidRole) {
this.invalidRoles = invalidRole;
}
public void addToInvalidRoles(PPMRole process) {
invalidRoles.add(process);
}
public Vector<PPMRole> getAlreadyImportedRoles() {
return alreadyImportedRoles;
}
public void setAlreadyImportedRoles(Vector<PPMRole> invalidRole) {
this.alreadyImportedRoles = invalidRole;
}
public void addToAlreadyImportedRoles(PPMRole process) {
alreadyImportedRoles.add(process);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
// 1. Properly imported
Iterator<PPMRole> i = getProperlyImported().keySet().iterator();
append(sb, i, FlexoLocalization.localizedForKey("the_following_roles_have_been_properly_imported"));
// 2. Invalid roles
i = getInvalidRoles().iterator();
append(sb, i, FlexoLocalization.localizedForKey("the_following_roles_were_not_valid"));
// 3. Already imported
i = getAlreadyImportedRoles().iterator();
append(sb, i, FlexoLocalization.localizedForKey("the_following_roles_were_already_imported"));
if (sb.length() == 0) {
return FlexoLocalization.localizedForKey("nothing_has_been_imported");
} else {
sb.append("</html>");
}
return sb.toString();
}
private void append(StringBuilder sb, Iterator<PPMRole> i, String title) {
if (sb.length() == 0) {
sb.append("<html>");
}
boolean needsClosingUl = false;
if (i.hasNext()) {
sb.append(title).append(':').append("<ul>");
needsClosingUl = true;
}
while (i.hasNext()) {
PPMRole p = i.next();
sb.append("<li>").append(p.getName()).append("</li>");
}
if (needsClosingUl) {
sb.append("</ul>");
needsClosingUl = false;
}
}
}
}