com.aelitis.azureus.core.metasearch.Result.java Source code

Java tutorial

Introduction

Here is the source code for com.aelitis.azureus.core.metasearch.Result.java

Source

/*
 * Created on May 6, 2008
 * Created by Paul Gardner
 * 
 * Copyright 2008 Vuze, Inc.  All rights reserved.
 * 
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2 of the License only.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
 */

package com.aelitis.azureus.core.metasearch;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Random;

import org.apache.commons.lang.Entities;
import org.gudy.azureus2.core3.util.DisplayFormatters;
import org.json.simple.JSONObject;

import com.aelitis.azureus.core.metasearch.utils.MomentsAgoDateFormatter;

public abstract class Result {
    private static final String HTML_TAGS = "(\\<(/?[^\\>]+)\\>)";
    private static final String DUPLICATE_SPACES = "\\s{2,}";

    private Engine engine;

    public abstract Date getPublishedDate();

    public abstract String getCategory();

    public abstract void setCategory(String category);

    public abstract String getContentType();

    public abstract void setContentType(String contentType);

    public abstract String getName();

    public abstract long getSize();

    public abstract int getNbPeers();

    public abstract int getNbSeeds();

    public abstract int getNbSuperSeeds();

    public abstract int getComments();

    public abstract int getVotes();

    public abstract int getVotesDown();

    public abstract boolean isPrivate();

    public abstract String getDRMKey();

    //Links
    public abstract String getDownloadLink();

    public abstract String getDownloadButtonLink();

    public abstract String getCDPLink();

    public abstract String getPlayLink();

    public abstract float getAccuracy(); // 0.0 -> 1.0 and -1 if not supported

    public abstract String getSearchQuery();

    public abstract String getUID();

    public abstract String getHash();

    protected Result(Engine _engine) {
        engine = _engine;
    }

    public Engine getEngine() {
        return (engine);
    }

    public String toString() {
        return getName() + " : " + getNbSeeds() + " s, " + getNbPeers() + "p, ";
    }

    /*
    public String getNameHTML() {      
       if(getName() != null) {
     return( getName());
     //return( XUXmlWriter.escapeXML( getName()));
     //return Entities.XML.escape(getName());
       }
       return null;
    }
        
    public String getCategoryHTML() {
       if(getCategory() != null) {
     return( getCategory());
     //return Entities.XML.escape(getCategory());
       }
       return null;
    }
    */

    /**
     * 
     * @return a value between 0 and 1 representing the rank of the result
     */
    public float getRank() {

        int seeds = getNbSeeds();
        int peers = getNbPeers();

        if (seeds < 0) {
            seeds = 0;
        }

        if (peers < 0) {
            peers = 0;
        }

        int totalVirtualPeers = 3 * seeds + peers + 2;

        int superSeeds = getNbSuperSeeds();
        if (superSeeds > 0) {
            totalVirtualPeers += 50 * superSeeds;
        }

        int votes = getVotes();
        if (votes > 0) {
            if (votes > 50) {
                votes = 50;
            }
            totalVirtualPeers += 5 * votes;
        }

        int votesDown = getVotesDown();
        if (votesDown > 0) {
            totalVirtualPeers -= 200 * votesDown;
        }

        if (totalVirtualPeers < 2)
            totalVirtualPeers = 2;

        float rank = (float) (Math.log(totalVirtualPeers) / Math.log(10)) / 5f;

        if (rank > 2f)
            rank = 2f;

        if (isPrivate()) {
            rank /= 2;
        }

        String queryString = getSearchQuery();
        String name = getName();
        if (queryString != null && name != null) {
            name = name.toLowerCase(Locale.ENGLISH);

            String token = "";

            List<String> tokens = new ArrayList<String>();

            char[] chars = queryString.toCharArray();

            for (char c : chars) {

                if (Character.isLetterOrDigit(c)) {

                    token += String.valueOf(c).toLowerCase(Locale.ENGLISH);

                } else {

                    if (token.length() > 0) {

                        tokens.add(token);

                        token = "";
                    }
                }
            }

            if (token.length() > 0) {

                tokens.add(token);
            }

            for (String s : tokens) {
                if (!name.contains(s)) {
                    rank /= 2;
                }
            }
        }

        rank = applyRankBias(rank);

        return rank;
    }

