/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.netsysit.controller;
import de.netsysit.policymanager.Enums.ApplicationBase;
import de.netsysit.policymanager.Enums.PolicyLevel;
import de.netsysit.model.ApplicationModel;
import de.netsysit.model.DataBaseModel;
import de.netsysit.model.PolicyModel;
import de.netsysit.model.ReceiverListModel;
import de.netsysit.model.XMLPolicyDBWriter;
import de.netsysit.policymanager.PolicyManager;
import de.netsysit.policymanager.PolicyUtilities;
import de.netsysit.view.FallBackChooserDialog;
import de.netsysit.view.LanguageChanger;
import de.netsysit.view.LevelChooserDialog;
import de.netsysit.view.ListSelectionDialog;
import de.netsysit.view.MainFrame;
import de.netsysit.view.MappingDialog;
import de.netsysit.view.SelectDBDialog;
import java.awt.event.ActionEvent;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.Icon;
import javax.swing.JOptionPane;
/**
*
* @author Ducksoul
*/
public final class ActionFactory {
private ActionFactory() {
}
private static ApplicationController ac;
private static ListController lc;
private static PolicyController pc;
private static Map<ActionKey, PolicyAction> map;
private static ResourceBundle rb = PolicyUtilities.getResourceBundle();
private static ResourceBundle mb = PolicyUtilities.getMessageBundle();
private static DataBaseModel dbModel = PolicyManager.getPolicyModel();
private static MappingDialog mDlg;
public static void init() {
map = new HashMap<ActionKey, PolicyAction>();
map.put(ActionKey.APP_ADD, new PolicyAction(ActionKey.APP_ADD, rb.getString("addapp"), PolicyUtilities.createImageIcon("/images/new_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
ApplicationModel app = new ApplicationModel();
app.setId(PolicyUtilities.getNewApplicationId());
app.setName(rb.getString("newapp") + "_" + new Integer(app.getId()).toString());
app.setBaseA(ApplicationBase.NONE);
app.setBaseC(ApplicationBase.NONE);
app.setBaseI(ApplicationBase.NONE);
if (dbModel.addApplication(app)) {
dbModel.setCurrentApplication(app);
}
}
});
map.put(ActionKey.APP_DELETE, new PolicyAction(ActionKey.APP_DELETE, rb.getString("delapp"), PolicyUtilities.createImageIcon("/images/delete_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
ac.removeApplication();
}
});
map.put(ActionKey.APP_JUMPTO, new PolicyAction(ActionKey.APP_JUMPTO, rb.getString("jump")) {
@Override
public void actionPerformed(ActionEvent e) {
ac.jumpToList();
}
});
map.put(ActionKey.APP_ADDLIST, new PolicyAction(ActionKey.APP_ADDLIST, rb.getString("add")) {
@Override
public void actionPerformed(ActionEvent e) {
ApplicationModel app = dbModel.getCurrentApplication();
List<ReceiverListModel> lists = new ArrayList(dbModel.getReceiverLists());
lists.removeAll(app.getReceiverLists());
if (lists.size() > 0) {
Object[] listnames = new Object[lists.size()];
for (int i = 0; i < lists.size(); i++) {
listnames[i] = lists.get(i);
}
ListSelectionDialog lsd = new ListSelectionDialog();
lsd.showDialog(listnames);
ReceiverListModel selection = (ReceiverListModel) lsd.getResult();
if (selection != null) {
app.addReceiverList(selection);
}
} else if(PolicyUtilities.isShowWarnings()) {
mb = PolicyUtilities.getMessageBundle();
PolicyUtilities.showMessageDialog(mb.getString("nolistavailable"), JOptionPane.INFORMATION_MESSAGE);
}
}
});
map.put(ActionKey.APP_DELETELIST, new PolicyAction(ActionKey.APP_DELETELIST, rb.getString("delete")) {
@Override
public void actionPerformed(ActionEvent e) {
ac.deleteList();
}
});
map.put(ActionKey.MAIN_OPENDB, new PolicyAction(ActionKey.MAIN_OPENDB, rb.getString("opendb")) {
@Override
public void actionPerformed(ActionEvent e) {
SelectDBDialog dlgSelectDB = new SelectDBDialog(MainFrame.getInstance(), true);
dlgSelectDB.setVisible(true);
}
});
map.put(ActionKey.MAIN_SAVE, new PolicyAction(ActionKey.MAIN_SAVE, rb.getString("save"), PolicyUtilities.createImageIcon("/images/save_24.png")) {
@Override
public void actionPerformed(ActionEvent e) {
XMLPolicyDBWriter writer = new XMLPolicyDBWriter();
try {
writer.savePolicyDB(dbModel.getFilePath());
} catch (Exception ex) {
Logger.getLogger(ActionFactory.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
map.put(ActionKey.MAIN_SAVEAS, new PolicyAction(ActionKey.MAIN_SAVEAS, rb.getString("saveas"), PolicyUtilities.createImageIcon("/images/save_24.png")) {
@Override
public void actionPerformed(ActionEvent e) {
XMLPolicyDBWriter writer = new XMLPolicyDBWriter();
try {
String path = PolicyUtilities.showSaveDialog();
writer.savePolicyDB(path);
} catch (Exception ex) {
Logger.getLogger(ActionFactory.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
map.put(ActionKey.MAIN_ADD, new PolicyAction(ActionKey.MAIN_ADD, rb.getString("addapp"), PolicyUtilities.createImageIcon("/images/new_24.png")) {
@Override
public void actionPerformed(ActionEvent e) {
switch (dbModel.getActiveItem()) {
case APP:
ApplicationModel app = new ApplicationModel();
app.setId(PolicyUtilities.getNewApplicationId());
app.setName(rb.getString("newapp") + "_" + new Integer(app.getId()).toString());
app.setBaseA(ApplicationBase.NONE);
app.setBaseC(ApplicationBase.NONE);
app.setBaseI(ApplicationBase.NONE);
if (dbModel.addApplication(app)) {
dbModel.setCurrentApplication(app);
}
break;
case LIST:
ReceiverListModel list = new ReceiverListModel();
list.setId(PolicyUtilities.getNewReceiverListId());
list.setName(rb.getString("newlist") + "_" + new Integer(list.getId()).toString());
if (dbModel.addReceiverList(list)) {
dbModel.setCurrentReceiverList(list);
}
break;
case POLICY:
LevelChooserDialog lcD = new LevelChooserDialog();
lcD.showDialog();
PolicyLevel result = lcD.getResult();
if(result != PolicyLevel.NONE) {
dbModel.setActiveLevel(result);
pc.createPolicy();
}
break;
}
}
});
map.put(ActionKey.MAIN_DELETE, new PolicyAction(ActionKey.MAIN_DELETE, rb.getString("delapp"), PolicyUtilities.createImageIcon("/images/delete_24.png")) {
@Override
public void actionPerformed(ActionEvent e) {
switch (dbModel.getActiveItem()) {
case APP:
ac.removeApplication();
break;
case LIST:
lc.removeReceiverList();
break;
case POLICY:
pc.removePolicy(dbModel.getActiveLevel());
break;
}
}
});
map.put(ActionKey.MAIN_MAPPING, new PolicyAction(ActionKey.MAIN_MAPPING, rb.getString("mapping"), PolicyUtilities.createImageIcon("/images/delete_24.png")) {
@Override
public void actionPerformed(ActionEvent e) {
if(mDlg == null) {
mDlg = new MappingDialog();
mDlg.showDialog();
} else {
mDlg.refresh();
mDlg.showDialog();
}
if(!mDlg.getResult()) {
if(PolicyUtilities.isShowWarnings()) {
mb = PolicyUtilities.getMessageBundle();
PolicyUtilities.showMessageDialog(mb.getString("mappingwarning"), JOptionPane.WARNING_MESSAGE);
}
}
}
});
map.put(ActionKey.LIST_ADD, new PolicyAction(ActionKey.LIST_ADD, rb.getString("addlist"), PolicyUtilities.createImageIcon("/images/new_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
ReceiverListModel list = new ReceiverListModel();
list.setId(PolicyUtilities.getNewReceiverListId());
list.setName(rb.getString("newlist") + "_" + new Integer(list.getId()).toString());
if (dbModel.addReceiverList(list)) {
dbModel.setCurrentReceiverList(list);
}
}
});
map.put(ActionKey.LIST_DELETE, new PolicyAction(ActionKey.LIST_DELETE, rb.getString("dellist"), PolicyUtilities.createImageIcon("/images/delete_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
lc.removeReceiverList();
}
});
map.put(ActionKey.LIST_ADDRECEIVER, new PolicyAction(ActionKey.LIST_ADDRECEIVER, rb.getString("add")) {
@Override
public void actionPerformed(ActionEvent e) {
lc.addReceiver();
}
});
map.put(ActionKey.LIST_RECEIVEREDIT, new PolicyAction(ActionKey.LIST_RECEIVEREDIT, rb.getString("edit")) {
@Override
public void actionPerformed(ActionEvent e) {
lc.editReceiver();
}
});
map.put(ActionKey.LIST_RECEIVERDELETE, new PolicyAction(ActionKey.LIST_RECEIVERDELETE, rb.getString("delete")) {
@Override
public void actionPerformed(ActionEvent e) {
lc.deleteReceiver();
}
});
map.put(ActionKey.POLICY_ADDA, new PolicyAction(ActionKey.POLICY_ADDA, rb.getString("newpolicy"), PolicyUtilities.createImageIcon("/images/new_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
dbModel.setActiveLevel(PolicyLevel.A);
pc.createPolicy();
}
});
map.put(ActionKey.POLICY_ADDC, new PolicyAction(ActionKey.POLICY_ADDC, rb.getString("newpolicy"), PolicyUtilities.createImageIcon("/images/new_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
dbModel.setActiveLevel(PolicyLevel.C);
pc.createPolicy();
}
});
map.put(ActionKey.POLICY_ADDI, new PolicyAction(ActionKey.POLICY_ADDI, rb.getString("newpolicy"), PolicyUtilities.createImageIcon("/images/new_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
dbModel.setActiveLevel(PolicyLevel.I);
pc.createPolicy();
}
});
map.put(ActionKey.POLICY_DELETEA, new PolicyAction(ActionKey.POLICY_DELETEA, rb.getString("delpolicy"), PolicyUtilities.createImageIcon("/images/delete_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
pc.removePolicy(PolicyLevel.A);
}
});
map.put(ActionKey.POLICY_DELETEC, new PolicyAction(ActionKey.POLICY_DELETEC, rb.getString("delpolicy"), PolicyUtilities.createImageIcon("/images/delete_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
pc.removePolicy(PolicyLevel.C);
}
});
map.put(ActionKey.POLICY_DELETEI, new PolicyAction(ActionKey.POLICY_DELETEI, rb.getString("delpolicy"), PolicyUtilities.createImageIcon("/images/delete_16.png")) {
@Override
public void actionPerformed(ActionEvent e) {
pc.removePolicy(PolicyLevel.I);
}
});
map.put(ActionKey.POLICY_CHOOSEFB, new PolicyAction(ActionKey.POLICY_CHOOSEFB, rb.getString("choosefallback")) {
@Override
public void actionPerformed(ActionEvent e) {
PolicyModel policy = dbModel.getCurrentPolicy();
List<PolicyModel> currentPolicies = null;
PolicyLevel level = dbModel.getActiveLevel();
if (level == PolicyLevel.A) {
currentPolicies = dbModel.getAPolicies();
} else if (level == PolicyLevel.C) {
currentPolicies = dbModel.getCPolicies();
} else if (level == PolicyLevel.I) {
currentPolicies = dbModel.getIPolicies();
}
List<PolicyModel> list = new ArrayList<PolicyModel>(currentPolicies);
list.remove(policy); // die darf sowieso nicht drin sein
for (Iterator<PolicyModel> it = list.iterator(); it.hasNext();) {
PolicyModel next = it.next();
if (!PolicyUtilities.isValidPolicyFallback(policy, next)) {
it.remove(); // entferne alle invaliden
} else {
// prüfen, ob Policy schon Elternteil einer anderen Policy ist
for (int i=0; i<currentPolicies.size(); i++) {
PolicyModel ref = currentPolicies.get(i);
if(!ref.equals(next))
if(PolicyUtilities.isParentPolicy(ref, next))
it.remove();
}
}
}
PolicyModel p = PolicyUtilities.getDummyPolicy();
if ((list.isEmpty()) && (policy.getFallback() == null)) {
if(PolicyUtilities.isShowWarnings()) {
mb = PolicyUtilities.getMessageBundle();
PolicyUtilities.showMessageDialog(mb.getString("nofbavailable"), JOptionPane.INFORMATION_MESSAGE);
}
} else {
list.add(p);
Object[] policies = list.toArray();
FallBackChooserDialog dlg = new FallBackChooserDialog();
dlg.showDialog(policies);
Object result = dlg.getResult();
if (result != null) {
PolicyModel fb = (PolicyModel) result;
if(fb.equals(p))
dbModel.getCurrentPolicy().setFallback(null);
else
dbModel.getCurrentPolicy().setFallback((PolicyModel) dlg.getResult());
PolicyUtilities.setPolicyRanks(currentPolicies, true);
pc.refreshPolicyLists();
}
}
}
});
map.put(ActionKey.LANG_DE, new PolicyAction(ActionKey.LANG_DE, rb.getString("german")) {
@Override
public void actionPerformed(ActionEvent e) {
Locale loc = new Locale("de", "DE");
PolicyUtilities.setLoc(loc);
LanguageChanger langChanger = MainFrame.getLangChanger();
langChanger.setRb(PolicyUtilities.getResourceBundle());
langChanger.changeLanguage();
}
});
map.put(ActionKey.LANG_EN, new PolicyAction(ActionKey.LANG_EN, rb.getString("english")) {
@Override
public void actionPerformed(ActionEvent e) {
Locale loc = new Locale("en", "GB");
PolicyUtilities.setLoc(loc);
LanguageChanger langChanger = MainFrame.getLangChanger();
langChanger.setRb(PolicyUtilities.getResourceBundle());
langChanger.changeLanguage();
}
});
}
public static PolicyAction get(ActionKey key) {
return map.get(key);
}
public static abstract class PolicyAction extends AbstractAction {
private ActionKey aKey;
private String name;
public PolicyAction(ActionKey aKey, String actionName) {
this.aKey = aKey;
putValue(ACTION_COMMAND_KEY, aKey.name());
putValue(Action.NAME, actionName);
setEnabled(true);
}
public PolicyAction(ActionKey aKey, String name, Icon icon) {
this.aKey = aKey;
this.name = name;
putValue(ACTION_COMMAND_KEY, aKey.name());
putValue(Action.NAME, name);
putValue(Action.SMALL_ICON, icon);
}
public ActionKey getActionKey() {
return aKey;
}
public String getName() {
return name;
}
public void setName(String name) {
putValue(Action.NAME, name);
}
}
public enum ActionKey {
APP_JUMPTO,
APP_ADDLIST,
APP_DELETELIST,
APP_ADD,
APP_DELETE,
MAIN_OPENDB,
MAIN_SAVE,
MAIN_SAVEAS,
MAIN_ADD,
MAIN_DELETE,
MAIN_MAPPING,
POLICY_CHOOSEFB,
POLICY_ADDA,
POLICY_ADDC,
POLICY_ADDI,
POLICY_DELETEA,
POLICY_DELETEC,
POLICY_DELETEI,
LIST_RECEIVEREDIT,
LIST_ADDRECEIVER,
LIST_RECEIVERDELETE,
LIST_ADD,
LIST_DELETE,
LANG_DE,
LANG_EN;
}
public static void setAc(ApplicationController ac) {
ActionFactory.ac = ac;
}
public static void setLc(ListController lc) {
ActionFactory.lc = lc;
}
public static void setPc(PolicyController pc) {
ActionFactory.pc = pc;
}
}