mirror of
				https://github.com/Mibew/java.git
				synced 2025-10-31 18:41:09 +03:00 
			
		
		
		
	webim-to-jabber transport application
git-svn-id: https://webim.svn.sourceforge.net/svnroot/webim/trunk@496 c66351dc-e62f-0410-b875-e3a5c0b9693f
This commit is contained in:
		
							parent
							
								
									ce538f961f
								
							
						
					
					
						commit
						fe9a5a606e
					
				
							
								
								
									
										8
									
								
								src/mibewjava/org.mibew.jabber/.classpath
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/mibewjava/org.mibew.jabber/.classpath
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,8 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <classpath> | ||||||
|  | 	<classpathentry kind="src" path="src"/> | ||||||
|  | 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> | ||||||
|  | 	<classpathentry kind="lib" path="libs/smack.jar"/> | ||||||
|  | 	<classpathentry kind="lib" path="libs/smackx.jar"/> | ||||||
|  | 	<classpathentry kind="output" path="bin"/> | ||||||
|  | </classpath> | ||||||
							
								
								
									
										17
									
								
								src/mibewjava/org.mibew.jabber/.project
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/mibewjava/org.mibew.jabber/.project
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <projectDescription> | ||||||
|  | 	<name>org.mibew.jabber</name> | ||||||
|  | 	<comment></comment> | ||||||
|  | 	<projects> | ||||||
|  | 	</projects> | ||||||
|  | 	<buildSpec> | ||||||
|  | 		<buildCommand> | ||||||
|  | 			<name>org.eclipse.jdt.core.javabuilder</name> | ||||||
|  | 			<arguments> | ||||||
|  | 			</arguments> | ||||||
|  | 		</buildCommand> | ||||||
|  | 	</buildSpec> | ||||||
|  | 	<natures> | ||||||
|  | 		<nature>org.eclipse.jdt.core.javanature</nature> | ||||||
|  | 	</natures> | ||||||
|  | </projectDescription> | ||||||
							
								
								
									
										
											BIN
										
									
								
								src/mibewjava/org.mibew.jabber/libs/smack.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/mibewjava/org.mibew.jabber/libs/smack.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/mibewjava/org.mibew.jabber/libs/smackx-debug.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/mibewjava/org.mibew.jabber/libs/smackx-debug.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/mibewjava/org.mibew.jabber/libs/smackx-jingle.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/mibewjava/org.mibew.jabber/libs/smackx-jingle.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								src/mibewjava/org.mibew.jabber/libs/smackx.jar
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								src/mibewjava/org.mibew.jabber/libs/smackx.jar
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										9
									
								
								src/mibewjava/org.mibew.jabber/src/mibew-sample.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								src/mibewjava/org.mibew.jabber/src/mibew-sample.ini
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | |||||||
|  | # | ||||||
|  | # Configuration file for Mibew-to-jabber gate | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | jabber.host=jabber.org | ||||||
|  | jabber.login=webim_notifier | ||||||
|  | jabber.password=123 | ||||||
|  | 
 | ||||||
|  | jabber.admin=yourmail@jabber.org | ||||||
| @ -0,0 +1,150 @@ | |||||||
|  | package org.mibew.api; | ||||||
|  | 
 | ||||||
|  | import java.io.ByteArrayInputStream; | ||||||
|  | import java.io.ByteArrayOutputStream; | ||||||
|  | import java.io.DataOutputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | import java.io.UnsupportedEncodingException; | ||||||
|  | import java.net.HttpURLConnection; | ||||||
|  | import java.net.MalformedURLException; | ||||||
|  | import java.net.URL; | ||||||
|  | import java.net.URLEncoder; | ||||||
|  | import java.security.NoSuchAlgorithmException; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Map.Entry; | ||||||
|  | import java.util.regex.Matcher; | ||||||
|  | import java.util.regex.Pattern; | ||||||
|  | 
 | ||||||
|  | import javax.xml.parsers.ParserConfigurationException; | ||||||
|  | import javax.xml.parsers.SAXParser; | ||||||
|  | import javax.xml.parsers.SAXParserFactory; | ||||||
|  | 
 | ||||||
