1 /*
2 * $HeadURL: $
3 * $Date: $
4 * $Revision: $
5 * $Author: $
6 *
7 * Copyright (c) 2005 MindTree Consulting Ltd.
8 *
9 * This file is part of Insight.
10 *
11 * Insight is free software: you can redistribute it and/or modify it under the
12 * terms of the GNU General Public License as published by the Free Software
13 * Foundation, either version 3 of the License, or (at your option) any later
14 * version.
15 *
16 * Insight is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
19 * Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along with
22 * Insight. If not, see <http://www.gnu.org/licenses/>.
23 */
24
25 package com.mindtree.techworks.insight.receiver;
26
27 import java.io.BufferedReader;
28 import java.io.IOException;
29 import java.io.InputStreamReader;
30 import java.net.URL;
31
32 import com.mindtree.techworks.insight.spi.LogEvent;
33 import com.mindtree.techworks.insight.spi.LogNamespace;
34
35 /**
36 *
37 * The <code>FileStreamReceiver</code> class is a concrete implementation of the
38 * AbstractReceiver class. It supports receiving and building events from
39 * files.
40 * @author Regunath B
41 * @version 1.0, 05/07/07
42 * @see com.mindtree.techworks.insight.receiver.AbstractReceiver
43 */
44
45 public class FileStreamReceiver extends AbstractReceiver {
46
47
48 /**
49 * The LogNamespace for this receiver
50 */
51 private LogNamespace logNamespace;
52
53 /**
54 * The tailing indicator for this receiver
55 */
56 private boolean isTailing ;
57 /**
58 * The Interpreter of String to LogEvents which we get by reader.
59 */
60 private LogInterpreter logInterpreter =null;
61
62 /**
63 * Reader instance which is being used for reading the file.
64 */
65 private BufferedReader reader;
66
67 /**
68 * Indicator to demote if end of stream has been reached. This flag depends on whether the reader has reached
69 * end of stream. However, this flag is set to true one call later than actual end signalled by the reader to
70 * permit the Loginterpreter to interpret any last events if they exist
71 */
72 private boolean hasReachedEOS = false;
73
74 /**
75 * Constructor for this class.
76 * @param namespace the LogNamespace that contains the file information to read events from
77 * @param isTailing true if the receiver must be a tailing receiver
78 * @throws ReceiverInitializationException if the receiver is not able to initialize.
79 */
80 public FileStreamReceiver (LogNamespace namespace, boolean isTailing) throws ReceiverInitializationException{
81 initialize(namespace, isTailing);
82 }
83
84 /**
85 * Overriden superclass method
86 * @see com.mindtree.techworks.insight.receiver.AbstractReceiver#getNamespaces()
87 */
88 public LogNamespace[] getNamespaces() {
89 return new LogNamespace[] {this.logNamespace};
90 }
91
92 /**
93 * Overriden superclass method
94 * @see com.mindtree.techworks.insight.receiver.AbstractReceiver#isTailing()
95 */
96 public boolean isTailing() {
97 return this.isTailing;
98 }
99
100 /**
101 * Overriden superclass method
102 * @see com.mindtree.techworks.insight.receiver.AbstractReceiver#initialize(com.mindtree.techworks.insight.spi.LogNamespace, boolean)
103 */
104 protected void initialize(LogNamespace namespace, boolean isTailingReceiver) throws ReceiverInitializationException{
105
106 this.logNamespace = namespace;
107 this.isTailing = isTailingReceiver;
108 logInterpreter = new LogInterpreter(namespace);
109
110 String url = namespace.getLocalSourceString();
111
112 // Modification for Bugzilla bug #2874. In the fix for #2715 URL
113 // Encode was introduced, but file systems allow spaces also in their
114 // directory names, which was getting encoded to '+' by the URLEncode
115 // class. This fix, specifically fixes the issue of #2715, while
116 // allowing all other special characters.
117 url = url.replaceAll("#", "%23");
118
119 try {
120 reader = new BufferedReader(new InputStreamReader(new URL(url).openStream()));
121 }catch (IOException ioe) {
122 throw new ReceiverInitializationException("Unable to load : " + (url==null?null:url.toString()) , ioe);
123 }
124 }
125
126 /**
127 * Overriden superclass method
128 * @see com.mindtree.techworks.insight.receiver.AbstractReceiver#deInitialize()
129 */
130 protected void deInitialize() {
131 try {
132 if (reader != null) {
133 reader.close();
134 }
135 } catch (IOException ioe) {
136 ioe.printStackTrace();
137 }
138 }
139
140 /**
141 * Overriden superclass method
142 * @see com.mindtree.techworks.insight.receiver.AbstractReceiver#getNextEvents()
143 */
144 protected LogEvent[] getNextEvents() {
145 LogEvent[] events = null;
146 String line = null;
147 try {
148 line = reader.readLine();
149 } catch(IOException ioe) {
150 // no events to process if error occurs
151 return events;
152 }
153 return this.logInterpreter.parseLogMessage(line);
154 }
155
156 /**
157 * Overriden superclass method
158 * @see com.mindtree.techworks.insight.receiver.AbstractReceiver#hasMoreEvents()
159 */
160 protected boolean hasMoreEvents() {
161 boolean hasData = false;
162 try {
163 hasData = reader.ready();
164 if (!hasData) {
165 // check to see if the logical hasReachedEOS has been set already
166 if (hasReachedEOS) {
167 return hasData;
168 } else {
169 hasReachedEOS = true;
170 return true;
171 }
172 }
173 } catch(IOException ioe) {
174 // ignore it
175 }
176 return hasData;
177 }
178
179
180 }