Package com.aelitis.azureus.core.subs.impl

Source Code of com.aelitis.azureus.core.subs.impl.SubscriptionResultFilter

package com.aelitis.azureus.core.subs.impl;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.regex.Pattern;

import com.aelitis.azureus.core.metasearch.Result;
import com.aelitis.azureus.util.ImportExportUtils;

public class
SubscriptionResultFilter
{
 
  private String[]   textFilters;
  private Pattern[]  textFilterPatterns;
 
  private String[]   excludeTextFilters;
  private Pattern[]  excludeTextFilterPatterns;
 
  private String regexFilter;  // unused
 
  private long minSeeds = -1;
  private long minSize = -1;
  private long maxSize = -1;
  private String categoryFilter = null;
 
  public String
  getString()
  {
    String  res = addString( "", "+", getString(textFilters));
 
    res = addString( res, "-", getString(excludeTextFilters));
   
    res = addString( res, "regex=", regexFilter );

    res = addString( res, "cat=", categoryFilter );

    return( res );
  }
 
  private String
  addString(
    String  existing,
    String  key,
    String  rest )
  {
    if ( rest == null || rest.length() == 0 ){
     
      return( existing );
    }
   
    String str = key + rest;
   
    if ( existing == null || existing.length() == 0){
     
      return( str );
    }
   
    return( existing + "," + str );
  }
   
  private String
  getString(
    String[]    strs )
  {
    String  res = "";
   
    for( int i=0;i<strs.length;i++){
      res += (i==0?"":"&") + strs[i];
    }
   
    return( res );
  }
 
  public SubscriptionResultFilter(Map filters) {
    try {
      textFilters = importStrings(filters,"text_filter"," ");
     
      textFilterPatterns = getPatterns( textFilters );
     
      excludeTextFilters = importStrings(filters,"text_filter_out"," ");
     
      excludeTextFilterPatterns = getPatterns( excludeTextFilters );

     
      regexFilter = ImportExportUtils.importString(filters, "text_filter_regex");
     
      minSize = ImportExportUtils.importLong(filters,"min_size",-1l);
     
      maxSize = ImportExportUtils.importLong(filters,"max_size",-1l);
     
      minSeeds = ImportExportUtils.importLong(filters, "min_seeds",-1l);
     
      String rawCategory = ImportExportUtils.importString(filters,"category");
      if(rawCategory != null) {
        categoryFilter = rawCategory.toLowerCase();
      }
     
    } catch(Exception e) {
      //Invalid filters array
    }
  }

  private static Pattern[] NO_PATTERNS = {};
 
  private Pattern[]
  getPatterns(
    String[]  strs )
  {
    if ( strs.length == 0 ){
     
      return( NO_PATTERNS );
    }
   
    Pattern[] pats = new Pattern[strs.length];
   
    for (int i=0;i<strs.length;i++){
   
      try{
        pats[i] = Pattern.compile( strs[i].trim());
       
      }catch( Throwable e ){
       
        System.out.println( "Failed to compile pattern '" + strs[i] );
      }
    }   
   
    return( pats );
  }
 
  private String[] importStrings(Map filters,String key,String separator) throws IOException {
    String rawStringFilter = ImportExportUtils.importString(filters,key);
    if(rawStringFilter != null) {
      StringTokenizer st = new StringTokenizer(rawStringFilter,separator);
      String[] stringFilter = new String[st.countTokens()];
      for(int i = 0 ; i < stringFilter.length ; i++) {
        stringFilter[i] = st.nextToken().toLowerCase();
      }
      return stringFilter;
    }
    return new String[0];
  }
 
  public Result[] filter(Result[] results) {
    List<Result> filteredResults = new ArrayList<Result>(results.length);
    for(int i = 0 ; i < results.length ; i++) {
      Result result = results[i];
     
      String name = result.getName();
      //Results need a name, or they are by default invalid
      if(name == null) {
        continue;
      }
      name = name.toLowerCase();
     
      boolean valid = true;
      for(int j = 0 ; j < textFilters.length ; j++) {
       
        //If one of the text filters do not match, let's not keep testing the others
        // and mark the result as not valid
        if(name.indexOf(textFilters[j]) == -1) {
         
            // double check against reg-expr if exists
         
          Pattern p = textFilterPatterns[j];
         
          if ( p == null  || !p.matcher( name ).find()){
         
            valid = false;
         
            break;
          }
        }
      }
     
      //if invalid after name check, let's get to the next result
      if(!valid) {
        continue;
      }
     
      for(int j = 0 ; j < excludeTextFilters.length ; j++) {
       
        //If one of the text filters do not match, let's not keep testing the others
        // and mark the result as not valid
        if(name.indexOf(excludeTextFilters[j]) != -1) {
          valid = false;
          break;
        }else{
          Pattern p = excludeTextFilterPatterns[j];
         
          if ( p != null  && p.matcher( name ).find()){
            valid = false;
            break;
          }
        }
      }
     
      //if invalid after name check, let's get to the next result
      if(!valid) {
        continue;
      }
     
      long size = result.getSize();
     
      if(minSize > -1) {
        if(minSize > size) {
          continue;
        }
      }
     
      if(maxSize > -1) {
        if(maxSize < size) {
          continue;
        }
      }
     
      if(minSeeds > -1) {
        if(minSeeds < result.getNbSeeds()) {
          continue;
        }
      }
     
      if(categoryFilter != null) {
        String category = result.getCategory();
        if(category == null || !category.equalsIgnoreCase(categoryFilter)) {
          continue;
        }
      }
     
     
      //All filters are ok, let's add the results to the filtered results
      filteredResults.add(result);
     
    }
   
    Result[] fResults = (Result[]) filteredResults.toArray(new Result[filteredResults.size()]);
   
    return fResults;
  }
}
TOP

Related Classes of com.aelitis.azureus.core.subs.impl.SubscriptionResultFilter

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.