|  | import org.mibew.api.handlers.LoginHandler; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class MibewConnection { | ||||||
|  | 
 | ||||||
|  | 	private static final int REQUEST_TIMEOUT = 5000; | ||||||
|  | 
 | ||||||
|  | 	private final String fUrl; | ||||||
|  | 
 | ||||||
|  | 	private final Map<String,String> fCookies; | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * @param url		Ex: http://yourserver.com/webim/ | ||||||
|  | 	 * @param login		admin | ||||||
|  | 	 * @param password	operators password | ||||||
|  | 	 */ | ||||||
|  | 	public MibewConnection(String url, String login, String password) | ||||||
|  | 			throws UnsupportedEncodingException, NoSuchAlgorithmException, | ||||||
|  | 			MalformedURLException { | ||||||
|  | 		this.fUrl = url; | ||||||
|  | 		this.fCookies = new HashMap<String,String>(); | ||||||
|  | 		this.fCookies.put("webim_lite", URLEncoder.encode(login + "," + Utils.md5(Utils.md5(password)), "UTF-8")); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 *  Connects to the server and tries to login, returns true if successful. | ||||||
|  | 	 */ | ||||||
|  | 	public boolean connect() throws ParserConfigurationException { | ||||||
|  | 		try { | ||||||
|  | 			MibewResponse response = request("operator/autologin.php", ""); | ||||||
|  | 			SAXParser sp = SAXParserFactory.newInstance().newSAXParser(); | ||||||
|  | 			LoginHandler handler = new LoginHandler(); | ||||||
|  | 			sp.parse(new ByteArrayInputStream(response.getResponse()), handler); | ||||||
|  | 			String status = handler.getStatus(); | ||||||
|  | 			return status.equals("OK"); | ||||||
|  | 		} catch(Exception e) { | ||||||
|  | 			handleError(e.getMessage(), e); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void disconnect() { | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * Request server. | ||||||
|  | 	 * @param suburl			ex: operator/update.php | ||||||
|  | 	 * @param urlParameters		post content | ||||||
|  | 	 */ | ||||||
|  | 	public final synchronized MibewResponse request(String suburl, String urlParameters) throws IOException { | ||||||
|  | 		HttpURLConnection connection = null; | ||||||
|  | 
 | ||||||
|  | 		try { | ||||||
|  | 			connection = (HttpURLConnection) new URL(fUrl+suburl).openConnection(); | ||||||
|  | 			connection.setConnectTimeout(REQUEST_TIMEOUT); | ||||||
|  | 			connection.setReadTimeout(REQUEST_TIMEOUT); | ||||||
|  | 
 | ||||||
|  | 			connection.setRequestMethod("POST"); | ||||||
|  | 			connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); | ||||||
|  | 			connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length)); | ||||||
|  | 			if(fCookies.size() > 0) { | ||||||
|  | 				StringBuilder sb = new StringBuilder(); | ||||||
|  | 				for(Entry<String,String> cookie : fCookies.entrySet()) { | ||||||
|  | 					if(sb.length() > 0) { | ||||||
|  | 						sb.append("; "); | ||||||
|  | 					} | ||||||
|  | 					sb.append(cookie.getKey()+"="+cookie.getValue()); | ||||||
|  | 				} | ||||||
|  | 				connection.addRequestProperty("Cookie", sb.toString()); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 
 | ||||||
|  | 			connection.setUseCaches(false); | ||||||
|  | 			connection.setDoInput(true); | ||||||
|  | 			connection.setDoOutput(true); | ||||||
|  | 
 | ||||||
|  | 			// create request | ||||||
|  | 			DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); | ||||||
|  | 			wr.writeBytes(urlParameters); | ||||||
|  | 			wr.flush(); | ||||||
|  | 			wr.close(); | ||||||
|  | 
 | ||||||
|  | 			// read response | ||||||
|  | 			InputStream is = connection.getInputStream(); | ||||||
|  | 			int len = connection.getContentLength(); | ||||||
|  | 			ByteArrayOutputStream buffer = new ByteArrayOutputStream(len < 256 ? 256 : len); | ||||||
|  | 			byte b[] = new byte[1024]; | ||||||
|  | 			int size = 0; | ||||||
|  | 			while((size=is.read(b)) >= 0) { | ||||||
|  | 				buffer.write(b, 0, size); | ||||||
|  | 			} | ||||||
|  | 			is.close(); | ||||||
|  | 
 | ||||||
|  | 			// load cookies | ||||||
|  | 			List<String> cookies = connection.getHeaderFields().get("Set-Cookie"); | ||||||
|  | 			if(cookies != null) { | ||||||
|  | 				for(String cookie : cookies) { | ||||||
|  | 					Matcher matcher = COOKIESET.matcher(cookie); | ||||||
|  | 					if(matcher.find()) { | ||||||
|  | 						String name = matcher.group(1); | ||||||
|  | 						String value = matcher.group(2); | ||||||
|  | 						fCookies.put(name, value); | ||||||
|  | 					} | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			return new MibewResponse(connection.getResponseCode(), buffer.toByteArray()); | ||||||
|  | 		} catch (Exception e) { | ||||||
|  | 			if(e instanceof IOException) { | ||||||
|  | 				throw (IOException)e; | ||||||
|  | 			} | ||||||
|  | 			throw new IOException("cannot connect: " + e.getMessage()); | ||||||
|  | 		} finally { | ||||||
|  | 			if (connection != null) { | ||||||
|  | 				connection.disconnect(); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	protected void handleError(String message, Exception ex) { | ||||||
|  | 		System.err.println(message); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private static Pattern COOKIESET = Pattern.compile("\\A(\\w+)=([^;]+);"); | ||||||
|  | } | ||||||
| @ -0,0 +1,50 @@ | |||||||
|  | package org.mibew.api; | ||||||
|  | 
 | ||||||
|  | import java.io.ByteArrayInputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStreamReader; | ||||||
|  | import java.io.Reader; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class MibewResponse { | ||||||
|  | 	 | ||||||
|  | 	public int code; | ||||||
|  | 	public byte[] response; | ||||||
|  | 
 | ||||||
|  | 	public MibewResponse(int code, byte[] response) { | ||||||
|  | 		this.code = code; | ||||||
|  | 		this.response = response; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public int getCode() { | ||||||
|  | 		return code; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public byte[] getResponse() { | ||||||
|  | 		return response; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public String getResponseText() { | ||||||
|  | 		try { | ||||||
|  | 			Reader r = new InputStreamReader(new ByteArrayInputStream(response), "UTF-8"); | ||||||
|  | 			StringBuilder sb = new StringBuilder(); | ||||||
|  | 			char[] c = new char[1024]; | ||||||
|  | 			int size = 0; | ||||||
|  | 			while((size = r.read(c)) != -1) { | ||||||
|  | 				sb.append(c, 0, size); | ||||||
|  | 			} | ||||||
|  | 			return sb.toString(); | ||||||
|  | 		} catch(IOException ex) { | ||||||
|  | 			return "<exception is thrown: "+ex.toString()+">"; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public String toString() { | ||||||
|  | 		return | ||||||
|  | 			"Response code: " + code + "\n" + | ||||||
|  | 			"Text: " + getResponseText(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,38 @@ | |||||||
|  | package org.mibew.api; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class MibewThread { | ||||||
|  | 
 | ||||||
|  | 	public final long fId; | ||||||
|  | 	public String fState; | ||||||
|  | 	public String fClientName = ""; | ||||||
|  | 	public String fAgent = ""; | ||||||
|  | 	public String fAddress = ""; | ||||||
|  | 	public String fFirstMessage = ""; | ||||||
|  | 	public boolean fCanOpen = false; | ||||||
|  | 	public boolean fCanView = false; | ||||||
|  | 	public boolean fCanBan = false; | ||||||
|  | 	public String fStateText; | ||||||
|  | 
 | ||||||
|  | 	public MibewThread(long id, String state) { | ||||||
|  | 		fId = id; | ||||||
|  | 		fState = state; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public void updateFrom(MibewThread updated) { | ||||||
|  | 		if(fId != updated.fId) { | ||||||
|  | 			throw new IllegalArgumentException("different threads"); | ||||||
|  | 		} | ||||||
|  | 		fState = updated.fState; | ||||||
|  | 		fClientName = updated.fClientName; | ||||||
|  | 		fAgent = updated.fAgent; | ||||||
|  | 		fAddress = updated.fAddress; | ||||||
|  | 		fFirstMessage = updated.fFirstMessage; | ||||||
|  | 		fCanOpen = updated.fCanOpen; | ||||||
|  | 		fCanView = updated.fCanView; | ||||||
|  | 		fCanBan = updated.fCanBan; | ||||||
|  | 		fStateText = updated.fStateText; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,85 @@ | |||||||
|  | package org.mibew.api; | ||||||
|  | 
 | ||||||
|  | import java.io.ByteArrayInputStream; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | import javax.xml.parsers.SAXParser; | ||||||
|  | import javax.xml.parsers.SAXParserFactory; | ||||||
|  | 
 | ||||||
|  | import org.mibew.api.handlers.UpdateHandler; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class MibewTracker { | ||||||
|  | 	 | ||||||
|  | 	private final MibewConnection fConnection; | ||||||
|  | 	private final MibewTrackerListener fListener; | ||||||
|  | 	private long fSince = 0; | ||||||
|  | 	private long fLastUpdate = 0; | ||||||
|  | 	 | ||||||
|  | 	private final Map<Long,MibewThread> fThreads; | ||||||
|  | 
 | ||||||
|  | 	public MibewTracker(MibewConnection conn, MibewTrackerListener listener) { | ||||||
|  | 		this.fConnection = conn; | ||||||
|  | 		this.fListener = listener; | ||||||
|  | 		this.fThreads = new HashMap<Long, MibewThread>(); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public void track() throws InterruptedException { | ||||||
|  | 		for(int i = 0; i < 5; i++) { | ||||||
|  | 			try { | ||||||
|  | 				MibewResponse response = fConnection.request("operator/update.php", "since="+fSince); | ||||||
|  | 				SAXParser sp = SAXParserFactory.newInstance().newSAXParser(); | ||||||
|  | 				UpdateHandler handler = new UpdateHandler(); | ||||||
|  | 				sp.parse(new ByteArrayInputStream(response.getResponse()), handler); | ||||||
|  | 				handleResponse(response, handler); | ||||||
|  | 			} catch(Exception e) { | ||||||
|  | 				System.err.println("update exception: " + e.getMessage()); | ||||||
|  | 			} | ||||||
|  | 			Thread.sleep(1000); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void handleResponse(MibewResponse response, UpdateHandler handler) { | ||||||
|  | 		if(handler.getResponse() == UpdateHandler.UPD_ERROR) { | ||||||
|  | 			System.out.println("Update error: " + handler.getMessage()); | ||||||
|  | 		} else if(handler.getResponse() == UpdateHandler.UPD_THREADS) { | ||||||
|  | 			System.out.println("Updated.... " + handler.getRevision()); | ||||||
|  | 			fSince = handler.getRevision(); | ||||||
|  | 			fLastUpdate = handler.getTime(); | ||||||
|  | 			List<MibewThread> threads = handler.getThreads(); | ||||||
|  | 			if(threads != null && threads.size() > 0) { | ||||||
|  | 				processUpdate(threads); | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			System.out.println("Update error"); | ||||||
|  | 			System.out.println(response.getResponseText()); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	private void processUpdate(List<MibewThread> updated) { | ||||||
|  | 		for(MibewThread mt : updated) { | ||||||
|  | 			MibewThread existing = fThreads.get(mt.fId); | ||||||
|  | 			boolean isClosed = mt.fState.equals("closed"); | ||||||
|  | 			if(existing == null) { | ||||||
|  | 				if(!isClosed) { | ||||||
|  | 					fThreads.put(mt.fId, mt); | ||||||
|  | 					fListener.threadCreated(mt); | ||||||
|  | 				} | ||||||
|  | 			} else if(isClosed) { | ||||||
|  | 				fThreads.remove(mt.fId); | ||||||
|  | 				fListener.threadClosed(existing); | ||||||
|  | 			} else { | ||||||
|  | 				existing.updateFrom(mt); | ||||||
|  | 				fListener.threadChanged(existing); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public long getLastUpdate() { | ||||||
|  | 		return fLastUpdate; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | package org.mibew.api; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public abstract class MibewTrackerListener { | ||||||
|  | 	 | ||||||
|  | 	public void threadCreated(MibewThread thread) { | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public void threadChanged(MibewThread thread) { | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public void threadClosed(MibewThread thread) { | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | } | ||||||
							
								
								
									
										31
									
								
								src/mibewjava/org.mibew.jabber/src/org/mibew/api/Utils.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								src/mibewjava/org.mibew.jabber/src/org/mibew/api/Utils.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,31 @@ | |||||||
|  | package org.mibew.api; | ||||||
|  | 
 | ||||||
|  | import java.io.UnsupportedEncodingException; | ||||||
|  | import java.security.MessageDigest; | ||||||
|  | import java.security.NoSuchAlgorithmException; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class Utils { | ||||||
|  | 	 | ||||||
|  | 	private static final String HEX_DIGITS = "0123456789abcdef"; | ||||||
|  | 	 | ||||||
|  | 	public static String md5(String string) throws NoSuchAlgorithmException, UnsupportedEncodingException { | ||||||
|  | 		return md5(string.getBytes("utf-8")); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	private static String md5(byte[] string) throws NoSuchAlgorithmException { | ||||||
|  | 		MessageDigest md = MessageDigest.getInstance( "MD5" ); | ||||||
|  | 		md.update(string); | ||||||
|  | 		byte[] digest = md.digest(); | ||||||
|  | 		StringBuilder sb = new StringBuilder(); | ||||||
|  | 		for ( byte b : digest ) { | ||||||
|  | 			sb.append(HEX_DIGITS.charAt((b&0xff)>>4)); | ||||||
|  | 			sb.append(HEX_DIGITS.charAt(b&0xf)); | ||||||
|  |         } | ||||||
|  | 		return sb.toString(); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	 | ||||||
|  | } | ||||||
| @ -0,0 +1,41 @@ | |||||||
|  | package org.mibew.api.handlers; | ||||||
|  | 
 | ||||||
|  | import java.util.Stack; | ||||||
|  | 
 | ||||||
|  | import org.xml.sax.Attributes; | ||||||
|  | import org.xml.sax.SAXException; | ||||||
|  | import org.xml.sax.helpers.DefaultHandler; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class LoginHandler extends DefaultHandler { | ||||||
|  | 	 | ||||||
|  | 	private Stack<String> fPath = new Stack<String>(); | ||||||
|  | 	private String status = "";  | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void startElement(String uri, String localName, String name, | ||||||
|  | 			Attributes attributes) throws SAXException { | ||||||
|  | 		fPath.push(name); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	@Override | ||||||
|  | 	public void endElement(String uri, String localName, String name) | ||||||
|  | 			throws SAXException { | ||||||
|  | 		fPath.pop(); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	@Override | ||||||
|  | 	public void characters(char[] ch, int start, int length) throws SAXException { | ||||||
|  | 		String current = fPath.peek(); | ||||||
|  | 		if(fPath.size() != 2 || !current.equals("status") || !fPath.get(0).equals("login")) { | ||||||
|  | 			throw new SAXException("unexpected characters"); | ||||||
|  | 		} | ||||||
|  | 		status += new String(ch,start,length); | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public String getStatus() { | ||||||
|  | 		return status; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,137 @@ | |||||||
|  | package org.mibew.api.handlers; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Stack; | ||||||
|  | 
 | ||||||
|  | import org.mibew.api.MibewThread; | ||||||
|  | import org.xml.sax.Attributes; | ||||||
|  | import org.xml.sax.SAXException; | ||||||
|  | import org.xml.sax.helpers.DefaultHandler; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class UpdateHandler extends DefaultHandler { | ||||||
|  | 
 | ||||||
|  | 	public static final int UPD_ERROR = 1; | ||||||
|  | 	public static final int UPD_THREADS = 2; | ||||||
|  | 
 | ||||||
|  | 	private int fResponse = 0; | ||||||
|  | 	private String fMessage = ""; | ||||||
|  | 	private long fRevision; | ||||||
|  | 	private long fTime; | ||||||
|  | 	private List<MibewThread> fUpdated; | ||||||
|  | 
 | ||||||
|  | 	private Stack<String> fPath = new Stack<String>(); | ||||||
|  | 	private MibewThread fCurrentThread; | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void startElement(String uri, String localName, String name, | ||||||
|  | 			Attributes attributes) throws SAXException { | ||||||
|  | 		try { | ||||||
|  | 			if (fPath.size() == 0) { | ||||||
|  | 				if (name.equals("error")) { | ||||||
|  | 					fResponse = UPD_ERROR; | ||||||
|  | 				} else if (name.equals("threads")) { | ||||||
|  | 					fResponse = UPD_THREADS; | ||||||
|  | 					fTime = Long.parseLong(attributes.getValue("time")); | ||||||
|  | 					fRevision = Long.parseLong(attributes.getValue("revision")); | ||||||
|  | 				} else { | ||||||
|  | 					throw new SAXException("unknown root element: " + name); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			if (fResponse == UPD_THREADS && fPath.size() == 1 | ||||||
|  | 					&& name.equals("thread")) { | ||||||
|  | 				long id = Long.parseLong(attributes.getValue("id")); | ||||||
|  | 				String stateid = attributes.getValue("stateid"); | ||||||
|  | 				fCurrentThread = new MibewThread(id, stateid); | ||||||
|  | 				 | ||||||
|  | 				if(!stateid.equals("closed")) { | ||||||
|  | 					fCurrentThread.fStateText = attributes.getValue("state"); | ||||||
|  | 					fCurrentThread.fCanOpen = booleanAttribute(attributes.getValue("canopen")); | ||||||
|  | 					fCurrentThread.fCanView = booleanAttribute(attributes.getValue("canview")); | ||||||
|  | 					fCurrentThread.fCanBan = booleanAttribute(attributes.getValue("canban")); | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 			} | ||||||
|  | 		} catch (NumberFormatException ex) { | ||||||
|  | 			throw new SAXException(ex.getMessage()); | ||||||
|  | 		} | ||||||
|  | 		fPath.push(name); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private boolean booleanAttribute(String value) { | ||||||
|  | 		if(value != null && value.equals("true")) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void endElement(String uri, String localName, String name) | ||||||
|  | 			throws SAXException { | ||||||
|  | 		fPath.pop(); | ||||||
|  | 		if (fResponse == UPD_THREADS && fPath.size() == 1 | ||||||
|  | 				&& name.equals("thread")) { | ||||||
|  | 			if(fUpdated == null) { | ||||||
|  | 				fUpdated = new ArrayList<MibewThread>(); | ||||||
|  | 			} | ||||||
|  | 			fUpdated.add(fCurrentThread); | ||||||
|  | 			fCurrentThread = null; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public void characters(char[] ch, int start, int length) | ||||||
|  | 			throws SAXException { | ||||||
|  | 		if (fResponse == UPD_ERROR) { | ||||||
|  | 			String current = fPath.peek(); | ||||||
|  | 			if (fPath.size() != 2 || !current.equals("descr")) { | ||||||
|  | 				throw new SAXException("unexpected characters"); | ||||||
|  | 			} | ||||||
|  | 			fMessage += new String(ch, start, length); | ||||||
|  | 		} else if (fResponse == UPD_THREADS) { | ||||||
|  | 			if(fCurrentThread == null || fPath.size() != 3) { | ||||||
|  | 				throw new SAXException("unknown characters"); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			String subvar = fPath.peek(); | ||||||
|  | 			String value = new String(ch, start, length); | ||||||
|  | 			if("name".equals(subvar)) { | ||||||
|  | 				fCurrentThread.fClientName += value;  | ||||||
|  | 			} else if("addr".equals(subvar)) { | ||||||
|  | 				fCurrentThread.fAddress += value; | ||||||
|  | 			} else if("message".equals(subvar)) { | ||||||
|  | 				fCurrentThread.fFirstMessage += value; | ||||||
|  | 			} else if("agent".equals(subvar)) { | ||||||
|  | 				fCurrentThread.fAgent += value; | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			// TODO | ||||||
|  | 
 | ||||||
|  | 		} else { | ||||||
|  | 			throw new SAXException("unexpected characters: no root"); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public int getResponse() { | ||||||
|  | 		return fResponse; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public String getMessage() { | ||||||
|  | 		return fMessage; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public long getTime() { | ||||||
|  | 		return fTime; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public long getRevision() { | ||||||
|  | 		return fRevision; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	public List<MibewThread> getThreads() { | ||||||
|  | 		return fUpdated; | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,63 @@ | |||||||
|  | package org.mibew.jabber; | ||||||
|  | 
 | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.security.NoSuchAlgorithmException; | ||||||
|  | 
 | ||||||
|  | import javax.xml.parsers.ParserConfigurationException; | ||||||
|  | 
 | ||||||
|  | import org.jivesoftware.smack.Chat; | ||||||
|  | import org.jivesoftware.smack.MessageListener; | ||||||
|  | import org.jivesoftware.smack.XMPPConnection; | ||||||
|  | import org.jivesoftware.smack.XMPPException; | ||||||
|  | import org.jivesoftware.smack.packet.Message; | ||||||
|  | import org.mibew.api.MibewConnection; | ||||||
|  | import org.mibew.api.MibewThread; | ||||||
|  | import org.mibew.api.MibewTracker; | ||||||
|  | import org.mibew.api.MibewTrackerListener; | ||||||
|  | import org.xml.sax.SAXException; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class Application { | ||||||
|  | 
 | ||||||
|  | 	public static void main(String[] args) throws NoSuchAlgorithmException, IOException, XMPPException, InterruptedException, ParserConfigurationException, SAXException { | ||||||
|  | 		System.out.println("Mibew Jabber transport application"); | ||||||
|  | 
 | ||||||
|  | 		Parameters p = new Parameters(args); | ||||||
|  | 		if(!p.load()) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		XMPPConnection connection = new XMPPConnection(p.fJabberServer); | ||||||
|  | 		connection.connect(); | ||||||
|  | 		connection.login(p.fJabberLogin, p.fJabberPassword); | ||||||
|  | 		final Chat chat = connection.getChatManager().createChat(p.fJabberAdmin, new MessageListener() { | ||||||
|  | 
 | ||||||
|  | 		    public void processMessage(Chat chat, Message message) { | ||||||
|  | 		        System.out.println("Received message: " + message.getThread() + " " + message.getBody()); | ||||||
|  | 		    } | ||||||
|  | 		}); | ||||||
|  | 
 | ||||||
|  | 		MibewConnection conn = new MibewConnection("http://localhost:8080/webim/", "admin", ""); | ||||||
|  | 		if(!conn.connect()) { | ||||||
|  | 			System.err.println("Wrong server, login or password."); | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 		MibewTracker mt = new MibewTracker(conn, new MibewTrackerListener(){ | ||||||
|  | 			 | ||||||
|  | 			@Override | ||||||
|  | 			public void threadCreated(MibewThread thread) { | ||||||
|  | 				try { | ||||||
|  | 					chat.sendMessage(thread.fId + ": " + thread.fAddress + " " + thread.fClientName); | ||||||
|  | 				} catch (XMPPException e) { | ||||||
|  | 					e.printStackTrace(); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 		}); | ||||||
|  | 		mt.track(); | ||||||
|  | 
 | ||||||
|  | 		connection.disconnect(); | ||||||
|  | 	} | ||||||
|  | } | ||||||
| @ -0,0 +1,54 @@ | |||||||
|  | package org.mibew.jabber; | ||||||
|  | 
 | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | import java.util.Properties; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  *  @author inspirer | ||||||
|  |  */ | ||||||
|  | public class Parameters { | ||||||
|  | 	 | ||||||
|  | 	private final String[] fArguments; | ||||||
|  | 	 | ||||||
|  | 	public String fJabberServer; | ||||||
|  | 	public String fJabberLogin; | ||||||
|  | 	public String fJabberPassword; | ||||||
|  | 	 | ||||||
|  | 	public String fJabberAdmin; | ||||||
|  | 
 | ||||||
|  | 	public Parameters(String[] args) { | ||||||
|  | 		this.fArguments = args; | ||||||
|  | 	} | ||||||
|  | 	 | ||||||
|  | 	private String getProperty(Properties p, String name) throws IOException { | ||||||
|  | 		String result = p.getProperty(name); | ||||||
|  | 		if(result == null || result.trim().length() == 0) { | ||||||
|  | 			throw new IOException("No '"+name+"' property"); | ||||||
|  | 		} | ||||||
|  | 		return result; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	public boolean load() { | ||||||
|  | 		try { | ||||||
|  | 			InputStream is = getClass().getClassLoader().getResourceAsStream("mibew.ini"); | ||||||
|  | 			if(is != null) { | ||||||
|  | 				Properties p = new Properties(); | ||||||
|  | 				p.load(is); | ||||||
|  | 				 | ||||||
|  | 				fJabberServer = getProperty(p, "jabber.host"); | ||||||
|  | 				fJabberLogin = getProperty(p, "jabber.login"); | ||||||
|  | 				fJabberPassword = getProperty(p, "jabber.password"); | ||||||
|  | 				fJabberAdmin = getProperty(p, "jabber.admin"); | ||||||
|  | 				 | ||||||
|  | 				return true;  | ||||||
|  | 			} | ||||||
|  | 		} catch (IOException e) { | ||||||
|  | 			System.err.println(e.getMessage()); | ||||||
|  | 			return false; | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		System.err.println("Cannot find mibew.ini"); | ||||||
|  | 		return false; | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user