SimpleDateFormat sdfParse = new SimpleDateFormat(”MMMMM dd, yyyy”, Locale.ENGLISH);
        SimpleDateFormat sdfFormat = new SimpleDateFormat(”yyyy-MM-dd”);
        SimpleDateFormat comFormat = new SimpleDateFormat(”yyyyMMdd”);
       
        long start = System.currentTimeMillis();
        Config.init(”app.properties”);
       
        //prepare db
        StringBuilder sql = null;
        Statement st = null;
        Connection conn = null;
        try{
            Class.forName(Config.get(”DB_DRIVER”)).newInstance();
            conn = DriverManager.getConnection(Config.get(”DB_DSN”), Config.get(”DB_USERNAME”), Config.get(”DB_PASSWORD”));
            st = conn.createStatement();
        }catch(InstantiationException e){
            e.printStackTrace();
        }catch(ClassNotFoundException e){
            e.printStackTrace();
        }catch(SQLException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
       
        //change timezone
        Calendar calendar = GregorianCalendar.getInstance();
        int millisDiff = TimeZone.getTimeZone(Config.get(”TZ_DATA”)).getRawOffset() - TimeZone.getDefault().getRawOffset();
        calendar.setTimeInMillis(calendar.getTimeInMillis()+millisDiff);
       
        Calendar calYesterday = (Calendar)calendar.clone();
        calYesterday.add(Calendar.DAY_OF_YEAR, -1);

        Calendar calLastWeekDay = (Calendar)calYesterday.clone();
        calLastWeekDay.add(Calendar.DAY_OF_YEAR, - Integer.parseInt(Config.get(”OFFSET_DAYS”)));
       
        System.out.println(”From: “+sdfFormat.format(calLastWeekDay.getTime()));
        System.out.println(”To: “+sdfFormat.format(calYesterday.getTime()));
       
        int i = 0, m = 0;
        HashMap<String, HashMap> data = new HashMap<String, HashMap>();
        HashMap<String, String> item = null;//new HashMap<String, String>()
        String u = Config.get(”START_URL”);
        WebClient client = new WebClient();
        client.setCssEnabled(false);
        client.setJavaScriptEnabled(false);
        client.setRedirectEnabled(true);
        client.setThrowExceptionOnScriptError(false);
        client.setThrowExceptionOnFailingStatusCode(false);
        client.setTimeout(0);
        try {
            //login
            HtmlPage p = (HtmlPage) client.getPage(u);
            HtmlForm form = (HtmlForm) p.getFormByName(”sign_in”);

            HtmlInput email = (HtmlInput) form.getInputByName(”email”);
            HtmlInput pass = (HtmlInput) form.getInputByName(”password”);
            HtmlInput submit = (HtmlInput) form.getInputByValue(”サインイン”);
            email.setValueAttribute(Config.get(”USERNAME”));
            pass.setValueAttribute(Config.get(”PASSWORD”));

            HtmlPage pr = (HtmlPage) submit.click();
           
            //go to report page
            HtmlPage er = client
                    .getPage(”https://the.report.page”);

            form = er.getFormByName(”htmlReport”);
           
            //set options
            form.getInputByValue(”exact”).setChecked(true);
           
            form.getSelectByName(”startMonth”).setSelectedAttribute(String.valueOf(calLastWeekDay.get(Calendar.MONTH)), true);
            form.getSelectByName(”startDay”).setSelectedAttribute(String.valueOf(calLastWeekDay.get(Calendar.DAY_OF_MONTH)), true);
            form.getSelectByName(”startYear”).setSelectedAttribute(String.valueOf(calLastWeekDay.get(Calendar.YEAR)), true);
           
            form.getSelectByName(”endMonth”).setSelectedAttribute(String.valueOf(calYesterday.get(Calendar.MONTH)), true);
            form.getSelectByName(”endDay”).setSelectedAttribute(String.valueOf(calYesterday.get(Calendar.DAY_OF_MONTH)), true);
            form.getSelectByName(”endYear”).setSelectedAttribute(String.valueOf(calYesterday.get(Calendar.YEAR)), true);
           
            HtmlInput gt = form.getInputByValue(”レポートのダウンロード(CSV形式)”);
            InputStream in = null;
           
            //retry if not available
            int retry = 0;
            while(in == null && retry < 50){
                in = gt.click().getWebResponse().getContentAsStream();
                if(in == null){
                    System.out.println(”Data not available! wait for 1 minute…”);
                    Thread.sleep(60000);
                }
                retry++;
            }

            //parse report
            BufferedReader br = new BufferedReader(new InputStreamReader(in, “UTF-8″));
            String line = null, key = null;
            String[] cols = null;
            HashMap<String, String> tmp = null;
            br.readLine();

            while ((line = br.readLine()) != null) {
                i++;
                item = new HashMap<String, String>();
                cols = StringUtils.splitPreserveAllTokens(line, “\t”);//.split(”\t”);
                System.out.println(”line”+i+” = “+cols.length);
                if(cols.length<11 || i<2){
                    for(int k=0; k<cols.length; k++){
                        System.out.println(”cols["+k+"]=”+cols[k]);
                    }
                    continue;
                }

                String settleDate = sdfFormat.format(sdfParse.parse(cols[5]));
                key = cols[2].trim()+settleDate;
                item.put(”OUTGOINGID”, cols[2].trim());
                item.put(”SETTLEDATE”, settleDate);
                if(data.containsKey(key)){
                    tmp = data.get(key);
                    item.put(”ORDERCOUNT”, String.valueOf(Integer.parseInt(tmp.get(”ORDERCOUNT”)) + Integer.parseInt(cols[8].replaceAll(”,”, “”))));
                    item.put(”ORDERAMOUNT”, String.valueOf(Double.parseDouble(tmp.get(”ORDERAMOUNT”)) + Double.parseDouble(cols[9].replace(”¥”, “”).replaceAll(”,”, “”))));
                    item.put(”REVENUE”, String.valueOf(Double.parseDouble(tmp.get(”REVENUE”)) + Double.parseDouble(cols[10].replace(”¥”, “”).replaceAll(”,”, “”))));
                }else{
                    item.put(”ORDERCOUNT”, String.valueOf(Integer.parseInt(cols[8].replaceAll(”,”, “”))));
                    item.put(”ORDERAMOUNT”, String.valueOf(Double.parseDouble(cols[9].replace(”¥”, “”).replaceAll(”,”, “”))));
                    item.put(”REVENUE”, String.valueOf(Double.parseDouble(cols[10].replace(”¥”, “”).replaceAll(”,”, “”))));
                }
                data.put(key, item);
            }
           
            br.close();
            in.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
       
       
        //save report
        for(Entry<String, HashMap> entry:data.entrySet()){
            item = entry.getValue();
            sql = new StringBuilder();
            sql.append(”select OUTGOINGID, SETTLEDATE, sum(REVENUE) as REVENUE from “);
            sql.append(Config.get(”TBL_CPA”));
            sql.append(” where OUTGOINGID=’”);
            sql.append(item.get(”OUTGOINGID”));
            sql.append(”‘ and to_char(SETTLEDATE, ‘yyyy-mm-dd’)=’”);
            sql.append(item.get(”SETTLEDATE”));
            sql.append(”‘ group by OUTGOINGID, SETTLEDATE”);
           
            try{
                st.execute(sql.toString());
   
                double oldRev = 0;
                if(st.getResultSet().next()){
                    oldRev = st.getResultSet().getDouble(”REVENUE”);
                }
                System.out.println(”oldRev=”+oldRev);
                double newRev = Double.parseDouble(item.get(”REVENUE”));
                double varRev = newRev-oldRev;
                if (varRev != 0){
                    System.out.println(”newRev=”+newRev);
                    sql = new StringBuilder();
                    sql.append(”insert into “);
                    sql.append(Config.get(”TBL_CPA”));
                    sql.append(”(WEBSITE, OUTGOINGID, SETTLEDATE, ORDERAMOUNT, ORDERCOUNT, REVENUE, LOADDATE)”);
                    sql.append(”values(1, ‘”);
                    sql.append(item.get(”OUTGOINGID”));
                    sql.append(”‘, to_date(’”);
                    sql.append(item.get(”SETTLEDATE”));
                    sql.append(”‘, ‘yyyy-mm-dd’), “);
                    sql.append(item.get(”ORDERAMOUNT”));
                    sql.append(”,”);
                    sql.append(item.get(”ORDERCOUNT”));
                    sql.append(”,”);
                   
                    sql.append(String.valueOf(varRev));
                    sql.append(”, to_date(’”);
                    sql.append(sdfFormat.format(calYesterday.getTime()));//
                    sql.append(”‘, ‘yyyy-mm-dd’))”);
                   
                    st.execute(sql.toString());
                   
                    m++;
                }else{
                    System.out.println(”Found no change: “+item.get(”OUTGOINGID”)+” : “+item.get(”SETTLEDATE”));
                }
            }catch(SQLException e){
                e.printStackTrace();
            }
        }
        System.out.println(”total=”+i+”; matched=”+m);
       
        //write log
        sql = new StringBuilder();
        sql.append(”begin user.log_proceduce(’the_site’, ‘cpa_”);
        sql.append(comFormat.format(calYesterday.getTime()));
        sql.append(”.dat’,”);
        sql.append(m);
        sql.append(”,0, null, ‘revenue’); end;”);
       
        try{
            st.execute(sql.toString());
        }catch(SQLException e){
            e.printStackTrace();
        }
       
        client = null;
        long cost = (System.currentTimeMillis()-start)/1000;
        System.out.println(”cost time: “+String.valueOf(cost)+” secs.”);