You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ch...@apache.org on 2011/08/17 07:45:42 UTC
svn commit: r1158525 - in
/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans:
BindingException.java DocumentObjectBinder.java
Author: chrism
Date: Wed Aug 17 05:45:42 2011
New Revision: 1158525
URL: http://svn.apache.org/viewvc?rev=1158525&view=rev
Log:
SOLR-2708: Cleaned up DocumentObjectBinder
Added:
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/BindingException.java
Modified:
lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
Added: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/BindingException.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/BindingException.java?rev=1158525&view=auto
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/BindingException.java (added)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/BindingException.java Wed Aug 17 05:45:42 2011
@@ -0,0 +1,29 @@
+package org.apache.solr.client.solrj.beans;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class BindingException extends RuntimeException {
+
+ public BindingException(String message) {
+ super(message);
+ }
+
+ public BindingException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java?rev=1158525&r1=1158524&r2=1158525&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java Wed Aug 17 05:45:42 2011
@@ -33,68 +33,66 @@ import java.nio.ByteBuffer;
* @since solr 1.3
*/
public class DocumentObjectBinder {
+
private final Map<Class, List<DocField>> infocache = new ConcurrentHashMap<Class, List<DocField>>();
public DocumentObjectBinder() {
}
public <T> List<T> getBeans(Class<T> clazz, SolrDocumentList solrDocList) {
- List<DocField> fields = getDocFields( clazz );
+ List<DocField> fields = getDocFields(clazz);
List<T> result = new ArrayList<T>(solrDocList.size());
- for(int j=0;j<solrDocList.size();j++) {
- SolrDocument sdoc = solrDocList.get(j);
- result.add(getBean(clazz, fields, sdoc));
+ for (SolrDocument sdoc : solrDocList) {
+ result.add(getBean(clazz, fields, sdoc));
}
return result;
}
+
public <T> T getBean(Class<T> clazz, SolrDocument solrDoc) {
- return getBean(clazz, null,solrDoc);
+ return getBean(clazz, null, solrDoc);
}
private <T> T getBean(Class<T> clazz, List<DocField> fields, SolrDocument solrDoc) {
if (fields == null) {
fields = getDocFields(clazz);
}
- T obj = null;
+
try {
- obj = clazz.newInstance();
+ T obj = clazz.newInstance();
+ for (DocField docField : fields) {
+ docField.inject(obj, solrDoc);
+ }
+ return obj;
} catch (Exception e) {
- throw new RuntimeException("Could not instantiate object of " + clazz, e);
- }
- for (int i = 0; i < fields.size(); i++) {
- DocField docField = fields.get(i);
- docField.inject(obj, solrDoc);
+ throw new BindingException("Could not instantiate object of " + clazz, e);
}
- return obj;
}
- public SolrInputDocument toSolrInputDocument( Object obj )
- {
- List<DocField> fields = getDocFields( obj.getClass() );
- if( fields.isEmpty() ) {
- throw new RuntimeException( "class: "+obj.getClass()+" does not define any fields." );
+ public SolrInputDocument toSolrInputDocument(Object obj) {
+ List<DocField> fields = getDocFields(obj.getClass());
+ if (fields.isEmpty()) {
+ throw new BindingException("class: " + obj.getClass() + " does not define any fields.");
}
-
+
SolrInputDocument doc = new SolrInputDocument();
- for (DocField field : fields) {
- if (field.dynamicFieldNamePatternMatcher != null
- && field.get(obj) != null && field.isContainedInMap) {
- Map<String, Object> mapValue = (HashMap<String, Object>) field
- .get(obj);
-
- for (Map.Entry<String, Object> e : mapValue.entrySet()) {
- doc.setField( e.getKey(), e.getValue(), 1.0f);
- }
- } else {
- doc.setField(field.name, field.get(obj), 1.0f);
- }
+ for (DocField field : fields) {
+ if (field.dynamicFieldNamePatternMatcher != null &&
+ field.get(obj) != null &&
+ field.isContainedInMap) {
+ Map<String, Object> mapValue = (Map<String, Object>) field.get(obj);
+
+ for (Map.Entry<String, Object> e : mapValue.entrySet()) {
+ doc.setField(e.getKey(), e.getValue(), 1.0f);
+ }
+ } else {
+ doc.setField(field.name, field.get(obj), 1.0f);
+ }
}
return doc;
}
- private List<DocField> getDocFields( Class clazz )
- {
+ private List<DocField> getDocFields(Class clazz) {
List<DocField> fields = infocache.get(clazz);
if (fields == null) {
synchronized(infocache) {
@@ -107,12 +105,14 @@ public class DocumentObjectBinder {
private List<DocField> collectInfo(Class clazz) {
List<DocField> fields = new ArrayList<DocField>();
Class superClazz = clazz;
- ArrayList<AccessibleObject> members = new ArrayList<AccessibleObject>();
+ List<AccessibleObject> members = new ArrayList<AccessibleObject>();
+
while (superClazz != null && superClazz != Object.class) {
members.addAll(Arrays.asList(superClazz.getDeclaredFields()));
members.addAll(Arrays.asList(superClazz.getDeclaredMethods()));
superClazz = superClazz.getSuperclass();
}
+
for (AccessibleObject member : members) {
if (member.isAnnotationPresent(Field.class)) {
member.setAccessible(true);
@@ -128,14 +128,15 @@ public class DocumentObjectBinder {
private Method setter;
private Method getter;
private Class type;
- private boolean isArray = false, isList=false;
+ private boolean isArray;
+ private boolean isList;
/*
* dynamic fields may use a Map based data structure to bind a given field.
* if a mapping is done using, "Map<String, List<String>> foo", <code>isContainedInMap</code>
* is set to <code>TRUE</code> as well as <code>isList</code> is set to <code>TRUE</code>
*/
- boolean isContainedInMap =false;
+ private boolean isContainedInMap;
private Pattern dynamicFieldNamePatternMatcher;
public DocField(AccessibleObject member) {
@@ -149,21 +150,19 @@ public class DocumentObjectBinder {
storeType();
// Look for a matching getter
- if( setter != null ) {
+ if (setter != null) {
String gname = setter.getName();
- if( gname.startsWith("set") ) {
+ if (gname.startsWith("set")) {
gname = "get" + gname.substring(3);
try {
- getter = setter.getDeclaringClass().getMethod( gname, (Class[])null );
- }
- catch( Exception ex ) {
+ getter = setter.getDeclaringClass().getMethod(gname, (Class[]) null);
+ } catch( Exception ex ) {
// no getter -- don't worry about it...
- if( type == Boolean.class ) {
- gname = "is" + setter.getName().substring( 3 );
+ if (type == Boolean.class) {
+ gname = "is" + setter.getName().substring(3);
try {
- getter = setter.getDeclaringClass().getMethod( gname, (Class[])null );
- }
- catch( Exception ex2 ) {
+ getter = setter.getDeclaringClass().getMethod(gname, (Class[]) null);
+ } catch(Exception ex2) {
// no getter -- don't worry about it...
}
}
@@ -184,9 +183,7 @@ public class DocumentObjectBinder {
name = setter.getName();
}
}
- }
- //dynamic fields are annotated as @Field("categories_*")
- else if(annotation.value().indexOf('*') >= 0){
+ } else if(annotation.value().indexOf('*') >= 0){ //dynamic fields are annotated as @Field("categories_*")
//if the field was annotated as a dynamic field, convert the name into a pattern
//the wildcard (*) is supposed to be either a prefix or a suffix, hence the use of replaceFirst
name = annotation.value().replaceFirst("\\*", "\\.*");
@@ -201,66 +198,52 @@ public class DocumentObjectBinder {
type = field.getType();
} else {
Class[] params = setter.getParameterTypes();
- if (params.length != 1)
- throw new RuntimeException("Invalid setter method. Must have one and only one parameter");
+ if (params.length != 1) {
+ throw new BindingException("Invalid setter method. Must have one and only one parameter");
+ }
type = params[0];
}
+
if(type == Collection.class || type == List.class || type == ArrayList.class) {
type = Object.class;
isList = true;
- /*ParameterizedType parameterizedType = null;
- if(field !=null){
- if( field.getGenericType() instanceof ParameterizedType){
- parameterizedType = (ParameterizedType) field.getGenericType();
- Type[] types = parameterizedType.getActualTypeArguments();
- if (types != null && types.length > 0) type = (Class) types[0];
- }
- }*/
- } else if(type == byte[].class){
+ } else if (type == byte[].class) {
//no op
- }else if (type.isArray()) {
+ } else if (type.isArray()) {
isArray = true;
type = type.getComponentType();
- }
- //corresponding to the support for dynamicFields
- else if (type == Map.class || type == HashMap.class) {
+ } else if (type == Map.class || type == HashMap.class) { //corresponding to the support for dynamicFields
isContainedInMap = true;
//assigned a default type
type = Object.class;
- if(field != null){
- if(field.getGenericType() instanceof ParameterizedType){
+ if (field != null) {
+ if (field.getGenericType() instanceof ParameterizedType) {
//check what are the generic values
ParameterizedType parameterizedType = (ParameterizedType) field.getGenericType();
Type[] types = parameterizedType.getActualTypeArguments();
- if(types != null && types.length == 2 && types[0] == String.class){
+ if (types != null && types.length == 2 && types[0] == String.class) {
//the key should always be String
//Raw and primitive types
- if(types[1] instanceof Class){
- //the value could be multivalued then it is a List ,Collection,ArrayList
+ if (types[1] instanceof Class) {
+ //the value could be multivalued then it is a List, Collection, ArrayList
if(types[1]== Collection.class || types[1] == List.class || types[1] == ArrayList.class){
type = Object.class;
isList = true;
- }else{
+ } else{
//else assume it is a primitive and put in the source type itself
type = (Class) types[1];
}
- }
- //Of all the Parameterized types, only List is supported
- else if(types[1] instanceof ParameterizedType){
+ } else if( types[1] instanceof ParameterizedType) { //Of all the Parameterized types, only List is supported
Type rawType = ((ParameterizedType)types[1]).getRawType();
if(rawType== Collection.class || rawType == List.class || rawType == ArrayList.class){
type = Object.class;
isList = true;
}
- }
- //Array types
- else if(types[1] instanceof GenericArrayType){
+ } else if (types[1] instanceof GenericArrayType) { //Array types
type = (Class) ((GenericArrayType) types[1]).getGenericComponentType();
isArray = true;
- }
- //Throw an Exception if types are not known
- else{
- throw new RuntimeException("Allowed type for values of mapping a dynamicField are : " +
+ } else { //Throw an Exception if types are not known
+ throw new BindingException("Allowed type for values of mapping a dynamicField are : " +
"Object, Object[] and List");
}
}
@@ -279,31 +262,35 @@ public class DocumentObjectBinder {
@SuppressWarnings("unchecked")
private Object getFieldValue(SolrDocument sdoc){
Object fieldValue = sdoc.getFieldValue(name);
- if(fieldValue != null) {
+ if (fieldValue != null) {
//this is not a dynamic field. so return te value
return fieldValue;
}
//reading dynamic field values
- if(dynamicFieldNamePatternMatcher != null){
+ if (dynamicFieldNamePatternMatcher != null) {
Map<String, Object> allValuesMap = null;
- ArrayList allValuesList = null;
- if(isContainedInMap){
+ List allValuesList = null;
+ if (isContainedInMap) {
allValuesMap = new HashMap<String, Object>();
} else {
allValuesList = new ArrayList();
}
- for(String field : sdoc.getFieldNames()){
- if(dynamicFieldNamePatternMatcher.matcher(field).find()){
+
+ for (String field : sdoc.getFieldNames()) {
+ if (dynamicFieldNamePatternMatcher.matcher(field).find()) {
Object val = sdoc.getFieldValue(field);
- if(val == null) continue;
- if(isContainedInMap){
- if(isList){
+ if (val == null) {
+ continue;
+ }
+
+ if (isContainedInMap) {
+ if (isList) {
if (!(val instanceof List)) {
- ArrayList al = new ArrayList();
+ List al = new ArrayList();
al.add(val);
val = al;
}
- } else if(isArray){
+ } else if (isArray) {
if (!(val instanceof List)) {
Object[] arr= (Object[]) Array.newInstance(type,1);
arr[0] = val;
@@ -313,7 +300,7 @@ public class DocumentObjectBinder {
}
}
allValuesMap.put(field, val);
- }else {
+ } else {
if (val instanceof Collection) {
allValuesList.addAll((Collection) val);
} else {
@@ -330,31 +317,33 @@ public class DocumentObjectBinder {
}
return null;
}
+
<T> void inject(T obj, SolrDocument sdoc) {
Object val = getFieldValue(sdoc);
if(val == null) {
return;
}
- if(isArray && !isContainedInMap){
- List list = null;
- if(val.getClass().isArray()){
+
+ if (isArray && !isContainedInMap) {
+ List list;
+ if (val.getClass().isArray()) {
set(obj,val);
return;
} else if (val instanceof List) {
list = (List) val;
- } else{
+ } else {
list = new ArrayList();
list.add(val);
}
- set(obj, list.toArray((Object[]) Array.newInstance(type,list.size())));
- } else if(isList && !isContainedInMap){
+ set(obj, list.toArray((Object[]) Array.newInstance(type,list.size())));
+ } else if (isList && !isContainedInMap) {
if (!(val instanceof List)) {
- ArrayList list = new ArrayList();
+ List list = new ArrayList();
list.add(val);
val = list;
}
set(obj, val);
- } else if(isContainedInMap){
+ } else if (isContainedInMap) {
if (val instanceof Map) {
set(obj, val);
}
@@ -366,8 +355,8 @@ public class DocumentObjectBinder {
private void set(Object obj, Object v) {
- if(v!= null && type == ByteBuffer.class && v.getClass()== byte[].class) {
- v = ByteBuffer.wrap((byte[])v);
+ if (v != null && type == ByteBuffer.class && v.getClass() == byte[].class) {
+ v = ByteBuffer.wrap((byte[]) v);
}
try {
if (field != null) {
@@ -377,29 +366,25 @@ public class DocumentObjectBinder {
}
}
catch (Exception e) {
- throw new RuntimeException("Exception while setting value : "+v+" on " + (field != null ? field : setter), e);
+ throw new BindingException("Exception while setting value : " + v + " on " + (field != null ? field : setter), e);
}
}
-
- public Object get( final Object obj )
- {
+
+ public Object get(final Object obj) {
if (field != null) {
try {
return field.get(obj);
- }
- catch (Exception e) {
- throw new RuntimeException("Exception while getting value: " + field, e);
+ } catch (Exception e) {
+ throw new BindingException("Exception while getting value: " + field, e);
}
+ } else if (getter == null) {
+ throw new BindingException("Missing getter for field: " + name + " -- You can only call the 'get' for fields that have a field of 'get' method");
}
- else if (getter == null) {
- throw new RuntimeException( "Missing getter for field: "+name+" -- You can only call the 'get' for fields that have a field of 'get' method" );
- }
-
+
try {
- return getter.invoke( obj, (Object[])null );
- }
- catch (Exception e) {
- throw new RuntimeException("Exception while getting value: " + getter, e);
+ return getter.invoke(obj, (Object[]) null);
+ } catch (Exception e) {
+ throw new BindingException("Exception while getting value: " + getter, e);
}
}
}