Author: kwright
Date: Fri Apr 26 17:54:12 2013
New Revision: 1476320
URL: http://svn.apache.org/r1476320
Log:
Fix for CONNECTORS-681. Check the URL not the temp file's filename.
Modified:
manifoldcf/trunk/CHANGES.txt
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
manifoldcf/trunk/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java
manifoldcf/trunk/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java
Modified: manifoldcf/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/CHANGES.txt?rev=1476320&r1=1476319&r2=1476320&view=diff
==============================================================================
--- manifoldcf/trunk/CHANGES.txt (original)
+++ manifoldcf/trunk/CHANGES.txt Fri Apr 26 17:54:12 2013
@@ -3,6 +3,13 @@ $Id$
======================= 1.2-dev =====================
+CONNECTORS-681: ElasticSearch and OpenSearchServer connectors
+both misused the File object passed to them in checkFileIndexable()
+in order to see if the extension was a supported one. Instead they
+should have been checking the URL. Added that code as well as changed
+the JCIFS connector to check indexability using the URL means.
+(konrad, Karl Wright)
+
CONNECTORS-679: Web connector hangs during throttling. Reason
appears to be that it is possible to interrupt the beginRead() method
after it goes into "obtain estimate" mode. Added code to make it clean
Modified:
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java?rev=1476320&r1=1476319&r2=1476320&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
(original)
+++
manifoldcf/trunk/connectors/elasticsearch/connector/src/main/java/org/apache/manifoldcf/agents/output/elasticsearch/ElasticSearchConnector.java
Fri Apr 26 17:54:12 2013
@@ -342,9 +342,23 @@ public class ElasticSearchConnector exte
public boolean checkDocumentIndexable(String outputDescription, File
localFile)
throws ManifoldCFException, ServiceInterruption
{
+ // No filtering here; we don't look inside the file and don't know its
extension. That's done via the url
+ // filter
+ return true;
+ }
+
+ /** Pre-determine whether a document's URL is indexable by this connector.
This method is used by participating repository connectors
+ * to help filter out documents that are not worth indexing.
+ *@param outputDescription is the document's output version.
+ *@param url is the URL of the document.
+ *@return true if the file is indexable.
+ */
+ @Override
+ public boolean checkURLIndexable(String outputDescription, String url)
+ throws ManifoldCFException, ServiceInterruption
+ {
ElasticSearchSpecs specs = getSpecsCache(outputDescription);
- return specs
- .checkExtension(FilenameUtils.getExtension(localFile.getName()));
+ return specs.checkExtension(FilenameUtils.getExtension(url));
}
@Override
Modified:
manifoldcf/trunk/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java?rev=1476320&r1=1476319&r2=1476320&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java
(original)
+++
manifoldcf/trunk/connectors/jcifs/connector/src/main/java/org/apache/manifoldcf/crawler/connectors/sharedrive/SharedDriveConnector.java
Fri Apr 26 17:54:12 2013
@@ -594,8 +594,8 @@ public class SharedDriveConnector extend
// is to fingerprint right here, in the version part of the world,
but that's got a performance
// downside, because it means that we'd have to suck over pretty
much everything just to determine
// what we wanted to ingest.
- boolean ifIndexable = wouldFileBeIncluded(newPath,spec,true);
- boolean ifNotIndexable = wouldFileBeIncluded(newPath,spec,false);
+ boolean ifIndexable =
wouldFileBeIncluded(activities,newPath,ingestionURI,spec,true);
+ boolean ifNotIndexable =
wouldFileBeIncluded(activities,newPath,ingestionURI,spec,false);
if (ifIndexable == ifNotIndexable)
sb.append("I");
else
@@ -726,115 +726,127 @@ public class SharedDriveConnector extend
String fileName = getFileCanonicalPath(file);
if (fileName != null && !file.isHidden())
{
- // manipulate path to include the DFS alias, not the literal
path
- // String newPath = matchPrefix +
fileName.substring(matchReplace.length());
- String newPath = fileName;
- if (checkNeedFileData(newPath, spec))
+ // Initialize repository document with common stuff, and find
the URI
+ RepositoryDocument rd = new RepositoryDocument();
+ String uri = prepareForIndexing(rd,file,version);
+
+ if
(activities.checkMimeTypeIndexable(mapExtensionToMimeType(fileName)) &&
+ activities.checkURLIndexable(uri))
{
- if (Logging.connectors.isDebugEnabled())
- Logging.connectors.debug("JCIFS: Local file data needed
for '"+documentIdentifier+"'");
- // Create a temporary file, and use that for the check and
then the ingest
- File tempFile = File.createTempFile("_sdc_",null);
- try
+ // manipulate path to include the DFS alias, not the literal
path
+ // String newPath = matchPrefix +
fileName.substring(matchReplace.length());
+ String newPath = fileName;
+ if (checkNeedFileData(activities, newPath, uri, spec))
{
- FileOutputStream os = new FileOutputStream(tempFile);
+ if (Logging.connectors.isDebugEnabled())
+ Logging.connectors.debug("JCIFS: Local file data needed
for '"+documentIdentifier+"'");
+
+ // Create a temporary file, and use that for the check and
then the ingest
+ File tempFile = File.createTempFile("_sdc_",null);
try
{
-
- // Now, make a local copy so we can fingerprint
- InputStream inputStream = getFileInputStream(file);
+ FileOutputStream os = new FileOutputStream(tempFile);
try
{
- // Copy!
- if (transferBuffer == null)
- transferBuffer = new byte[65536];
- while (true)
+
+ // Now, make a local copy so we can fingerprint
+ InputStream inputStream = getFileInputStream(file);
+ try
+ {
+ // Copy!
+ if (transferBuffer == null)
+ transferBuffer = new byte[65536];
+ while (true)
+ {
+ int amt =
inputStream.read(transferBuffer,0,transferBuffer.length);
+ if (amt == -1)
+ break;
+ os.write(transferBuffer,0,amt);
+ }
+ }
+ finally
{
- int amt =
inputStream.read(transferBuffer,0,transferBuffer.length);
- if (amt == -1)
- break;
- os.write(transferBuffer,0,amt);
+ inputStream.close();
}
}
finally
{
- inputStream.close();
+ os.close();
}
- }
- finally
- {
- os.close();
- }
-
- if (checkIngest(tempFile, newPath, spec, activities))
- {
- if (Logging.connectors.isDebugEnabled())
- Logging.connectors.debug("JCIFS: Decided to ingest
'"+documentIdentifier+"'");
- // OK, do ingestion itself!
- InputStream inputStream = new FileInputStream(tempFile);
- try
+ if (checkIngest(tempFile, newPath, uri, spec,
activities))
{
- RepositoryDocument rd = new RepositoryDocument();
- rd.setBinary(inputStream, tempFile.length());
-
-
indexDocument(activities,rd,file,documentIdentifier,version);
+ if (Logging.connectors.isDebugEnabled())
+ Logging.connectors.debug("JCIFS: Decided to ingest
'"+documentIdentifier+"'");
+ // OK, do ingestion itself!
+ InputStream inputStream = new
FileInputStream(tempFile);
+ try
+ {
+ rd.setBinary(inputStream, tempFile.length());
+
+ activities.ingestDocument(documentIdentifier,
version, uri, rd);
+ }
+ finally
+ {
+ inputStream.close();
+ }
+
+ // I put this record here deliberately for two reasons:
+ // (1) the other path includes ingestion time, and
+ // (2) if anything fails up to and during ingestion, I
want THAT failure record to be written, not this one.
+ // So, really, ACTIVITY_ACCESS is a bit more than just
fetch for JCIFS...
+ activities.recordActivity(new
Long(startFetchTime),ACTIVITY_ACCESS,
+ new
Long(tempFile.length()),documentIdentifier,"Success",null,null);
+
}
- finally
+ else
{
- inputStream.close();
+ // We must actively remove the document here, because
the getDocumentVersions()
+ // method has no way of signalling this, since it does
not do the fingerprinting.
+ if (Logging.connectors.isDebugEnabled())
+ Logging.connectors.debug("JCIFS: Decided to remove
'"+documentIdentifier+"'");
+ activities.deleteDocument(documentIdentifier, version);
+ // We should record the access here as well, since
this is a non-exception way through the code path.
+ // (I noticed that this was not being recorded in the
history while fixing 25477.)
+ activities.recordActivity(new
Long(startFetchTime),ACTIVITY_ACCESS,
+ new
Long(tempFile.length()),documentIdentifier,"Success",null,null);
}
-
- // I put this record here deliberately for two reasons:
- // (1) the other path includes ingestion time, and
- // (2) if anything fails up to and during ingestion, I
want THAT failure record to be written, not this one.
- // So, really, ACTIVITY_ACCESS is a bit more than just
fetch for JCIFS...
- activities.recordActivity(new
Long(startFetchTime),ACTIVITY_ACCESS,
- new
Long(tempFile.length()),documentIdentifier,"Success",null,null);
-
}
- else
+ finally
{
- // We must actively remove the document here, because
the getDocumentVersions()
- // method has no way of signalling this, since it does
not do the fingerprinting.
- if (Logging.connectors.isDebugEnabled())
- Logging.connectors.debug("JCIFS: Decided to remove
'"+documentIdentifier+"'");
- activities.deleteDocument(documentIdentifier, version);
- // We should record the access here as well, since this
is a non-exception way through the code path.
- // (I noticed that this was not being recorded in the
history while fixing 25477.)
- activities.recordActivity(new
Long(startFetchTime),ACTIVITY_ACCESS,
- new
Long(tempFile.length()),documentIdentifier,"Success",null,null);
+ tempFile.delete();
}
}
- finally
+ else
{
- tempFile.delete();
+ if (Logging.connectors.isDebugEnabled())
+ Logging.connectors.debug("JCIFS: Local file data not
needed for '"+documentIdentifier+"'");
+
+ // Presume that since the file was queued that it
fulfilled the needed criteria.
+ // Go off and ingest the fast way.
+
+ // Ingest the document.
+ InputStream inputStream = getFileInputStream(file);
+ try
+ {
+ rd.setBinary(inputStream, fileLength(file));
+
+ activities.ingestDocument(documentIdentifier, version,
uri, rd);
+ }
+ finally
+ {
+ inputStream.close();
+ }
+ activities.recordActivity(new
Long(startFetchTime),ACTIVITY_ACCESS,
+ new
Long(fileLength(file)),documentIdentifier,"Success",null,null);
}
}
else
{
- if (Logging.connectors.isDebugEnabled())
- Logging.connectors.debug("JCIFS: Local file data not
needed for '"+documentIdentifier+"'");
-
- // Presume that since the file was queued that it fulfilled
the needed criteria.
- // Go off and ingest the fast way.
-
- // Ingest the document.
- InputStream inputStream = getFileInputStream(file);
- try
- {
- RepositoryDocument rd = new RepositoryDocument();
- rd.setBinary(inputStream, fileLength(file));
-
-
indexDocument(activities,rd,file,documentIdentifier,version);
- }
- finally
- {
- inputStream.close();
- }
- activities.recordActivity(new
Long(startFetchTime),ACTIVITY_ACCESS,
- new
Long(fileLength(file)),documentIdentifier,"Success",null,null);
+ Logging.connectors.debug("JCIFS: Skipping file because
output connector cannot accept it");
+ activities.recordActivity(null,ACTIVITY_ACCESS,
+ null,documentIdentifier,"Skip","Output connector
refused",null);
}
}
else
@@ -965,8 +977,8 @@ public class SharedDriveConnector extend
}
- protected static void indexDocument(IProcessActivity activities,
RepositoryDocument rd, SmbFile file, String documentIdentifier, String version)
- throws ManifoldCFException, ServiceInterruption, SmbException
+ protected static String prepareForIndexing(RepositoryDocument rd, SmbFile
file, String version)
+ throws ManifoldCFException, SmbException
{
String fileNameString = file.getName();
Date lastModifiedDate = new Date(file.lastModified());
@@ -983,9 +995,9 @@ public class SharedDriveConnector extend
index = setPathMetadata(rd,version,index);
StringBuilder ingestURI = new StringBuilder();
index = unpack(ingestURI,version,index,'+');
- activities.ingestDocument(documentIdentifier, version,
ingestURI.toString(), rd);
+ return ingestURI.toString();
}
-
+
/** Map an extension to a mime type */
protected static String mapExtensionToMimeType(String fileName)
{
@@ -1601,12 +1613,13 @@ public class SharedDriveConnector extend
/** Pretend that a file is either indexable or not, and return whether or
not it would be ingested.
* This is only ever called for files.
*@param fileName is the canonical file name.
+ *@param url is the file's url.
*@param documentSpecification is the specification.
*@param pretendIndexable should be set to true if the document's contents
would be fingerprinted as "indexable",
* or false otherwise.
*@return true if the file would be ingested given the parameters.
*/
- protected boolean wouldFileBeIncluded(String fileName, DocumentSpecification
documentSpecification,
+ protected boolean wouldFileBeIncluded(IFingerprintActivity activities,
String fileName, String url, DocumentSpecification documentSpecification,
boolean pretendIndexable)
throws ManifoldCFException
{
@@ -1691,6 +1704,7 @@ public class SharedDriveConnector extend
isIndexable = false;
else
{
+ // Evaluate the parts of being indexable that are based on
the filename, mime type, and url
isIndexable = pretendIndexable;
}
@@ -1740,10 +1754,10 @@ public class SharedDriveConnector extend
*@param documentSpecification is the document specification.
*@return true if the file needs to be fingerprinted.
*/
- protected boolean checkNeedFileData(String fileName, DocumentSpecification
documentSpecification)
+ protected boolean checkNeedFileData(IFingerprintActivity activities, String
fileName, String url, DocumentSpecification documentSpecification)
throws ManifoldCFException
{
- return wouldFileBeIncluded(fileName,documentSpecification,true) !=
wouldFileBeIncluded(fileName,documentSpecification,false);
+ return
wouldFileBeIncluded(activities,fileName,url,documentSpecification,true) !=
wouldFileBeIncluded(activities,fileName,url,documentSpecification,false);
}
/** Check if a file should be ingested, given a document specification and a
local copy of the
@@ -1751,11 +1765,12 @@ public class SharedDriveConnector extend
* file data by checkNeedFileData() will be checked by this method.
*@param localFile is the file.
*@param fileName is the JCIFS file name.
+ *@param url is the file's url.
*@param documentSpecification is the specification.
*@param activities are the activities available to determine indexability.
*@return true if the file should be ingested.
*/
- protected boolean checkIngest(File localFile, String fileName,
DocumentSpecification documentSpecification, IFingerprintActivity activities)
+ protected boolean checkIngest(File localFile, String fileName, String url,
DocumentSpecification documentSpecification, IFingerprintActivity activities)
throws ManifoldCFException, ServiceInterruption
{
if (Logging.connectors.isDebugEnabled())
Modified:
manifoldcf/trunk/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java
URL:
http://svn.apache.org/viewvc/manifoldcf/trunk/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java?rev=1476320&r1=1476319&r2=1476320&view=diff
==============================================================================
---
manifoldcf/trunk/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java
(original)
+++
manifoldcf/trunk/connectors/opensearchserver/connector/src/main/java/org/apache/manifoldcf/agents/output/opensearchserver/OpenSearchServerConnector.java
Fri Apr 26 17:54:12 2013
@@ -340,9 +340,7 @@ public class OpenSearchServerConnector e
@Override
public boolean checkDocumentIndexable(String outputDescription, File
localFile)
throws ManifoldCFException, ServiceInterruption {
- OpenSearchServerSpecs specs = getSpecsCache(outputDescription);
- return specs
- .checkExtension(FilenameUtils.getExtension(localFile.getName()));
+ return true;
}
@Override
@@ -352,6 +350,19 @@ public class OpenSearchServerConnector e
return specs.checkMimeType(mimeType);
}
+ /** Pre-determine whether a document's URL is indexable by this connector.
This method is used by participating repository connectors
+ * to help filter out documents that are not worth indexing.
+ *@param outputDescription is the document's output version.
+ *@param url is the URL of the document.
+ *@return true if the file is indexable.
+ */
+ @Override
+ public boolean checkURLIndexable(String outputDescription, String url)
+ throws ManifoldCFException, ServiceInterruption {
+ OpenSearchServerSpecs specs = getSpecsCache(outputDescription);
+ return specs.checkExtension(FilenameUtils.getExtension(url));
+ }
+
@Override
public void viewConfiguration(IThreadContext threadContext, IHTTPOutput out,
Locale locale, ConfigParams parameters) throws ManifoldCFException,
IOException {