001    package sysModel.parser;
002    
003    import sysModel.ICmdFactory;
004    import sysModel.ISecurityAdapter;
005    import sysModel.env.AGlobalEnv;
006    
007    import java.lang.reflect.Constructor;
008    import java.io.IOException;
009    
010    /**
011     * Parser class.
012     *
013     * @author Mathias Ricken
014     */
015    public class Parser {
016        /**
017         * Invoke the parser and recreate a global environment from a file.
018         *
019         * @param filename        name of file
020         * @param factory         factory to use for creation
021         * @param securityAdapter security adapter in use
022         * @return global environment
023         */
024        public static AGlobalEnv parse(String filename, final ICmdFactory factory, final ISecurityAdapter securityAdapter) {
025            try {
026                final Lexer l = new Lexer(filename);
027    
028                return (AGlobalEnv) l.nextToken().execute(new DefaultTokenVisitor() {
029                    public Object defaultCase() {
030                        throw new ParserException("Invalid token");
031                    }
032    
033                    public Object wordCase(String className) {
034                        // read class name
035                        try {
036                            Class envClass = Class.forName(className);
037                            Constructor envCtor = envClass.getConstructor(new Class[]{ICmdFactory.class, ISecurityAdapter.class});
038                            AGlobalEnv env = (AGlobalEnv) envCtor.newInstance(new Object[]{factory, securityAdapter});
039                            return env.parse(l);
040                        }
041                        catch (Exception e) {
042                            throw new ParserException(e.toString(),e);
043                        }
044                    }
045                });
046            }
047            catch (IOException e) {
048                throw new ParserException(e.toString(),e);
049            }
050        }
051    }