- experimental opensessions
[mir.git] / source / mir / generator / GeneratorLibraryRepository.java
1 /*
2  * Copyright (C) 2001, 2002  The Mir-coders group
3  *
4  * This file is part of Mir.
5  *
6  * Mir is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * Mir is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Mir; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  * In addition, as a special exception, The Mir-coders gives permission to link
21  * the code of this program with the com.oreilly.servlet library, any library
22  * licensed under the Apache Software License, The Sun (tm) Java Advanced
23  * Imaging library (JAI), The Sun JIMI library (or with modified versions of
24  * the above that use the same license as the above), and distribute linked
25  * combinations including the two.  You must obey the GNU General Public
26  * License in all respects for all of the code used other than the above
27  * mentioned libraries.  If you modify this file, you may extend this exception
28  * to your version of the file, but you are not obligated to do so.  If you do
29  * not wish to do so, delete this exception statement from your version.
30  */
31
32 package mir.generator;
33
34 import java.util.HashMap;
35 import java.util.Map;
36
37 import mir.log.LoggerWrapper;
38 import mir.util.SimpleParser;
39
40 public class GeneratorLibraryRepository {
41   private Map factories;
42   private LoggerWrapper logger;
43
44   public GeneratorLibraryRepository() {
45     factories = new HashMap();
46     logger = new LoggerWrapper("TemplateEngine");
47   }
48
49   public void registerLibraryFactory(String aName, Generator.GeneratorLibraryFactory aFactory) {
50     factories.put(aName, aFactory);
51   }
52
53   public Generator.GeneratorLibrary constructLibrary(String aName, String aParameters) throws GeneratorExc {
54     if (!factories.containsKey(aName))
55       throw new GeneratorExc("Unknown library factory: "+aName);
56
57     return ((Generator.GeneratorLibraryFactory) factories.get(aName)).makeLibrary(aParameters);
58   }
59
60   private final static String SPACE = "[\t\n\r ]*";
61   private final static String IDENTIFIER = "[a-zA-Z_][a-zA-Z0-9_]*";
62   private final static String EQUALS = "=";
63   private final static String LEFT_PARENTHESIS = "[(]";
64   private final static String RIGHT_PARENTHESIS = "[)]";
65   private final static String FACTORY_PARAMETERS = "[^)]*";
66   private final static String SEMICOLON = ";";
67
68   public Generator.GeneratorLibrary constructCompositeLibrary(String aSpecification) throws GeneratorExc, GeneratorFailure {
69     String identifier;
70     String factory;
71     String factoryParameters;
72     CompositeGeneratorLibrary result = new CompositeGeneratorLibrary();
73     boolean first=true;
74
75     SimpleParser parser = new SimpleParser(aSpecification);
76     try {
77       parser.skip(SPACE);
78       while (!parser.isAtEnd()) {
79         identifier = parser.parse(IDENTIFIER, "library key expected");
80         parser.skip(SPACE);
81         parser.parse(EQUALS, "'=' expected");
82         parser.skip(SPACE);
83         factory = parser.parse(IDENTIFIER, "factory name expected");
84         parser.skip(SPACE);
85         parser.parse(LEFT_PARENTHESIS, "'(' expected");
86         factoryParameters = parser.parse(FACTORY_PARAMETERS, "parameters expected");
87         parser.parse(RIGHT_PARENTHESIS, "')' expected");
88
89         result.addLibrary(identifier, constructLibrary(factory, factoryParameters), first);
90         first=false;
91         parser.skip(SPACE);
92
93         if (!parser.isAtEnd()) {
94           parser.parse(SEMICOLON, "; expected");
95         }
96       }
97     }
98     catch (Exception e) {
99       e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));
100       throw new GeneratorFailure("Failed to construct generator library: " + e.getMessage(), e);
101     }
102
103     return result;
104   }
105 }