001    /**
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     *
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     *
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.camel.component.irc;
018    
019    import java.net.URI;
020    import java.net.URISyntaxException;
021    import java.util.ArrayList;
022    import java.util.Arrays;
023    import java.util.List;
024    
025    import org.apache.camel.RuntimeCamelException;
026    import org.apache.camel.util.ObjectHelper;
027    import org.schwering.irc.lib.ssl.SSLDefaultTrustManager;
028    import org.schwering.irc.lib.ssl.SSLTrustManager;
029    
030    public class IrcConfiguration implements Cloneable {
031        private String target;
032        private List<String> channels = new ArrayList<String>();
033        private String hostname;
034        private String password;
035        private String nickname;
036        private String realname;
037        private String username;
038        private SSLTrustManager trustManager = new SSLDefaultTrustManager();
039        private boolean usingSSL;
040        private boolean persistent = true;
041        private boolean colors = true;
042        private boolean onNick = true;
043        private boolean onQuit = true;
044        private boolean onJoin = true;
045        private boolean onKick = true;
046        private boolean onMode = true;
047        private boolean onPart = true;
048        private boolean onReply;
049        private boolean onTopic = true;
050        private boolean onPrivmsg = true;
051        private int[] ports = {6667, 6668, 6669};
052        
053        public IrcConfiguration() {
054        }
055    
056        public IrcConfiguration(String hostname, String nickname, String displayname, List<String> channels) {
057            this.channels = channels;
058            this.hostname = hostname;
059            this.nickname = nickname;
060            this.username = nickname;
061            this.realname = displayname;
062        }
063    
064        public IrcConfiguration(String hostname, String username, String password, String nickname, String displayname, List<String> channels) {
065            this.channels = channels;
066            this.hostname = hostname;
067            this.username = username;
068            this.password = password;
069            this.nickname = nickname;
070            this.realname = displayname;
071        }
072    
073        public IrcConfiguration copy() {
074            try {
075                return (IrcConfiguration) clone();
076            } catch (CloneNotSupportedException e) {
077                throw new RuntimeCamelException(e);
078            }
079        }
080    
081        public String getCacheKey() {
082            return hostname + ":" + nickname;
083        }
084    
085        public String getListOfChannels() {
086            String retval = "";
087            for (String channel : channels) {
088                retval += channel + " ";
089            }
090            return retval.trim();
091        }
092    
093        public void configure(String uriStr) throws URISyntaxException {
094            // fix provided URI and handle that we can use # to indicate the IRC room
095            if (uriStr.startsWith("ircs")) {
096                setUsingSSL(true);
097                if (!uriStr.startsWith("ircs://")) {
098                    uriStr = uriStr.replace("ircs:", "ircs://");
099                }
100            } else if (!uriStr.startsWith("irc://")) {
101                uriStr = uriStr.replace("irc:", "irc://");
102            }
103            
104            if (uriStr.contains("?")) {
105                uriStr = ObjectHelper.before(uriStr, "?");
106            }
107            
108            URI uri = new URI(uriStr);
109    
110            setNickname(uri.getUserInfo());
111            setUsername(uri.getUserInfo());
112            setRealname(uri.getUserInfo());
113            setHostname(uri.getHost());
114    
115            if (uri.getFragment() != null && uri.getFragment().length() != 0) {
116                String channel = "#" + uri.getFragment();
117                addChannel(channel);
118            }
119        }
120    
121        public void addChannel(String channel) {
122            boolean alreadyHave = false;
123            for (String aChannel : channels) {
124                if (channel.contentEquals(aChannel)) {
125                    alreadyHave = true;
126                }
127            }
128            if (!alreadyHave) {
129                channels.add(channel);
130            }
131        }
132    
133        public void setChannels(String channels) {
134            String[] args = channels.split(",");
135    
136            for (String channel : args) {
137                channel = channel.trim();
138                if (channel.startsWith("#")) {
139                    addChannel(channel);
140                }
141            }
142        }
143    
144        public void setTrustManager(SSLTrustManager trustManager) {
145            this.trustManager = trustManager;
146        }
147    
148        public SSLTrustManager getTrustManager() {
149            return trustManager;
150        }
151    
152        public boolean getUsingSSL() {
153            return usingSSL;
154        }
155    
156        private void setUsingSSL(boolean usingSSL) {
157            this.usingSSL = usingSSL;
158        }
159    
160        public String getHostname() {
161            return hostname;
162        }
163    
164        public void setHostname(String hostname) {
165            this.hostname = hostname;
166        }
167    
168        public String getPassword() {
169            return password;
170        }
171    
172        public void setPassword(String password) {
173            this.password = password;
174        }
175    
176        public String getNickname() {
177            return nickname;
178        }
179    
180        public void setNickname(String nickname) {
181            this.nickname = nickname;
182        }
183    
184        public String getRealname() {
185            return realname;
186        }
187    
188        public void setRealname(String realname) {
189            this.realname = realname;
190        }
191    
192        public String getUsername() {
193            return username;
194        }
195    
196        public void setUsername(String username) {
197            this.username = username;
198        }
199    
200        public int[] getPorts() {
201            return ports;
202        }
203    
204        public void setPorts(int[] ports) {
205            this.ports = ports;
206        }
207    
208        public List<String> getChannels() {
209            return channels;
210        }
211    
212        public boolean isPersistent() {
213            return persistent;
214        }
215    
216        public void setPersistent(boolean persistent) {
217            this.persistent = persistent;
218        }
219    
220        public boolean isColors() {
221            return colors;
222        }
223    
224        public void setColors(boolean colors) {
225            this.colors = colors;
226        }
227    
228        public boolean isOnNick() {
229            return onNick;
230        }
231    
232        public void setOnNick(boolean onNick) {
233            this.onNick = onNick;
234        }
235    
236        public boolean isOnQuit() {
237            return onQuit;
238        }
239    
240        public void setOnQuit(boolean onQuit) {
241            this.onQuit = onQuit;
242        }
243    
244        public boolean isOnJoin() {
245            return onJoin;
246        }
247    
248        public void setOnJoin(boolean onJoin) {
249            this.onJoin = onJoin;
250        }
251    
252        public boolean isOnKick() {
253            return onKick;
254        }
255    
256        public void setOnKick(boolean onKick) {
257            this.onKick = onKick;
258        }
259    
260        public boolean isOnMode() {
261            return onMode;
262        }
263    
264        public void setOnMode(boolean onMode) {
265            this.onMode = onMode;
266        }
267    
268        public boolean isOnPart() {
269            return onPart;
270        }
271    
272        public void setOnPart(boolean onPart) {
273            this.onPart = onPart;
274        }
275    
276        public boolean isOnReply() {
277            return onReply;
278        }
279    
280        public void setOnReply(boolean onReply) {
281            this.onReply = onReply;
282        }
283    
284        public boolean isOnTopic() {
285            return onTopic;
286        }
287    
288        public void setOnTopic(boolean onTopic) {
289            this.onTopic = onTopic;
290        }
291    
292        public boolean isOnPrivmsg() {
293            return onPrivmsg;
294        }
295    
296        public void setOnPrivmsg(boolean onPrivmsg) {
297            this.onPrivmsg = onPrivmsg;
298        }
299    
300        public String toString() {
301            return "IrcConfiguration[hostname: " + hostname + ", ports=" + Arrays.toString(ports) + ", target: " + target + ", username=" + username + "]";
302        }
303    }