package converter;
import org.apache.commons.cli.BasicParser;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.io.IOUtils;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import java.io.*;
public class Main {
private static String originPath;
private static String epcPath;
private static String genericBcmPath;
private static String bcmScenarioPath;
private static OwlManager owl;
// private static boolean infer;
public static void main(String[] args) throws IOException, JSONException, ParseException {
Options options = new Options();
options.addOption("help", false, "Show all options");
options.addOption("h", false, "Show all options");
options.addOption("s", true, "Choose source file");
options.addOption("e", true, "Choose EPC destination file");
options.addOption("g", true, "Choose genericBcm destination file");
options.addOption("b", true, "Choose bcmScenario destination file");
CommandLine cmd = new BasicParser().parse(options, args);
if (cmd.hasOption("h") || cmd.hasOption("help")) {
System.out.println("-config\tChoose config file\n-s\tChoose source file - Mandatory\n-d\tChoose simple bpmn destination file\n-ed\tChoose EPC destination file\n" +
"-rd\tChoose Risk destination file\n-i\tInfer start and end events\n-e\tConvert to iERM formats");
System.exit(0);
}
if (cmd.hasOption("s"))
originPath = cmd.getOptionValue("s");
else {
System.out.println("No source file is set. Conversion is impossible");
System.exit(0);
}
if (cmd.hasOption("e"))
epcPath = cmd.getOptionValue("e");
else
epcPath = "output.epc";
if (cmd.hasOption("g"))
genericBcmPath = cmd.getOptionValue("g");
else
genericBcmPath = "output.genericbcm";
if (cmd.hasOption("b"))
bcmScenarioPath = cmd.getOptionValue("b");
else
bcmScenarioPath = "output.bcmscenario";
owl = new OwlManager(originPath);
EPCManager epcManager = new EPCManager();
GenericBcmManager genericBcmManager = new GenericBcmManager();
BcmScenarioManager bcmScenarioManager = new BcmScenarioManager();
System.out.println("Converting to iERM generated.epc format...");
/* for (int i = 0; i < jsonObject.getJSONArray("Activity").length(); i++) {
HashMap<String, String> ba = owl.getElementsFromClass(jsonObject.getJSONArray("Activity").getString(i));
for (String id : ba.keySet()) {
manag.addActivity(id, ba.get(id));
}
}
HashMap<String, String> junc = owl.getJunctions();
ArrayList<String> mergeCandidates = owl.getElementWithNumberOfInFlows(2, true);
for (String id : junc.keySet()) {
if (mergeCandidates.contains(id))
manag.addMerge(id, junc.get(id));
}
ArrayList<String> decisionCandidates = owl.getElementWithNumberOfOutFlows(2, true);
for (String id : junc.keySet()) {
if (decisionCandidates.contains(id))
manag.addDecision(id, junc.get(id));
}
HashMap<String, String> andJunc = owl.getAndJunctions();
ArrayList<String> possibleJoins = owl.getElementWithNumberOfInFlows(2, true);
for (String id : andJunc.keySet()) {
if (possibleJoins.contains(id))
manag.addJoin(id, andJunc.get(id));
else
manag.addFork(id, andJunc.get(id));
}
HashMap<String, String> candidateStartEnd = owl.getElementsFromClass("BusinessEvent");
for (String a : candidateStartEnd.keySet()) {
if (owl.getElementWithNumberOfInFlows(0, false).contains(a) && owl.getElementWithNumberOfOutFlows(1, false).contains(a))
manag.addStart(a, candidateStartEnd.get(a));
if (owl.getElementWithNumberOfInFlows(1, false).contains(a)) {
int n = 0;
for (StringPair sp : owl.getFlows())
if (sp.getFirst().equals(a)) {
n = 1;
}
if (n == 0)
manag.addFinish(a, candidateStartEnd.get(a));
}
}
if (infer) {
ArrayList<String> possibleStartEvents = owl.getElementWithNumberOfInFlows(0, false);
ArrayList<String> possibleEndEvents = new ArrayList<String>();
ArrayList<StringPair> flows = owl.getFlows();
for (String a : manag.getElements().keySet()) {
boolean exists = false;
for (StringPair aa : flows) {
if (aa.getFirst().equals(a)) {
exists = true;
break;
}
}
if (!exists)
possibleEndEvents.add(a);
}
for (String a : possibleEndEvents) {
// if(!possibleStartEvents.contains(a))
manag.addArtificialFinish(a);
}
for (String a : possibleStartEvents) {
// if(oneOuters.contains(a) || twoOuters.contains(a))
manag.addArtificialStart(a);
}
}
ArrayList<StringPair> fl = owl.getFlows();
for (StringPair id : fl)
manag.addFlow(id.getFirst(), id.getSecond());
if (isBpcf)
manag.saveModel(normalPathToSave);
else
manag.saveModel(epcPath);
if (!isBpcf)
getAndSaveRisks();*/
}
/* private static void getAndSaveRisks() {
BusinessProcess process = new BusinessProcess();
ArrayList<Risk> risks = new ArrayList<Risk>();
ArrayList<Resource> resources = new ArrayList<Resource>();
ArrayList<BusinessActivity> activities = new ArrayList<BusinessActivity>();
HashMap<String, String> risksFromOwl = owl.getRisks();
for (String s : risksFromOwl.keySet()) {
Risk risk = new Risk();
risk.setId(s);
risk.setName(risksFromOwl.get(s));
risks.add(risk);
}
Set<String> stringResources = new HashSet<String>();
Set<String> stringActivities = new HashSet<String>();
for (Risk r : risks) {
System.out.println("Adding Risk " + r.getName() + "...");
r.setLikelihood(owl.getDataPropertyFromIndividual(r.getId(), "likelihood"));
r.setPotentialLoss(owl.getDataPropertyFromIndividual(r.getId(), "potentialLoss"));
r.setStrategicImpact(owl.getDataPropertyFromIndividual(r.getId(), "strategicImpact"));
r.setCustomerImpact(owl.getDataPropertyFromIndividual(r.getId(), "customerImpact"));
r.setLegalImpact(owl.getDataPropertyFromIndividual(r.getId(), "legalImpact"));
String max = owl.getDataPropertyFromIndividual(r.getId(), "maxRecoveryTime");
if (max != null)
r.setMaxRecoveryTime(Double.valueOf(max));
String min = owl.getDataPropertyFromIndividual(r.getId(), "minRecoveryTime");
if (min != null)
r.setMinRecoveryTime(Double.valueOf(min));
r.setRiskCategory(owl.getDataPropertyFromIndividual(r.getId(), "riskCategory"));
String resource = owl.getObjectPropertyFromIndividual(r.getId(), "http://timbus.teco.edu/ontologies/DSOs/risk.owl", "occurInResource");
r.setOccurInResource(resource);
String activity = owl.getObjectPropertyFromIndividual(r.getId(), "http://timbus.teco.edu/ontologies/DSOs/risk.owl", "occurInBusinessActivity");
r.setOccurInBusinessActivity(activity);
stringResources.add(resource);
stringActivities.add(activity);
}
for (String s : stringResources) {
Resource resource = new Resource();
resource.setId(s);
resource.setName(owl.getNameAnnotationFromId(s));
resource.setType(owl.getDataPropertyFromIndividual(s, "type"));
resource.setDependOn(owl.getMultipleObjectPropertyFromIndividualAsStrings(s, "http://timbus.teco.edu/ontologies/DIO.owl", "uses"));
resource.setContextModelURI(owl.getIndividualURI(s));
resources.add(resource);
}
for (String s : stringActivities) {
BusinessActivity activity = new BusinessActivity();
activity.setId(s);
String name = owl.getNameAnnotationFromId(s);
System.out.println("Adding activity " + name + "...");
activity.setName(name);
activity.setRequireResource(owl.getMultipleObjectPropertyFromIndividualAsStrings(s, "http://timbus.teco.edu/ontologies/DIO.owl", "uses"));
activities.add(activity);
}
process.setRisk(risks);
process.setResource(resources);
process.setBusinessActivity(activities);
File file = new File(pathToSaveRisk);
JAXBContext jaxbContext = null;
try {
System.out.println("Saving risks file in " + pathToSaveRisk + "...");
jaxbContext = JAXBContext.newInstance(BusinessProcess.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(process, file);
} catch (JAXBException e) {
e.printStackTrace();
}
}*/
private static JSONObject getJSONFromFile(String path) {
try {
return new JSONObject(IOUtils.toString(new FileInputStream(fileHandler(path))));
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static File fileHandler(String path) {
File file;
if (path.startsWith("/") || path.startsWith("~"))
file = new File(path);
else
file = new File(new File(System.getProperty("user.dir")), path);
return file;
}
}