@Override
 public List<String> getTestsByPrefix(String prefix) {
   List<Test> tests = testDAO.findByUIDPrefix(prefix);
   List<String> testuids = new ArrayList<String>();
   for (Test test : tests) {
     if (userService.isLoggedUserInGroup(test.getGroupId())) {
       testuids.add(test.getUid());
     }
   }
   return testuids;
 }
 @Override
 public Test createTest(Test test) throws ServiceException {
   if (!userService.isLoggedUserInGroup(test.getGroupId())) {
     throw new org.perfrepo.web.security.SecurityException(
         "securityException.userNotInGroup.createTest",
         userService.getLoggedUser().getUsername(),
         test.getGroupId());
   }
   if (testDAO.findByUid(test.getUid()) != null) {
     throw new ServiceException("serviceException.testUidExists", test.getUid());
   }
   Test createdTest = testDAO.create(test);
   // store metrics
   if (test.getMetrics() != null) {
     for (Metric metric : test.getMetrics()) {
       addMetric(test, metric);
     }
   }
   return createdTest;
 }
  @Override
  @Secured
  public Metric addMetric(Test test, Metric metric) throws ServiceException {
    Test freshTest = testDAO.get(test.getId());
    if (freshTest.getMetrics() == null) {
      freshTest.setMetrics(new ArrayList<>());
    }

    if (metric.getId() != null) {
      // associating an existing metric with the test
      Metric freshMetric = metricDAO.get(metric.getId());
      if (freshMetric == null) {
        throw new ServiceException("serviceException.metricNotFound", metric.getName().toString());
      }

      if (freshMetric.getTests() == null) {
        freshMetric.setTests(new ArrayList<>());
      }

      for (Test testForMetric : freshMetric.getTests()) {
        if (!testForMetric.getGroupId().equals(freshTest.getGroupId())) {
          throw new ServiceException("serviceException.metricSharingOnlyInGroup");
        }
        if (testForMetric.getId().equals(freshTest.getId())) {
          throw new ServiceException(
              "serviceException.metricAlreadyExists", freshTest.getUid(), freshMetric.getName());
        }
      }

      freshMetric.getTests().add(freshTest);
      freshTest.getMetrics().add(freshMetric);

      freshMetric = metricDAO.update(freshMetric);
      testDAO.update(freshTest);

      return freshMetric;
    } else {
      // creating a new metric object
      if (metric.getName() == null) {
        throw new IllegalArgumentException("Metric name is mandatory");
      }
      // metric name needs to be unique in the metric space of a certain groupId
      // does it exist in a test with same group id (including the target test) ?
      List<Metric> existingMetricsForGroup =
          metricDAO.getMetricByNameAndGroup(metric.getName(), freshTest.getGroupId());
      for (Metric existingMetric : existingMetricsForGroup) {
        if (existingMetric.getName().equals(metric.getName())) {
          Metric freshMetric = metricDAO.get(existingMetric.getId());

          if (freshMetric.getTests().stream().anyMatch(t -> t.getId().equals(freshTest.getId()))) {
            throw new ServiceException(
                "serviceException.metricAlreadyExists", freshTest.getUid(), freshMetric.getName());
          }
        }
      }

      metric.setTests(Arrays.asList(freshTest));
      Metric freshMetric = metricDAO.create(metric);

      freshTest.getMetrics().add(freshMetric);
      testDAO.update(freshTest);

      return freshMetric;
    }
  }