33import com .fasterxml .jackson .annotation .JsonInclude ;
44import com .fasterxml .jackson .databind .JsonNode ;
55import com .fasterxml .jackson .databind .ObjectMapper ;
6- import com .github .kklisura .cdtp .services .DevToolsService ;
6+ import com .github .kklisura .cdtp .services .ChromeDevToolsService ;
77import com .github .kklisura .cdtp .services .WebSocketService ;
8- import com .github .kklisura .cdtp .services .exceptions .ChromeDevToolsException ;
8+ import com .github .kklisura .cdtp .services .exceptions .ChromeDevToolsInvocationException ;
99import com .github .kklisura .cdtp .services .exceptions .WebSocketServiceException ;
10+ import com .github .kklisura .cdtp .services .model .chrome .ChromeTab ;
1011import com .github .kklisura .cdtp .services .model .chrome .MethodInvocation ;
1112import org .slf4j .Logger ;
1213import org .slf4j .LoggerFactory ;
1314
1415import java .io .IOException ;
16+ import java .lang .reflect .InvocationHandler ;
1517import java .util .Map ;
1618import java .util .concurrent .ConcurrentHashMap ;
1719import java .util .concurrent .CountDownLatch ;
2527 *
2628 * @author Kenan Klisura
2729 */
28- public class DevToolsServiceImpl implements DevToolsService , Consumer <String > {
29- private static final Logger LOGGER = LoggerFactory .getLogger (DevToolsServiceImpl .class );
30+ public abstract class ChromeDevToolsServiceImpl implements ChromeDevToolsService , Consumer <String >, AutoCloseable {
31+ private static final Logger LOGGER = LoggerFactory .getLogger (ChromeDevToolsServiceImpl .class );
3032
3133 private static final String TIMEOUT_ENV_PROPERTY = "com.github.kklisura.cdtp.websocket.readTimeout" ;
3234
@@ -49,32 +51,56 @@ public class DevToolsServiceImpl implements DevToolsService, Consumer<String> {
4951
5052 private long readTimeout ;
5153
54+ private ChromeTab chromeTab ;
55+ private ChromeServiceImpl chromeService ;
56+
5257 /**
5358 * Instantiates a new Dev tools service.
5459 *
5560 * @param webSocketService Web socket service.
5661 * @param readTimeout Read timeout in milliseconds.
5762 * @throws WebSocketServiceException Web socket service exception.
5863 */
59- public DevToolsServiceImpl (WebSocketService webSocketService , long readTimeout ) throws WebSocketServiceException {
64+ public ChromeDevToolsServiceImpl (WebSocketService webSocketService , long readTimeout )
65+ throws WebSocketServiceException {
6066 this .webSocketService = webSocketService ;
6167 this .webSocketService .addMessageHandler (this );
6268 this .readTimeout = readTimeout ;
6369 }
6470
6571 /**
66- * Instantiates a new Dev tools service.
72+ * Instantiates a new Chrome dev tools service. This is used during proxy building phase.
73+ *
74+ * See {@link ChromeServiceImpl#createDevToolsService(ChromeTab)}
75+ * See {@link com.github.kklisura.cdtp.services.utils.ProxyUtils#createProxyFromAbstract(Class, Class[], Object[], InvocationHandler)}
6776 *
6877 * @param webSocketService Web socket service.
69- * @throws WebSocketServiceException Web socket service exception.
78+ * @throws WebSocketServiceException Web socket service exception
7079 */
71- public DevToolsServiceImpl (WebSocketService webSocketService ) throws WebSocketServiceException {
80+ public ChromeDevToolsServiceImpl (WebSocketService webSocketService ) throws WebSocketServiceException {
7281 this (webSocketService , READ_TIMEOUT );
7382 }
7483
84+ /**
85+ * Sets the chrome service container.
86+ *
87+ * @param chromeService Chrome service.
88+ */
89+ public void setChromeService (ChromeServiceImpl chromeService ) {
90+ this .chromeService = chromeService ;
91+ }
92+
93+ /**
94+ * Sets the chrome tab for this service.
95+ *
96+ * @param chromeTab the tab
97+ */
98+ public void setChromeTab (ChromeTab chromeTab ) {
99+ this .chromeTab = chromeTab ;
100+ }
101+
75102 @ Override
76- public <T > T invoke (String returnProperty , Class <T > clazz , MethodInvocation methodInvocation )
77- throws ChromeDevToolsException {
103+ public <T > T invoke (String returnProperty , Class <T > clazz , MethodInvocation methodInvocation ) {
78104 try {
79105 InvocationResult invocationResult = new InvocationResult (returnProperty );
80106 invocationResultMap .put (methodInvocation .getId (), invocationResult );
@@ -85,7 +111,7 @@ public <T> T invoke(String returnProperty, Class<T> clazz, MethodInvocation meth
85111 invocationResultMap .remove (methodInvocation .getId ());
86112
87113 if (!hasReceivedResponse ) {
88- throw new ChromeDevToolsException ("Timeout expired while waiting for server response." );
114+ throw new ChromeDevToolsInvocationException ("Timeout expired while waiting for server response." );
89115 }
90116
91117 if (invocationResult .isSuccess ()) {
@@ -102,14 +128,23 @@ public <T> T invoke(String returnProperty, Class<T> clazz, MethodInvocation meth
102128 errorMessageBuilder .append (error .getData ());
103129 }
104130
105- throw new ChromeDevToolsException (error .getCode (), errorMessageBuilder .toString ());
131+ throw new ChromeDevToolsInvocationException (error .getCode (), errorMessageBuilder .toString ());
106132 }
107- } catch (WebSocketServiceException ex ) {
108- throw new ChromeDevToolsException ("Failed sending web socket message." , ex );
109- } catch (InterruptedException ex ) {
110- throw new ChromeDevToolsException ("Interrupted while waiting response." , ex );
133+ } catch (WebSocketServiceException e ) {
134+ throw new ChromeDevToolsInvocationException ("Failed sending web socket message." , e );
135+ } catch (InterruptedException e ) {
136+ throw new ChromeDevToolsInvocationException ("Interrupted while waiting response." , e );
111137 } catch (IOException ex ) {
112- throw new ChromeDevToolsException ("Failed reading response message." , ex );
138+ throw new ChromeDevToolsInvocationException ("Failed reading response message." , ex );
139+ }
140+ }
141+
142+ @ Override
143+ public void close () {
144+ webSocketService .close ();
145+
146+ if (chromeService != null ) {
147+ chromeService .clearChromeDevToolsServiceCache (chromeTab );
113148 }
114149 }
115150
@@ -158,6 +193,10 @@ public void accept(String message) {
158193 }
159194
160195 private <T > T readJsonObject (Class <T > clazz , JsonNode jsonNode ) throws IOException {
196+ if (jsonNode == null ) {
197+ throw new ChromeDevToolsInvocationException ("Failed converting null response to clazz " + clazz .getName ());
198+ }
199+
161200 return OBJECT_MAPPER .readerFor (clazz ).readValue (jsonNode );
162201 }
163202
0 commit comments