/**
  * Test round trip from axiom source to peristence unit and back again.
  *
  * @throws SQLException
  * @throws ParseException
  * @throws InterruptedException
  */
 @Test
 public void test_query_term_names() throws Exception {
   ParserAssembler parserAssembler = null;
   parserAssembler = openScript("include \"agriculture-land.xpl\";");
   AxiomSource agriSource = parserAssembler.getAxiomSource(QualifiedName.parseGlobalName("Data"));
   Iterator<Axiom> dataIterator = agriSource.iterator();
   AgriPersistenceService agriPersistenceService =
       new AgriPersistenceService(component.persistenceContext(), this);
   AgriPercentCollector agriPercentCollector = new AgriPercentCollector(agriPersistenceService);
   List<NameMap> termNameList = new ArrayList<NameMap>();
   termNameList.add(new NameMap("country", "country"));
   for (int year = 1962; year < 2011; ++year) {
     String key = "Y" + year;
     termNameList.add(new NameMap(key, key));
   }
   JpaSource jpaSource = new JpaSource(agriPercentCollector, "Data", termNameList);
   Iterator<Axiom> aricultureIterator = jpaSource.iterator();
   while (aricultureIterator.hasNext()) {
     assertThat(dataIterator.hasNext());
     Axiom output = aricultureIterator.next();
     Axiom input = dataIterator.next();
     assertThat(output.getTermCount()).isEqualTo(input.getTermCount());
     assertThat(output.getTermByName("country").toString())
         .isEqualTo(input.getTermByName("country").toString());
     for (int i = 1; i < input.getTermCount(); i++) {
       String inputTerm = input.getTermByIndex(i).toString();
       String outputTerm = output.getTermByIndex(i).toString();
       assertThat(outputTerm.toUpperCase()).isEqualTo(inputTerm.toUpperCase());
     }
   }
 }
  public boolean isInstanceOf(
      Instance instance, List<ApplicationComponent> appComps, Component component) {
    boolean result = false;

    Long componentId = component.getId();

    for (ApplicationComponent ac : appComps) {
      Long acId = ac.getId();

      if (instance.getApplicationComponent().getId().equals(acId)
          && ac.getComponent().getId().equals(componentId)) {
        result = true;
      }
    }

    return result;
  }
 public Executable getExecutable(PersistenceWork persistenceWork) {
   PersistenceWorkModule persistenceWorkModule =
       new PersistenceWorkModule(PU_NAME, true, persistenceWork);
   return component.plus(persistenceWorkModule).executable();
 }
  @Override
  public List<VirtualMachine> getVirtualMachines(
      Long applicationId, Long componentId, Long instanceId, Long cloudId) {
    List<VirtualMachine> vms;
    List<VirtualMachine> result = new ArrayList<VirtualMachine>();

    vms = virtualMachineModelService.getAll();

    for (VirtualMachine vm : vms) {
      boolean suitable = true;
      List<Instance> instances = null;
      List<ApplicationComponent> appComps = null;

      // Filter for application id
      if (applicationId != null) {
        instances = this.getInstances(vm.getId());
        appComps = new ArrayList<>();
        for (Instance instance : instances) {
          if (instance.getVirtualMachine().getId().equals(vm.getId())) {
            LOGGER.info("Instance " + instance.getId() + " belongs to VM " + vm.getId());
            appComps.add(
                getApplicationComponentForInstance(instance.getApplicationComponent().getId()));
          }
        }

        boolean oneInstanceFit = false;

        for (ApplicationComponent ac : appComps) {
          if (ac.getApplication().getId() == applicationId) {
            oneInstanceFit = true;
          }
        }

        suitable = oneInstanceFit;
      }

      // Filter for component id
      if (suitable && componentId != null) {
        if (instances == null) {
          instances = this.getInstances(vm.getId());
          appComps = new ArrayList<ApplicationComponent>();
          for (Instance instance : instances) {
            appComps.add(
                getApplicationComponentForInstance(instance.getApplicationComponent().getId()));
          }
        }

        boolean oneInstanceFit = false;

        for (ApplicationComponent ac : appComps) {
          if (ac.getComponent().getId() == componentId) {
            oneInstanceFit = true;
          }
        }

        suitable = oneInstanceFit;
      }

      // Filter for instance id
      if (suitable && instanceId != null) {
        if (instances == null) {
          instances = this.getInstances(vm.getId());
        }

        boolean oneInstanceFit = false;
        for (Instance instance : instances) {
          if (instance.getId() == instanceId) {
            oneInstanceFit = true;
          }
        }

        suitable = oneInstanceFit;
      }

      // Filter for cloud id
      if (suitable && cloudId != null) {
        if (vm.cloud().getId() != cloudId) {
          suitable = false;
        }
      }

      // Add to result
      if (suitable) {
        result.add(vm);
      }
    }

    return result;
  }
  @Override
  public List<Component> getComponents(
      Long applicationId, Long componentId, Long instanceId, Long cloudId) {
    List<Component> result = new ArrayList<Component>();
    List<Component> components = componentModelService.getAll();
    List<Instance> instances = null;
    List<VirtualMachine> vms = null;

    List<ApplicationComponent> appComps = applicationComponentModelService.getAll();

    for (Component component : components) {
      boolean suitable = false;

      if (applicationId != null) {
        for (ApplicationComponent ac : appComps) {
          if (ac.getComponent().getId().equals(componentId)
              && ac.getApplication().getId().equals(applicationId)) {
            suitable = true;
          }
        }
      }

      if (componentId != null) {
        if (componentId.equals(component.getId())) {
          suitable = suitable && true;
        }
      }

      if (instanceId != null) {
        if (instances == null) instances = instanceModelService.getAll();
        boolean oneFits = false;

        for (Instance instance : instances) {
          if (isInstanceOf(instance, appComps, component)) {
            oneFits = true;
          }
        }

        if (oneFits) {
          suitable = suitable && true;
        } else {
          suitable = false;
        }
      }

      if (cloudId != null) {
        if (instances == null) instances = instanceModelService.getAll();
        if (vms == null) vms = virtualMachineModelService.getAll();
        boolean oneFits = false;

        for (Instance instance : instances) {
          if (isInstanceOf(instance, vms, cloudId)) {
            if (isInstanceOf(instance, appComps, component)) {
              oneFits = true;
            }
          }
        }

        if (oneFits) {
          suitable = suitable && true;
        } else {
          suitable = false;
        }
      }

      if (suitable) {
        result.add(component);
      }
    }

    return result;
  }