作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有办法不在 PlaceHistoryMapper
中定义所有 Places
?目前我正在使用 Generator
来自动生成所有地点的列表,但我不确定这是正确的方法。
public class AppPlaceHistoryMapper extends AbstractPlaceHistoryMapper<Object> {
@Override
protected PrefixAndToken getPrefixAndToken(Place place) {
if (place instanceof AbstractPlace) {
return new PrefixAndToken(((AbstractPlace) place).getName(), ((AbstractPlace) place).getTokenizer()
.getToken((AbstractPlace) place));
}
throw new RuntimeException("Invalid place: " + place);
}
/**
* This method will be overrided by the gwt-generated class, so any changes made in it will not be executed
*
* @see PlaceMapperGenerator
*/
@Override
protected PlaceTokenizer<?> getTokenizer(String prefix) {
AbstractPlace[] places = {/* List of places generated by PlaceMapperGenerator */};
for (AbstractPlace p : places) {
if (p.getName().equals(prefix)) {
return p.getTokenizer();
}
}
throw new RuntimeException("Unable to find place for provided prefix: " + prefix);
}
}
生成器:
public class PlaceMapperGenerator extends Generator {
// @formatter:off
private static final String GENERATED_METHOD_TEMPLATE =
"protected com.google.gwt.place.shared.PlaceTokenizer<?> getTokenizer(String prefix) {" +
"AbstractPlace[] places = { %s };" +
"for (AbstractPlace p : places) {" +
"if (p.getName().equals(prefix)) {" +
"return p.getTokenizer();" +
"}" +
"}" +
"throw new RuntimeException(\"Unable to find place for provided prefix: \" + prefix);" +
"}"
; // @formatter:on
@Override
public String generate(TreeLogger logger, GeneratorContext context, String typeName) {
JClassType type;
try {
type = context.getTypeOracle().getType(typeName);
} catch (NotFoundException e) {
throw new RuntimeException(e);
}
String implTypeName = type.getSimpleSourceName() + "Impl";
String implPackageName = type.getPackage().getName();
ClassSourceFileComposerFactory composerFactory = new ClassSourceFileComposerFactory(implPackageName,
implTypeName);
composerFactory.setSuperclass(AppPlaceHistoryMapper.class.getName());
@SuppressWarnings("resource")
PrintWriter printWriter = context.tryCreate(logger, implPackageName, implTypeName);
if (printWriter != null) {
SourceWriter sourceWriter = composerFactory.createSourceWriter(context, printWriter);
sourceWriter.print(GENERATED_METHOD_TEMPLATE, getPlaces(context));
sourceWriter.commit(logger);
printWriter.close();
}
return composerFactory.getCreatedClassName();
}
private static String getPlaces(GeneratorContext context) {
JPackage[] packages = context.getTypeOracle().getPackages();
List<String> places = new ArrayList<String>();
for (JPackage p : packages) {
if (p.getName().startsWith(AbstractPlace.class.getPackage().getName())) {
JClassType[] types = p.getTypes();
for (JClassType type : types) {
if (type.getSuperclass() != null
&& type.getSuperclass().getQualifiedSourceName().equals(AbstractPlace.class.getName())) {
places.add("new " + type.getQualifiedSourceName() + "()");
}
}
}
}
return places.toString().replaceAll("^\\[|\\]$", "");
}
}
最佳答案
恐怕要弄清楚应用程序中的 Places 和 Tokenizers 是什么,而不用维护它们的列表,唯一的方法就是像你正在做的那样使用生成器。
无论如何,我不会维护生成器,而是使用 @WithTokenizers
注释并让 GWT 生成您的 PlaceHistoryMapper
查看 GWT MVP dev-guide
@WithTokenizers({HelloPlace.Tokenizer.class, GoodbyePlace.Tokenizer.class})
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper {}
我在我的应用程序中所做的是使用脚本生成 Activity 、 View 、位置并基于模板更新 gin 模块和映射器。
关于java - 如何摆脱 PlaceHistoryMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15447391/
有没有办法不在 PlaceHistoryMapper 中定义所有 Places?目前我正在使用 Generator 来自动生成所有地点的列表,但我不确定这是正确的方法。 public class Ap
如果我实现自己的 PlaceHistoryMapper: public class MyAppPlaceHistoryMapper implements PlaceHistoryMapper {
我希望我的小型 GWT 应用程序具有以下所有“可添加书签”Place小号: http://www.mywebapp.com --> "home page" ht
我是一名优秀的程序员,十分优秀!