View Javadoc

1   package de.matthias_burbach.mosaique.core.model;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   
6   import de.matthias_burbach.mosaique.core.parser.JspParser;
7   
8   /***
9    * @author Matthias Burbach
10   */
11  public class JspResolver {
12      /***
13       * The singleton instance of this class.
14       */
15      private static JspResolver instance = new JspResolver(null, null);
16  
17      /***
18       * The absolute path of the web application's document root to prepend
19       * to relative JSP paths.
20       * Is not used if the path finder has been set.
21       */
22      private String root = "";
23  
24      /***
25       * The optional path finder to map relative paths to absolute paths.
26       * Was introduced with the port to Eclipse where path logic is more
27       * complicated.
28       */
29      private PathFinder pathFinder;
30  
31      /***
32       * The context to use by this instance.
33       */
34      private Context context;
35  
36      /***
37       * The JSP parser to parse JSPs lazily on demand with.
38       */
39      private JspParser parser = new JspParser();
40  
41      /***
42       * The map of already resolved JSPs of type {@link Jsp} keyed by their
43       * relative paths of type {@link String}.
44       */
45      private Map resolvedJsps = new HashMap();
46  
47      /***
48       * @return The singleton instance of this class.
49       */
50      public static JspResolver getInstance() {
51          return instance;
52      }
53  
54      /***
55       * @param pathFinder The optional path finder to map relative paths to
56       *                   absolute paths.
57       *                   Was introduced with the port to Eclipse where path
58       *                   logic is more complicated.
59       * @param context The context to use by this instance.
60       */
61      public JspResolver(final PathFinder pathFinder, final Context context) {
62          this.pathFinder = pathFinder;
63          this.context = context;
64      }
65  
66      /***
67       * @param root The absolute path of the web application's document root to
68       *             prepend to relative JSP paths.
69       */
70      public void setRoot(final String root) {
71          this.root = root;
72      }
73  
74      /***
75       * Clears the internal map of already resolved JSPs.
76       */
77      public void clear() {
78          resolvedJsps.clear();
79      }
80  
81      /***
82       * @param relativePath The relative path of a JSP to resolve.
83       * @return The JSP resolved or <code>null</code>.
84       */
85      public Jsp resolve(final String relativePath) {
86          Jsp jsp = (Jsp) resolvedJsps.get(relativePath);
87          try {
88              if (jsp == null) {
89                  String path = null;
90                  if (pathFinder != null) {
91                      path = pathFinder.findAbsolutePath(relativePath);
92                  } else {
93                      path = root + "/" + relativePath;
94                  }
95                  if (path != null) {
96                      jsp = parser.parse(path, context);
97                      resolvedJsps.put(relativePath, jsp);
98                  }
99              }
100         } catch (Exception e) {
101             e.printStackTrace();
102         }
103         return jsp;
104     }
105 }