2009-07-14 11 views
4

wir verwenden Velocity, um unsere Konfigurationsdateien für mehrere verschiedene Umgebungen zu erstellen und dieser Prozess funktioniert wirklich gut, aber ich habe eine kurze Frage zum Parsen einer Datei, die nicht existiert.Velocity mit #parse wo die Datei nicht existiert

Meine Frage ist: Wie überprüfen Sie, ob eine Datei vor der Analyse vorhanden ist?

Also im Beispiel könnte die Datei default.user.properties legitim nicht existieren und wenn es nicht der Rest der Datei wird nicht geparst.

Ich weiß eine Lösung ist, um sicherzustellen, dass die Datei immer da ist, aber es wäre schön, wenn ich nicht müsste.

Vielen Dank im Voraus.

Antwort

1

Eine neue Art von Event-Handler "IncludeEventHandler". Auf diese Weise können Sie als Entwickler eine Klasse definieren (die IncludeEventHandler implementiert), die jedes Mal aufgerufen wird, wenn eine #parse oder #include ausgewertet wird. Der Zweck Ihres Event-Handlers besteht darin, zu prüfen, ob die Vorlage existiert, und ein Fehler-Flag für den aufrufenden Code zu setzen, falls dies nicht der Fall ist. Überprüfen Sie für weitere Informationen die Dokumentation obwohl ich es selbst nicht getestet

+0

Danke für die Antwort der org.apache.velocity.app.event.IncludeEventHandler sieht interessant aus, obwohl ein bisschen mehr Mühe, als ich gehofft hatte, :) Es ist auch kompliziert, wie wir die Dateien zusammenführen/Vorlage alle aus ant so Es ist nicht klar, wie ich die neue Implementierung von IncludeEventHandler anschließen werde. Aber ich werde dem nachgehen und meine Ergebnisse veröffentlichen. –

1

Die Lösung, die ich verwendet, um eine Hilfsmethode zur Überprüfung Vorlage Existenz zu schaffen, dh

public synchronized boolean templateExists(String templateFilename) { 
    Boolean templateExists = this.templateExistsCache.get(templateFilename); 
    if (templateExists != null) { 
     return templateExists; 
    } 
    String absoluteFilename = this.request.getSession().getServletContext().getRealPath(
      "/WEB-INF/templates/" + templateFilename); 
    File templateFile = new File(absoluteFilename); 
    templateExists = templateFile.exists(); 
    this.templateExistsCache.put(templateFilename, templateExists); 
    return templateExists; 
} 

private Map<String, Boolean> templateExistsCache = new HashMap<String, Boolean>(); 

von

https://github.com/okohll/agileBase/blob/master/gtpb_server/src/com/gtwm/pb/model/manageData/ViewTools.java

3

Just tat dies mit Feder und Geschwindigkeit:

Ich hatte Probleme, Geschwindigkeit zu bekommen abholen meine Event-Handler, am Ende ist es in der Servlet-XML-Datei angeben:

<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer"> 
     <property name="resourceLoaderPath" value="WEB-INF/templates"/> 
     <property name="velocityPropertiesMap"> 
      <map> 
       <entry key="eventhandler.include.class"><value>com.velocity.events.OptionalIncludeEventHandler</value></entry> 
      </map> 
     </property> 
    </bean> 

Es ist einfach nicht akzeptieren würde ich in den Eigenschaften setze Datei - es würde die Klasse instanziiert, aber nicht registriert es als Ereignis Hörer. sehr frustrierend.

Die Klasse selbst ist einfach, eine ganz eklatante Abzocke aus der bestehenden Geschwindigkeitsklasse „org.apache.velocity.app.event.implementIncludeNotFound“. Die vorhandene Velocity-Implementierung prüft das Vorhandensein der Datei und gibt, falls nicht vorhanden, eine konfigurierbare Alternative zurück (Standard: notfound.vm).

Meins ist genau das gleiche, außer es gibt null zurück, wenn die Datei nicht existiert, den Parser verursacht dies überspringen include/parsen Richtlinie:

public class OptionalIncludeEventHandler implements IncludeEventHandler, RuntimeServicesAware { 

    private RuntimeServices rs; 

    @Override 
    public void setRuntimeServices(RuntimeServices rs) { 
     this.rs = rs; 
    } 

    @Override 
    public String includeEvent(String includeResourcePath, String currentResourcePath, String directiveName) { 
     return rs.getLoaderNameForResource(includeResourcePath) != null ? includeResourcePath : null; 
    } 

} 

Arbeiten wie ein Charme.

Ich hoffe, es ist nützlich.