diff --git a/.gitignore b/.gitignore
index fc8f67e9..feee77d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+.idea
*.pydevproject
.project
.metadata
diff --git a/CHANGES.md b/CHANGES.md
index baab5de0..54056f65 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,22 @@
+Unreleased
+----------
+
+### Changes
+
+`FileUtils.pagedLines()` and `FileUtils.expandRange()` now return the Apache Commons Lang 3 version of `LongRange`.
+Users of these methods may need to make the following changes:
+
+| Old | New |
+|-------------------------------------------------|---------------------------------------------|
+| `import org.apache.commons.lang.math.LongRange` | `import org.apache.commons.lang3.LongRange` |
+| `new LongRange(min, max)` | `LongRange.of(min, max)` |
+| `longRange.getMaximumLong()` | `longRange.getMaximum()` |
+| `longRange.getMinimumLong()` | `longRange.getMinimum()` |
+
+### Dependency upgrades
+
+- **commons-lang**: 2.6 → 3.18.0
+
2.0.2
-----
diff --git a/pom.xml b/pom.xml
index 02e06e76..93dd4514 100644
--- a/pom.xml
+++ b/pom.xml
@@ -133,9 +133,9 @@
- commons-lang
- commons-lang
- 2.6
+ org.apache.commons
+ commons-lang3
+ 3.18.0
diff --git a/src/main/java/org/archive/extract/JSONViewExtractorOutput.java b/src/main/java/org/archive/extract/JSONViewExtractorOutput.java
index 530dadd0..fb6dc847 100644
--- a/src/main/java/org/archive/extract/JSONViewExtractorOutput.java
+++ b/src/main/java/org/archive/extract/JSONViewExtractorOutput.java
@@ -5,7 +5,7 @@
import java.io.PrintStream;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.archive.format.json.JSONView;
import org.archive.resource.Resource;
import org.archive.util.StreamCopy;
diff --git a/src/main/java/org/archive/format/cdx/FieldSplitLine.java b/src/main/java/org/archive/format/cdx/FieldSplitLine.java
index 7e965b2f..2da61808 100644
--- a/src/main/java/org/archive/format/cdx/FieldSplitLine.java
+++ b/src/main/java/org/archive/format/cdx/FieldSplitLine.java
@@ -3,7 +3,7 @@
import java.util.ArrayList;
import java.util.List;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
/**
* Base class for text lines that are split by a delimiter Some examples will be
diff --git a/src/main/java/org/archive/format/gzip/zipnum/TimestampBestPickDedupIterator.java b/src/main/java/org/archive/format/gzip/zipnum/TimestampBestPickDedupIterator.java
index 4afb58c4..8c4616a3 100644
--- a/src/main/java/org/archive/format/gzip/zipnum/TimestampBestPickDedupIterator.java
+++ b/src/main/java/org/archive/format/gzip/zipnum/TimestampBestPickDedupIterator.java
@@ -1,6 +1,6 @@
package org.archive.format.gzip.zipnum;
-import org.apache.commons.lang.math.NumberUtils;
+import org.apache.commons.lang3.math.NumberUtils;
import org.archive.util.iterator.CloseableIterator;
public class TimestampBestPickDedupIterator extends TimestampDedupIterator {
diff --git a/src/main/java/org/archive/format/json/CrossProductOfLists.java b/src/main/java/org/archive/format/json/CrossProductOfLists.java
index 7be11fda..f9e2abd2 100644
--- a/src/main/java/org/archive/format/json/CrossProductOfLists.java
+++ b/src/main/java/org/archive/format/json/CrossProductOfLists.java
@@ -8,7 +8,7 @@
import java.util.logging.Level;
import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
public class CrossProductOfLists {
private static final Logger LOG =
diff --git a/src/main/java/org/archive/format/json/JSONView.java b/src/main/java/org/archive/format/json/JSONView.java
index b73c0666..7a984ebe 100644
--- a/src/main/java/org/archive/format/json/JSONView.java
+++ b/src/main/java/org/archive/format/json/JSONView.java
@@ -5,7 +5,7 @@
import java.util.logging.Level;
import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
/**
diff --git a/src/main/java/org/archive/hadoop/ArchiveJSONViewLoader.java b/src/main/java/org/archive/hadoop/ArchiveJSONViewLoader.java
index e92ed7e1..d31e31c9 100644
--- a/src/main/java/org/archive/hadoop/ArchiveJSONViewLoader.java
+++ b/src/main/java/org/archive/hadoop/ArchiveJSONViewLoader.java
@@ -6,7 +6,7 @@
import java.util.logging.Level;
import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.pig.backend.executionengine.ExecException;
import org.apache.pig.data.Tuple;
import org.apache.pig.data.TupleFactory;
diff --git a/src/main/java/org/archive/io/arc/ARCRecord.java b/src/main/java/org/archive/io/arc/ARCRecord.java
index dafc63b6..0815c18a 100644
--- a/src/main/java/org/archive/io/arc/ARCRecord.java
+++ b/src/main/java/org/archive/io/arc/ARCRecord.java
@@ -32,7 +32,7 @@
import java.util.logging.Logger;
import java.util.regex.Matcher;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.archive.format.http.HttpHeader;
import org.archive.io.ArchiveRecord;
import org.archive.io.ArchiveRecordHeader;
diff --git a/src/main/java/org/archive/io/warc/WARCReader.java b/src/main/java/org/archive/io/warc/WARCReader.java
index f9b41af7..d33874a3 100644
--- a/src/main/java/org/archive/io/warc/WARCReader.java
+++ b/src/main/java/org/archive/io/warc/WARCReader.java
@@ -31,7 +31,7 @@
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
-import org.apache.commons.lang.NotImplementedException;
+import org.apache.commons.lang3.NotImplementedException;
import org.archive.io.ArchiveReader;
import org.archive.io.ArchiveRecord;
diff --git a/src/main/java/org/archive/io/warc/WARCWriter.java b/src/main/java/org/archive/io/warc/WARCWriter.java
index 1e6135c8..5c6a6854 100644
--- a/src/main/java/org/archive/io/warc/WARCWriter.java
+++ b/src/main/java/org/archive/io/warc/WARCWriter.java
@@ -36,7 +36,7 @@
import java.util.logging.Level;
import java.util.logging.Logger;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.archive.format.ArchiveFileConstants;
import org.archive.io.UTF8Bytes;
import org.archive.io.WriterPoolMember;
diff --git a/src/main/java/org/archive/util/FileUtils.java b/src/main/java/org/archive/util/FileUtils.java
index 55255e2e..b7bdcee8 100644
--- a/src/main/java/org/archive/util/FileUtils.java
+++ b/src/main/java/org/archive/util/FileUtils.java
@@ -39,7 +39,7 @@
import org.apache.commons.io.IOUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
-import org.apache.commons.lang.math.LongRange;
+import org.apache.commons.lang3.LongRange;
/** Utility methods for manipulating files and directories.
@@ -473,7 +473,7 @@ public static LongRange pagedLines(File file, long position,
if(signedDesiredLineCount>0) {
if(startPosition+bufferSize == fileEnd) {
// nothing more to read: return nothing
- return new LongRange(fileEnd,fileEnd);
+ return LongRange.of(fileEnd,fileEnd);
} else {
// retry with larger lineEstimate
return pagedLines(file, position, signedDesiredLineCount, lines, Math.max(bufferSize,lineEstimate));
@@ -501,7 +501,7 @@ public static LongRange pagedLines(File file, long position,
}
int firstLine = lineStarts.getFirst();
int partialLine = lineStarts.getLast();
- LongRange range = new LongRange(startPosition + firstLine, startPosition + partialLine);
+ LongRange range = LongRange.of(startPosition + firstLine, startPosition + partialLine);
List foundLines =
IOUtils.readLines(new ByteArrayInputStream(buf,firstLine,partialLine-firstLine));
@@ -510,7 +510,7 @@ public static LongRange pagedLines(File file, long position,
range = expandRange(
range,
pagedLines(file,
- range.getMinimumLong()-1,
+ range.getMinimum()-1,
signedDesiredLineCount+foundFullLines,
lines,
bufferSize/foundFullLines));
@@ -519,7 +519,7 @@ public static LongRange pagedLines(File file, long position,
lines.addAll(foundLines);
- if(signedDesiredLineCount < 0 && range.getMaximumLong() < position) {
+ if(signedDesiredLineCount < 0 && range.getMaximum() < position) {
// did not get line containining start position
range = expandRange(
range,
@@ -530,12 +530,12 @@ public static LongRange pagedLines(File file, long position,
bufferSize/foundFullLines));
}
- if(signedDesiredLineCount > 0 && foundFullLines < desiredLineCount && range.getMaximumLong() < fileEnd) {
+ if(signedDesiredLineCount > 0 && foundFullLines < desiredLineCount && range.getMaximum() < fileEnd) {
// need more forward lines
range = expandRange(
range,
pagedLines(file,
- range.getMaximumLong(),
+ range.getMaximum(),
desiredLineCount - foundFullLines,
lines,
bufferSize/foundFullLines));
@@ -545,8 +545,8 @@ public static LongRange pagedLines(File file, long position,
}
public static LongRange expandRange(LongRange range1, LongRange range2) {
- return new LongRange(Math.min(range1.getMinimumLong(), range2.getMinimumLong()),
- Math.max(range1.getMaximumLong(), range2.getMaximumLong()));
+ return LongRange.of(Math.min(range1.getMinimum(), range2.getMinimum()),
+ Math.max(range1.getMaximum(), range2.getMaximum()));
}
diff --git a/src/main/java/org/archive/util/PropertyUtils.java b/src/main/java/org/archive/util/PropertyUtils.java
index e29862bf..659b2820 100644
--- a/src/main/java/org/archive/util/PropertyUtils.java
+++ b/src/main/java/org/archive/util/PropertyUtils.java
@@ -21,7 +21,7 @@
import java.util.Properties;
import java.util.regex.Matcher;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
/**
* Utilities for dealing with Java Properties (incl. System Properties)
diff --git a/src/main/java/org/archive/util/Recorder.java b/src/main/java/org/archive/util/Recorder.java
index e67cfb48..6a7a53d7 100644
--- a/src/main/java/org/archive/util/Recorder.java
+++ b/src/main/java/org/archive/util/Recorder.java
@@ -34,7 +34,7 @@
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.archive.io.GenericReplayCharSequence;
import org.archive.io.RecordingInputStream;
import org.archive.io.RecordingOutputStream;
diff --git a/src/main/java/org/archive/util/TextUtils.java b/src/main/java/org/archive/util/TextUtils.java
index 42e5f31f..98b471f8 100644
--- a/src/main/java/org/archive/util/TextUtils.java
+++ b/src/main/java/org/archive/util/TextUtils.java
@@ -34,7 +34,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import org.apache.commons.lang.StringEscapeUtils;
+import org.apache.commons.lang3.StringEscapeUtils;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
@@ -198,7 +198,7 @@ public static String getFirstWord(String s) {
* @return The same string escaped.
*/
public static String escapeForHTMLJavascript(String s) {
- return escapeForHTML(StringEscapeUtils.escapeJavaScript(s));
+ return escapeForHTML(StringEscapeUtils.escapeEcmaScript(s));
}
/**
@@ -239,7 +239,7 @@ public static void writeEscapedForHTML(String s, Writer w)
BufferedReader reader = new BufferedReader(new StringReader(s));
String line;
while((line=reader.readLine()) != null){
- out.println(StringEscapeUtils.escapeHtml(line));
+ out.println(StringEscapeUtils.escapeHtml3(line));
}
}
@@ -253,7 +253,7 @@ public static CharSequence unescapeHtml(final CharSequence cs) {
return cs;
}
- return StringEscapeUtils.unescapeHtml(cs.toString());
+ return StringEscapeUtils.unescapeHtml4(cs.toString());
}
/**
diff --git a/src/test/java/org/archive/io/ArchiveReaderFactoryTest.java b/src/test/java/org/archive/io/ArchiveReaderFactoryTest.java
index f7ad75d2..791a1148 100644
--- a/src/test/java/org/archive/io/ArchiveReaderFactoryTest.java
+++ b/src/test/java/org/archive/io/ArchiveReaderFactoryTest.java
@@ -24,7 +24,7 @@
import java.net.URL;
import java.util.Iterator;
-import org.apache.commons.lang.StringUtils;
+import org.apache.commons.lang3.StringUtils;
import org.archive.io.arc.ARCWriterTest;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;
diff --git a/src/test/java/org/archive/url/UsableURIFactoryTest.java b/src/test/java/org/archive/url/UsableURIFactoryTest.java
index 85d423c0..8daebe12 100644
--- a/src/test/java/org/archive/url/UsableURIFactoryTest.java
+++ b/src/test/java/org/archive/url/UsableURIFactoryTest.java
@@ -21,7 +21,7 @@
import java.util.TreeMap;
-import org.apache.commons.lang.SerializationUtils;
+import org.apache.commons.lang3.SerializationUtils;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
diff --git a/src/test/java/org/archive/util/FileUtilsTest.java b/src/test/java/org/archive/util/FileUtilsTest.java
index 6142913f..bd58bd09 100644
--- a/src/test/java/org/archive/util/FileUtilsTest.java
+++ b/src/test/java/org/archive/util/FileUtilsTest.java
@@ -27,7 +27,7 @@
import java.util.List;
import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang.math.LongRange;
+import org.apache.commons.lang3.LongRange;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -216,7 +216,7 @@ private List getTestTailLines(File file, int count, int estimate) throws
LongRange range = FileUtils.pagedLines(file,pos,-count,returnedLines,estimate);
Collections.reverse(returnedLines);
testLines.addAll(returnedLines);
- pos = range.getMinimumLong()-1;
+ pos = range.getMinimum()-1;
} while (pos>=0);
Collections.reverse(testLines);
return testLines;
@@ -291,7 +291,7 @@ private List getTestHeadLines(File file, int count, int estimate) throws
List testLines = new LinkedList();
do {
LongRange range = FileUtils.pagedLines(file,pos,count,testLines,estimate);
- pos = range.getMaximumLong();
+ pos = range.getMaximum();
} while (pos