cleanup / abuse system fix / prepping for a release
[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 import java.util.Arrays;
35
36 import mir.log.LoggerWrapper;
37 import mir.util.SimpleParser;
38
39 public class GeneratorLibraryRepository {
40   private Map factories;
41   private LoggerWrapper logger;
42
43   public GeneratorLibraryRepository() {
44     factories = new HashMap();
45     logger = new LoggerWrapper("Generator");
46   }
47
48   public void registerLibraryFactory(String aName, Generator.LibraryFactory aFactory) {
49     factories.put(aName, aFactory);
50   }
51
52   public Generator.Library constructLibrary(String aName, String aParameters) throws GeneratorExc {
53     if (!factories.containsKey(aName))
54       throw new GeneratorExc("Unknown library factory: "+aName);
55
56     return ((Generator.LibraryFactory) factories.get(aName)).makeLibrary(aParameters);
57   }
58
59   private final static String SPACE = "[\t\n\r ]*";
60   private final static String IDENTIFIER = "[a-zA-Z_][a-zA-Z0-9_]*";
61   private final static String EQUALS = "=";
62   private final static String LEFT_PARENTHESIS = "[(]";
63   private final static String RIGHT_PARENTHESIS = "[)]";
64   private final static String FACTORY_PARAMETERS = "[^)]*";
65   private final static String SEMICOLON = ";";
66
67   public Generator.Library constructCompositeLibrary(String aSpecification[]) throws GeneratorExc, GeneratorFailure {
68     String identifier;
69     String factory;
70     String factoryParameters;
71     CompositeGeneratorLibrary result = new CompositeGeneratorLibrary();
72     boolean first=true;
73
74     for (int i=0; i<aSpecification.length; i++) {
75       SimpleParser parser = new SimpleParser(aSpecification[i]);
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         logger.error("Failed to parse generator library expression " +
100             Arrays.asList(aSpecification).toString(), e);
101
102         throw new GeneratorFailure("Failed to parse generator library expression " +
103             Arrays.asList(aSpecification).toString(), e);
104       }
105     }
106
107     return result;
108   }
109 }