    protected float applyRankBias(float _rank) {
        float rank = engine.applyRankBias(_rank);

        /*
        if ( rank != _rank ){
               
           System.out.println( "bias applied for " + engine.getName() + ": " + _rank + "-> " + rank );
        }
        */

        return (rank);
    }

    public Map toJSONMap() {
        Map object = new JSONObject();
        try {
            object.put("d", MomentsAgoDateFormatter.getMomentsAgoString(this.getPublishedDate()));
            object.put("ts", "" + this.getPublishedDate().getTime());
        } catch (Exception e) {
            object.put("d", "unknown");
            object.put("ts", "0");
        }

        object.put("c", this.getCategory());
        object.put("n", this.getName());

        int super_seeds = getNbSuperSeeds();
        int seeds = getNbSeeds();

        int seed_total = -1;

        if (super_seeds > 0) {

            seed_total = 10 * super_seeds + new Random().nextInt(10);
        }

        if (seeds > 0) {

            if (seed_total == -1) {

                seed_total = 0;
            }

            seed_total += seeds;
        }

        object.put("s", "" + seed_total);

        if (this.getNbPeers() >= 0) {
            object.put("p", "" + this.getNbPeers());
        } else {
            object.put("p", "-1");
        }

        int comments = getComments();

        if (comments >= 0) {

            object.put("co", "" + comments);
        }

        long size = this.getSize();
        if (size >= 0) {
            // max three digits for display purposes

            String size_str = DisplayFormatters.formatByteCountToKiBEtc(size);

            size_str = DisplayFormatters.trimDigits(size_str, 3);

            object.put("l", size_str);
            object.put("lb", "" + size);
        } else {
            object.put("l", "-1");
            object.put("lb", "0");
        }

        object.put("r", "" + this.getRank());

        object.put("ct", this.getContentType());

        float accuracy = getAccuracy();

        if (accuracy >= 0) {
            if (accuracy > 1) {
                accuracy = 1;
            }
            object.put("ac", "" + accuracy);
        }

        if (this.getCDPLink().length() > 0) {
            object.put("cdp", this.getCDPLink());
        }

        // This is also used by subscription code to extract download link so if you
        // change this you'll need to change that too...

        if (this.getDownloadLink().length() > 0) {
            object.put("dl", this.getDownloadLink());
        }

        if (this.getDownloadButtonLink().length() > 0) {
            object.put("dbl", this.getDownloadButtonLink());
        }

        if (this.getPlayLink().length() > 0) {
            object.put("pl", this.getPlayLink());
        }

        if (this.getVotes() >= 0) {
            object.put("v", "" + this.getVotes());
        }

        if (this.getVotesDown() >= 0) {
            object.put("vd", "" + this.getVotesDown());
        }

        String drmKey = getDRMKey();
        if (drmKey != null) {
            object.put("dk", drmKey);
        }

        // used by subscriptions...

        String uid = getUID();
        if (uid != null) {
            object.put("u", uid);
        }
        object.put("pr", this.isPrivate() ? "1" : "0");

        String hash = getHash();
        if (hash != null) {
            object.put("h", hash);
        }

        return object;
    }

    public static void adjustRelativeTerms(Map map) {
        String ts = (String) map.get("ts");

        if (ts != null) {

            long l_ts = Long.parseLong(ts);

            if (l_ts > 0) {

                map.put("d", MomentsAgoDateFormatter.getMomentsAgoString(new Date(l_ts)));

            }
        }
    }

    protected static final String removeHTMLTags(String input) {
        if (input == null) {
            return (null);
        }
        String result = input.replaceAll(HTML_TAGS, " ");
        return result.replaceAll(DUPLICATE_SPACES, " ").trim();
    }

    protected static final String unescapeEntities(String input) {
        if (input == null) {
            return (null);
        }
        return (Entities.HTML40.unescape(input));
    }
}