You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stanbol.apache.org by rw...@apache.org on 2013/10/16 08:42:30 UTC
svn commit: r1532653 - in
/stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking:
CorpusCreationTask.java CorpusInfo.java
Author: rwesten
Date: Wed Oct 16 06:42:30 2013
New Revision: 1532653
URL: http://svn.apache.org/r1532653
Log:
STANBOL-1177: creation, writing and reading of FST corpora is now done within AccessController.doPrivileged(..) blocks
Modified:
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusCreationTask.java
stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusInfo.java
Modified: stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusCreationTask.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusCreationTask.java?rev=1532653&r1=1532652&r2=1532653&view=diff
==============================================================================
--- stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusCreationTask.java (original)
+++ stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusCreationTask.java Wed Oct 16 06:42:30 2013
@@ -17,6 +17,9 @@
package org.apache.stanbol.enhancer.engines.lucenefstlinking;
import java.io.IOException;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
@@ -67,37 +70,56 @@ public class CorpusCreationTask implemen
log.warn("Unable to build {} becuase SolrCore {} is closed!",fstInfo,core.getName());
return;
}
- TaggerFstCorpus corpus = null;
+ final TaggerFstCorpus corpus;
RefCounted<SolrIndexSearcher> searcherRef = core.getSearcher();
- try {
- SolrIndexSearcher searcher = searcherRef.get();
+ try { //STANBOL-1177: create FST models in AccessController.doPrivileged(..)
+ final SolrIndexSearcher searcher = searcherRef.get();
//we do get the AtomicReader, because TaggerFstCorpus will need it
//anyways. This prevents to create another SlowCompositeReaderWrapper.
- IndexReader reader = searcher.getAtomicReader();
+ final IndexReader reader = searcher.getAtomicReader();
log.info(" ... build FST corpus for {}",fstInfo);
- corpus = new TaggerFstCorpus(reader, searcher.getIndexReader().getVersion(),
- null, fstInfo.indexedField, fstInfo.storedField, fstInfo.analyzer,
- fstInfo.partialMatches,1,100);
- } catch (IOException e) {
- throw new IllegalStateException("Unable to read Information to build "
- + fstInfo + " from SolrIndex '" + core.getName() + "'!", e);
+ corpus = AccessController.doPrivileged(new PrivilegedExceptionAction<TaggerFstCorpus>() {
+ public TaggerFstCorpus run() throws IOException {
+ return new TaggerFstCorpus(reader, searcher.getIndexReader().getVersion(),
+ null, fstInfo.indexedField, fstInfo.storedField, fstInfo.analyzer,
+ fstInfo.partialMatches,1,100);
+ }
+ });
+ } catch (PrivilegedActionException pae) {
+ Exception e = pae.getException();
+ if(e instanceof IOException){ //IO Exception while loading the file
+ throw new IllegalStateException("Unable to read Information to build "
+ + fstInfo + " from SolrIndex '" + core.getName() + "'!", e);
+ } else { //Runtime exception
+ throw RuntimeException.class.cast(e);
+ }
} finally {
searcherRef.decref(); //ensure that we dereference the searcher
}
if(indexConfig.isActive()){
- if(fstInfo.fst.exists()){
- if(!FileUtils.deleteQuietly(fstInfo.fst)){
- log.warn("Unable to delete existing FST fiel for {}",fstInfo);
- }
- }
- try {
- corpus.save(fstInfo.fst);
- } catch (IOException e) {
- log.warn("Unable to store FST corpus " + fstInfo + " to "
- + fstInfo.fst.getAbsolutePath() + "!", e);
- }
//set the created corpus to the FST Info
fstInfo.setCorpus(enqueued, corpus);
+ try { //STANBOL-1177: save FST models in AccessController.doPrivileged(..)
+ AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
+ public Object run() throws IOException {
+ if(fstInfo.fst.exists()){
+ if(!FileUtils.deleteQuietly(fstInfo.fst)){
+ log.warn("Unable to delete existing FST file for {}", fstInfo);
+ }
+ }
+ corpus.save(fstInfo.fst);
+ return null; //not used
+ }
+ });
+ } catch (PrivilegedActionException pae) {
+ Exception e = pae.getException();
+ if(e instanceof IOException){ //IO Exception while loading the file
+ log.warn("Unable to store FST corpus " + fstInfo + " to "
+ + fstInfo.fst.getAbsolutePath() + "!", e);
+ } else { //Runtime exception
+ throw RuntimeException.class.cast(e);
+ }
+ }
} //else index configuration no longer active ... ignore the built FST
}
Modified: stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusInfo.java
URL: http://svn.apache.org/viewvc/stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusInfo.java?rev=1532653&r1=1532652&r2=1532653&view=diff
==============================================================================
--- stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusInfo.java (original)
+++ stanbol/trunk/enhancement-engines/lucenefstlinking/src/main/java/org/apache/stanbol/enhancer/engines/lucenefstlinking/CorpusInfo.java Wed Oct 16 06:42:30 2013
@@ -21,10 +21,10 @@ import java.io.IOException;
import java.lang.ref.Reference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
+import java.security.AccessController;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
import java.util.Date;
-import java.util.concurrent.Future;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.ObjectUtils;
@@ -182,23 +182,36 @@ public class CorpusInfo {
} else if(taggerCorpusRef != null){
taggerCorpusRef = null; //reset to null as the reference was taken
}
- //if we do not have a corpus try to load from file
- if(corpus == null && fst.exists() && //if the file exists
- //AND the file was not yet failing to load OR the file is newer
- //as the last version failing to load
- (!fstFileError || FileUtils.isFileNewer(fst, fstDate))){
- try {
- corpus = TaggerFstCorpus.load(fst);
+ if(corpus == null) {
+ try { //STANBOL-1177: load FST models in AccessController.doPrivileged(..)
+ corpus = AccessController.doPrivileged(new PrivilegedExceptionAction<TaggerFstCorpus>() {
+ public TaggerFstCorpus run() throws IOException {
+ if(fst.exists() && //if the file exists AND the file was not yet failing to load
+ //OR the file is newer as the last version failing to load
+ (!fstFileError || FileUtils.isFileNewer(fst, fstDate))){
+ return TaggerFstCorpus.load(fst);
+ } else {
+ return null;
+ }
+ }
+ });
+ } catch (PrivilegedActionException pae) {
+ Exception e = pae.getException();
+ if(e instanceof IOException){ //IO Exception while loading the file
+ this.errorMessage = new StringBuilder("Unable to load FST corpus from "
+ + "FST file: '").append(fst.getAbsolutePath())
+ .append("' (Message: ").append(e.getMessage()).append(")!").toString();
+ log.warn(errorMessage,e);
+ fstFileError = true;
+ } else { //Runtime exception
+ throw RuntimeException.class.cast(e);
+ }
+ }
+ if(corpus != null){
fstFileError = false;
fstDate = new Date(fst.lastModified());
taggerCorpusRef = new SoftReference<TaggerFstCorpus>(corpus);
- } catch (IOException e) {
- this.errorMessage = new StringBuilder("Unable to load FST corpus from "
- + "FST file: '").append(fst.getAbsolutePath())
- .append("' (Message: ").append(e.getMessage()).append(")!").toString();
- log.warn(errorMessage,e);
- fstFileError = true;
- }
+ } //else not loaded from file
}
return corpus;
}