diff --git a/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/Path.java b/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/Path.java index 6a25866f..d96456d6 100644 --- a/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/Path.java +++ b/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/Path.java @@ -29,6 +29,9 @@ public interface Path Path subpath(int beginIndex, int endIndex); + /** Experimental. Not part of nio Path.*/ + Path subpath(int beginIndex); + // default Path subpath(int beginIndex) { // return subpath(beginIndex, getNameCount()); // } diff --git a/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathBase.java b/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathBase.java index 4011b498..2a8ece0a 100644 --- a/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathBase.java +++ b/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathBase.java @@ -146,6 +146,12 @@ public P subpath(int beginIndex, int endIndex) { return newPath(false, segments.subList(beginIndex, endIndex)); } + @Override + public P subpath(int beginIndex) { + int endIndex = getNameCount(); + return subpath(beginIndex, endIndex); + } + @Override public boolean startsWith(Path other) { boolean result; diff --git a/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathNio.java b/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathNio.java index 03902326..8f3d81d2 100644 --- a/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathNio.java +++ b/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathNio.java @@ -92,6 +92,12 @@ public Path subpath(int beginIndex, int endIndex) { return wrapInternal(getDelegate().subpath(beginIndex, endIndex)); } + @Override + public Path subpath(int beginIndex) { + int endIndex = getNameCount(); + return subpath(beginIndex, endIndex); + } + @Override public boolean startsWith(Path other) { return getDelegate().startsWith(((PathNio)other).getDelegate()); diff --git a/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathWrapperBase.java b/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathWrapperBase.java index 71017f27..04f661aa 100644 --- a/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathWrapperBase.java +++ b/aksw-commons-paths/src/main/java/org/aksw/commons/path/core/PathWrapperBase.java @@ -102,6 +102,11 @@ public F subpath(int beginIndex, int endIndex) { return wrapOrNull(getDelegate().subpath(beginIndex, endIndex)); } + @Override + public F subpath(int beginIndex) { + return wrapOrNull(getDelegate().subpath(beginIndex)); + } + @Override public boolean startsWith(Path other) { return getDelegate().startsWith(unwrap(other)); diff --git a/aksw-commons-tuples/src/main/java/org/aksw/commons/tuple/bridge/TupleBridge.java b/aksw-commons-tuples/src/main/java/org/aksw/commons/tuple/bridge/TupleBridge.java index 45470da7..f4d631bc 100644 --- a/aksw-commons-tuples/src/main/java/org/aksw/commons/tuple/bridge/TupleBridge.java +++ b/aksw-commons-tuples/src/main/java/org/aksw/commons/tuple/bridge/TupleBridge.java @@ -51,6 +51,20 @@ default void validateBuildArg(TupleBridge bridge) { } } + /** If the dimension is 1 then return the component, otherwise the tuple. */ + // FIXME What's the best name for this method? compact? + default Object compact(D domainObject) { + Object result = getDimension() == 1 + ? get(domainObject, 0) + : domainObject; + return result; + } + + /** If dimension == 1 then return the object as is, otherwise interpret it as a domain tuple. */ +// default Object fromObject(Object componentOrTuple) { +// +// } + default C[] toComponentArray(D domainObject) { int len = getDimension(); @SuppressWarnings("unchecked") diff --git a/aksw-commons-utils-parent/aksw-commons-utils/src/main/java/org/aksw/commons/util/string/StringUtils.java b/aksw-commons-utils-parent/aksw-commons-utils/src/main/java/org/aksw/commons/util/string/StringUtils.java index 7fb9632e..e9114347 100644 --- a/aksw-commons-utils-parent/aksw-commons-utils/src/main/java/org/aksw/commons/util/string/StringUtils.java +++ b/aksw-commons-utils-parent/aksw-commons-utils/src/main/java/org/aksw/commons/util/string/StringUtils.java @@ -1,6 +1,7 @@ package org.aksw.commons.util.string; import java.io.UnsupportedEncodingException; +import java.math.BigInteger; import java.net.URLDecoder; import java.net.URLEncoder; import java.security.MessageDigest; @@ -13,6 +14,7 @@ import java.util.NavigableSet; import java.util.SortedMap; import java.util.TreeSet; +import java.util.function.Predicate; public class StringUtils { @@ -626,4 +628,56 @@ public static String md5Hash(String string) { return md5Hash(string.getBytes()); } + + /** + * Return the substring of a string that only consists of digits. + *

+ * Examples: + *

+     *   "abc123" -> "123"
+     *   "abc" -> ""
+     *   "abc123.456" -> "456"
+     * 
+ */ + public static String numberSuffix(String base) { + int l = base.length(); + int i; + for (i = l - 1; i >= 0; --i) { + char c = base.charAt(i); + if (!Character.isDigit(c)) { + break; + } + } + String result = base.substring(i + 1, l); + return result; + } + + public static String allocateName(String base, boolean forceNumberSuffix, Predicate skip) { + String result = null; + if (!forceNumberSuffix) { + if (!skip.test(base)) { + result = base; + } + } + + if (result == null) { + String numberStr = numberSuffix(base); + String prefix = base.substring(0, base.length() - numberStr.length()); + + BigInteger current = numberStr.isEmpty() + ? BigInteger.valueOf(0) + : new BigInteger(numberStr); + + BigInteger one = BigInteger.valueOf(1); + + while (true) { + current = current.add(one); + result = prefix + current; + if (!skip.test(result)) { + break; + } + } + } + return result; + } }