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