2013-03-16 172 views
3

有没有什么办法不能在PlaceHistoryMapper中定义所有Places? 此刻,我正在使用Generator以自动生成所有地点的列表,但我不确定这是否是正确的方式。如何摆脱PlaceHistoryMapper

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("^\\[|\\]$", ""); 
    } 
} 

回答

1

恐怕只有这样,才能弄清楚什么地方和断词在你的应用程序,而保持与他们的列表,是一台发电机像你这样做。的

反正不是维持发生器我会用@WithTokenizers注解,让GWT生成你PlaceHistoryMapper看看到GWT MVP dev-guide

@WithTokenizers({HelloPlace.Tokenizer.class, GoodbyePlace.Tokenizer.class}) 
public interface AppPlaceHistoryMapper extends PlaceHistoryMapper {} 

我在我的应用程序做的是使用脚本生成活动,视图,地点和基于模板更新杜松子酒模块和映射器。

+0

那么,我的问题是如何避免使用这种方法。 – Slam 2013-03-17 19:51:09

+0

我误解了你的问题,我以为你想摆脱你的PlaceHistoryMapper中的所有代码。编辑我的回应。 – 2013-03-17 22:19:55