source: trunk/jabberit_messenger/java_source/src/nu/fw/jeti/backend/CapabilitiesCache.java @ 1001

Revision 1001, 4.9 KB checked in by alexandrecorreia, 15 years ago (diff)

Ticket #552 - Inclusão do projeto Java referente ao applet do módulo.

Line 
1/*
2 *      Jeti, a Java Jabber client, Copyright (C) 2007 E.S. de Boer 
3 *
4 *  This program is free software; you can redistribute it and/or modify
5 *  it under the terms of the GNU General Public License as published by
6 *  the Free Software Foundation; either version 2 of the License, or
7 *  (at your option) any later version.
8 *
9 *  This program is distributed in the hope that it will be useful,
10 *      but WITHOUT ANY WARRANTY; without even the implied warranty of
11 *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 *      GNU General Public License for more details.
13 *
14 *  You should have received a copy of the GNU General Public License
15 *  along with this program; if not, write to the Free Software
16 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 *
18 *      For questions, comments etc,
19 *      use the website at http://jeti.jabberstudio.org
20 */
21
22//created on Mar 11, 2007
23package nu.fw.jeti.backend;
24
25import java.io.BufferedWriter;
26import java.io.FileInputStream;
27import java.io.FileOutputStream;
28import java.io.IOException;
29import java.io.InputStream;
30import java.io.OutputStreamWriter;
31import java.net.URL;
32import java.util.HashMap;
33import java.util.Iterator;
34import java.util.LinkedList;
35import java.util.List;
36import java.util.Map;
37
38import javax.xml.parsers.SAXParser;
39import javax.xml.parsers.SAXParserFactory;
40
41import org.xml.sax.Attributes;
42import org.xml.sax.helpers.DefaultHandler;
43
44import nu.fw.jeti.events.DiscoveryListener;
45import nu.fw.jeti.jabber.Backend;
46import nu.fw.jeti.jabber.JID;
47import nu.fw.jeti.jabber.elements.DiscoItem;
48import nu.fw.jeti.jabber.elements.DiscoveryInfo;
49import nu.fw.jeti.jabber.elements.DiscoveryItem;
50import nu.fw.jeti.jabber.elements.IQDiscoInfo;
51import nu.fw.jeti.jabber.elements.IQXCaps;
52import nu.fw.jeti.jabber.handlers.IQDiscoInfoHandler;
53import nu.fw.jeti.util.Log;
54import nu.fw.jeti.util.PreferencesHandler;
55
56
57public class CapabilitiesCache implements DiscoveryListener {
58        private Map capabilities;
59        private Map cache;
60        private Backend backend;
61
62       
63        public CapabilitiesCache(Backend backend)
64        {
65                this.backend = backend;
66                capabilities = new HashMap();
67                cache = new HashMap();
68        }
69       
70        public void setCapability(JID jid, IQXCaps caps){
71                String cap = caps.getNode() + "#" + caps.getVer();
72                addCap(jid, cap);
73                if(caps.getExt() != null){
74                        String[] extensions = caps.getExt().split(" ");
75                        for (int i = 0; i < extensions.length; i++) {
76                                cap = caps.getNode() +"#"+ extensions[i];
77                                addCap(jid, cap);
78                        }
79                }
80        }
81
82        private void addCap(JID jid, String cap) {
83                if(cache.containsKey(cap)){
84                        getJIDCapabilities(jid).addCapabilities((IQDiscoInfo)cache.get(cap));
85                }
86                else {
87                        backend.getInfo(jid, cap, this);
88                }
89        }
90
91
92        private Capabilities getJIDCapabilities(JID jid) {
93                Capabilities jidCapabilities = null;
94                if(capabilities.containsKey(jid)){
95                        jidCapabilities = (Capabilities) capabilities.get(jid);
96                }
97                else {
98                        jidCapabilities = new Capabilities();
99                        capabilities.put(jid,jidCapabilities);
100                }
101                return jidCapabilities;
102        }
103       
104        public void discoveryInfoResult(JID jid, DiscoveryInfo info){
105                if(!info.hasFeatures())return;
106                IQDiscoInfo disco = (IQDiscoInfo)info;
107                cache.put(disco.getNode(), disco);
108                getJIDCapabilities(jid).addCapabilities(disco);
109        }
110       
111        public void discoveryItemResult(JID jid, DiscoveryItem item){}
112       
113       
114        /**
115         * Has JID jid capability capability
116         * @param jid
117         * @param capability
118         */
119        public boolean hasCapability(JID jid, String capability){
120                return getJIDCapabilities(jid).hasCapability(capability);
121        }       
122       
123        public void save()
124        {
125                StringBuffer xml = new StringBuffer();
126                xml.append("<?xml version='1.0'?>");
127                xml.append("<queries>");
128                for (Iterator iter = cache.values().iterator(); iter.hasNext();) {
129                       
130                        ((IQDiscoInfo)iter.next()).appendToXML(xml);
131                        xml.append("\n");
132                }
133                xml.append("</queries>");
134                System.out.println(xml.toString());
135                try
136                {
137                        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
138                                        new FileOutputStream(Start.path + "capabilitiesCache.xml"), "UTF8"));
139                        writer.write(xml.toString());
140                        writer.close();
141                }
142                catch (IOException ex2)
143                {
144                        ex2.printStackTrace();
145                }
146        }
147       
148        static class DiscoInfoHandler extends DefaultHandler
149    {
150         private Map queries;
151         private IQDiscoInfoHandler discoHandler;
152       
153        public DiscoInfoHandler(Map queries)
154        {
155            this.queries = queries;
156            discoHandler = new IQDiscoInfoHandler();
157        }
158           
159        public void startElement(String uri, String localName, String qName, Attributes attr)
160        {
161                if(qName.equals("queries")); //do nothing top level
162                else if(qName.equals("query")) 
163            {
164                discoHandler.startHandling(attr);
165            }
166            else discoHandler.startElement(qName, attr);
167        }
168       
169        public void endElement(String uri, String localName, String qName){
170                if(qName.equals("query")){
171                        IQDiscoInfo info = (IQDiscoInfo) discoHandler.build();
172                        queries.put(info.getNode(),info);
173                }
174        }
175        }
176       
177}
Note: See TracBrowser for help on using the repository browser.