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)); } } }
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); }
// 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); } }