7ee9630d51880c6fa0589adba567b5d138f0a47e
[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  any library licensed under the Apache Software License, 
22  * The Sun (tm) Java Advanced Imaging library (JAI), The Sun JIMI library 
23  * (or with modified versions of the above that use the same license as the above), 
24  * and distribute linked combinations including the two.  You must obey the 
25  * GNU General Public License in all respects for all of the code used other than 
26  * the above mentioned libraries.  If you modify this file, you may extend this 
27  * exception to your version of the file, but you are not obligated to do so.  
28  * If you do not wish to do so, delete this exception statement from your version.
29  */
30 package mir.generator;
31
32 import java.util.HashMap;
33 import java.util.Map;
34
35 import mir.log.LoggerWrapper;
36 import mir.util.SimpleParser;
37
38 public class GeneratorLibraryRepository {
39   private Map factories;
40   private LoggerWrapper logger;
41
42   public GeneratorLibraryRepository() {
43     factories = new HashMap();
44     logger = new LoggerWrapper("Generator");
45   }
46
47   public void registerLibraryFactory(String aName, Generator.LibraryFactory aFactory) {
48     factories.put(aName, aFactory);
49   }
50
51   public Generator.Library constructLibrary(String aName, String aParameters) throws GeneratorExc {
52     if (!factories.containsKey(aName))
53       throw new GeneratorExc("Unknown library factory: "+aName);
54
55     return ((Generator.LibraryFactory) factories.get(aName)).makeLibrary(aParameters);
56   }
57
58   private final static String SPACE = "[\t\n\r ]*";
59   private final static String IDENTIFIER = "[a-zA-Z_][a-zA-Z0-9_]*";
60   private final static String EQUALS = "=";
61   private final static String LEFT_PARENTHESIS = "[(]";
62   private final static String RIGHT_PARENTHESIS = "[)]";
63   private final static String FACTORY_PARAMETERS = "[^)]*";
64   private final static String SEMICOLON = ";";
65
66   public Generator.Library constructCompositeLibrary(String aSpecification[]) throws GeneratorExc, GeneratorFailure {
67     String identifier;
68     String factory;
69     String factoryParameters;
70     CompositeGeneratorLibrary result = new CompositeGeneratorLibrary();
71     boolean first=true;
72
73     for (int i=0; i<aSpecification.length; i++) {
74       SimpleParser parser = new SimpleParser(aSpecification[i]);
75       try {
76         parser.skip(SPACE);
77         while (!parser.isAtEnd()) {
78           identifier = parser.parse(IDENTIFIER, "library key expected");
79           parser.skip(SPACE);
80           parser.parse(EQUALS, "'=' expected");
81           parser.skip(SPACE);
82           factory = parser.parse(IDENTIFIER, "factory name expected");
83           parser.skip(SPACE);
84           parser.parse(LEFT_PARENTHESIS, "'(' expected");
85           factoryParameters = parser.parse(FACTORY_PARAMETERS, "parameters expected");
86           parser.parse(RIGHT_PARENTHESIS, "')' expected");
87
88           result.addLibrary(identifier, constructLibrary(factory, factoryParameters), first);
89           first=false;
90           parser.skip(SPACE);
91
92           if (!parser.isAtEnd()) {
93             parser.parse(SEMICOLON, "; expected");
94           }
95         }
96       }
97       catch (Exception e) {
98         throw new GeneratorFailure("Failed to construct generator library: " + e.getMessage(), e);
99       }
100     }
101
102     return result;
103   }
104 }