Пример #1
0
 private static void merge(Resource res, Resource put) {
   res.getActions().putAll(put.getActions());
   for (String s : put.getResources().keySet()) {
     if (res.getResources().containsKey(s)) {
       merge(res.getResources().get(s), put.getResources().get(s));
     } else {
       res.getResources().put(s, put.getResources().get(s));
     }
   }
 }
Пример #2
0
 public void addResource(Resource res) {
   cleanupUrl(res);
   String relativeUri = res.getRelativeUri();
   int c = 0;
   for (int a = 0; a < relativeUri.length(); a++) {
     if (relativeUri.charAt(a) == '/') {
       c++;
     }
   }
   Map<String, Resource> resources = getCoreRaml().getResources();
   if (c == 1) {
     Resource put = resources.put(relativeUri, res);
     if (put != null) {
       merge(res, put);
     }
     if (relativeUri.length() > 0) {
       Path ps = new Path(relativeUri);
       // lets search for sub resources to gather
       for (String s : new HashSet<String>(resources.keySet())) {
         Path anotherPath = new Path(s);
         if (ps.isPrefixOf(anotherPath) && !ps.equals(anotherPath) && ps.segmentCount() > 0) {
           Resource remove = resources.remove(s);
           Path removeFirstSegments = anotherPath.removeFirstSegments(ps.segmentCount());
           String portableString = removeFirstSegments.toPortableString();
           String doCleanup = doCleanup("/" + portableString);
           res.getResources().put(doCleanup, remove);
           remove.setRelativeUri(doCleanup);
         }
       }
     }
     return;
   }
   if (res.getRelativeUri().length() == 0 && res.getActions().isEmpty()) {
     return;
   }
   placeResource(resources, res);
 }
Пример #3
0
  // TODO More accurate resource merging
  public static void placeResource(Map<String, Resource> resources, Resource createResource) {
    String relativeUri = createResource.getRelativeUri();
    Path path = new Path(relativeUri);
    boolean restructure = false;
    for (String s : new HashSet<String>(resources.keySet())) {
      Path rp = new Path(s);
      if (path.isPrefixOf(rp)) {
        if (path.equals(rp)) {
          Resource resource = resources.get(s);
          resource.getActions().putAll(createResource.getActions());
          return;
        }
        restructure = true;
        Resource remove = resources.remove(s);
        Path removeFirstSegments = rp.removeFirstSegments(path.segmentCount());
        String portableString = "/" + removeFirstSegments.toPortableString();
        portableString = doCleanup(portableString);
        remove.setRelativeUri(portableString);
        Resource old = resources.put(relativeUri, createResource);
        if (old != null) {
          createResource.getActions().putAll(old.getActions());
        }
        Map<String, UriParameter> uriParameters = createResource.getUriParameters();
        Map<String, UriParameter> uriParameters2 = remove.getUriParameters();
        for (String q : uriParameters.keySet()) {
          uriParameters2.remove(q);
        }
        createResource.getResources().put(portableString, remove);
        Resource put = resources.put(relativeUri, createResource);
        if (put != null) {
          createResource.getActions().putAll(put.getActions());
        }
      }
    }
    if (restructure) {
      return;
    }
    for (String s : resources.keySet()) {
      if (s.equals("/")) {
        continue;
      }
      Path rp = new Path(s);
      if (rp.isPrefixOf(path) && path.segmentCount() - rp.segmentCount() >= 1) {
        Path removeFirstSegments2 = path.removeFirstSegments(rp.segmentCount());
        Path removeFirstSegments = removeFirstSegments2;
        String portableString = "/" + removeFirstSegments.toPortableString();

        createResource.setRelativeUri(doCleanup(portableString));
        Resource resource = resources.get(s);
        Map<String, UriParameter> uriParameters = resource.getUriParameters();
        Map<String, UriParameter> uriParameters2 = createResource.getUriParameters();
        for (String sa : uriParameters.keySet()) {
          uriParameters2.remove(sa);
        }
        placeResource(resource.getResources(), createResource);
        return;
      }
    }
    Resource put = resources.put(relativeUri, createResource);
    if (put != null) {
      merge(createResource, put);
    }
  }