This is an automated email from the ASF dual-hosted git repository.
lewismc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nutch.git
The following commit(s) were added to refs/heads/master by this push:
new 21ba9a8a8 NUTCH-3200 Close Closeable resources flagged by Sonar
java:S2095 (#948)
21ba9a8a8 is described below
commit 21ba9a8a81710f890bece5456af0bbadf8a48fa9
Author: Lewis John McGibbney <[email protected]>
AuthorDate: Fri Aug 14 23:41:10 2026 -0600
NUTCH-3200 Close Closeable resources flagged by Sonar java:S2095 (#948)
---
.../apache/nutch/crawl/AdaptiveFetchSchedule.java | 176 ++++++------
.../apache/nutch/crawl/TextProfileSignature.java | 17 +-
.../apache/nutch/protocol/RobotRulesParser.java | 48 ++--
.../apache/nutch/scoring/webgraph/LinkRank.java | 33 +--
.../apache/nutch/tools/CommonCrawlDataDumper.java | 298 ++++++++++-----------
src/java/org/apache/nutch/tools/FileDumper.java | 169 ++++++------
src/java/org/apache/nutch/tools/ResolveUrls.java | 22 +-
.../org/apache/nutch/parse/feed/FeedParser.java | 6 +-
.../org/apache/nutch/parse/js/JSParseFilter.java | 15 +-
.../java/org/apache/nutch/parse/zip/ZipParser.java | 9 +-
.../nutch/parsefilter/naivebayes/Classify.java | 34 +--
.../apache/nutch/parsefilter/naivebayes/Train.java | 73 +++--
.../apache/nutch/protocol/file/FileResponse.java | 20 +-
13 files changed, 455 insertions(+), 465 deletions(-)
diff --git a/src/java/org/apache/nutch/crawl/AdaptiveFetchSchedule.java
b/src/java/org/apache/nutch/crawl/AdaptiveFetchSchedule.java
index 04a3a1303..6bfb6085f 100644
--- a/src/java/org/apache/nutch/crawl/AdaptiveFetchSchedule.java
+++ b/src/java/org/apache/nutch/crawl/AdaptiveFetchSchedule.java
@@ -133,111 +133,111 @@ public class AdaptiveFetchSchedule extends
AbstractFetchSchedule {
private void setHostSpecificIntervals(String fileName,
float defaultMin, float defaultMax) throws IOException {
// Setup for reading the config file.
- Reader configReader = null;
- configReader = conf.getConfResourceAsReader(fileName);
+ Reader configReader = conf.getConfResourceAsReader(fileName);
if (configReader == null) {
configReader = new FileReader(fileName, StandardCharsets.UTF_8);
}
- BufferedReader reader = new BufferedReader(configReader);
- String line;
- int lineNo = 0;
+ try (BufferedReader reader = new BufferedReader(configReader)) {
+ String line;
+ int lineNo = 0;
- // Read the file line by line.
- while ((line = reader.readLine()) != null) {
- lineNo++;
+ // Read the file line by line.
+ while ((line = reader.readLine()) != null) {
+ lineNo++;
- // Skip blank lines and comments.
- if (StringUtils.isBlank(line) || line.startsWith("#")) {
- continue;
- }
+ // Skip blank lines and comments.
+ if (StringUtils.isBlank(line) || line.startsWith("#")) {
+ continue;
+ }
- // Trim and partition the line.
- line = line.trim();
- String[] parts = line.split("\\s+");
+ // Trim and partition the line.
+ line = line.trim();
+ String[] parts = line.split("\\s+");
- // There should be three parts.
- if (parts.length != 3) {
- LOG.error(
- "Malformed (domain, min_interval, max_interval) triplet on line {}
of the config. file: `{}`",
- lineNo, line);
- continue;
- }
+ // There should be three parts.
+ if (parts.length != 3) {
+ LOG.error(
+ "Malformed (domain, min_interval, max_interval) triplet on line
{} of the config. file: `{}`",
+ lineNo, line);
+ continue;
+ }
- // Normalize the parts.
- String host = parts[0].trim().toLowerCase(Locale.ROOT);
- String minInt = parts[1].trim();
- String maxInt = parts[2].trim();
-
- // "0" and "default" both mean `use default interval`; normalize to "0".
- if (minInt.equalsIgnoreCase("default")) { minInt = "0"; }
- if (maxInt.equalsIgnoreCase("default")) { maxInt = "0"; }
-
- // Convert intervals to float and ignore the line in case of failure.
- float m, M;
- try {
- m = Float.parseFloat(minInt);
- M = Float.parseFloat(maxInt);
- } catch (NumberFormatException e) {
- LOG.error(
- "Improper fetch intervals given on line {} in the config. file
`{}`: {}",
- lineNo, line, e.toString());
- continue;
- }
+ // Normalize the parts.
+ String host = parts[0].trim().toLowerCase(Locale.ROOT);
+ String minInt = parts[1].trim();
+ String maxInt = parts[2].trim();
+
+ // "0" and "default" both mean `use default interval`; normalize to
"0".
+ if (minInt.equalsIgnoreCase("default")) { minInt = "0"; }
+ if (maxInt.equalsIgnoreCase("default")) { maxInt = "0"; }
+
+ // Convert intervals to float and ignore the line in case of failure.
+ float m, M;
+ try {
+ m = Float.parseFloat(minInt);
+ M = Float.parseFloat(maxInt);
+ } catch (NumberFormatException e) {
+ LOG.error(
+ "Improper fetch intervals given on line {} in the config. file
`{}`: {}",
+ lineNo, line, e.toString());
+ continue;
+ }
- // If both intervals are set to default,
- // ignore the line and issue a warning.
- if (m == 0 && M == 0) {
- LOG.warn(
- "Ignoring default interval values on line {} of config. file:
`{}`",
- lineNo, line);
- continue;
- }
+ // If both intervals are set to default,
+ // ignore the line and issue a warning.
+ if (m == 0 && M == 0) {
+ LOG.warn(
+ "Ignoring default interval values on line {} of config. file:
`{}`",
+ lineNo, line);
+ continue;
+ }
- // Replace the zero with the default value.
- if (m == 0) {
- m = defaultMin;
- } else if (M == 0) {
- M = defaultMax;
- }
+ // Replace the zero with the default value.
+ if (m == 0) {
+ m = defaultMin;
+ } else if (M == 0) {
+ M = defaultMax;
+ }
- // Intervals cannot be negative and the min cannot be above the max
- // (we assume here that the default values satisfy this).
- if (m < 0 || M < 0) {
- LOG.error(
- "Improper fetch intervals given on line {} in the config. file:
`{}`: intervals cannot be negative",
- lineNo, line);
- continue;
- }
+ // Intervals cannot be negative and the min cannot be above the max
+ // (we assume here that the default values satisfy this).
+ if (m < 0 || M < 0) {
+ LOG.error(
+ "Improper fetch intervals given on line {} in the config. file:
`{}`: intervals cannot be negative",
+ lineNo, line);
+ continue;
+ }
- if (m > M) {
- LOG.error(
- "Improper fetch intervals given on line {} in the config. file:
`{}`: min. interval cannot be above max. interval",
- lineNo, line);
- continue;
- }
+ if (m > M) {
+ LOG.error(
+ "Improper fetch intervals given on line {} in the config. file:
`{}`: min. interval cannot be above max. interval",
+ lineNo, line);
+ continue;
+ }
- // The custom intervals should respect the boundaries of the default
values.
- if (m < defaultMin) {
- LOG.error(
- "Min. interval out of bounds ({}) on line {} in the config. file:
`{}`",
- defaultMin, lineNo, line);
- continue;
- }
+ // The custom intervals should respect the boundaries of the default
values.
+ if (m < defaultMin) {
+ LOG.error(
+ "Min. interval out of bounds ({}) on line {} in the config.
file: `{}`",
+ defaultMin, lineNo, line);
+ continue;
+ }
- if (M > defaultMax) {
- LOG.error(
- "Max. interval out of bounds ({}) on line {} in the config. file:
`{}`",
- defaultMax, lineNo, line);
- continue;
- }
+ if (M > defaultMax) {
+ LOG.error(
+ "Max. interval out of bounds ({}) on line {} in the config.
file: `{}`",
+ defaultMax, lineNo, line);
+ continue;
+ }
- // If all is well, store the specific intervals.
- hostSpecificMinInterval.put(host, m);
- LOG.debug("Added custom min. interval {} for host {}.", m, host);
+ // If all is well, store the specific intervals.
+ hostSpecificMinInterval.put(host, m);
+ LOG.debug("Added custom min. interval {} for host {}.", m, host);
- hostSpecificMaxInterval.put(host, M);
- LOG.debug("Added custom max. interval {} for host {}.", M, host);
+ hostSpecificMaxInterval.put(host, M);
+ LOG.debug("Added custom max. interval {} for host {}.", M, host);
+ }
}
}
diff --git a/src/java/org/apache/nutch/crawl/TextProfileSignature.java
b/src/java/org/apache/nutch/crawl/TextProfileSignature.java
index 63583a694..f54d230ae 100644
--- a/src/java/org/apache/nutch/crawl/TextProfileSignature.java
+++ b/src/java/org/apache/nutch/crawl/TextProfileSignature.java
@@ -195,17 +195,16 @@ public class TextProfileSignature extends Signature {
HashMap<String, byte[]> res = new HashMap<>();
File[] files = new File(args[0]).listFiles();
for (int i = 0; i < files.length; i++) {
- FileInputStream fis = new FileInputStream(files[i]);
- BufferedReader br = new BufferedReader(
- new InputStreamReader(fis, StandardCharsets.UTF_8));
StringBuffer text = new StringBuffer();
- String line = null;
- while ((line = br.readLine()) != null) {
- if (text.length() > 0)
- text.append("\n");
- text.append(line);
+ try (BufferedReader br = new BufferedReader(new InputStreamReader(
+ new FileInputStream(files[i]), StandardCharsets.UTF_8))) {
+ String line = null;
+ while ((line = br.readLine()) != null) {
+ if (text.length() > 0)
+ text.append("\n");
+ text.append(line);
+ }
}
- br.close();
byte[] signature = sig.calculate(null, new ParseImpl(text.toString(),
null));
res.put(files[i].toString(), signature);
diff --git a/src/java/org/apache/nutch/protocol/RobotRulesParser.java
b/src/java/org/apache/nutch/protocol/RobotRulesParser.java
index 5b0412910..3efa0fc3b 100644
--- a/src/java/org/apache/nutch/protocol/RobotRulesParser.java
+++ b/src/java/org/apache/nutch/protocol/RobotRulesParser.java
@@ -398,30 +398,30 @@ public abstract class RobotRulesParser implements Tool {
System.out.println("Testing robots.txt for agent names: "
+ (agentNames.isEmpty() ? "* (any other agent)" : agentNames));
- LineNumberReader testsIn = new LineNumberReader(
- new FileReader(urlFile, StandardCharsets.UTF_8));
- String testPath;
- testPath = testsIn.readLine();
- while (testPath != null) {
- testPath = testPath.trim();
- try {
- // testPath can be just a path or a complete URL
- URL url = new URL(testPath);
- String status;
- if (isAllowListed(url)) {
- status = "allowlisted";
- } else if (rules.isAllowed(testPath)) {
- status = "allowed";
- } else {
- status = "not allowed";
+ try (LineNumberReader testsIn = new LineNumberReader(
+ new FileReader(urlFile, StandardCharsets.UTF_8))) {
+ String testPath;
+ testPath = testsIn.readLine();
+ while (testPath != null) {
+ testPath = testPath.trim();
+ try {
+ // testPath can be just a path or a complete URL
+ URL url = new URL(testPath);
+ String status;
+ if (isAllowListed(url)) {
+ status = "allowlisted";
+ } else if (rules.isAllowed(testPath)) {
+ status = "allowed";
+ } else {
+ status = "not allowed";
+ }
+ System.out.println(status + ":\t" + testPath);
+ } catch (MalformedURLException e) {
+ LOG.warn("Not a valid URL: {}", testPath);
}
- System.out.println(status + ":\t" + testPath);
- } catch (MalformedURLException e) {
- LOG.warn("Not a valid URL: {}", testPath);
+ testPath = testsIn.readLine();
}
- testPath = testsIn.readLine();
}
- testsIn.close();
} catch (IOException e) {
LOG.error("Failed to run:", e);
return -1;
@@ -476,9 +476,9 @@ public abstract class RobotRulesParser implements Tool {
try {
int contentLength = url.openConnection().getContentLength();
byte[] robotsBytes = new byte[contentLength];
- InputStream openStream = url.openStream();
- openStream.read(robotsBytes);
- openStream.close();
+ try (InputStream openStream = url.openStream()) {
+ openStream.read(robotsBytes);
+ }
rules = robotParser.parseContent(url.toString(), robotsBytes,
"text/plain", agentNames);
} catch (IOException e) {
diff --git a/src/java/org/apache/nutch/scoring/webgraph/LinkRank.java
b/src/java/org/apache/nutch/scoring/webgraph/LinkRank.java
index 80d6ac7cf..de15e3d66 100644
--- a/src/java/org/apache/nutch/scoring/webgraph/LinkRank.java
+++ b/src/java/org/apache/nutch/scoring/webgraph/LinkRank.java
@@ -141,25 +141,26 @@ public class LinkRank extends Configured implements Tool {
}
Path numLinksFile = numLinksFiles[0].getPath();
LOG.info("Reading numlinks temp file {}", numLinksFile);
- FSDataInputStream readLinks = fs.open(numLinksFile);
CompressionCodecFactory cf = new CompressionCodecFactory(conf);
CompressionCodec codec = cf.getCodec(numLinksFiles[0].getPath());
- InputStream streamLinks;
- if (codec == null) {
- LOG.debug("No compression codec found for {}, trying uncompressed",
- numLinksFile);
- streamLinks = readLinks;
- } else {
- LOG.info("Compression codec of numlinks temp file: {}",
- codec.getDefaultExtension());
- readLinks.seek(0);
- streamLinks = codec.createInputStream(readLinks);
+ String numLinksLine;
+ try (FSDataInputStream readLinks = fs.open(numLinksFile)) {
+ InputStream streamLinks;
+ if (codec == null) {
+ LOG.debug("No compression codec found for {}, trying uncompressed",
+ numLinksFile);
+ streamLinks = readLinks;
+ } else {
+ LOG.info("Compression codec of numlinks temp file: {}",
+ codec.getDefaultExtension());
+ readLinks.seek(0);
+ streamLinks = codec.createInputStream(readLinks);
+ }
+ try (BufferedReader buffer = new BufferedReader(
+ new InputStreamReader(streamLinks, StandardCharsets.UTF_8))) {
+ numLinksLine = buffer.readLine();
+ }
}
- BufferedReader buffer = new BufferedReader(
- new InputStreamReader(streamLinks, StandardCharsets.UTF_8));
-
- String numLinksLine = buffer.readLine();
- readLinks.close();
// check if there are links to process, if none, webgraph might be empty
if (numLinksLine == null || numLinksLine.length() == 0) {
diff --git a/src/java/org/apache/nutch/tools/CommonCrawlDataDumper.java
b/src/java/org/apache/nutch/tools/CommonCrawlDataDumper.java
index 39935016d..fe714218e 100644
--- a/src/java/org/apache/nutch/tools/CommonCrawlDataDumper.java
+++ b/src/java/org/apache/nutch/tools/CommonCrawlDataDumper.java
@@ -269,182 +269,180 @@ public class CommonCrawlDataDumper extends NutchTool
implements Tool {
}
}
- LinkDbReader linkDbReader = null;
- if (linkdb != null) {
- linkDbReader = new LinkDbReader(nutchConfig, new
Path(linkdb.toString()));
- }
- if (parts == null || parts.size() == 0) {
- LOG.error( "No segment directories found in {} ",
- segmentRootDir.getAbsolutePath());
- this.errorTracker.recordError(ErrorTracker.ErrorType.OTHER);
- return;
- }
- LOG.info("Found {} segment parts", parts.size());
- if (gzip && !warc) {
- fileList = new ArrayList<>();
- constructNewStream(outputDir);
- }
+ try (LinkDbReader linkDbReader = linkdb != null
+ ? new LinkDbReader(nutchConfig, new Path(linkdb.toString()))
+ : null) {
+ if (parts == null || parts.size() == 0) {
+ LOG.error( "No segment directories found in {} ",
+ segmentRootDir.getAbsolutePath());
+ this.errorTracker.recordError(ErrorTracker.ErrorType.OTHER);
+ return;
+ }
+ LOG.info("Found {} segment parts", parts.size());
+ if (gzip && !warc) {
+ fileList = new ArrayList<>();
+ constructNewStream(outputDir);
+ }
- for (Path segmentPart : parts) {
- LOG.info("Processing segment Part : [ {} ]", segmentPart);
- try {
- SequenceFile.Reader reader = new SequenceFile.Reader(nutchConfig,
- SequenceFile.Reader.file(segmentPart));
+ for (Path segmentPart : parts) {
+ LOG.info("Processing segment Part : [ {} ]", segmentPart);
+ try (SequenceFile.Reader reader = new SequenceFile.Reader(nutchConfig,
+ SequenceFile.Reader.file(segmentPart))) {
- Writable key = (Writable)
reader.getKeyClass().getConstructor().newInstance();
+ Writable key = (Writable)
reader.getKeyClass().getConstructor().newInstance();
- Content content = null;
- while (reader.next(key)) {
- content = new Content();
- reader.getCurrentValue(content);
- Metadata metadata = content.getMetadata();
- String url = key.toString();
+ Content content = null;
+ while (reader.next(key)) {
+ content = new Content();
+ reader.getCurrentValue(content);
+ Metadata metadata = content.getMetadata();
+ String url = key.toString();
- String baseName = FilenameUtils.getBaseName(url);
- String extensionName = FilenameUtils.getExtension(url);
+ String baseName = FilenameUtils.getBaseName(url);
+ String extensionName = FilenameUtils.getExtension(url);
- if (!extension.isEmpty()) {
- extensionName = extension;
- } else if ((extensionName == null) || extensionName.isEmpty()) {
- extensionName = "html";
- }
+ if (!extension.isEmpty()) {
+ extensionName = extension;
+ } else if ((extensionName == null) || extensionName.isEmpty()) {
+ extensionName = "html";
+ }
- String outputFullPath = null;
- String outputRelativePath = null;
- String filename = null;
- String timestamp = null;
- String reverseKey = null;
+ String outputFullPath = null;
+ String outputRelativePath = null;
+ String filename = null;
+ String timestamp = null;
+ String reverseKey = null;
+
+ if (epochFilename || config.getReverseKey()) {
+ try {
+ long epoch = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z")
+ .parse(getDate(metadata.get("Date"))).getTime();
+ timestamp = String.valueOf(epoch);
+ } catch (ParseException pe) {
+ LOG.warn(pe.getMessage());
+ }
- if (epochFilename || config.getReverseKey()) {
- try {
- long epoch = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z")
- .parse(getDate(metadata.get("Date"))).getTime();
- timestamp = String.valueOf(epoch);
- } catch (ParseException pe) {
- LOG.warn(pe.getMessage());
+ reverseKey = reverseUrl(url);
+ config.setReverseKeyValue(
+ reverseKey.replace("/", "_") + "_" + DigestUtils.sha1Hex(url)
+ + "_" + timestamp);
}
- reverseKey = reverseUrl(url);
- config.setReverseKeyValue(
- reverseKey.replace("/", "_") + "_" + DigestUtils.sha1Hex(url)
- + "_" + timestamp);
- }
-
- if (!warc) {
- if (epochFilename) {
- outputFullPath = DumpFileUtil
- .createFileNameFromUrl(outputDir.getAbsolutePath(),
- reverseKey, url, timestamp, extensionName, !gzip);
- outputRelativePath = outputFullPath
- .substring(0, outputFullPath.lastIndexOf(File.separator) -
1);
- filename = content.getMetadata().get(Metadata.DATE) + "."
- + extensionName;
- } else {
- String md5Ofurl = DumpFileUtil.getUrlMD5(url);
- String fullDir = DumpFileUtil
- .createTwoLevelsDirectory(outputDir.getAbsolutePath(),
- md5Ofurl, !gzip);
- filename = DumpFileUtil
- .createFileName(md5Ofurl, baseName, extensionName);
- outputFullPath = String.format(Locale.ROOT, "%s/%s", fullDir,
filename);
-
- String[] fullPathLevels = fullDir
- .split(Pattern.quote(File.separator));
- String firstLevelDirName = fullPathLevels[fullPathLevels.length
- - 2];
- String secondLevelDirName = fullPathLevels[fullPathLevels.length
- - 1];
- outputRelativePath = firstLevelDirName + secondLevelDirName;
+ if (!warc) {
+ if (epochFilename) {
+ outputFullPath = DumpFileUtil
+ .createFileNameFromUrl(outputDir.getAbsolutePath(),
+ reverseKey, url, timestamp, extensionName, !gzip);
+ outputRelativePath = outputFullPath
+ .substring(0, outputFullPath.lastIndexOf(File.separator) -
1);
+ filename = content.getMetadata().get(Metadata.DATE) + "."
+ + extensionName;
+ } else {
+ String md5Ofurl = DumpFileUtil.getUrlMD5(url);
+ String fullDir = DumpFileUtil
+ .createTwoLevelsDirectory(outputDir.getAbsolutePath(),
+ md5Ofurl, !gzip);
+ filename = DumpFileUtil
+ .createFileName(md5Ofurl, baseName, extensionName);
+ outputFullPath = String.format(Locale.ROOT, "%s/%s", fullDir,
filename);
+
+ String[] fullPathLevels = fullDir
+ .split(Pattern.quote(File.separator));
+ String firstLevelDirName = fullPathLevels[fullPathLevels.length
+ - 2];
+ String secondLevelDirName =
fullPathLevels[fullPathLevels.length
+ - 1];
+ outputRelativePath = firstLevelDirName + secondLevelDirName;
+ }
}
- }
- // Encode all filetypes if no mimetypes have been given
- Boolean filter = (mimeTypes == null);
-
- String jsonData = "";
- try {
- String mimeType = new Tika().detect(content.getContent());
- // Maps file to JSON-based structure
-
- Set<String> inUrls = null; //there may be duplicates, so using set
- if (linkDbReader != null) {
- Inlinks inlinks = linkDbReader.getInlinks((Text) key);
- if (inlinks != null) {
- Iterator<Inlink> iterator = inlinks.iterator();
- inUrls = new LinkedHashSet<>();
- while (inUrls.size() <= MAX_INLINKS && iterator.hasNext()){
- inUrls.add(iterator.next().getFromUrl());
+ // Encode all filetypes if no mimetypes have been given
+ Boolean filter = (mimeTypes == null);
+
+ String jsonData = "";
+ try {
+ String mimeType = new Tika().detect(content.getContent());
+ // Maps file to JSON-based structure
+
+ Set<String> inUrls = null; //there may be duplicates, so using
set
+ if (linkDbReader != null) {
+ Inlinks inlinks = linkDbReader.getInlinks((Text) key);
+ if (inlinks != null) {
+ Iterator<Inlink> iterator = inlinks.iterator();
+ inUrls = new LinkedHashSet<>();
+ while (inUrls.size() <= MAX_INLINKS && iterator.hasNext()){
+ inUrls.add(iterator.next().getFromUrl());
+ }
}
}
- }
- //TODO: Make this Jackson Format implementation reusable
- try (CommonCrawlFormat format = CommonCrawlFormatFactory
- .getCommonCrawlFormat(warc ? "WARC" : "JACKSON", nutchConfig,
config)) {
- if (inUrls != null) {
- format.setInLinks(new ArrayList<>(inUrls));
+ //TODO: Make this Jackson Format implementation reusable
+ try (CommonCrawlFormat format = CommonCrawlFormatFactory
+ .getCommonCrawlFormat(warc ? "WARC" : "JACKSON",
nutchConfig, config)) {
+ if (inUrls != null) {
+ format.setInLinks(new ArrayList<>(inUrls));
+ }
+ jsonData = format.getJsonData(url, content, metadata);
}
- jsonData = format.getJsonData(url, content, metadata);
- }
- collectStats(typeCounts, mimeType);
- // collects statistics for the given mimetypes
- if ((mimeType != null) && (mimeTypes != null) && Arrays
- .asList(mimeTypes).contains(mimeType)) {
- collectStats(filteredCounts, mimeType);
- filter = true;
+ collectStats(typeCounts, mimeType);
+ // collects statistics for the given mimetypes
+ if ((mimeType != null) && (mimeTypes != null) && Arrays
+ .asList(mimeTypes).contains(mimeType)) {
+ collectStats(filteredCounts, mimeType);
+ filter = true;
+ }
+ } catch (IOException ioe) {
+ LOG.error("Fatal error in creating JSON data: {}",
ioe.getMessage());
+ return;
}
- } catch (IOException ioe) {
- LOG.error("Fatal error in creating JSON data: {}",
ioe.getMessage());
- return;
- }
- if (!warc) {
- if (filter) {
- byte[] byteData = serializeCBORData(jsonData);
-
- if (!gzip) {
- File outputFile = new File(outputFullPath);
- if (outputFile.exists()) {
- LOG.info("Skipping writing: [{}]: file already exists",
outputFullPath);
- } else {
- LOG.info("Writing: [{}]", outputFullPath);
- IOUtils.copy(new ByteArrayInputStream(byteData),
- new FileOutputStream(outputFile));
- }
- } else {
- if (fileList.contains(outputFullPath)) {
- LOG.info("Skipping compressing: [{}]: file already exists",
outputFullPath);
+ if (!warc) {
+ if (filter) {
+ byte[] byteData = serializeCBORData(jsonData);
+
+ if (!gzip) {
+ File outputFile = new File(outputFullPath);
+ if (outputFile.exists()) {
+ LOG.info("Skipping writing: [{}]: file already exists",
outputFullPath);
+ } else {
+ LOG.info("Writing: [{}]", outputFullPath);
+ IOUtils.copy(new ByteArrayInputStream(byteData),
+ new FileOutputStream(outputFile));
+ }
} else {
- fileList.add(outputFullPath);
- LOG.info("Compressing: [{}]", outputFullPath);
- //TarArchiveEntry tarEntry = new
TarArchiveEntry(firstLevelDirName + File.separator + secondLevelDirName +
File.separator + filename);
- TarArchiveEntry tarEntry = new TarArchiveEntry(
- outputRelativePath + File.separator + filename);
- tarEntry.setSize(byteData.length);
- tarOutput.putArchiveEntry(tarEntry);
- tarOutput.write(byteData);
- tarOutput.closeArchiveEntry();
+ if (fileList.contains(outputFullPath)) {
+ LOG.info("Skipping compressing: [{}]: file already
exists", outputFullPath);
+ } else {
+ fileList.add(outputFullPath);
+ LOG.info("Compressing: [{}]", outputFullPath);
+ //TarArchiveEntry tarEntry = new
TarArchiveEntry(firstLevelDirName + File.separator + secondLevelDirName +
File.separator + filename);
+ TarArchiveEntry tarEntry = new TarArchiveEntry(
+ outputRelativePath + File.separator + filename);
+ tarEntry.setSize(byteData.length);
+ tarOutput.putArchiveEntry(tarEntry);
+ tarOutput.write(byteData);
+ tarOutput.closeArchiveEntry();
+ }
}
}
}
}
+ } catch (Exception e){
+ LOG.warn("SKIPPED: {} Because : {}", segmentPart, e.getMessage());
+ } finally {
+ fs.close();
}
- reader.close();
- } catch (Exception e){
- LOG.warn("SKIPPED: {} Because : {}", segmentPart, e.getMessage());
- } finally {
- fs.close();
}
- }
- if (gzip && !warc) {
- closeStream();
- }
+ if (gzip && !warc) {
+ closeStream();
+ }
- if (!typeCounts.isEmpty()) {
- LOG.info("CommonsCrawlDataDumper File Stats: {}", DumpFileUtil
- .displayFileTypes(typeCounts, filteredCounts));
- }
+ if (!typeCounts.isEmpty()) {
+ LOG.info("CommonsCrawlDataDumper File Stats: {}", DumpFileUtil
+ .displayFileTypes(typeCounts, filteredCounts));
+ }
+ }
}
private void closeStream() {
diff --git a/src/java/org/apache/nutch/tools/FileDumper.java
b/src/java/org/apache/nutch/tools/FileDumper.java
index 8afc390c6..35d096351 100644
--- a/src/java/org/apache/nutch/tools/FileDumper.java
+++ b/src/java/org/apache/nutch/tools/FileDumper.java
@@ -169,114 +169,107 @@ public class FileDumper {
continue;
}
- SequenceFile.Reader reader = new SequenceFile.Reader(conf,
SequenceFile.Reader.file(file));
-
- Writable key = (Writable)
reader.getKeyClass().getConstructor().newInstance();
- Content content = null;
-
- while (reader.next(key)) {
- content = new Content();
- reader.getCurrentValue(content);
- String url = key.toString();
- String baseName = FilenameUtils.getBaseName(url);
- String extension = FilenameUtils.getExtension(url);
- if (extension == null || (extension != null &&
extension.equals(""))) {
- extension = "html";
- }
+ try (SequenceFile.Reader reader = new SequenceFile.Reader(conf,
+ SequenceFile.Reader.file(file))) {
+
+ Writable key = (Writable)
reader.getKeyClass().getConstructor().newInstance();
+ Content content = null;
+
+ while (reader.next(key)) {
+ content = new Content();
+ reader.getCurrentValue(content);
+ String url = key.toString();
+ String baseName = FilenameUtils.getBaseName(url);
+ String extension = FilenameUtils.getExtension(url);
+ if (extension == null || (extension != null &&
extension.equals(""))) {
+ extension = "html";
+ }
- ByteArrayInputStream bas = null;
- Boolean filter = false;
- try {
- bas = new ByteArrayInputStream(content.getContent());
- String mimeType = new Tika().detect(content.getContent());
- collectStats(typeCounts, mimeType);
- if (mimeType != null) {
- if (mimeTypes == null
- || Arrays.asList(mimeTypes).contains(mimeType)) {
- collectStats(filteredCounts, mimeType);
- filter = true;
+ ByteArrayInputStream bas = null;
+ Boolean filter = false;
+ try {
+ bas = new ByteArrayInputStream(content.getContent());
+ String mimeType = new Tika().detect(content.getContent());
+ collectStats(typeCounts, mimeType);
+ if (mimeType != null) {
+ if (mimeTypes == null
+ || Arrays.asList(mimeTypes).contains(mimeType)) {
+ collectStats(filteredCounts, mimeType);
+ filter = true;
+ }
}
- }
- } catch (Exception e) {
- e.printStackTrace();
- LOG.warn("Tika is unable to detect type for: [{}]", url);
- } finally {
- if (bas != null) {
- try {
- bas.close();
- } catch (Exception ignore) {
+ } catch (Exception e) {
+ e.printStackTrace();
+ LOG.warn("Tika is unable to detect type for: [{}]", url);
+ } finally {
+ if (bas != null) {
+ try {
+ bas.close();
+ } catch (Exception ignore) {
+ }
}
}
- }
- if (filter) {
- if (!mimeTypeStats) {
- String md5Ofurl = DumpFileUtil.getUrlMD5(url);
+ if (filter) {
+ if (!mimeTypeStats) {
+ String md5Ofurl = DumpFileUtil.getUrlMD5(url);
- String fullDir = outputDir.getAbsolutePath();
- if (!flatDir && !reverseURLDump) {
- fullDir = DumpFileUtil.createTwoLevelsDirectory(fullDir,
md5Ofurl);
- }
+ String fullDir = outputDir.getAbsolutePath();
+ if (!flatDir && !reverseURLDump) {
+ fullDir = DumpFileUtil.createTwoLevelsDirectory(fullDir,
md5Ofurl);
+ }
- if (!Strings.isNullOrEmpty(fullDir)) {
- String outputFullPath;
+ if (!Strings.isNullOrEmpty(fullDir)) {
+ String outputFullPath;
- if (reverseURLDump) {
- String[] reversedURL =
TableUtil.reverseUrl(url).split(":");
- reversedURL[0] = reversedURL[0].replace('.', '/');
+ if (reverseURLDump) {
+ String[] reversedURL =
TableUtil.reverseUrl(url).split(":");
+ reversedURL[0] = reversedURL[0].replace('.', '/');
- String reversedURLPath = reversedURL[0] + "/"
- + DigestUtils.sha256Hex(url).toUpperCase(Locale.ROOT);
- outputFullPath = String.format(Locale.ROOT, "%s/%s",
- fullDir, reversedURLPath);
+ String reversedURLPath = reversedURL[0] + "/"
+ +
DigestUtils.sha256Hex(url).toUpperCase(Locale.ROOT);
+ outputFullPath = String.format(Locale.ROOT, "%s/%s",
+ fullDir, reversedURLPath);
- // We'll drop the trailing file name and create the nested
structure if it doesn't already exist.
- String[] splitPath = outputFullPath.split("/");
- File fullOutputDir = new
File(org.apache.commons.lang3.StringUtils.join(Arrays.copyOf(splitPath,
splitPath.length - 1), "/"));
+ // We'll drop the trailing file name and create the
nested structure if it doesn't already exist.
+ String[] splitPath = outputFullPath.split("/");
+ File fullOutputDir = new
File(org.apache.commons.lang3.StringUtils.join(Arrays.copyOf(splitPath,
splitPath.length - 1), "/"));
- if (!fullOutputDir.exists()) {
- if(!fullOutputDir.mkdirs());
- throw new Exception("Unable to create: ["
- + fullOutputDir.getAbsolutePath() + "]");
+ if (!fullOutputDir.exists()) {
+ if(!fullOutputDir.mkdirs());
+ throw new Exception("Unable to create: ["
+ + fullOutputDir.getAbsolutePath() + "]");
+ }
+ } else {
+ outputFullPath = String.format(Locale.ROOT, "%s/%s",
+ fullDir, DumpFileUtil.createFileName(md5Ofurl,
baseName,
+ extension));
}
- } else {
- outputFullPath = String.format(Locale.ROOT, "%s/%s",
- fullDir, DumpFileUtil.createFileName(md5Ofurl,
baseName,
- extension));
- }
- filenameToUrl.put(outputFullPath, url);
- File outputFile = new File(outputFullPath);
-
- if (!outputFile.exists()) {
- LOG.info("Writing: [{}]", outputFullPath);
-
- // Modified to prevent FileNotFoundException (Invalid
Argument)
- FileOutputStream output = null;
- try {
- output = new FileOutputStream(outputFile);
- IOUtils.write(content.getContent(), output);
- } catch (Exception e) {
- LOG.warn("Write Error: [{}]", outputFullPath);
- e.printStackTrace();
- } finally {
- if (output != null) {
+ filenameToUrl.put(outputFullPath, url);
+ File outputFile = new File(outputFullPath);
+
+ if (!outputFile.exists()) {
+ LOG.info("Writing: [{}]", outputFullPath);
+
+ // Modified to prevent FileNotFoundException (Invalid
Argument)
+ try (FileOutputStream output = new FileOutputStream(
+ outputFile)) {
+ IOUtils.write(content.getContent(), output);
output.flush();
- try {
- output.close();
- } catch (Exception ignore) {
- }
+ } catch (Exception e) {
+ LOG.warn("Write Error: [{}]", outputFullPath);
+ e.printStackTrace();
}
+ fileCount++;
+ } else {
+ LOG.info("Skipping writing: [{}]: file already exists",
+ outputFullPath);
}
- fileCount++;
- } else {
- LOG.info("Skipping writing: [{}]: file already exists",
- outputFullPath);
}
}
}
}
}
- reader.close();
} finally {
if (doutputStream != null) {
try {
diff --git a/src/java/org/apache/nutch/tools/ResolveUrls.java
b/src/java/org/apache/nutch/tools/ResolveUrls.java
index ad38307a6..ddfa6cf21 100644
--- a/src/java/org/apache/nutch/tools/ResolveUrls.java
+++ b/src/java/org/apache/nutch/tools/ResolveUrls.java
@@ -107,19 +107,19 @@ public class ResolveUrls {
pool = Executors.newFixedThreadPool(numThreads);
// read in the urls file and loop through each line, one url per line
- BufferedReader buffRead = new BufferedReader(new FileReader(new File(
- urlsFile), StandardCharsets.UTF_8));
- String urlStr = null;
- while ((urlStr = buffRead.readLine()) != null) {
-
- // spin up a resolver thread per url
- LOG.info("Starting: {}", urlStr);
- pool.execute(new ResolverThread(urlStr));
+ try (BufferedReader buffRead = new BufferedReader(new FileReader(
+ new File(urlsFile), StandardCharsets.UTF_8))) {
+ String urlStr = null;
+ while ((urlStr = buffRead.readLine()) != null) {
+
+ // spin up a resolver thread per url
+ LOG.info("Starting: {}", urlStr);
+ pool.execute(new ResolverThread(urlStr));
+ }
}
- // close the file and wait for up to 60 seconds before shutting down
- // the thread pool to give urls time to finish resolving
- buffRead.close();
+ // wait for up to 60 seconds before shutting down the thread pool to
+ // give urls time to finish resolving
pool.awaitTermination(60, TimeUnit.SECONDS);
} catch (Exception e) {
diff --git
a/src/plugin/feed/src/java/org/apache/nutch/parse/feed/FeedParser.java
b/src/plugin/feed/src/java/org/apache/nutch/parse/feed/FeedParser.java
index a444f4312..720f5a6d1 100644
--- a/src/plugin/feed/src/java/org/apache/nutch/parse/feed/FeedParser.java
+++ b/src/plugin/feed/src/java/org/apache/nutch/parse/feed/FeedParser.java
@@ -198,9 +198,9 @@ public class FeedParser implements Parser {
parser.setConf(conf);
File file = new File(name);
byte[] bytes = new byte[(int) file.length()];
- DataInputStream in = new DataInputStream(new FileInputStream(file));
- in.readFully(bytes);
- in.close();
+ try (DataInputStream in = new DataInputStream(new FileInputStream(file))) {
+ in.readFully(bytes);
+ }
ParseResult parseResult = parser.getParse(new Content(url, url, bytes,
"application/rss+xml", new Metadata(), conf));
for (Entry<Text, Parse> entry : parseResult) {
diff --git
a/src/plugin/parse-js/src/java/org/apache/nutch/parse/js/JSParseFilter.java
b/src/plugin/parse-js/src/java/org/apache/nutch/parse/js/JSParseFilter.java
index 172b2030a..8e83572f3 100644
--- a/src/plugin/parse-js/src/java/org/apache/nutch/parse/js/JSParseFilter.java
+++ b/src/plugin/parse-js/src/java/org/apache/nutch/parse/js/JSParseFilter.java
@@ -18,7 +18,6 @@ package org.apache.nutch.parse.js;
import java.io.BufferedReader;
import java.io.FileInputStream;
-import java.io.InputStream;
import java.io.InputStreamReader;
import java.lang.invoke.MethodHandles;
import java.net.MalformedURLException;
@@ -278,14 +277,14 @@ public class JSParseFilter implements HtmlParseFilter,
Parser {
System.err.println(JSParseFilter.class.getName() + " file.js baseURL");
return;
}
- InputStream in = new FileInputStream(args[0]);
- BufferedReader br = new BufferedReader(
- new InputStreamReader(in, StandardCharsets.UTF_8));
StringBuffer sb = new StringBuffer();
- String line = null;
- while ((line = br.readLine()) != null)
- sb.append(line + "\n");
- br.close();
+ try (BufferedReader br = new BufferedReader(
+ new InputStreamReader(new FileInputStream(args[0]),
+ StandardCharsets.UTF_8))) {
+ String line = null;
+ while ((line = br.readLine()) != null)
+ sb.append(line + "\n");
+ }
JSParseFilter parseFilter = new JSParseFilter();
parseFilter.setConf(NutchConfiguration.create());
diff --git
a/src/plugin/parse-zip/src/java/org/apache/nutch/parse/zip/ZipParser.java
b/src/plugin/parse-zip/src/java/org/apache/nutch/parse/zip/ZipParser.java
index 315f7e79b..7dc08fd7b 100644
--- a/src/plugin/parse-zip/src/java/org/apache/nutch/parse/zip/ZipParser.java
+++ b/src/plugin/parse-zip/src/java/org/apache/nutch/parse/zip/ZipParser.java
@@ -124,10 +124,11 @@ public class ZipParser implements Parser {
}
File file = new File(args[0]);
String url = "file:"+file.getCanonicalPath();
- FileInputStream in = new FileInputStream(file);
- byte[] bytes = new byte[in.available()];
- in.read(bytes);
- in.close();
+ byte[] bytes;
+ try (FileInputStream in = new FileInputStream(file)) {
+ bytes = new byte[in.available()];
+ in.read(bytes);
+ }
Configuration conf = NutchConfiguration.create();
ZipParser parser = new ZipParser();
parser.setConf(conf);
diff --git
a/src/plugin/parsefilter-naivebayes/src/java/org/apache/nutch/parsefilter/naivebayes/Classify.java
b/src/plugin/parsefilter-naivebayes/src/java/org/apache/nutch/parsefilter/naivebayes/Classify.java
index 4decb7a35..362c341cc 100644
---
a/src/plugin/parsefilter-naivebayes/src/java/org/apache/nutch/parsefilter/naivebayes/Classify.java
+++
b/src/plugin/parsefilter-naivebayes/src/java/org/apache/nutch/parsefilter/naivebayes/Classify.java
@@ -70,23 +70,23 @@ public class Classify {
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(configuration);
- BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(
- fs.open(new Path("naivebayes-model")), StandardCharsets.UTF_8));
-
- uniquewords_size = Integer.parseInt(bufferedReader.readLine());
- bufferedReader.readLine();
-
- numof_ir = Integer.parseInt(bufferedReader.readLine());
- numwords_ir = Integer.parseInt(bufferedReader.readLine());
- wordfreq_ir = unflattenToHashmap(bufferedReader.readLine());
- bufferedReader.readLine();
- numof_r = Integer.parseInt(bufferedReader.readLine());
- numwords_r = Integer.parseInt(bufferedReader.readLine());
- wordfreq_r = unflattenToHashmap(bufferedReader.readLine());
-
- ismodel = true;
-
- bufferedReader.close();
+ try (BufferedReader bufferedReader = new BufferedReader(
+ new InputStreamReader(fs.open(new Path("naivebayes-model")),
+ StandardCharsets.UTF_8))) {
+
+ uniquewords_size = Integer.parseInt(bufferedReader.readLine());
+ bufferedReader.readLine();
+
+ numof_ir = Integer.parseInt(bufferedReader.readLine());
+ numwords_ir = Integer.parseInt(bufferedReader.readLine());
+ wordfreq_ir = unflattenToHashmap(bufferedReader.readLine());
+ bufferedReader.readLine();
+ numof_r = Integer.parseInt(bufferedReader.readLine());
+ numwords_r = Integer.parseInt(bufferedReader.readLine());
+ wordfreq_r = unflattenToHashmap(bufferedReader.readLine());
+
+ ismodel = true;
+ }
}
diff --git
a/src/plugin/parsefilter-naivebayes/src/java/org/apache/nutch/parsefilter/naivebayes/Train.java
b/src/plugin/parsefilter-naivebayes/src/java/org/apache/nutch/parsefilter/naivebayes/Train.java
index ab021334b..0b23705f4 100644
---
a/src/plugin/parsefilter-naivebayes/src/java/org/apache/nutch/parsefilter/naivebayes/Train.java
+++
b/src/plugin/parsefilter-naivebayes/src/java/org/apache/nutch/parsefilter/naivebayes/Train.java
@@ -90,34 +90,36 @@ public class Train {
Configuration configuration = new Configuration();
FileSystem fs = FileSystem.get(configuration);
- BufferedReader bufferedReader = new BufferedReader(
- configuration.getConfResourceAsReader(filepath));
+ try (BufferedReader bufferedReader = new BufferedReader(
+ configuration.getConfResourceAsReader(filepath))) {
- while ((line = bufferedReader.readLine()) != null) {
+ while ((line = bufferedReader.readLine()) != null) {
- target = line.split("\t")[0];
+ target = line.split("\t")[0];
- line = replacefirstoccuranceof(target + "\t", line);
+ line = replacefirstoccuranceof(target + "\t", line);
- linearray = line.replaceAll("[^a-zA-Z ]", "").toLowerCase(Locale.ROOT)
- .split(" ");
+ linearray = line.replaceAll("[^a-zA-Z ]", "").toLowerCase(Locale.ROOT)
+ .split(" ");
- // update the data structures
- if (target.equals("0")) {
+ // update the data structures
+ if (target.equals("0")) {
- numof_ir += 1;
- numwords_ir += linearray.length;
- for (int i = 0; i < linearray.length; i++) {
- uniquewords.add(linearray[i]);
- updateHashMap(wordfreq_ir, linearray[i]);
- }
- } else {
+ numof_ir += 1;
+ numwords_ir += linearray.length;
+ for (int i = 0; i < linearray.length; i++) {
+ uniquewords.add(linearray[i]);
+ updateHashMap(wordfreq_ir, linearray[i]);
+ }
+ } else {
+
+ numof_r += 1;
+ numwords_r += linearray.length;
+ for (int i = 0; i < linearray.length; i++) {
+ uniquewords.add(linearray[i]);
+ updateHashMap(wordfreq_r, linearray[i]);
+ }
- numof_r += 1;
- numwords_r += linearray.length;
- for (int i = 0; i < linearray.length; i++) {
- uniquewords.add(linearray[i]);
- updateHashMap(wordfreq_r, linearray[i]);
}
}
@@ -128,22 +130,19 @@ public class Train {
Path path = new Path("naivebayes-model");
- Writer writer = new BufferedWriter(new OutputStreamWriter(fs.create(path,
- true), StandardCharsets.UTF_8));
-
- writer.write(String.valueOf(uniquewords.size()) + "\n");
- writer.write("0\n");
- writer.write(String.valueOf(numof_ir) + "\n");
- writer.write(String.valueOf(numwords_ir) + "\n");
- writer.write(flattenHashMap(wordfreq_ir) + "\n");
- writer.write("1\n");
- writer.write(String.valueOf(numof_r) + "\n");
- writer.write(String.valueOf(numwords_r) + "\n");
- writer.write(flattenHashMap(wordfreq_r) + "\n");
-
- writer.close();
-
- bufferedReader.close();
+ try (Writer writer = new BufferedWriter(new OutputStreamWriter(fs.create(
+ path, true), StandardCharsets.UTF_8))) {
+
+ writer.write(String.valueOf(uniquewords.size()) + "\n");
+ writer.write("0\n");
+ writer.write(String.valueOf(numof_ir) + "\n");
+ writer.write(String.valueOf(numwords_ir) + "\n");
+ writer.write(flattenHashMap(wordfreq_ir) + "\n");
+ writer.write("1\n");
+ writer.write(String.valueOf(numof_r) + "\n");
+ writer.write(String.valueOf(numwords_r) + "\n");
+ writer.write(flattenHashMap(wordfreq_r) + "\n");
+ }
}
diff --git
a/src/plugin/protocol-file/src/java/org/apache/nutch/protocol/file/FileResponse.java
b/src/plugin/protocol-file/src/java/org/apache/nutch/protocol/file/FileResponse.java
index 266aab165..143ef3d1e 100644
---
a/src/plugin/protocol-file/src/java/org/apache/nutch/protocol/file/FileResponse.java
+++
b/src/plugin/protocol-file/src/java/org/apache/nutch/protocol/file/FileResponse.java
@@ -204,17 +204,17 @@ public class FileResponse {
this.content = new byte[len];
- java.io.InputStream is = new java.io.FileInputStream(f);
- int offset = 0;
- int n = 0;
- while (offset < len
- && (n = is.read(this.content, offset, len - offset)) >= 0) {
- offset += n;
- }
- if (offset < len) { // keep whatever already have, but issue a warning
- File.LOG.warn("not enough bytes read from file: {}", f.getPath());
+ try (java.io.InputStream is = new java.io.FileInputStream(f)) {
+ int offset = 0;
+ int n = 0;
+ while (offset < len
+ && (n = is.read(this.content, offset, len - offset)) >= 0) {
+ offset += n;
+ }
+ if (offset < len) { // keep whatever already have, but issue a warning
+ File.LOG.warn("not enough bytes read from file: {}", f.getPath());
+ }
}
- is.close();
// set headers
headers.set(Response.CONTENT_LENGTH, Long.valueOf(size).toString());