1 /**
2 * Copyright (c) 2012, University of Konstanz, Distributed Systems Group
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the University of Konstanz nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27 package org.perfidix.socketadapter;
28
29 import java.io.IOException;
30 import java.io.ObjectOutputStream;
31 import java.net.Socket;
32 import java.net.UnknownHostException;
33 import java.util.Map;
34
35 import org.perfidix.exceptions.SocketViewException;
36
37 /**
38 * This class creates the connection to the eclipse view, which depict the
39 * current progress of the operation. It contains also the methods to upudate
40 * the view.
41 *
42 * @author Lewandowski Lukas, University of Konstanz
43 */
44 public final class SocketViewStub implements IBenchRunSessionListener {
45
46 /**
47 * The host name for the connection to the socket skeleton.
48 */
49 private transient final String host;
50 /**
51 * The command that will be send to the socket skeleton. So the skeleton
52 * knows which data will be dispatched afterwards.
53 */
54 private transient String command;
55 /**
56 * The client socket that will connect to the server socket of the ide
57 * plug-in.
58 */
59 private transient Socket socket;
60 /**
61 * The output stream for dispatching data to the ide skeleton to visualize
62 * the bench process / progress.
63 */
64 private transient ObjectOutputStream outputStream;
65
66 /**
67 * The constructor initializes the given host name and the port, which are
68 * needed for creating a client socket. Afterwards it creates the client
69 * socket and the object output stream.
70 *
71 * @param host
72 * Host represents the {@link String} host name
73 * @param viewListenerPort
74 * This param represents the port of the view.
75 * @throws SocketViewException
76 * if communitcation fails
77 */
78 public SocketViewStub(final String host, final int viewListenerPort) throws SocketViewException {
79 if (host == null) {
80 this.host = "localhost";
81 } else {
82 this.host = host;
83 }
84 try {
85 socket = new Socket(this.host, viewListenerPort);
86 outputStream = new ObjectOutputStream(socket.getOutputStream());
87 } catch (final UnknownHostException e) {
88 throw new SocketViewException(e);
89 } catch (final IOException e) {
90 throw new SocketViewException(e);
91 }
92
93 }
94
95 /** {@inheritDoc} */
96 public void initTotalBenchProgress(final Map<String, Integer> elems) throws SocketViewException {
97 command = "init";
98 try {
99 outputStream.writeObject(command);
100 outputStream.writeObject(elems);
101 } catch (final IOException e) {
102 throw new SocketViewException(e);
103 }
104
105 }
106
107 /** {@inheritDoc} */
108 public void updateCurrentRun(final String currentElement) throws SocketViewException {
109 command = "updateCurrentRun";
110 try {
111 outputStream.writeObject(command);
112 outputStream.writeObject(currentElement);
113 } catch (final IOException e) {
114 throw new SocketViewException(e);
115 }
116
117 }
118
119 /** {@inheritDoc} */
120
121 public void updateError(final String element, final String exception) throws SocketViewException {
122
123 command = "updateError";
124 try {
125 outputStream.writeObject(command);
126 outputStream.writeObject(element);
127 outputStream.writeObject(exception);
128 } catch (final IOException e) {
129 throw new SocketViewException(e);
130 }
131
132 }
133
134 /** {@inheritDoc} */
135 public boolean finishedBenchRuns() throws SocketViewException {
136 command = "finished";
137 try {
138 outputStream.writeObject(command);
139 outputStream.close();
140 socket.close();
141 return true;
142 } catch (final IOException e) {
143 throw new SocketViewException(e);
144 }
145
146 }
147
148 }