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
31
32
33
34
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 }