organizing imports
[mir.git] / source / mir / generator / GeneratorLibraryRepository.java
1 package mir.generator;
2
3 import java.util.HashMap;
4 import java.util.Map;
5
6 import mir.log.LoggerWrapper;
7 import mir.util.SimpleParser;
8
9 public class GeneratorLibraryRepository {
10   private Map factories;
11   private LoggerWrapper logger;
12
13   public GeneratorLibraryRepository() {
14     factories = new HashMap();
15     logger = new LoggerWrapper("TemplateEngine");
16   }
17
18   public void registerLibraryFactory(String aName, Generator.GeneratorLibraryFactory aFactory) {
19     factories.put(aName, aFactory);
20   }
21
22   public Generator.GeneratorLibrary constructLibrary(String aName, String aParameters) throws GeneratorExc {
23     if (!factories.containsKey(aName))
24       throw new GeneratorExc("Unknown library factory: "+aName);
25
26     return ((Generator.GeneratorLibraryFactory) factories.get(aName)).makeLibrary(aParameters);
27   }
28
29   private final static String SPACE = "[\t\n\r ]*";
30   private final static String IDENTIFIER = "[a-zA-Z_][a-zA-Z0-9_]*";
31   private final static String EQUALS = "=";
32   private final static String LEFT_PARENTHESIS = "[(]";
33   private final static String RIGHT_PARENTHESIS = "[)]";
34   private final static String FACTORY_PARAMETERS = "[^)]*";
35   private final static String SEMICOLON = ";";
36
37   public Generator.GeneratorLibrary constructCompositeLibrary(String aSpecification) throws GeneratorExc, GeneratorFailure {
38     String identifier;
39     String factory;
40     String factoryParameters;
41     CompositeGeneratorLibrary result = new CompositeGeneratorLibrary();
42     boolean first=true;
43
44     SimpleParser parser = new SimpleParser(aSpecification);
45     try {
46       parser.skip(SPACE);
47       while (!parser.isAtEnd()) {
48         identifier = parser.parse(IDENTIFIER, "library key expected");
49         parser.skip(SPACE);
50         parser.parse(EQUALS, "'=' expected");
51         parser.skip(SPACE);
52         factory = parser.parse(IDENTIFIER, "factory name expected");
53         parser.skip(SPACE);
54         parser.parse(LEFT_PARENTHESIS, "'(' expected");
55         factoryParameters = parser.parse(FACTORY_PARAMETERS, "parameters expected");
56         parser.parse(RIGHT_PARENTHESIS, "')' expected");
57
58         result.addLibrary(identifier, constructLibrary(factory, factoryParameters), first);
59         first=false;
60         parser.skip(SPACE);
61
62         if (!parser.isAtEnd()) {
63           parser.parse(SEMICOLON, "; expected");
64         }
65       }
66     }
67     catch (Exception e) {
68       e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));
69       throw new GeneratorFailure("Failed to construct generator library: " + e.getMessage(), e);
70     }
71
72     return result;
73   }
74 }