@Override
 public MonitorInstance saveMonitorInstance(
     Long idMonitor, String apiEndpoint, Long ipAddressId, Long vmId, Long componentId) {
   MonitorInstance result =
       new MonitorInstance(
           monitorModelService.getById(idMonitor),
           apiEndpoint,
           (ipAddressId == null ? null : ipAddressModelService.getById(ipAddressId)),
           (vmId == null ? null : virtualMachineModelService.getById(vmId)),
           (componentId == null ? null : componentModelService.getById(componentId)));
   monitorInstanceModelService.save(result);
   return result;
 }
  @Override
  public List<MonitorInstance> getMonitorInstances(Long monitorId) {
    List<MonitorInstance> result = new ArrayList<>();

    for (MonitorInstance mi : monitorInstanceModelService.getAll()) {
      if (mi.getMonitor().getId().equals(monitorId)) {
        result.add(mi);
      }
    }

    return result;
  }
  @Override
  public String getPublicAddressOfVM(VirtualMachine vm) {
    List<IpAddress> addresses = ipAddressModelService.getAll();

    for (IpAddress ip : addresses) {
      /*TODO Not only return ONE, but EACH address */
      if (ip.getVirtualMachine().equals(vm) && ip.getIpType().equals(IpType.PUBLIC)) {
        return ip.getIp();
      }
    }

    return null;
  }
  @Override
  public List<Instance> getInstances(Long vm) {
    List<Instance> instances;
    List<Instance> result = new ArrayList<Instance>();

    instances = instanceModelService.getAll();

    for (Instance instance : instances) {
      boolean suitable = true;

      // Filter for application id
      if (vm > 0 && !instance.getVirtualMachine().getId().equals(vm)) {
        suitable = false;
      }

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

    return result;
  }
  @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 void removeMonitorInstance(MonitorInstance monitorInstance) {
   monitorInstanceModelService.delete(monitorInstance);
 }
 @Override
 public List<Monitor> getMonitors() {
   return monitorModelService.getAll();
 }
 @Override
 public Monitor getMonitor(Long id) {
   return monitorModelService.getById(id);
 }
 @Override
 public ComposedMonitor getComposedMonitor(Long monitorId) {
   return composedMonitorModelService.getById(monitorId);
 }
 @Override
 public RawMonitor getRawMonitor(Long monitorId) {
   return rawMonitorModelService.getById(monitorId);
 }
 @Override
 public MonitorInstance getMonitorInstance(Long monitorInstanceId) {
   return monitorInstanceModelService.getById(monitorInstanceId);
 }
 @Override
 public String getIpAddress(Long idIpAddress) {
   return ipAddressModelService.getById(idIpAddress).getIp();
 }
  @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;
  }
 @Override
 public ApplicationComponent getApplicationComponentForInstance(Long appCompId) {
   return applicationComponentModelService.getById(appCompId);
 }