GitNex-Android-App/app/src/main/java/org/mian/gitnex/helpers/Path.java

146 lines
2.3 KiB
Java

package org.mian.gitnex.helpers;
import androidx.annotation.NonNull;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.StringJoiner;
/**
* @author opyale
*/
public class Path {
private final List<String> segments;
private final List<Runnable> onChangedListeners;
public Path(String... segments) {
this.segments = new ArrayList<>(Arrays.asList(segments));
this.onChangedListeners = new ArrayList<>();
}
public Path addListener(Runnable onChangedListener) {
onChangedListeners.add(onChangedListener);
return this;
}
public Path removeListener(Runnable onChangedListener) {
onChangedListeners.remove(onChangedListener);
return this;
}
private void pathChanged() {
for(Runnable onChangedListener : onChangedListeners) {
onChangedListener.run();
}
}
public Path add(String segment) {
if(segment != null && !segment.trim().isEmpty()) {
try {
segments.add(URLEncoder.encode(segment, "UTF-8"));
} catch(UnsupportedEncodingException ignored) {}
}
pathChanged();
return this;
}
public Path addWithoutEncoding(String segment) {
if(segment != null && !segment.trim().isEmpty()) {
segments.add(segment);
}
pathChanged();
return this;
}
public int size() {
return segments.size();
}
public Path join(Path path) {
this.segments.addAll(path.segments);
pathChanged();
return this;
}
public Path pop(int count) {
for(int i=0; i<count; i++)
segments.remove(segments.size() - 1);
pathChanged();
return this;
}
public Path remove(int index) {
segments.remove(index);
pathChanged();
return this;
}
public Path clear() {
segments.clear();
pathChanged();
return this;
}
public String[] segments() {
return segments.toArray(new String[]{});
}
public static Path of(String path) {
String[] parsed_segments = path.split("/");
return new Path(
Arrays
.stream(parsed_segments)
.filter(s -> !s.trim().isEmpty())
.toArray(String[]::new)
);
}
@NonNull
@Override
public String toString() {
StringJoiner stringJoiner = new StringJoiner("/");
for(String segment : segments)
stringJoiner.add(segment);
return stringJoiner.toString();
}
}