/*
 * Copyright: Jiang Xi Strong Co.. Ltd.
 * 
 * All right reserved.
 *  
 */
package com.strongit.credit.manager.infomanager.dao.impl;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Serializable;
import java.io.Writer;
import java.lang.reflect.Method;
import java.sql.Clob;
import java.util.List;
import oracle.sql.CLOB;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Hibernate;
import org.hibernate.LockMode;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.lob.SerializableClob;
import com.strongit.credit.common.dao.impl.CreditDAO;
import com.strongit.credit.common.filter.ResultFilter;
import com.strongit.credit.common.po.Info;
import com.strongit.credit.common.po.Stat;
import com.strongit.credit.common.po.Subject;
import com.strongit.credit.manager.infomanager.dao.InfoDao;
/*
 * Create Date:2008-9-22 上午09:54:46
 * 
 * Author:lanjh
 * 
 * Version: V1.0
 * 
 * Description:对进行修改的功能进行描述
 * 
 * 
 */
public class InfoDaoImpl extends CreditDAO implements InfoDao {
    private Log log;
    public InfoDaoImpl() {
        log = LogFactory.getLog(InfoDaoImpl.class);
    }
    public void addip(Stat stat) {
        this.getSession().save(stat);
    }
    public int count(ResultFilter resultfilter) {
        // TODO Auto-generated method stub
        return getResultCount(com.strongit.credit.common.po.InfoWrapper.class,
                resultfilter);
    }
    public void delete(Info info) {
//        this.getHibernateTemplate().delete(info);
        Transaction tx = this.getSession().beginTransaction();
        this.getSession().delete(info);
        tx.commit();
    }
    public Info findInfoById(Long long1) {
        return loadInfo(com.strongit.credit.common.po.InfoWrapper.class, long1);
    }
    public Subject findSubjectById(String s) {
        return (Subject) this.getSession().get(
                com.strongit.credit.common.po.Subject.class, s);
    }
    public List getInfos(ResultFilter resultfilter) {
        return getResults(com.strongit.credit.common.po.InfoWrapper.class,
                resultfilter);
    }
    public List getStat() {
        String hql = "";
        hql = "select sum(decode(t.comedate,null,0,1)) AS TOTAL, sum(decode(to_char(t.comedate,'yyyy-mm') ,to_char(ADD_MONTHS(SYSDATE,-1),'yyyy-mm'),1,0)) AS LASTMONTH, sum(decode(to_char(t.comedate,'yyyy-mm') ,to_char(ADD_MONTHS(SYSDATE,0),'yyyy-mm'),1,0)) AS THISMONTH, sum(decode(to_char(t.comedate,'yyyy-mm-dd') ,to_char(SYSDATE-1,'yyyy-mm-dd'),1,0)) AS YESTERDAY, sum(decode(to_char(t.comedate,'yyyy-mm-dd') ,to_char(SYSDATE,'yyyy-mm-dd'),1,0)) AS TODAY from STAT t ";
        SQLQuery query = this.getSession().createSQLQuery(hql);
        return query.list();
    }
    public List getSubjects(ResultFilter resultfilter) {
        return getResults(com.strongit.credit.common.po.Subject.class,
                resultfilter);
    }
    public void insert(Info info) {
        Session ssesion = this.getSession();    
        Transaction ts = ssesion.beginTransaction();    
        info.setContentClob(Hibernate.createClob(" "));    
        ssesion.save(info);
        ssesion.flush();
        ssesion.refresh(info,LockMode.UPGRADE);    
        SerializableClob clob=(SerializableClob)info.getContentClob();     
        java.sql.Clob wrapClob = clob.getWrappedClob();     
        CLOB tmpClob=(CLOB)wrapClob;     
        Writer wt;
        try {
            wt = tmpClob.getCharacterOutputStream();
            String content = info.getContent();
            wt.write(content);
            wt.close();
            ts.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void update(Info info) {
//        Session ssesion = this.getSession();    
//        Transaction ts = ssesion.beginTransaction();
//        info = (Info)ssesion.load(Info.class,info.getId(),LockMode.UPGRADE); 
//
//        info.setContent(info.getContent());
//        info.setContentClob(Hibernate.createClob(" "));
//        ssesion.update(info);
//        ssesion.flush();
//        ssesion.refresh(info,LockMode.UPGRADE);
//        SerializableClob clob=(SerializableClob)info.getContentClob();
//        java.sql.Clob wrapClob = clob.getWrappedClob();     
//        CLOB tmpClob=(CLOB)wrapClob;
//        Writer wt;
//        try {
//            wt = tmpClob.setCharacterStream(0);
//            String content = info.getContent();
//            wt.write(content);
//            wt.close();
//            ts.commit();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
        this.delete(info);
        this.insert(info);
    }
    
    public void saveOrUpdate(Info info)
    {
        Session s;
        BufferedWriter writer;
        s = this.getHibernateTemplate().getSessionFactory().getCurrentSession();
        writer = null;
        try
        {
            Class clazz = Info.class;
            Method m = null;
            String clobValue = null;
            clobValue = info.getContent();
            m = clazz.getDeclaredMethod("setContentClob", new Class[] {
                java.sql.Clob.class
            });
            m.setAccessible(true);
            if(clobValue == null || clobValue.length() == 0)
                m.invoke(info, new Object[] {
                    Hibernate.createClob("")
                });
            else
                m.invoke(info, new Object[] {
                    Hibernate.createClob(" ")
                });
            s.saveOrUpdate(info);
            if(clobValue != null && clobValue.length() > 0)
            {
                s.flush();
                s.refresh(info, LockMode.UPGRADE);
                CLOB clob = null;
                m = clazz.getDeclaredMethod("getContentClob", null);
                m.setAccessible(true);
                Object obj = m.invoke(info, null);
                if(obj instanceof SerializableClob)
                    clob = (CLOB)((SerializableClob)obj).getWrappedClob();
                if(clob != null)
                {
                    writer = new BufferedWriter(clob.getCharacterOutputStream());
                    writer.write(clobValue);
                }
            }
        }
        catch(Exception e)
        {
            StringBuilder sb = new StringBuilder();
            sb.append("\u6301\u4E45\u5316POJO\u65F6\u51FA\u73B0\u9519\u8BEF\uFF0C\u7C7B ").append(info.getClass().getName()).append("\u3002").append(e.getMessage());
            log.error(sb.toString());
        }  
        
        if(writer != null)
            try
            {
                writer.close();
            }
            catch(IOException e)
            {
                log.error(e.getMessage());
            }
        return;
    }
    public Info loadInfo(Class clazz, Serializable id) {
        Object pojo;
        Info info;
        BufferedReader reader;
        pojo = this.getSession().get(clazz, id);
        info = (Info) pojo;
        if (pojo == null || !(pojo instanceof Info)) {
            this.getSession().refresh(pojo, LockMode.READ);
        }
        reader = null;
        try {
            Class c = com.strongit.credit.common.po.Info.class;
            Method m = c.getDeclaredMethod("getContentClob", null);
            m.setAccessible(true);
            Object result = m.invoke(pojo, null);
            if (result != null) {
                reader = new BufferedReader(((Clob) result)
                        .getCharacterStream());
                StringBuilder sb = new StringBuilder();
                for (String line = null; (line = reader.readLine()) != null;)
                    sb.append(line);
                if (sb.length() > 0)
                    info.setContent(sb.toString());
            }
        } catch (Exception e) {
            StringBuilder sb = new StringBuilder();
            sb
                    .append(
                            "\u52A0\u8F7DPOJO\u65F6\u51FA\u73B0\u9519\u8BEF\uFF0C\u7C7B ")
                    .append(clazz.getName()).append("\u3002").append(
                            e.getMessage());
            log.error(sb.toString());
        }
        if (reader != null)
            try {
                reader.close();
            } catch (IOException e) {
                log.error(e.getMessage());
            }
        return info;
    }
}