View Javadoc

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.lang.reflect.Array;
19  import java.util.logging.Level;
20  import java.util.logging.Logger;
21  
22  import org.ov4j.data.ClassComparable;
23  
24  /**
25   * Class used to compare 2 ClassComparable objects.
26   * 
27   * @author smolloy
28   * 
29   */
30  public class ClassComparableComparisonResult extends ComparisonResult<ClassComparable> {
31  	/**
32  	 * Logger for this class
33  	 */
34  	private static final Logger	logger	= Logger.getLogger(ClassComparableComparisonResult.class.getName());
35  
36  	/**
37  	 * @see org.ov4j.comp.ComparisonResult#compute()
38  	 */
39  	@Override
40  	public void compute() {
41  		if (ClassComparableComparisonResult.logger.isLoggable(Level.FINER)) {
42  			ClassComparableComparisonResult.logger.entering("ClassComparableComparisonResult", "compute()", "start");
43  		}
44  
45  		double prec = 0.0;
46  		double recall = 0.0;
47  		if (getOriginal() != null && getChanged() != null) {
48  			if (getOriginal().getTheObject().getClass().isArray()) {
49  				final int numOri = Array.getLength(getOriginal().getTheObject());
50  				final int numCh = Array.getLength(getChanged().getTheObject());
51  				for (int i = 0; i < Array.getLength(getOriginal().getTheObject()); i++) {
52  					final Object a1 = Array.get(getOriginal().getTheObject(), i);
53  					final Object a2 = Array.get(getChanged().getTheObject(), i);
54  					ComparisonResult<Object> result = null;
55  					try {
56  						final Class<? extends ComparisonResult<Object>> compResultClass =
57  							ComparisonResult.findComparisonResultClass(a1);
58  						result = compResultClass.newInstance();
59  					} catch (final Exception e) {
60  						if (ClassComparableComparisonResult.logger.isLoggable(Level.FINE)) {
61  							ClassComparableComparisonResult.logger.logp(Level.FINE, "ClassComparableComparisonResult",
62  								"compute()", "Exception caught", e);
63  						}
64  
65  						result = new DefaultComparisonResult();
66  					}
67  					result.setOriginal(a1);
68  					result.setChanged(a2);
69  					result.compute();
70  					prec += result.getPrecision();
71  					recall = result.getRecall();
72  				}
73  				if (numCh > 0) {
74  					setPrecision(prec / numCh);
75  				} else {
76  					setPrecision(1.0);
77  				}
78  				if (numOri > 0) {
79  					setRecall(recall / numCh);
80  				} else {
81  					setRecall(1.0);
82  				}
83  			} else {
84  				ComparisonResult<Object> result = null;
85  				try {
86  					final Class<? extends ComparisonResult<Object>> compResultClass =
87  						ComparisonResult.findComparisonResultClass(getOriginal().getTheObject());
88  					result = compResultClass.newInstance();
89  				} catch (final Exception e) {
90  					if (ClassComparableComparisonResult.logger.isLoggable(Level.FINE)) {
91  						ClassComparableComparisonResult.logger.logp(Level.FINE, "ClassComparableComparisonResult",
92  							"compute()", "Exception caught", e);
93  					}
94  
95  					result = new DefaultComparisonResult();
96  				}
97  				result.setOriginal(getOriginal().getTheObject());
98  				result.setChanged(getChanged().getTheObject());
99  				result.compute();
100 				setPrecision(result.getPrecision());
101 				setRecall(result.getRecall());
102 			}
103 		}
104 
105 		if (ClassComparableComparisonResult.logger.isLoggable(Level.FINER)) {
106 			ClassComparableComparisonResult.logger.exiting("ClassComparableComparisonResult", "compute()", "end");
107 		}
108 	}
109 
110 	/**
111 	 * @see org.ov4j.comp.ComparisonResult#fastCompute()
112 	 */
113 	@Override
114 	public void fastCompute() {
115 		if (ClassComparableComparisonResult.logger.isLoggable(Level.FINER)) {
116 			ClassComparableComparisonResult.logger
117 				.entering("ClassComparableComparisonResult", "fastCompute()", "start");
118 		}
119 
120 		if (getOriginal() != null && getChanged() != null) {
121 			if (getOriginal().getTheObject().getClass().isArray()) {
122 				final int numOri = Array.getLength(getOriginal().getTheObject());
123 				final int numCh = Array.getLength(getChanged().getTheObject());
124 				if (numOri == numCh) {
125 					int i = 0;
126 					for (; i < Array.getLength(getOriginal().getTheObject()); i++) {
127 						final Object a1 = Array.get(getOriginal().getTheObject(), i);
128 						final Object a2 = Array.get(getChanged().getTheObject(), i);
129 						ComparisonResult<Object> result = null;
130 						try {
131 							final Class<? extends ComparisonResult<Object>> compResultClass =
132 								ComparisonResult.findComparisonResultClass(a1);
133 							result = compResultClass.newInstance();
134 						} catch (final Exception e) {
135 							if (ClassComparableComparisonResult.logger.isLoggable(Level.FINE)) {
136 								ClassComparableComparisonResult.logger.logp(Level.FINE,
137 									"ClassComparableComparisonResult", "fastCompute()", "Exception caught", e);
138 							}
139 
140 							result = new DefaultComparisonResult();
141 						}
142 						result.setOriginal(a1);
143 						result.setChanged(a2);
144 						result.fastCompute();
145 						if (result.getPrecision() < 1.0) {
146 							i = Integer.MAX_VALUE - 1;
147 						}
148 					}
149 					if (i < Integer.MAX_VALUE) {
150 						setPrecision(1.0);
151 					}
152 				}
153 			} else {
154 				ComparisonResult<Object> result = null;
155 				try {
156 					final Class<? extends ComparisonResult<Object>> compResultClass =
157 						ComparisonResult.findComparisonResultClass(getOriginal().getTheObject());
158 					result = compResultClass.newInstance();
159 				} catch (final Exception e) {
160 					if (ClassComparableComparisonResult.logger.isLoggable(Level.FINE)) {
161 						ClassComparableComparisonResult.logger.logp(Level.FINE, "ClassComparableComparisonResult",
162 							"fastCompute()", "Exception caught", e);
163 					}
164 
165 					result = new DefaultComparisonResult();
166 				}
167 				result.setOriginal(getOriginal().getTheObject());
168 				result.setChanged(getChanged().getTheObject());
169 				result.fastCompute();
170 				setPrecision(result.getPrecision());
171 			}
172 		}
173 
174 		if (ClassComparableComparisonResult.logger.isLoggable(Level.FINER)) {
175 			ClassComparableComparisonResult.logger.exiting("ClassComparableComparisonResult", "fastCompute()", "end");
176 		}
177 	}
178 
179 }