View Javadoc

1   package cz.cuni.amis.pogamut.base.communication.parser.impl.yylex;
2   
3   import java.io.Reader;
4   import java.util.logging.Level;
5   import java.util.logging.Logger;
6   
7   import com.google.inject.Inject;
8   import com.google.inject.internal.Nullable;
9   
10  import cz.cuni.amis.pogamut.base.communication.connection.IWorldReaderProvider;
11  import cz.cuni.amis.pogamut.base.communication.exception.CommunicationException;
12  import cz.cuni.amis.pogamut.base.communication.messages.InfoMessage;
13  import cz.cuni.amis.pogamut.base.communication.parser.IWorldMessageParser;
14  import cz.cuni.amis.pogamut.base.communication.parser.exception.ParserException;
15  import cz.cuni.amis.pogamut.base.component.IComponent;
16  import cz.cuni.amis.pogamut.base.component.bus.IComponentBus;
17  import cz.cuni.amis.pogamut.base.component.bus.exception.ComponentNotRunningException;
18  import cz.cuni.amis.pogamut.base.component.bus.exception.ComponentPausedException;
19  import cz.cuni.amis.pogamut.base.component.controller.ComponentControlHelper;
20  import cz.cuni.amis.pogamut.base.component.controller.ComponentController;
21  import cz.cuni.amis.pogamut.base.component.controller.ComponentDependencyType;
22  import cz.cuni.amis.pogamut.base.component.controller.IComponentControlHelper;
23  import cz.cuni.amis.pogamut.base.utils.guice.AgentScoped;
24  import cz.cuni.amis.pogamut.base.utils.logging.IAgentLogger;
25  import cz.cuni.amis.pogamut.base.utils.logging.LogCategory;
26  import cz.cuni.amis.utils.token.Token;
27  import cz.cuni.amis.utils.token.Tokens;
28  
29  /**
30   * TODO!:
31   * <p><p>
32   * Ignores {@link IComponentControlHelper#startPaused()}, performs {@link IComponentControlHelper#start()} in both start cases.
33   * 
34   * @author Jimmy
35   */
36  @AgentScoped
37  public class YylexParser implements IWorldMessageParser {
38  	
39  	public static final Token COMPONENT_ID = Tokens.get("Parser");
40  	
41  	private IWorldReaderProvider readerProvider;
42  	
43  	private Reader reader = null;
44  	
45  	private IYylex yylex;
46  	
47  	private IAgentLogger agentLogger = null;
48  	
49  	private LogCategory log = null;
50  	
51  	private ComponentController<IComponent> controller = null;
52  
53  	private IComponentBus eventBus;
54  	
55  	@Inject
56  	public YylexParser(IWorldReaderProvider readerProvider, IYylex yylex, @Nullable IYylexObserver yylexObserver, IComponentBus eventBus, IAgentLogger logger) throws CommunicationException {
57  		agentLogger = logger;
58  		log = agentLogger.getCategory(getComponentId().getToken());
59  		this.readerProvider = readerProvider;
60  		this.yylex = yylex;
61  		this.yylex.setObserver(yylexObserver == null ? new IYylexObserver.LogObserver(logger) : yylexObserver);
62  		
63  		this.eventBus = eventBus;
64  		this.controller = new ComponentController(this, control, eventBus, log, ComponentDependencyType.STARTS_AFTER, readerProvider);
65  	}
66  	
67  	private IComponentControlHelper control = new ComponentControlHelper() {
68  		
69  		@Override
70  		public void startPaused() {
71  			start();
72  		}
73  		
74  		@Override
75  		public void start() throws ParserException {
76  			Reader reader = readerProvider.getReader();
77  			if (reader == null) throw new ParserException("Can't get reader from " + readerProvider + ", can't start.", log, this); 
78  			yylex.setReader(reader);
79  		}
80  		
81  	};
82  	
83  	@Override
84  	public Token getComponentId() {
85  		return COMPONENT_ID;
86  	}
87  	
88  	public Logger getLog() {
89  		return log;
90  	}
91  
92  	@Override
93  	public InfoMessage parse() throws ComponentNotRunningException, ComponentPausedException, ParserException {
94  		if (controller.isPaused()) throw new ComponentPausedException(controller.getState().getFlag(), this);
95  		if (!controller.isRunning()) throw new ComponentNotRunningException(controller.getState().getFlag(), this);
96  		try {
97  			InfoMessage parsed = yylex.yylex(); 
98  			if (log.isLoggable(Level.FINEST)) log.finest("Received: " + parsed);
99  			return parsed;
100 		} catch (ComponentPausedException cp) {
101 			throw cp;
102 		} catch (ComponentNotRunningException cnr) {
103 			throw cnr;
104 		} catch (ParserException p) {
105 			throw p;
106 		} catch (Exception e) {
107 			throw new ParserException("Can't parse next message: " + e.getMessage(), e, log, this);
108 		}
109 	}
110 	
111 	public String toString() {
112 		if (this == null) return "YylexParser";
113 		else return getClass().getSimpleName();
114 	}
115 	
116 }