commons/core/src/main/java/org/ldp4j/commons/net/URIUtils.java
private static String removeDotSegments(String path) {
		Deque<String> outputBuffer=new LinkedList<String>();
		String input=path==null?EMPTY:path;
		while(!input.isEmpty()) {
			input=processInput(outputBuffer, input);
		}
		return assembleInOrder(outputBuffer);
	}
private static String removeDotSegments(String path) {
		Deque<String> outputBuffer=new LinkedList<String>();
		String input=path==null?EMPTY:path;
		while(!input.isEmpty()) {
			input=processInput(outputBuffer, input);
		}
		return assembleInOrder(outputBuffer);
	}
5.2.4.  Remove Dot Segments

The pseudocode also refers to a "remove_dot_segments" routine for
interpreting and removing the special "." and ".." complete path
segments from a referenced path.  This is done after the path is
extracted from a reference, whether or not the path was relative, in
order to remove any invalid or extraneous dot-segments prior to
forming the target URI.  Although there are many ways to accomplish
this removal process, we describe a simple method using two string
buffers.

1.  The input buffer is initialized with the now-appended path
components and the output buffer is initialized to the empty
string.

2.  While the input buffer is not empty, loop as follows:

A.  If the input buffer begins with a prefix of "../" or "./",
then remove that prefix from the input buffer; otherwise,

B.  if the input buffer begins with a prefix of "/./" or "/.",
where "." is a complete path segment, then replace that
prefix with "/" in the input buffer; otherwise,

C.  if the input buffer begins with a prefix of "/../" or "/..",
where ".." is a complete path segment, then replace that
prefix with "/" in the input buffer and remove the last
segment and its preceding "/" (if any) from the output
buffer; otherwise,

D.  if the input buffer consists only of "." or "..", then remove
that from the input buffer; otherwise,

E.  move the first path segment in the input buffer to the end of
the output buffer, including the initial "/" character (if
any) and any subsequent characters up to, but not including,
the next "/" character or the end of the input buffer.

3.  Finally, the output buffer is returned as the result of
remove_dot_segments.