You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2019/01/31 10:31:07 UTC
[camel] branch master updated: Fixed CS for Camel-Util
This is an automated email from the ASF dual-hosted git repository.
acosentino pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new 38e5ee1 Fixed CS for Camel-Util
38e5ee1 is described below
commit 38e5ee102ba5393ed0b821e31eae408a716c1e60
Author: Andrea Cosentino <an...@gmail.com>
AuthorDate: Thu Jan 31 11:30:48 2019 +0100
Fixed CS for Camel-Util
---
.../main/java/org/apache/camel/util/IOHelper.java | 93 ++++++++------
.../src/main/java/org/apache/camel/util/Pair.java | 13 +-
.../java/org/apache/camel/util/URISupport.java | 141 ++++++++++++---------
3 files changed, 141 insertions(+), 106 deletions(-)
diff --git a/camel-util/src/main/java/org/apache/camel/util/IOHelper.java b/camel-util/src/main/java/org/apache/camel/util/IOHelper.java
index 3acc734..fbac259 100644
--- a/camel-util/src/main/java/org/apache/camel/util/IOHelper.java
+++ b/camel-util/src/main/java/org/apache/camel/util/IOHelper.java
@@ -48,7 +48,7 @@ import org.slf4j.LoggerFactory;
* IO helper class.
*/
public final class IOHelper {
-
+
public static Supplier<Charset> defaultCharset = Charset::defaultCharset;
public static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
@@ -56,17 +56,18 @@ public final class IOHelper {
private static final Logger LOG = LoggerFactory.getLogger(IOHelper.class);
private static final Charset UTF8_CHARSET = Charset.forName("UTF-8");
- // allows to turn on backwards compatible to turn off regarding the first read byte with value zero (0b0) as EOL.
+ // allows to turn on backwards compatible to turn off regarding the first
+ // read byte with value zero (0b0) as EOL.
// See more at CAMEL-11672
- private static final boolean ZERO_BYTE_EOL_ENABLED =
- "true".equalsIgnoreCase(System.getProperty("camel.zeroByteEOLEnabled", "true"));
+ private static final boolean ZERO_BYTE_EOL_ENABLED = "true".equalsIgnoreCase(System.getProperty("camel.zeroByteEOLEnabled", "true"));
private IOHelper() {
// Utility Class
}
-
+
/**
- * Use this function instead of new String(byte[]) to avoid surprises from non-standard default encodings.
+ * Use this function instead of new String(byte[]) to avoid surprises from
+ * non-standard default encodings.
*/
public static String newStringFromBytes(byte[] bytes) {
try {
@@ -77,8 +78,8 @@ public final class IOHelper {
}
/**
- * Use this function instead of new String(byte[], int, int)
- * to avoid surprises from non-standard default encodings.
+ * Use this function instead of new String(byte[], int, int) to avoid
+ * surprises from non-standard default encodings.
*/
public static String newStringFromBytes(byte[] bytes, int start, int length) {
try {
@@ -195,8 +196,7 @@ public final class IOHelper {
}
if (LOG.isTraceEnabled()) {
- LOG.trace("Copying InputStream: {} -> OutputStream: {} with buffer: {} and flush on each write {}",
- new Object[]{input, output, bufferSize, flushOnEachWrite});
+ LOG.trace("Copying InputStream: {} -> OutputStream: {} with buffer: {} and flush on each write {}", new Object[] {input, output, bufferSize, flushOnEachWrite});
}
int total = 0;
@@ -205,7 +205,8 @@ public final class IOHelper {
boolean hasData;
if (ZERO_BYTE_EOL_ENABLED) {
- // workaround issue on some application servers which can return 0 (instead of -1)
+ // workaround issue on some application servers which can return 0
+ // (instead of -1)
// as first byte to indicate end of stream (CAMEL-11672)
hasData = n > 0;
} else {
@@ -227,11 +228,11 @@ public final class IOHelper {
}
return total;
}
-
+
public static void copyAndCloseInput(InputStream input, OutputStream output) throws IOException {
copyAndCloseInput(input, output, DEFAULT_BUFFER_SIZE);
}
-
+
public static void copyAndCloseInput(InputStream input, OutputStream output, int bufferSize) throws IOException {
copy(input, output, bufferSize);
close(input, null, LOG);
@@ -251,11 +252,13 @@ public final class IOHelper {
}
/**
- * Forces any updates to this channel's file to be written to the storage device that contains it.
+ * Forces any updates to this channel's file to be written to the storage
+ * device that contains it.
*
* @param channel the file channel
* @param name the name of the resource
- * @param log the log to use when reporting warnings, will use this class's own {@link Logger} if <tt>log == null</tt>
+ * @param log the log to use when reporting warnings, will use this class's
+ * own {@link Logger} if <tt>log == null</tt>
*/
public static void force(FileChannel channel, String name, Logger log) {
try {
@@ -276,11 +279,13 @@ public final class IOHelper {
}
/**
- * Forces any updates to a FileOutputStream be written to the storage device that contains it.
+ * Forces any updates to a FileOutputStream be written to the storage device
+ * that contains it.
*
* @param os the file output stream
* @param name the name of the resource
- * @param log the log to use when reporting warnings, will use this class's own {@link Logger} if <tt>log == null</tt>
+ * @param log the log to use when reporting warnings, will use this class's
+ * own {@link Logger} if <tt>log == null</tt>
*/
public static void force(FileOutputStream os, String name, Logger log) {
try {
@@ -305,9 +310,11 @@ public final class IOHelper {
* An associated FileOutputStream can optionally be forced to disk.
*
* @param writer the writer to close
- * @param os an underlying FileOutputStream that will to be forced to disk according to the force parameter
+ * @param os an underlying FileOutputStream that will to be forced to disk
+ * according to the force parameter
* @param name the name of the resource
- * @param log the log to use when reporting warnings, will use this class's own {@link Logger} if <tt>log == null</tt>
+ * @param log the log to use when reporting warnings, will use this class's
+ * own {@link Logger} if <tt>log == null</tt>
* @param force forces the FileOutputStream to disk
*/
public static void close(Writer writer, FileOutputStream os, String name, Logger log, boolean force) {
@@ -332,11 +339,13 @@ public final class IOHelper {
}
/**
- * Closes the given resource if it is available, logging any closing exceptions to the given log.
+ * Closes the given resource if it is available, logging any closing
+ * exceptions to the given log.
*
* @param closeable the object to close
* @param name the name of the resource
- * @param log the log to use when reporting closure warnings, will use this class's own {@link Logger} if <tt>log == null</tt>
+ * @param log the log to use when reporting closure warnings, will use this
+ * class's own {@link Logger} if <tt>log == null</tt>
*/
public static void close(Closeable closeable, String name, Logger log) {
if (closeable != null) {
@@ -355,13 +364,14 @@ public final class IOHelper {
}
}
}
-
+
/**
- * Closes the given resource if it is available and don't catch the exception
+ * Closes the given resource if it is available and don't catch the
+ * exception
*
* @param closeable the object to close
* @throws IOException
- */
+ */
public static void closeWithException(Closeable closeable) throws IOException {
if (closeable != null) {
closeable.close();
@@ -369,12 +379,14 @@ public final class IOHelper {
}
/**
- * Closes the given channel if it is available, logging any closing exceptions to the given log.
- * The file's channel can optionally be forced to disk.
+ * Closes the given channel if it is available, logging any closing
+ * exceptions to the given log. The file's channel can optionally be forced
+ * to disk.
*
* @param channel the file channel
* @param name the name of the resource
- * @param log the log to use when reporting warnings, will use this class's own {@link Logger} if <tt>log == null</tt>
+ * @param log the log to use when reporting warnings, will use this class's
+ * own {@link Logger} if <tt>log == null</tt>
* @param force forces the file channel to disk
*/
public static void close(FileChannel channel, String name, Logger log, boolean force) {
@@ -416,10 +428,10 @@ public final class IOHelper {
public static void closeIterator(Object it) throws IOException {
if (it instanceof Closeable) {
- IOHelper.closeWithException((Closeable) it);
+ IOHelper.closeWithException((Closeable)it);
}
if (it instanceof java.util.Scanner) {
- IOException ioException = ((java.util.Scanner) it).ioException();
+ IOException ioException = ((java.util.Scanner)it).ioException();
if (ioException != null) {
throw ioException;
}
@@ -463,14 +475,15 @@ public final class IOHelper {
close(isr, in);
}
}
-
+
/**
* Get the charset name from the content type string
+ *
* @param contentType
* @return the charset name, or <tt>UTF-8</tt> if no found
*/
public static String getCharsetNameFromContentType(String contentType) {
- String[] values = contentType.split(";");
+ String[] values = contentType.split(";");
String charset = "";
for (String value : values) {
@@ -481,7 +494,7 @@ public final class IOHelper {
}
}
if ("".equals(charset)) {
- charset = "UTF-8";
+ charset = "UTF-8";
}
return normalizeCharset(charset);
@@ -504,7 +517,7 @@ public final class IOHelper {
return null;
}
}
-
+
/**
* Encoding-aware input stream.
*/
@@ -553,7 +566,7 @@ public final class IOHelper {
}
/**
- * Encoding-aware file reader.
+ * Encoding-aware file reader.
*/
public static class EncodingFileReader extends InputStreamReader {
@@ -563,8 +576,7 @@ public final class IOHelper {
* @param in file to read
* @param charset character set to use
*/
- public EncodingFileReader(FileInputStream in, String charset)
- throws FileNotFoundException, UnsupportedEncodingException {
+ public EncodingFileReader(FileInputStream in, String charset) throws FileNotFoundException, UnsupportedEncodingException {
super(in, charset);
this.in = in;
}
@@ -578,9 +590,9 @@ public final class IOHelper {
}
}
}
-
+
/**
- * Encoding-aware file writer.
+ * Encoding-aware file writer.
*/
public static class EncodingFileWriter extends OutputStreamWriter {
@@ -590,8 +602,7 @@ public final class IOHelper {
* @param out file to write
* @param charset character set to use
*/
- public EncodingFileWriter(FileOutputStream out, String charset)
- throws FileNotFoundException, UnsupportedEncodingException {
+ public EncodingFileWriter(FileOutputStream out, String charset) throws FileNotFoundException, UnsupportedEncodingException {
super(out, charset);
this.out = out;
}
@@ -605,7 +616,7 @@ public final class IOHelper {
}
}
}
-
+
public static BufferedReader toReader(File file, String charset) throws IOException {
FileInputStream in = new FileInputStream(file);
return IOHelper.buffered(new EncodingFileReader(in, charset));
diff --git a/camel-util/src/main/java/org/apache/camel/util/Pair.java b/camel-util/src/main/java/org/apache/camel/util/Pair.java
index 8f4e3b4..4cdc670 100644
--- a/camel-util/src/main/java/org/apache/camel/util/Pair.java
+++ b/camel-util/src/main/java/org/apache/camel/util/Pair.java
@@ -41,11 +41,14 @@ public class Pair<T> {
@Override
public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || getClass() != o.getClass()) return false;
- Pair<?> that = (Pair<?>) o;
- return Objects.equals(left, that.left) &&
- Objects.equals(right, that.right);
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ Pair<?> that = (Pair<?>)o;
+ return Objects.equals(left, that.left) && Objects.equals(right, that.right);
}
@Override
diff --git a/camel-util/src/main/java/org/apache/camel/util/URISupport.java b/camel-util/src/main/java/org/apache/camel/util/URISupport.java
index 7c93201..215da85 100644
--- a/camel-util/src/main/java/org/apache/camel/util/URISupport.java
+++ b/camel-util/src/main/java/org/apache/camel/util/URISupport.java
@@ -33,22 +33,22 @@ import java.util.regex.Pattern;
public final class URISupport {
public static final String RAW_TOKEN_PREFIX = "RAW";
- public static final char[] RAW_TOKEN_START = { '(', '{' };
- public static final char[] RAW_TOKEN_END = { ')', '}' };
+ public static final char[] RAW_TOKEN_START = {'(', '{'};
+ public static final char[] RAW_TOKEN_END = {')', '}'};
// Match any key-value pair in the URI query string whose key contains
// "passphrase" or "password" or secret key (case-insensitive).
// First capture group is the key, second is the value.
- private static final Pattern SECRETS = Pattern.compile(
- "([?&][^=]*(?:passphrase|password|secretKey)[^=]*)=(RAW[({].*[)}]|[^&]*)",
- Pattern.CASE_INSENSITIVE);
+ private static final Pattern SECRETS = Pattern.compile("([?&][^=]*(?:passphrase|password|secretKey)[^=]*)=(RAW[({].*[)}]|[^&]*)", Pattern.CASE_INSENSITIVE);
// Match the user password in the URI as second capture group
- // (applies to URI with authority component and userinfo token in the form "user:password").
+ // (applies to URI with authority component and userinfo token in the form
+ // "user:password").
private static final Pattern USERINFO_PASSWORD = Pattern.compile("(.*://.*:)(.*)(@)");
// Match the user password in the URI path as second capture group
- // (applies to URI path with authority component and userinfo token in the form "user:password").
+ // (applies to URI path with authority component and userinfo token in the
+ // form "user:password").
private static final Pattern PATH_USERINFO_PASSWORD = Pattern.compile("(.*:)(.*)(@)");
private static final String CHARSET = "UTF-8";
@@ -58,12 +58,13 @@ public final class URISupport {
}
/**
- * Removes detected sensitive information (such as passwords) from the URI and returns the result.
+ * Removes detected sensitive information (such as passwords) from the URI
+ * and returns the result.
*
* @param uri The uri to sanitize.
* @see #SECRETS and #USERINFO_PASSWORD for the matched pattern
- *
- * @return Returns null if the uri is null, otherwise the URI with the passphrase, password or secretKey sanitized.
+ * @return Returns null if the uri is null, otherwise the URI with the
+ * passphrase, password or secretKey sanitized.
*/
public static String sanitizeUri(String uri) {
// use xxxxx as replacement as that works well with JMX also
@@ -92,9 +93,10 @@ public final class URISupport {
}
/**
- * Extracts the scheme specific path from the URI that is used as the remainder option when creating endpoints.
+ * Extracts the scheme specific path from the URI that is used as the
+ * remainder option when creating endpoints.
*
- * @param u the URI
+ * @param u the URI
* @param useRaw whether to force using raw values
* @return the remainder path
*/
@@ -116,9 +118,10 @@ public final class URISupport {
/**
* Parses the query part of the uri (eg the parameters).
* <p/>
- * The URI parameters will by default be URI encoded. However you can define a parameter
- * values with the syntax: <tt>key=RAW(value)</tt> which tells Camel to not encode the value,
- * and use the value as is (eg key=value) and the value has <b>not</b> been encoded.
+ * The URI parameters will by default be URI encoded. However you can define
+ * a parameter values with the syntax: <tt>key=RAW(value)</tt> which tells
+ * Camel to not encode the value, and use the value as is (eg key=value) and
+ * the value has <b>not</b> been encoded.
*
* @param uri the uri
* @return the parameters, or an empty map if no parameters (eg never null)
@@ -134,9 +137,10 @@ public final class URISupport {
/**
* Parses the query part of the uri (eg the parameters).
* <p/>
- * The URI parameters will by default be URI encoded. However you can define a parameter
- * values with the syntax: <tt>key=RAW(value)</tt> which tells Camel to not encode the value,
- * and use the value as is (eg key=value) and the value has <b>not</b> been encoded.
+ * The URI parameters will by default be URI encoded. However you can define
+ * a parameter values with the syntax: <tt>key=RAW(value)</tt> which tells
+ * Camel to not encode the value, and use the value as is (eg key=value) and
+ * the value has <b>not</b> been encoded.
*
* @param uri the uri
* @param useRaw whether to force using raw values
@@ -153,13 +157,16 @@ public final class URISupport {
/**
* Parses the query part of the uri (eg the parameters).
* <p/>
- * The URI parameters will by default be URI encoded. However you can define a parameter
- * values with the syntax: <tt>key=RAW(value)</tt> which tells Camel to not encode the value,
- * and use the value as is (eg key=value) and the value has <b>not</b> been encoded.
+ * The URI parameters will by default be URI encoded. However you can define
+ * a parameter values with the syntax: <tt>key=RAW(value)</tt> which tells
+ * Camel to not encode the value, and use the value as is (eg key=value) and
+ * the value has <b>not</b> been encoded.
*
* @param uri the uri
* @param useRaw whether to force using raw values
- * @param lenient whether to parse lenient and ignore trailing & markers which has no key or value which can happen when using HTTP components
+ * @param lenient whether to parse lenient and ignore trailing & markers
+ * which has no key or value which can happen when using HTTP
+ * components
* @return the parameters, or an empty map if no parameters (eg never null)
* @throws URISyntaxException is thrown if uri has invalid syntax.
* @see #RAW_TOKEN_PREFIX
@@ -174,8 +181,7 @@ public final class URISupport {
// must check for trailing & as the uri.split("&") will ignore those
if (!lenient && uri.endsWith("&")) {
- throw new URISyntaxException(uri, "Invalid uri syntax: Trailing & marker found. "
- + "Check the uri and remove the trailing & marker.");
+ throw new URISyntaxException(uri, "Invalid uri syntax: Trailing & marker found. " + "Check the uri and remove the trailing & marker.");
}
URIScanner scanner = new URIScanner(CHARSET);
@@ -183,14 +189,15 @@ public final class URISupport {
}
/**
- * Scans RAW tokens in the string and returns the list of pair indexes which tell where
- * a RAW token starts and ends in the string.
+ * Scans RAW tokens in the string and returns the list of pair indexes which
+ * tell where a RAW token starts and ends in the string.
* <p/>
- * This is a companion method with {@link #isRaw(int, List)} and the returned value is
- * supposed to be used as the parameter of that method.
+ * This is a companion method with {@link #isRaw(int, List)} and the
+ * returned value is supposed to be used as the parameter of that method.
*
* @param str the string to scan RAW tokens
- * @return the list of pair indexes which represent the start and end positions of a RAW token
+ * @return the list of pair indexes which represent the start and end
+ * positions of a RAW token
* @see #isRaw(int, List)
* @see #RAW_TOKEN_PREFIX
* @see #RAW_TOKEN_START
@@ -201,15 +208,18 @@ public final class URISupport {
}
/**
- * Tests if the index is within any pair of the start and end indexes which represent
- * the start and end positions of a RAW token.
+ * Tests if the index is within any pair of the start and end indexes which
+ * represent the start and end positions of a RAW token.
* <p/>
- * This is a companion method with {@link #scanRaw(String)} and is supposed to consume
- * the returned value of that method as the second parameter <tt>pairs</tt>.
+ * This is a companion method with {@link #scanRaw(String)} and is supposed
+ * to consume the returned value of that method as the second parameter
+ * <tt>pairs</tt>.
*
* @param index the index to be tested
- * @param pairs the list of pair indexes which represent the start and end positions of a RAW token
- * @return <tt>true</tt> if the index is within any pair of the indexes, <tt>false</tt> otherwise
+ * @param pairs the list of pair indexes which represent the start and end
+ * positions of a RAW token
+ * @return <tt>true</tt> if the index is within any pair of the indexes,
+ * <tt>false</tt> otherwise
* @see #scanRaw(String)
* @see #RAW_TOKEN_PREFIX
* @see #RAW_TOKEN_START
@@ -244,9 +254,10 @@ public final class URISupport {
}
/**
- * Traverses the given parameters, and resolve any parameter values which uses the RAW token
- * syntax: <tt>key=RAW(value)</tt>. This method will then remove the RAW tokens, and replace
- * the content of the value, with just the value.
+ * Traverses the given parameters, and resolve any parameter values which
+ * uses the RAW token syntax: <tt>key=RAW(value)</tt>. This method will then
+ * remove the RAW tokens, and replace the content of the value, with just
+ * the value.
*
* @param parameters the uri parameters
* @see #parseQuery(String)
@@ -263,7 +274,7 @@ public final class URISupport {
// if the value is a list then we need to iterate
Object value = entry.getValue();
if (value instanceof List) {
- List list = (List) value;
+ List list = (List)value;
for (int i = 0; i < list.size(); i++) {
Object obj = list.get(i);
if (obj == null) {
@@ -294,7 +305,8 @@ public final class URISupport {
public static URI createURIWithQuery(URI uri, String query) throws URISyntaxException {
ObjectHelper.notNull(uri, "uri");
- // assemble string as new uri and replace parameters with the query instead
+ // assemble string as new uri and replace parameters with the query
+ // instead
String s = uri.toString();
String before = StringHelper.before(s, "?");
if (before == null) {
@@ -318,7 +330,7 @@ public final class URISupport {
* <p/>
* Returns the value as-is if not starting with the prefix.
*
- * @param value the value
+ * @param value the value
* @param prefix the prefix to remove from value
* @return the value without the prefix
*/
@@ -358,8 +370,9 @@ public final class URISupport {
/**
* Assembles a query from the given map.
*
- * @param options the map with the options (eg key/value pairs)
- * @return a query string with <tt>key1=value&key2=value2&...</tt>, or an empty string if there is no options.
+ * @param options the map with the options (eg key/value pairs)
+ * @return a query string with <tt>key1=value&key2=value2&...</tt>, or an
+ * empty string if there is no options.
* @throws URISyntaxException is thrown if uri has invalid syntax.
*/
@SuppressWarnings("unchecked")
@@ -375,16 +388,18 @@ public final class URISupport {
rc.append("&");
}
- String key = (String) o;
+ String key = (String)o;
Object value = options.get(key);
- // the value may be a list since the same key has multiple values
+ // the value may be a list since the same key has multiple
+ // values
if (value instanceof List) {
- List<String> list = (List<String>) value;
+ List<String> list = (List<String>)value;
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String s = it.next();
appendQueryStringParameter(key, s, rc);
- // append & separator if there is more in the list to append
+ // append & separator if there is more in the list
+ // to append
if (it.hasNext()) {
rc.append("&");
}
@@ -440,13 +455,14 @@ public final class URISupport {
/**
* Appends the given parameters to the given URI.
* <p/>
- * It keeps the original parameters and if a new parameter is already defined in
- * {@code originalURI}, it will be replaced by its value in {@code newParameters}.
+ * It keeps the original parameters and if a new parameter is already
+ * defined in {@code originalURI}, it will be replaced by its value in
+ * {@code newParameters}.
*
- * @param originalURI the original URI
+ * @param originalURI the original URI
* @param newParameters the parameters to add
* @return the URI with all the parameters
- * @throws URISyntaxException is thrown if the uri syntax is invalid
+ * @throws URISyntaxException is thrown if the uri syntax is invalid
* @throws UnsupportedEncodingException is thrown if encoding error
*/
public static String appendParametersToURI(String originalURI, Map<String, Object> newParameters) throws URISyntaxException, UnsupportedEncodingException {
@@ -457,12 +473,13 @@ public final class URISupport {
}
/**
- * Normalizes the uri by reordering the parameters so they are sorted and thus
- * we can use the uris for endpoint matching.
+ * Normalizes the uri by reordering the parameters so they are sorted and
+ * thus we can use the uris for endpoint matching.
* <p/>
- * The URI parameters will by default be URI encoded. However you can define a parameter
- * values with the syntax: <tt>key=RAW(value)</tt> which tells Camel to not encode the value,
- * and use the value as is (eg key=value) and the value has <b>not</b> been encoded.
+ * The URI parameters will by default be URI encoded. However you can define
+ * a parameter values with the syntax: <tt>key=RAW(value)</tt> which tells
+ * Camel to not encode the value, and use the value as is (eg key=value) and
+ * the value has <b>not</b> been encoded.
*
* @param uri the uri
* @return the normalized uri
@@ -499,10 +516,14 @@ public final class URISupport {
path = UnsafeUriCharactersEncoder.encode(path);
}
- // okay if we have user info in the path and they use @ in username or password,
- // then we need to encode them (but leave the last @ sign before the hostname)
- // this is needed as Camel end users may not encode their user info properly, but expect
- // this to work out of the box with Camel, and hence we need to fix it for them
+ // okay if we have user info in the path and they use @ in username or
+ // password,
+ // then we need to encode them (but leave the last @ sign before the
+ // hostname)
+ // this is needed as Camel end users may not encode their user info
+ // properly, but expect
+ // this to work out of the box with Camel, and hence we need to fix it
+ // for them
String userInfoPath = path;
if (userInfoPath.contains("/")) {
userInfoPath = userInfoPath.substring(0, userInfoPath.indexOf("/"));