image bugfixx - mir now depends on jai imagio
[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.GeneratorLibraryFactory aFactory) {
48     factories.put(aName, aFactory);
49   }
50
51   public Generator.GeneratorLibrary constructLibrary(String aName, String aParameters) throws GeneratorExc {
52     if (!factories.containsKey(aName))
53       throw new GeneratorExc("Unknown library factory: "+aName);
54
55     return ((Generator.GeneratorLibraryFactory) 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.GeneratorLibrary 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     SimpleParser parser = new SimpleParser(aSpecification);
74     try {
75       parser.skip(SPACE);
76       while (!parser.isAtEnd()) {
77         identifier = parser.parse(IDENTIFIER, "library key expected");
78         parser.skip(SPACE);
79         parser.parse(EQUALS, "'=' expected");
80         parser.skip(SPACE);
81         factory = parser.parse(IDENTIFIER, "factory name expected");
82         parser.skip(SPACE);
83         parser.parse(LEFT_PARENTHESIS, "'(' expected");
84         factoryParameters = parser.parse(FACTORY_PARAMETERS, "parameters expected");
85         parser.parse(RIGHT_PARENTHESIS, "')' expected");
86
87         result.addLibrary(identifier, constructLibrary(factory, factoryParameters), first);
88         first=false;
89         parser.skip(SPACE);
90
91         if (!parser.isAtEnd()) {
92           parser.parse(SEMICOLON, "; expected");
93         }
94       }
95     }
96     catch (Exception e) {
97       e.printStackTrace(logger.asPrintWriter(LoggerWrapper.DEBUG_MESSAGE));
98       throw new GeneratorFailure("Failed to construct generator library: " + e.getMessage(), e);
99     }
100
101     return result;
102   }
103 }