1 /** 2 * Copyright 2005 Steve Molloy 3 * 4 * This file is part of OV4J. 5 * 6 * OV4J is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. 8 * 9 * OV4J is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty 10 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. 11 * 12 * You should have received a copy of the GNU General Public License along with OV4J; if not, write to the Free Software 13 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 14 * 15 */ 16 package org.ov4j.comp; 17 18 import java.net.URI; 19 import java.net.URISyntaxException; 20 import java.net.UnknownHostException; 21 import java.util.logging.Level; 22 import java.util.logging.Logger; 23 24 import org.ov4j.Config; 25 26 /** 27 * This class is used to compare URIs. 28 * 29 * @author smolloy 30 * 31 */ 32 public class URIComparisonResult extends ComparisonResult<URI> { 33 /** 34 * Logger for this class 35 */ 36 private static final Logger logger = Logger.getLogger(URIComparisonResult.class.getName()); 37 38 /** 39 * Normalize the URI so it can be sorted and compared. This will try to add missing ports according to protocol and 40 * replace hostname with IP address. 41 * 42 * @param uri 43 * URI to normalize. 44 * @return Normalized URI. 45 * @throws UnknownHostException 46 * @throws URISyntaxException 47 */ 48 public static URI normalizeURI(final URI uri) throws UnknownHostException, URISyntaxException { 49 if (URIComparisonResult.logger.isLoggable(Level.FINEST)) { 50 URIComparisonResult.logger.entering("URIComparisonResult", "normalizeURI(URI=" + uri + ")", "start"); 51 } 52 53 int port = uri.getPort(); 54 if (port < 1 && uri.getScheme() != null) { 55 final String defaultPort = Config.getString("OV4J.ports." + uri.getScheme()); 56 if (defaultPort != null) { 57 port = Integer.parseInt(defaultPort); 58 } 59 } 60 final URI res = 61 new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), port, uri.getPath(), uri.getQuery(), uri 62 .getFragment()); 63 64 if (URIComparisonResult.logger.isLoggable(Level.FINEST)) { 65 URIComparisonResult.logger.exiting("URIComparisonResult", "normalizeURI(URI=" + uri + ")", 66 "end - return value=" + res); 67 } 68 return res; 69 } 70 71 /** 72 * @see org.ov4j.comp.ComparisonResult#compute() 73 */ 74 @Override 75 public void compute() { 76 if (URIComparisonResult.logger.isLoggable(Level.FINER)) { 77 URIComparisonResult.logger.entering("URIComparisonResult", "compute()", "start"); 78 } 79 80 if (getOriginal() != null && getChanged() != null) { 81 URI u1 = null; 82 URI u2 = null; 83 try { 84 u1 = URIComparisonResult.normalizeURI(getOriginal()); 85 u2 = URIComparisonResult.normalizeURI(getChanged()); 86 } catch (final Exception e) { 87 if (URIComparisonResult.logger.isLoggable(Level.FINE)) { 88 URIComparisonResult.logger.logp(Level.FINE, "URIComparisonResult", "compute()", "Exception caught", 89 e); 90 } 91 92 u1 = getOriginal(); 93 u2 = getChanged(); 94 } 95 final SentenceComparisonResult hostComp = new SentenceComparisonResult(); 96 hostComp.setOriginal(u1.getHost()); 97 hostComp.setChanged(u2.getHost()); 98 hostComp.compute(); 99 final SentenceComparisonResult pathComp = new SentenceComparisonResult(); 100 pathComp.setOriginal(u1.getPath()); 101 pathComp.setChanged(u2.getPath()); 102 pathComp.compute(); 103 final StringComparisonResult schemeComp = new StringComparisonResult(); 104 schemeComp.setOriginal(u1.getScheme()); 105 schemeComp.setChanged(u2.getScheme()); 106 schemeComp.compute(); 107 final NumericComparisonResult<Integer> portComp = new NumericComparisonResult<Integer>(); 108 portComp.setOriginal(Integer.valueOf(u1.getPort())); 109 portComp.setChanged(Integer.valueOf(u2.getPort())); 110 portComp.compute(); 111 setPrecision(0.4 * hostComp.getPrecision() + 0.4 * pathComp.getPrecision() + 0.1 112 * schemeComp.getPrecision() + 0.1 * portComp.getPrecision()); 113 setRecall(0.4 * hostComp.getRecall() + 0.4 * pathComp.getRecall() + 0.1 * schemeComp.getRecall() + 0.1 114 * portComp.getRecall()); 115 } 116 117 if (URIComparisonResult.logger.isLoggable(Level.FINER)) { 118 URIComparisonResult.logger.exiting("URIComparisonResult", "compute()", "end"); 119 } 120 } 121 122 /** 123 * @see org.ov4j.comp.ComparisonResult#fastCompute() 124 */ 125 @Override 126 public void fastCompute() { 127 if (URIComparisonResult.logger.isLoggable(Level.FINER)) { 128 URIComparisonResult.logger.entering("URIComparisonResult", "fastCompute()", "start"); 129 } 130 131 if (getOriginal() != null && getChanged() != null && getOriginal().equals(getChanged())) { 132 setPrecision(1.0); 133 } 134 135 if (URIComparisonResult.logger.isLoggable(Level.FINER)) { 136 URIComparisonResult.logger.exiting("URIComparisonResult", "fastCompute()", "end"); 137 } 138 } 139 140 }