/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package de.netsysit.model;
import de.netsysit.policymanager.Enums.ApplicationBase;
import de.netsysit.policymanager.Enums.PolicyLevel;
import de.netsysit.policymanager.PolicyUtilities;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.XMLEvent;
/**
*
* @author ducksoul
*/
public class XMLPolicyReader implements PolicyReader {
private List<ApplicationModel> applications = new ArrayList();
private List<ReceiverListModel> receiverLists = new ArrayList();
private List<PolicyModel> aPolicies = new ArrayList();
private List<PolicyModel> cPolicies = new ArrayList();
private List<PolicyModel> iPolicies = new ArrayList();
private LevelModel baseLow = new LevelModel();
private LevelModel baseNormal = new LevelModel();
private LevelModel baseHigh = new LevelModel();
private String node = "";
private String policyLevel = "";
private String level = "";
private int[] lowLevel = new int[3];
private int[] normalLevel = new int[3];
private int[] highLevel = new int[3];
private Map<PolicyModel, Integer> aFallBackMap = new HashMap();
private Map<PolicyModel, Integer> cFallBackMap = new HashMap();
private Map<PolicyModel, Integer> iFallBackMap = new HashMap();
private Set<Integer> appKeys = new TreeSet();
private Set<Integer> receiverListKeys = new TreeSet();
private Set<Integer> policyAKeys = new TreeSet();
private Set<Integer> policyCKeys = new TreeSet();
private Set<Integer> policyIKeys = new TreeSet();
public void loadPolicy(File f, DataBaseModel m) {
try {
// zuerst eine neue XMLInputFactory erstellen
XMLInputFactory inputFactory = XMLInputFactory.newInstance();
// einen neuen eventReader einrichten
InputStream in = new FileInputStream(f);
XMLEventReader eventReader = inputFactory.createXMLEventReader(in);
// Objekte erzeugen
ReceiverListModel pReceiverList = null;
ReceiverModel pReceiver = null;
ApplicationModel pApplication = null;
PolicyModel pPolicy = null;
// das XML-Dokument lesen
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.isStartElement()) {
String localpart = event.asStartElement().getName().getLocalPart();
if (localpart.equals("list")) {
node = "list";
pReceiverList = new ReceiverListModel();
} else if (localpart.equals("receiver")) {
node = "receiver";
pReceiver = new ReceiverModel();
} else if (localpart.equals("app")) {
node = "app";
pApplication = new ApplicationModel();
} else if (localpart.equals("policy")) {
node = "policy";
pPolicy = new PolicyModel();
} else if (localpart.equals("level1")) {
level = "low";
} else if (localpart.equals("level2")) {
level = "normal";
} else if (localpart.equals("level3")) {
level = "high";
} else if (localpart.equals("id")) {
event = eventReader.nextEvent();
if (node.equals("list")) {
pReceiverList.setId(Integer.parseInt(event.asCharacters().getData()));
} else if (node.equals("receiver")) {
pReceiver.setId(Integer.parseInt(event.asCharacters().getData()));
} else if (node.equals("app")) {
pApplication.setId(Integer.parseInt(event.asCharacters().getData()));
} else if (node.equals("policy")) {
pPolicy.setId(Integer.parseInt(event.asCharacters().getData()));
}
} else if (localpart.equals("name")) {
event = eventReader.nextEvent();
if (node.equals("list")) {
pReceiverList.setName(event.asCharacters().getData());
} else if (node.equals("receiver")) {
pReceiver.setName(event.asCharacters().getData());
} else if (node.equals("app")) {
pApplication.setName(event.asCharacters().getData());
} else if (node.equals("policy")) {
pPolicy.setName(event.asCharacters().getData());
// if (policyLevel.equals("a")) {
// pPolicy.setLevel(0);
// } else if (policyLevel.equals("c")) {
// pPolicy.setLevel(1);
// } else if (policyLevel.equals("i")) {
// pPolicy.setLevel(2);
// }
}
} else if (localpart.equals("a-policies")) {
policyLevel = "a";
} else if (localpart.equals("c-policies")) {
policyLevel = "c";
} else if (localpart.equals("i-policies")) {
policyLevel = "i";
} else if (localpart.equals("a")) {
event = eventReader.nextEvent();
if (level.equals("low")) {
lowLevel[0] = Integer.parseInt(event.asCharacters().getData());
} else if (level.equals("normal")) {
normalLevel[0] = Integer.parseInt(event.asCharacters().getData());
} else if (level.equals("high")) {
highLevel[0] = Integer.parseInt(event.asCharacters().getData());
}
} else if (localpart.equals("c")) {
event = eventReader.nextEvent();
if (level.equals("low")) {
lowLevel[1] = Integer.parseInt(event.asCharacters().getData());
} else if (level.equals("normal")) {
normalLevel[1] = Integer.parseInt(event.asCharacters().getData());
} else if (level.equals("high")) {
highLevel[1] = Integer.parseInt(event.asCharacters().getData());
}
} else if (localpart.equals("i")) {
event = eventReader.nextEvent();
if (level.equals("low")) {
lowLevel[2] = Integer.parseInt(event.asCharacters().getData());
} else if (level.equals("normal")) {
normalLevel[2] = Integer.parseInt(event.asCharacters().getData());
} else if (level.equals("high")) {
highLevel[2] = Integer.parseInt(event.asCharacters().getData());
}
} else if (localpart.equals("expectRequestEncrypted")) {
event = eventReader.nextEvent();
pApplication.setExpectRequestEncrypted(PolicyUtilities.intToBool(Integer.parseInt(event.asCharacters().getData())));
} else if (localpart.equals("a-level")) {
event = eventReader.nextEvent();
pApplication.setBaseA(intToApplicationBase(Integer.parseInt(event.asCharacters().getData())));
} else if (localpart.equals("c-level")) {
event = eventReader.nextEvent();
pApplication.setBaseC(intToApplicationBase(Integer.parseInt(event.asCharacters().getData())));
} else if (localpart.equals("i-level")) {
event = eventReader.nextEvent();
pApplication.setBaseI(intToApplicationBase(Integer.parseInt(event.asCharacters().getData())));
} else if (localpart.equals("listID")) {
event = eventReader.nextEvent();
pApplication.addReceiverList(getReceiverListModel(Integer.parseInt(event.asCharacters().getData())));
} else if (localpart.equals("fallback")) {
event = eventReader.nextEvent();
if(policyLevel.equals("a")) {
aFallBackMap.put(pPolicy, new Integer(Integer.parseInt(event.asCharacters().getData())));
} else if(policyLevel.equals("c")) {
cFallBackMap.put(pPolicy, new Integer(Integer.parseInt(event.asCharacters().getData())));
} else if(policyLevel.equals("i")) {
iFallBackMap.put(pPolicy, new Integer(Integer.parseInt(event.asCharacters().getData())));
}
} else if (localpart.equals("action")) {
event = eventReader.nextEvent();
if(policyLevel.equals("a")) {
pPolicy.setLevel(PolicyLevel.A);
} else if(policyLevel.equals("c")) {
Map<ActionTupel, String> actions = m.getCActions();
pPolicy.setAction(new ActionModel(actions, event.asCharacters().getData()));
pPolicy.setLevel(PolicyLevel.C);
} else if(policyLevel.equals("i")) {
Map<ActionTupel, String> actions = m.getIActions();
pPolicy.setAction(new ActionModel(actions, event.asCharacters().getData()));
pPolicy.setLevel(PolicyLevel.I);
}
} else if (localpart.equals("useToken")) {
event = eventReader.nextEvent();
pPolicy.setUseToken(PolicyUtilities.intToBool(Integer.parseInt(event.asCharacters().getData())));
} else if (localpart.equals("rank")) {
event = eventReader.nextEvent();
pPolicy.setRank(Integer.parseInt(event.asCharacters().getData()));
}
} else if (event.isEndElement()) {
String localpart = event.asEndElement().getName().getLocalPart();
if (localpart.equals("receiver")) {
// System.out.println(preceiver.getName());
pReceiverList.addReceiver(pReceiver);
} else if (localpart.equals("list")) {
receiverLists.add(pReceiverList);
// System.out.println(receiverLists.get(receiverLists.size()-1).getName());
// System.out.println(receiverLists.get(receiverLists.size()-1).getId());
// for (int i=0; i < receiverLists.get(receiverLists.size()-1).getReceivers().size(); i++) {
// System.out.println(receiverLists.get(receiverLists.size()-1).getReceivers().get(i).toString());
//// System.out.println(policies.get(policies.size()-1).getReceivers().get(i).getId());
//// System.out.println(policies.get(policies.size()-1).getReceivers().get(i).getName());
// }
// System.out.println("============================================================");
} else if (localpart.equals("app")) {
applications.add(pApplication);
} else if (localpart.equals("policy")) {
if (policyLevel.equals("a")) {
aPolicies.add(pPolicy);
} else if (policyLevel.equals("c")) {
cPolicies.add(pPolicy);
} else if (policyLevel.equals("i")) {
iPolicies.add(pPolicy);
}
}
}
}
setFallBacks(aPolicies, aFallBackMap);
setFallBacks(cPolicies, cFallBackMap);
setFallBacks(iPolicies, iFallBackMap);
PolicyUtilities.setPolicyRanks(aPolicies, false);
PolicyUtilities.setPolicyRanks(cPolicies, false);
PolicyUtilities.setPolicyRanks(iPolicies, false);
setBase(lowLevel, baseLow);
setBase(normalLevel, baseNormal);
setBase(highLevel, baseHigh);
for(ApplicationModel am : applications)
if(!appKeys.add(new Integer(am.getId())))
System.out.println("Doppelte App Id");
for(ReceiverListModel rlm : receiverLists)
if(!receiverListKeys.add(new Integer(rlm.getId())))
System.out.println("Doppelte ReceiverList Id");
for(PolicyModel pmA : aPolicies)
if(!policyAKeys.add(new Integer(pmA.getId())))
System.out.println("Doppelte APolicy Id");
for(PolicyModel pmC : cPolicies)
if(!policyCKeys.add(new Integer(pmC.getId())))
System.out.println("Doppelte CPolicy Id");
for(PolicyModel pmI : iPolicies)
if(!policyIKeys.add(new Integer(pmI.getId())))
System.out.println("Doppelte IPolicy Id");
for(ReceiverListModel rlm : receiverLists)
if(!checkReceiverIds(rlm))
System.out.println("Doppelte Id in den Empfänger der Liste " + rlm.getName());
m.setAppKeys(appKeys);
m.setReceiverListKeys(receiverListKeys);
m.setPolicyAKeys(policyAKeys);
m.setPolicyCKeys(policyCKeys);
m.setPolicyIKeys(policyIKeys);
m.setApplications(applications);
m.setReceiverLists(receiverLists);
m.setAPolicies(aPolicies);
m.setCPolicies(cPolicies);
m.setIPolicies(iPolicies);
m.setBaseLow(baseLow);
m.setBaseNormal(baseNormal);
m.setBaseHigh(baseHigh);
PolicyUtilities.setSystemState(PolicyUtilities.createSystemStateString(m));
} catch (Exception e) {
}
}
private void setBase(int[] pIds, LevelModel level) {
level.setABasePolicy( getPolicy(aPolicies, pIds[0]));
level.setCBasePolicy( getPolicy(cPolicies, pIds[1]));
level.setIBasePolicy( getPolicy(iPolicies, pIds[2]));
}
private ApplicationBase intToApplicationBase(int i) {
switch(i) {
case 1: return ApplicationBase.LOW;
case 2: return ApplicationBase.NORMAL;
case 3: return ApplicationBase.HIGH;
default: return ApplicationBase.NONE;
}
}
private ReceiverListModel getReceiverListModel(int id) {
for(int i=0; i<receiverLists.size(); i++) {
ReceiverListModel rm = receiverLists.get(i);
if(rm.getId() == id) {
return rm;
}
}
return null;
}
private void setFallBacks(List<PolicyModel> policies, Map<PolicyModel, Integer> map) {
for(int i=0; i<policies.size(); i++) {
PolicyModel aPolicy = policies.get(i);
Integer fallBack = map.get(aPolicy);
if ((fallBack != null) && (fallBack.intValue() != -1)) {
PolicyModel fbPolicy = getPolicy(policies, fallBack.intValue());
if(fbPolicy != null) {
aPolicy.setFallback(fbPolicy);
} else {
aPolicy.setFallback(null);
}
} else {
aPolicy.setFallback(null);
}
}
}
private PolicyModel getPolicy(List<PolicyModel> policies, int id) {
for(int i=0; i<policies.size(); i++) {
PolicyModel pm = policies.get(i);
if(pm.getId() == id) {
return pm;
}
}
return null;
}
private boolean checkReceiverIds(ReceiverListModel rlm) {
List<ReceiverModel> receivers = rlm.getReceivers();
Set<Integer> ids = new HashSet<Integer>();
for(ReceiverModel rm : receivers)
if(!ids.add(rm.getId()))
return false;
return true;
}
}