2013-03-16 254 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