04e6489f56f835adc9840fc748c8310cf851b1d3
[svjatoslav_commons.git] / src / main / java / eu / svjatoslav / commons / string / String2.java
1 /*
2  * Svjatoslav Commons - shared library of common functionality. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.commons.string;
6
7 import java.util.ArrayList;
8 import java.util.List;
9
10 public class String2 {
11
12     private final List<Character> chars = new ArrayList<>();
13
14     public String2(String value) {
15         addSuffix(value);
16     }
17
18     public String2 addPrefix(final String prefix) {
19         if (prefix == null)
20             return this;
21
22         int i = 0;
23         for (final char c : prefix.toCharArray())
24             chars.add(i++, c);
25
26         return this;
27     }
28
29     public String2 addSuffix(final String suffix) {
30         if (suffix == null)
31             return this;
32
33         for (final char c : suffix.toCharArray())
34             chars.add(c);
35
36         return this;
37     }
38
39     public String2 addSuffix(String separator, final String suffix) {
40         if (!isEmpty())
41             addSuffix(separator);
42
43         addSuffix(suffix);
44
45         return this;
46     }
47
48     /**
49      * Cut given amount of characters from the left of the string.
50      *
51      * @param cutAmount of characters to cut
52      * @return part that was cut.
53      */
54     public String2 trimPrefix(final int cutAmount) {
55
56         int actualCutAmount = cutAmount;
57
58         if (actualCutAmount > getLength())
59             actualCutAmount = getLength();
60
61         chars.subList(0, actualCutAmount).clear();
62
63         return this;
64     }
65
66     public String2 trimPrefixIfExists(String prefix) {
67         if (prefix == null)
68             return this;
69
70         if (hasPrefix(prefix))
71             trimPrefix(prefix.length());
72
73         return this;
74     }
75
76     public String2 trimSuffixIfExists(String suffix) {
77         if (hasSuffix(suffix))
78             trimSuffix(suffix.length());
79
80         return this;
81     }
82
83     public String2 trimSuffix(int charsToTrim) {
84
85         if (charsToTrim > chars.size()) {
86             chars.clear();
87             return this;
88         }
89
90         for (int i = 0; i < charsToTrim; i++)
91             chars.remove(chars.size() - 1);
92
93         return this;
94     }
95
96     public boolean hasSuffix(String suffix) {
97         return contains(suffix, getLength() - suffix.length());
98     }
99
100     public boolean hasPrefix(String prefix) {
101         return contains(prefix, 0);
102     }
103
104     public boolean contains(String fragment, int index) {
105         if (index + fragment.length() > chars.size())
106             return false;
107
108         for (int i = 0; i < fragment.length(); i++)
109             if (chars.get(index + i) != fragment.charAt(i))
110                 return false;
111
112         return true;
113     }
114
115     public String2 enforceLength(final int targetLength) {
116         if (getLength() > targetLength)
117             chars.subList(targetLength, getLength()).clear();
118         else if (getLength() < targetLength) {
119             final int charactersToAdd = targetLength - getLength();
120             for (int i = 0; i < charactersToAdd; i++)
121                 chars.add(' ');
122         }
123
124         return this;
125     }
126
127     public int getLength() {
128         return chars.size();
129     }
130
131     public String getSubString(final int startInclusive, final int endExclusive) {
132         final char[] charArray = new char[endExclusive - startInclusive];
133
134         int j = 0;
135         for (int i = startInclusive; i < endExclusive; i++) {
136             charArray[j] = chars.get(i);
137             j++;
138         }
139         return new String(charArray);
140     }
141
142     public boolean isEmpty() {
143         return chars.size() == 0;
144     }
145
146     @Override
147     public String toString() {
148         return getSubString(0, chars.size());
149     }
150 }