java

    contact-list类库依赖包之gdata

    25 Oct 2009

    gdata是google提供的获取其数据的api,analytics, calender, contacts, webmastertools, youtube等等。

    对于contact-list从1.7.0开始,放弃原来通过模拟用户登录并爬取网页数据的做法,改用gdata api,使得获取google联系人列表变得简单了许多,同时使用api也保证联系人的获取不会因为网页的变动而失败。

    contact-list使用gdata有一点小问题,那就是gdata没有maven repository,我不得不手动下载gdata的jar包,并手动安装到本地的maven类库中。下面是安装这些jar包的ruby脚本(shell脚本不熟)

    [
      ['analytics', 2.0],
      ['appsforyourdomain', 1.0],
      ['base', 1.0],
      ['blogger', 2.0],
      ['books', 1.0],
      ['calendar', 2.0],
      ['client', 1.0],
      ['codesearch', 2.0],
      ['con...
    Read More

    Tags 


    contact-list类库依赖包之json

    19 Sep 2009

    json类库为java提供了方便地在json和string之间的转换和对json数据的操作。

    对于contact-list类库来说,有些联系人信息是通过json来传输的,所以利用json类库来处理数据。

    1. 从String转换为JSON对象

    protected JSONObject parseJSON(String content, String startTag) throws JSONException {
        String json = content.substring(content.indexOf(startTag) + startTag.length());
        JSONTokener jsonTokener = new JSONTokener(json);
        Object o = jsonTokener.nextValue();
        return (JSONObject) o;
    }
    
    protected JSONObject parseJSON(String content, String startTag, String endTag) throws...
    Read More

    Tags 


    在google app engine上做代理服务(for crawler)

    12 Sep 2009

    本来是想在GAE上做一个完整的代理服务器的,结果发现不可行,好像当HTTP的URL和HOST不匹配的时候,GAE就会把你拦截。怪不得GAE上找到的代理服务器都必须安装客户端或者是网页式的呢。

    但是我在hostmonster上的crawler还被挡在国门之外,没办法,只能通过QUERY_STRING来实现一个比较奇怪的代理了:

    package com.huangzhimin.gae.proxy;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.Enumeration;
    
    import javax.servlet.http.*;
    
    @SuppressWarnings("serial")
    public class RichardProxyServlet extends HttpServlet {
        public void doGet(HttpServletRequest req...
    Read More

    Tags 


    android初始化时反射读取所有的drawable

    06 Sep 2009

    刚开始写android app,需要做一个图片浏览的Activity,本来应该是用一个数组来列出所有的drawable,不过drawable实在太多了,一个个列出来还是件体力活,只能搬出java reflection。代码如下:

    try {
        Class klazz = Class.forName("com.huangzhimin.android.R$drawable");
        Field[] fields = klazz.getFields();
        mImageIds = new int[fields.length - 1];
        int i = 0;
        for (Field field : fields) {
            if (!field.getName().equals("icon")) {
                mImageIds[i] = field.getInt(klazz);
                i++;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();...
    Read More

    Tags 


    contact-list类库依赖包之msnmlib

    26 Aug 2009

    msnmlib是韩国人写的一个msn的java客户端,提供了完整的api,很好用的,唯一的缺陷就是javadoc使用韩文写的,看不懂。

    对于contact-list类库来说,完全是基于msnmlib来提供对msn联系人列表的导入。

    1. 登录msn
    private void login() {
        msn.setInitialStatus(UserStatus.OFFLINE);
        msn.login(username, password);
    }

    设置初始登录状态为OFFLINE,可以防止被误以为是用户登录,影响用户之间的联系。

    1. 获取联系人列表
    public List<Contact> getContacts() throws ContactsException {
        try {
            login();
            List<Contact> contacts = new ArrayList<Contact>();
            BuddyList list = msn.getBuddyGroup().getAllowList();
            ...
    Read More

    Tags 


    给javadoc增加uml类图

    23 Aug 2009

    今天准备开始写点介绍我的contact-list jar包的文章,自然要放些直观的UML图看看,google了一下,找到了一个名叫apiviz的maven插件,可以为javadoc生成uml类图。用起来也很方便,首先安装graphviz包

    sudo apt-get install graphviz

    然后修改pom.xml文件

    1. 增加jboss的repository
    <repositories>
        <repository>
            <id>jboss.releases</id>
            <name>JBosss releases</name>
            <url>http://repository.jboss.org/maven2 </url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        ...
    Read More

    Tags 


    contact-list类库依赖包之commons-httpclient

    23 Aug 2009

    commons-httpclient是apache下的一个开源项目,提供了一个纯java实现的http客户端,使用它可以很方便发送HTTP请求,接受HTTP应答,自动管理Cookie等等。

    对于contact-list类库来说,需要使用的功能有,自动管理Cookie,设置HTTP头,发送HTTP请求,接受HTTP应答,转发HTTP重定向,还有输出HTTP请求/应答日志,下面对这些功能的实现进行解释:

    1. 自动管理Cookie
    public EmailImporter(String email, String password, String encoding) {
        ......
        client = new HttpClient();
        client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
        client.getParams().setParameter("http.protocol.single-cookie-header", true);
    }

    其中将HttpClient的Cookie策略设置为CookiePolicy.BROWSER_COMPATIBILITY,即表示java client将按照浏览器的方式来自动处理Cookie。当然你也可以在运行过程中手动调整cooki...

    Read More

    Tags 


    java读取配置文件

    17 Jul 2009

    最近在完善contact-list项目,打算把一些配置写配置文件里,就像log4j的做法一样,代码如下:

    package com.huangzhimin.contacts.utils;
    
    import java.net.URL;
    import java.util.Properties;
    
    public class SystemConfig {
    
        private static Properties props = null;
    
        static {
            try {
                props = new Properties();
                URL url = Thread.currentThread().getContextClassLoader().getResource("contactlist.properties");
                if (url != null) {
                    props.load(url.openStream());
                }
            } catch (...
    Read More

    Tags 


    Java连接LDAP服务器

    25 Jun 2008

    LDAP是轻量目录访问协议,是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用。 LDAP是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言SQL属同一级别。LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。

    Java连接LDAP服务器可以通过JDK的Context接口。下面定义了两种Context,env是直接查询referral指向的目标,而envIgnoreReferral则忽略referral,可以用来修改referral的值。我用的ldap服务器是openldap

    private static Hashtable env = new Hashtable();
    private static Hashtable envIgnoreReferral = new Hashtable();
    
    static {
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun...
    Read More

    Tags