X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Facr%2FContentUtils.java;h=facb5933bf3ebe743ce99eeed8e57c300d0cb11b;hb=55d88fba80cec198a0f11ba7545e19878c51fc5e;hp=bf5954411bc157a32003bf17d3e4363e8ee9d5bc;hpb=847735bd9b3d522cd1acdd37044a8012d8edc5e8;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java b/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java index bf5954411..facb5933b 100644 --- a/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java +++ b/org.argeo.cms/src/org/argeo/cms/acr/ContentUtils.java @@ -1,10 +1,13 @@ package org.argeo.cms.acr; import java.io.PrintStream; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.StringJoiner; +import java.util.StringTokenizer; import java.util.function.BiConsumer; import javax.security.auth.login.LoginContext; @@ -16,6 +19,7 @@ import org.argeo.api.acr.ContentRepository; import org.argeo.api.acr.ContentSession; import org.argeo.api.acr.DName; import org.argeo.api.cms.CmsAuth; +import org.argeo.api.cms.CmsConstants; import org.argeo.api.cms.CmsSession; import org.argeo.api.cms.directory.CmsDirectory; import org.argeo.api.cms.directory.CmsUserManager; @@ -124,6 +128,16 @@ public class ContentUtils { throw new IllegalArgumentException("Path " + path + " contains //"); } + /** The last element of a path. */ + public static String lastPathElement(String path) { + if (path.charAt(path.length() - 1) == '/') + throw new IllegalArgumentException("Path " + path + " cannot end with '/'"); + int index = path.lastIndexOf('/'); + if (index < 0) + return path; + return path.substring(index + 1); + } + /* * DIRECTORY */ @@ -217,6 +231,33 @@ public class ContentUtils { return relativePath; } + /** A path in the node repository */ + public static String getDataPath(Content node) { + // TODO make it more configurable? + StringBuilder buf = new StringBuilder(CmsConstants.PATH_API_ACR); + buf.append(node.getPath()); + return buf.toString(); + } + + /** A path in the node repository */ + public static String getDataPathForUrl(Content node) { + return cleanPathForUrl(getDataPath(node)); + } + + /** Clean reserved URL characters for use in HTTP links. */ + public static String cleanPathForUrl(String path) { + StringTokenizer st = new StringTokenizer(path, "/"); + StringBuilder sb = new StringBuilder(); + while (st.hasMoreElements()) { + sb.append('/'); + String encoded = URLEncoder.encode(st.nextToken(), StandardCharsets.UTF_8); + encoded = encoded.replace("+", "%20"); + sb.append(encoded); + + } + return sb.toString(); + } + /** Singleton. */ private ContentUtils() {