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 }