add setter support

master
yihua.huang 2013-08-02 07:32:37 +08:00
parent abba3b7bff
commit 06a39af0f3
2 changed files with 52 additions and 5 deletions

View File

@ -3,6 +3,7 @@ package us.codecraft.webmagic.annotation;
import us.codecraft.webmagic.selector.Selector;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* @author yihua.huang@dianping.com <br>
@ -17,6 +18,8 @@ class FieldExtractor {
private final Source source;
private Method setterMethod;
static enum Source {Html, Url}
public FieldExtractor(Field field, Selector selector) {
@ -42,4 +45,12 @@ class FieldExtractor {
Source getSource() {
return source;
}
void setSetterMethod(Method setterMethod) {
this.setterMethod = setterMethod;
}
Method getSetterMethod() {
return setterMethod;
}
}

View File

@ -1,5 +1,6 @@
package us.codecraft.webmagic.annotation;
import org.apache.commons.lang3.StringUtils;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.selector.CssSelector;
import us.codecraft.webmagic.selector.RegexSelector;
@ -8,6 +9,8 @@ import us.codecraft.webmagic.selector.XpathSelector;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
@ -54,7 +57,12 @@ class PageModelExtractor {
default:
selector = new XpathSelector(value);
}
fieldExtractors.add(new FieldExtractor(field, selector));
FieldExtractor fieldExtractor = new FieldExtractor(field, selector);
Method setterMethod = getSetterMethod(clazz, field);
if (setterMethod != null) {
fieldExtractor.setSetterMethod(setterMethod);
}
fieldExtractors.add(fieldExtractor);
}
ExtractByUrl extractByUrl = field.getAnnotation(ExtractByUrl.class);
if (extractByUrl != null) {
@ -62,11 +70,27 @@ class PageModelExtractor {
if (regexPattern.trim().equals("")) {
regexPattern = ".*";
}
fieldExtractors.add(new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url));
FieldExtractor fieldExtractor = new FieldExtractor(field, new RegexSelector(regexPattern), FieldExtractor.Source.Url);
Method setterMethod = getSetterMethod(clazz, field);
if (setterMethod != null) {
fieldExtractor.setSetterMethod(setterMethod);
}
fieldExtractors.add(fieldExtractor);
}
}
}
public static Method getSetterMethod(Class clazz, Field field) {
String name = "set" + StringUtils.capitalize(field.getName());
try {
Method declaredMethod = clazz.getDeclaredMethod(name, field.getType());
declaredMethod.setAccessible(true);
return declaredMethod;
} catch (NoSuchMethodException e) {
return null;
}
}
private void initTargetUrlPatterns() {
targetUrlPatterns = new ArrayList<Pattern>();
Annotation annotation = clazz.getAnnotation(TargetUrl.class);
@ -94,24 +118,36 @@ class PageModelExtractor {
try {
o = clazz.newInstance();
for (FieldExtractor fieldExtractor : fieldExtractors) {
String value;
switch (fieldExtractor.getSource()) {
case Html:
fieldExtractor.getField().set(o, fieldExtractor.getSelector().select(page.getHtml().toString()));
value = fieldExtractor.getSelector().select(page.getHtml().toString());
break;
case Url:
fieldExtractor.getField().set(o, fieldExtractor.getSelector().select(page.getUrl().toString()));
value = fieldExtractor.getSelector().select(page.getUrl().toString());
break;
default:
value = fieldExtractor.getSelector().select(page.getHtml().toString());
}
setField(o,fieldExtractor,value);
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return o;
}
private void setField(Object o, FieldExtractor fieldExtractor, String value) throws IllegalAccessException, InvocationTargetException {
if (fieldExtractor.getSetterMethod()!=null){
fieldExtractor.getSetterMethod().invoke(o,value);
}
fieldExtractor.getField().set(o, value);
}
Class getClazz() {
return clazz;
}