Пример #1
0
 private static double retrieveExecutionTimeFor(
     IcmComponent initialComponent, List<ArchEResponsibility> resps) {
   ArchEResponsibilityVO respItem = null;
   for (Iterator<ArchEResponsibility> itResponsibilities = resps.iterator();
       itResponsibilities.hasNext(); ) {
     respItem = (ArchEResponsibilityVO) (itResponsibilities.next());
     if (removeSpaces(respItem.getName()).equals(initialComponent.getName()))
       try { // This is the executionTime associated to the original responsibility
         return (respItem.getDoubleParameter(
             ICMPerformanceReasoningFramework.PARAMETER_EXECUTION_TIME));
       } catch (ArchEException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
         return (0);
       }
   } // Otherwise, return the default value
   return (ICMPerformanceReasoningFramework.DEFAULT_EXECUTION_TIME);
 }
Пример #2
0
  private static AssemblyInstance createICM(
      String name,
      List<ArchEScenario> scenarios,
      List<ArchEResponsibility> responsibilities,
      List<ArchERelation> reactions,
      List<ArchERelation> translations) {

    // System.out.println("@@@@@CREATION OF ICM WITH REACTIONS: "+reactions.size());

    IcmFactory factory = IcmFactory.eINSTANCE;
    AssemblyInstance assembly = factory.createAssemblyInstance();
    assembly.setName(name);
    assembly.setConnectionOverhead(DEFAULT_CONNECTION_OVERHEAD);
    resetTaskPriority();

    String nameWithoutSpaces = null;

    // Rule 1: Create an ICM component for each responsibility
    IcmComponent comp = null;
    ArchEResponsibilityVO resp = null;
    Hashtable<String, IcmComponent> allComponents = new Hashtable<String, IcmComponent>();
    for (Iterator<ArchEResponsibility> itResponsibilities = responsibilities.iterator();
        itResponsibilities.hasNext(); ) {
      resp = (ArchEResponsibilityVO) (itResponsibilities.next());
      comp = factory.createIcmComponent();
      nameWithoutSpaces = removeSpaces(resp.getName());
      comp.setName(nameWithoutSpaces);
      allComponents.put(nameWithoutSpaces, comp);
      assembly.getElements().add(comp);
    }

    // Rule 2: For each reaction relationship create corresponding source and sink pins
    // in the components associated to the responsibilities involved in the relationship
    IcmComponent component = null;
    SinkPinInstance pinSinkInstance = null;
    SourcePinInstance pinSourceInstance = null;
    ArchEResponsibilityReactionRelationVO reaction = null;
    List<String> connectedComponents = new ArrayList<String>();
    double avgExecutionTime = 0;
    Distribution uniform = null;
    // For connecting the pins within a component
    for (Iterator<ArchERelation> it1 = reactions.iterator(); it1.hasNext(); ) {
      reaction = (ArchEResponsibilityReactionRelationVO) (it1.next());

      // This creates a sink pin for the child responsibility,
      // assuming that parent --> child maps to source_parent --> sink_child
      pinSinkInstance = factory.createSinkPinInstance();
      pinSinkInstance.setMode(DEFAULT_SINKPIN_MODE);
      pinSinkInstance.setPriority(getTaskPriority());
      nameWithoutSpaces = removeSpaces(reaction.getChild().getName());
      pinSinkInstance.setName("psink_" + nameWithoutSpaces);
      try {
        avgExecutionTime =
            reaction
                .getChild()
                .getDoubleParameter(ICMPerformanceReasoningFramework.PARAMETER_EXECUTION_TIME);
        uniform = getUniformDistribution(factory, 1.0, avgExecutionTime);
        pinSinkInstance.setExecTimeDistribution(uniform);
      } catch (ArchEException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      component = allComponents.get(nameWithoutSpaces);
      pinSinkInstance.setElementInstance(component);
      // This saves the names of those components that have at least one sink pin
      // connected, for later.
      if (!connectedComponents.contains(nameWithoutSpaces))
        connectedComponents.add(nameWithoutSpaces);

      // This creates a source pin for the child responsibility
      pinSourceInstance = factory.createSourcePinInstance();
      pinSourceInstance.setMode(DEFAULT_SOURCEPIN_MODE);

      nameWithoutSpaces = removeSpaces(reaction.getParent().getName());
      pinSourceInstance.setName("psource_" + nameWithoutSpaces);
      component = allComponents.get(nameWithoutSpaces);
      pinSourceInstance.setElementInstance(component);

      // This connects the source for the sink to react to
      pinSourceInstance.getSinks().add(pinSinkInstance);
      pinSinkInstance.getLinkSources().add(pinSourceInstance);
    }

    // Rule 3: Create services for each of the scenarios, and then link them
    // to responsibilities (components) that have no incoming reactions (within the same scenario)
    ServiceSourcePinIcm serviceSourcePin = null;
    IcmService service = null;
    IcmComponent initialComponent = null;
    SinkPinInstance serviceSinkPin = null;
    ArchEScenarioVO scItem = null;
    List<IcmComponent> list = null;
    Scenario scenarioMode = null;
    int index = 1;
    Double interarrival = null;
    Distribution constant = null;

    for (Iterator<ArchEScenario> itScenarios = scenarios.iterator(); itScenarios.hasNext(); ) {
      scItem = (ArchEScenarioVO) (itScenarios.next());

      // Rule 4: Create Icm scenarios (modes) for the assembly
      scenarioMode = factory.createScenario();
      scenarioMode.setNumber(index);
      index++;
      nameWithoutSpaces = scItem.getId();
      scenarioMode.setName(
          nameWithoutSpaces); // Check if the number depends on the services (Gabriel)!!
      assembly.getScenarios().add(scenarioMode);

      //				list = getInitialComponentsFor(scItem,translations,markedComponents,allComponents);
      list = getInitialComponentsFor1(scItem, translations, reactions, allComponents);
      if (list.size() > 0) { // The scenario has at least one responsibility
        interarrival = scItem.getStimulusValue();
        if (interarrival == null) interarrival = DEFAULT_EVENT_INTERARRIVAL_TIME;
        constant = getConstantDistribution(factory, interarrival);

        // Create a service for the scenario
        service = factory.createIcmService();
        service.setPriority(getTaskPriority());
        nameWithoutSpaces = removeSpaces(scItem.getId());
        service.setName("Service_" + nameWithoutSpaces);
        assembly.getElements().add(service);

        // Create a source pin for the service
        serviceSourcePin = factory.createServiceSourcePinIcm();
        // The deadline comes from the response of the scenario
        serviceSourcePin.setDeadline(scItem.getMeasureValue());
        serviceSourcePin.setMode(DEFAULT_SOURCEPIN_MODE);
        avgExecutionTime = ICMPerformanceReasoningFramework.DEFAULT_EXECUTION_TIME;
        serviceSourcePin.setEventDistribution(constant);
        uniform = getUniformDistribution(factory, 1.0, avgExecutionTime);
        serviceSourcePin.setExecTimeDistribution(uniform);
        serviceSourcePin.setName("psource_service");
        serviceSourcePin.setElementInstance(service);

        // Create a sink pin for every component that is "initial" for the scenario
        for (Iterator<IcmComponent> itComponents = list.iterator(); itComponents.hasNext(); ) {
          initialComponent = itComponents.next();

          // This saves the names of those components that have at least one sink pin
          // connected, for later.
          if (!connectedComponents.contains(initialComponent.getName())) ;
          connectedComponents.add(initialComponent.getName());

          serviceSinkPin = factory.createSinkPinInstance();
          serviceSinkPin.setMode(DEFAULT_SINKPIN_MODE);
          serviceSinkPin.setPriority(getTaskPriority());
          // avgExecutionTime = ICMPerformanceReasoningFramework.DEFAULT_EXECUTION_TIME;
          avgExecutionTime = retrieveExecutionTimeFor(initialComponent, responsibilities);
          uniform = getUniformDistribution(factory, 1.0, avgExecutionTime);
          serviceSinkPin.setExecTimeDistribution(uniform);
          serviceSinkPin.setName("psink_" + service.getName());
          serviceSinkPin.setElementInstance(initialComponent);

          // This connects the source for the sink to react to
          serviceSourcePin.getSinks().add(serviceSinkPin);
          serviceSinkPin.getLinkSources().add(serviceSourcePin);
        }

        serviceSourcePin.getScenarios().add(scenarioMode);
      } // End if list.size() > 0
    }

    // Rule 5: Create a default scenario for all the remaining "unconnected" components
    //			if (allComponents.size() > connectedComponents.size()) {
    //				scenarioMode = factory.createScenario();
    //				scenarioMode.setNumber(index);
    //				index++;
    //				nameWithoutSpaces = "background";
    //				scenarioMode.setName(nameWithoutSpaces); // Check if the number depends on the services
    // (Gabriel)!!
    //				assembly.getScenarios().add(scenarioMode);
    //
    //				interarrival = DEFAULT_EVENT_INTERARRIVAL_TIME;
    //				constant = getConstantDistribution(factory,interarrival);
    //
    //				// Create a service for the default scenario
    //				service = factory.createIcmService();
    //				service.setPriority(getTaskPriority());
    //				service.setName("Service_background");
    //				assembly.getElements().add(service);
    //
    //				// Create a source pin for the service
    //				serviceSourcePin = factory.createServiceSourcePinIcm();
    //				// The deadline comes from the response of the scenario
    //				serviceSourcePin.setDeadline(100.0); // Some default long value
    //				serviceSourcePin.setMode(DEFAULT_SOURCEPIN_MODE);
    //				avgExecutionTime = ICMPerformanceReasoningFramework.DEFAULT_EXECUTION_TIME;
    //				serviceSourcePin.setEventDistribution(constant);
    //				uniform = getUniformDistribution(factory,1.0, avgExecutionTime);
    //				serviceSourcePin.setExecTimeDistribution(uniform);
    //				serviceSourcePin.setName("psource_service");
    //				serviceSourcePin.setElementInstance(service);
    //
    //				for(Enumeration<IcmComponent> itComponents = allComponents.elements();
    // itComponents.hasMoreElements();) {
    //					initialComponent = itComponents.nextElement();
    //					// This means the component is isolated
    //					if (!connectedComponents.contains(initialComponent.getName())) {
    //						serviceSinkPin = factory.createSinkPinInstance();
    //						serviceSinkPin.setMode(DEFAULT_SINKPIN_MODE);
    //						serviceSinkPin.setPriority(getTaskPriority());
    //						//avgExecutionTime = ICMPerformanceReasoningFramework.DEFAULT_EXECUTION_TIME;
    //						avgExecutionTime = retrieveExecutionTimeFor(initialComponent, responsibilities);
    //						uniform = getUniformDistribution(factory,1.0, avgExecutionTime);
    //						serviceSinkPin.setExecTimeDistribution(uniform);
    //						serviceSinkPin.setName("psink_" + service.getName());
    //						serviceSinkPin.setElementInstance(initialComponent);
    //
    //						// This connects the source for the sink to react to
    //						serviceSourcePin.getSinks().add(serviceSinkPin);
    //						serviceSinkPin.getLinkSources().add(serviceSourcePin);
    //					}
    //				}
    //
    //			}

    for (Enumeration<IcmComponent> itComponents = allComponents.elements();
        itComponents.hasMoreElements(); ) {
      initialComponent = itComponents.nextElement();
      initialComponent.setName("IcmC_" + initialComponent.getName());
    }

    // This prints the assembly just created, for testing purposes
    //			System.out.println("ASSEMBLY ==> "+assembly.getName());
    //			ElementInstance componenti = null;
    //			PinInstance pini = null;
    //			for (Iterator it3 = assembly.getElements().iterator(); it3.hasNext();) {
    //				componenti = (ElementInstance)(it3.next());
    //				System.out.println("    Component: "+ componenti.getName());
    //				for (Iterator it4 = componenti.getPins().iterator(); it4.hasNext();) {
    //					pini = (PinInstance)(it4.next());
    //					System.out.println("        Pin: "+ pini.getName());
    //				}
    //			}

    return (assembly);
  }