/* Copyright 2012-2015 SAP SE * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package eu.aniketos.securebpmn.export.xacml.export; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.securebpmn2.ActivityAction; import org.eclipse.securebpmn2.BindingOfDuty; import org.eclipse.securebpmn2.Permission; /** * Creates the ASLan representation of a SecureBPMN BindingOfDuty element. * * */ public class BindingOfDutyExport { // // /** // * Generates the ASLan representation of the provided BindingOfDuty element // * and sends the output to the provided AslanFileBuilder. // * // * @param bod // * The BindingOfDuty element for which the representation should // * be generated. // * @param afb // * The AslanFileBuilder the output is sent to. // */ // public static void createBindingOfDutyElements(BindingOfDuty bod, // XacmlFileBuilder afb) { // // if (bod.isDynamicEnforcement()) // return; // // List<String> assignTasks = new ArrayList<String>(); // List<String> claimTasks = new ArrayList<String>(); // List<String> completeTasks = new ArrayList<String>(); // // for (Permission p : bod.getPermissions()) { // // if (p.getActions().size() == 0) { // System.err // .println("[WARNING] The permission with name=\"" // + p.getPName() // + "\" and id=\"" // + p.getId() // + "\" has no action. This should never happen! Check your .activiti diagram file."); // continue; // } // // // Permissions only have one Action // if (p.getActions().get(0) instanceof ActivityAction) { // ActivityAction a = (ActivityAction) p.getActions().get(0); // // if (a.getActionName().equals("Complete")) { // // completeTasks.add(a.getActivity().getId()); // // } else if (a.getActionName().equals("Claim")) { // // claimTasks.add(a.getActivity().getId()); // // } else if (a.getActionName().equals("Assign")) { // // assignTasks.add(a.getActivity().getId()); // // } else if (a.getActionName().equals("Full Access")) { // // assignTasks.add(a.getActivity().getId()); // claimTasks.add(a.getActivity().getId()); // completeTasks.add(a.getActivity().getId()); // // } // // } // } // // if (assignTasks.size() > 1) { // // TODO what to check? only executed() is persistent... // } // // if (claimTasks.size() > 1) { // // TODO what to check? only executed() is persistent... // } // // if (completeTasks.size() > 1) { // // safe default assumptions // int maxUsers = 1; // int numActions = completeTasks.size(); // // if (bod.getMaxUsers() == null) { // System.out // .println("[SCVM-EXPORT-ASLAN] maximum users for BoD \"" // + bod.getId() + "\" not set, using " + maxUsers // + "."); // } else { // if (bod.getMaxUsers() < 1) { // System.err // .println("[SCVM-EXPORT-ASLAN] invalid input for maximum users at BoD \"" // + bod.getId() // + "\", using " // + maxUsers // + "."); // } else { // maxUsers = bod.getMaxUsers(); // } // } // // if (bod.getSameUserActionCount() == null) { // System.out // .println("[SCVM-EXPORT-ASLAN] number of actions for BoD \"" // + bod.getId() // + "\" not set, using " // + numActions + "."); // } else { // if (bod.getSameUserActionCount() > completeTasks.size() // || bod.getSameUserActionCount() < 1) { // System.err // .println("[SCVM-EXPORT-ASLAN] invalid input for number of actions at BoD \"" // + bod.getId() // + "\", using " // + numActions // + "."); // } else { // numActions = bod.getSameUserActionCount(); // } // } // // // calculate numeric partitions // final List<int[]> allPartitions = ExportUtil // .generateIntegerPartitions(completeTasks.size()); // // // select invalid partitions // List<int[]> selectedPartitions = new ArrayList<int[]>(); // for (int[] part : allPartitions) { // boolean invalidSummandFound = false; // for (int i : part) { // if (i != numActions) // invalidSummandFound = true; // } // if (part.length > 0 // && (part.length > maxUsers || invalidSummandFound)) { // selectedPartitions.add(part); // } // } // // // create goals for partitions // String[] tasks = new String[completeTasks.size()]; // for (int i = 0; i < completeTasks.size(); i++) { // tasks[i] = completeTasks.get(i); // } // List<int[]> permList = ExportUtil // .generateLocationPermutations(tasks.length); // // for (int[] part : selectedPartitions) { // // we assume that tasks.lengh equals the sum of each partition // List<List<Set<String>>> sets = new ArrayList<List<Set<String>>>(); // // // loop over index permutations // for (int[] perm : permList) { // int indexStart = 0; // // list of sets (parts of the partition) for the current // // permutation // List<Set<String>> setList = new ArrayList<Set<String>>(); // // create the sets // for (int partLength : part) { // Set<String> partTasks = new HashSet<String>(); // // get the tasks and add them to the set // for (int i = 0; i < partLength; i++) { // partTasks.add(tasks[perm[indexStart + i] - 1]); // } // indexStart += partLength; // setList.add(partTasks); // } // // check if partition config already exists // boolean newSet = true; // for (List<Set<String>> presentSetList : sets) { // if (presentSetList.equals(setList)) { // newSet = false; // break; // } // } // // add partition config if new // if (newSet) { // sets.add(setList); // } // // } // // // create goals for this partition // for (List<Set<String>> setArray : sets) { // // generate goal // int numUsers = setArray.size(); // int numTasks = tasks.length; // List<String> natVars = new ArrayList<String>(); // StringBuilder goalString = new StringBuilder(); // goalString.append("("); // // // generate user variables // for (int i = 0; i < numUsers; i++) { // afb.addType("user", "U" + i); // if (i > 0) // goalString.append(","); // goalString.append("U" + i); // } // // // generate task nat variables // for (int i = 0; i < numTasks; i++) { // String currentVar = afb.addNatVar(); // natVars.add(currentVar); // goalString.append("," + currentVar); // } // // goalString.append("):="); // // // generate "executed" facts // int natVarPos = 0; // for (int i = 0; i < numUsers; i++) { // for (String currentTask : setArray.get(i)) { // goalString.append(" executed(U" + i + ",task(" // + currentTask + "," // + natVars.get(natVarPos) + "))."); // natVarPos++; // } // } // // // generate "not equal" facts // StringBuilder neqString = new StringBuilder(); // for (int i = 0; i < numUsers - 1; i++) { // for (int j = i + 1; j < numUsers; j++) { // neqString.append("& not(equal(U" + i + ",U" + j // + "))"); // } // } // // // add goal // String finalGoalString = goalString.toString(); // afb.addGoal( // "bod_" + bod.getId() + "_", // finalGoalString.substring(0, // finalGoalString.length() - 1) // + neqString.toString()); // } // } // // } // // } }