paulwong

#

解压ZIP文件

在pom.xml中加入JAR包
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
</dependency>

ZipUtil.java
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.UUID;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ZipUtil {
    
    private static Logger logger = LoggerFactory.getLogger(ZipUtil.class);
    
    public static void extractFolder(InputStream inputStream, String outputFolder) throws IOException 
    {
        ZipInputStream zis = null;
        try {

            Charset GBK = Charset.forName("GBK");
            zis = new ZipInputStream(inputStream, GBK);
            ZipEntry entry;

            while ((entry = zis.getNextEntry()) != null) {

                // Create a file on HDD in the destinationPath directory
                
// destinationPath is a "root" folder, where you want to extract your ZIP file
                String encoding = System.getProperty("file.encoding");
                logger.info("encoding:"+encoding); 
                
                String fileName = new String(entry.getName().getBytes("GBK"), encoding);
                File entryFile = new File(outputFolder, fileName);
//                File entryFile = new File(outputFolder, entry.getName());
                if (entry.isDirectory()) {

                    if (entryFile.exists()) {
                        logger.warn("Directory {0} already exists!", entryFile);
                    } else {
                        entryFile.mkdirs();
                    }

                } else {

                    // Make sure all folders exists (they should, but the safer, the better ;-))
                    if (entryFile.getParentFile() != null && !entryFile.getParentFile().exists()) {
                        entryFile.getParentFile().mkdirs();
                    }

                    // Create file on disk
                    if (!entryFile.exists()) {
                        entryFile.createNewFile();
                    }

                    // and rewrite data from stream
                    OutputStream os = null;
                    try {
                        os = new FileOutputStream(entryFile);
                        IOUtils.copy(zis, os);
                    } finally {
//                        os.close();
                        IOUtils.closeQuietly(os);
                        zis.closeEntry();
                    }
                }
            }
        } finally {
            IOUtils.closeQuietly(zis);
        }
    }
    
    public static void main(String [] args) throws IOException
    {
        final String INPUT_ZIP_FILE = "D:TESTING-FILE/ZIP/INPUT/应用.zip";
        String OUTPUT_FOLDER = "D:/TESTING-FILE/ZIP/OUTPUT";
        
        OUTPUT_FOLDER += File.separator + UUID.randomUUID().toString();
        
        InputStream inputStream = new FileInputStream(new File(INPUT_ZIP_FILE));
        
        extractFolder(inputStream, OUTPUT_FOLDER);
        
        /*File file = new File(OUTPUT_FOLDER);
        FileUtil.deleteFolder(file);
*/
    }

}

posted @ 2014-10-29 17:34 paulwong 阅读(358) | 评论 (0)编辑 收藏

EXCEL转JAVA BEAN

pom.xml回入以下包:
        <dependency>
            <groupId>net.sf.jxls</groupId>
            <artifactId>jxls-core</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.jxls</groupId>
            <artifactId>jxls-reader</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.jxls</groupId>
            <artifactId>jxls-examples</artifactId>
        </dependency>


转换的配置文件:
<workbook>
  <worksheet name="Sheet1">
    <section startRow="0" endRow="0" />
    <loop startRow="1" endRow="1" items="result" var="app" varType="n.app.valueobject.App">
      <section startRow="1" endRow="1">
        <mapping row="1" col="0">app.title</mapping>
        <mapping row="1" col="1">app.categoryId</mapping>
        <mapping row="1" col="2">app.updateContent</mapping>
        <mapping row="1" col="3">app.rank</mapping>
        <mapping row="1" col="4">app.installedQty</mapping>
        <mapping row="1" col="5">app.installedType</mapping>
        <mapping row="1" col="6">app.discuss</mapping>
        <mapping row="1" col="7">app.summary</mapping>
        <mapping row="1" col="8">app.deviceTypes</mapping>
        <mapping row="1" col="9">app.description</mapping>
        <mapping row="1" col="10">app.newFeatures</mapping>
        <mapping row="1" col="11">app.shortRecommend</mapping>
        <mapping row="1" col="12">app.appUrl</mapping>
      </section>
      <loopbreakcondition>
        <rowcheck offset="0">
          <cellcheck offset="0" />
        </rowcheck>
      </loopbreakcondition>
    </loop>
  </worksheet>
</workbook>



JAVA代码:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.jxls.reader.ReaderBuilder;
import net.sf.jxls.reader.XLSReader;

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;

import application.app.valueobject.App;

public class ExcelUtil<T> {
    
    private static Logger logger = LoggerFactory.getLogger(ExcelUtil.class);
    
    public List<T> parseExcelFileToBeans(InputStream xlsFileInputStream, InputStream jxlsConfigInputStream) throws IOException, SAXException, InvalidFormatException  {
        
        
        List<T> result = new ArrayList<T>();
        Map<String, Object> beans = new HashMap<String, Object>();
        beans.put("result", result);
        InputStream inputStream = null;
        try {
            XLSReader xlsReader = ReaderBuilder.buildFromXML(jxlsConfigInputStream);
            inputStream = new BufferedInputStream(xlsFileInputStream);
            xlsReader.read(inputStream, beans);
        } catch (IOException e) {
            logger.error(e.getMessage(), e);
            throw e;
        } catch (SAXException e) {
            logger.error(e.getMessage(), e);
            throw e;
        } catch (InvalidFormatException e) {
            logger.error(e.getMessage(), e);
            throw e;
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (Exception e) {
                }
            }
        }
        return result;
    }
    
    public static void main(String[] args) throws Exception {
        
        String path = "D:/DATA/TESTING-FILE/EXCEL";
        
        path = System.getProperty("user.home");
        
        ExcelUtil<App> util = new ExcelUtil<App>();
        String excelFilePath = path + File.separator + "appData.xls";
        
        InputStream configInputStream = 
                ExcelUtil.class.getResourceAsStream("/excel/template/config/app_config.xml");
        InputStream xlsFileInputStream = new FileInputStream(excelFilePath);
        
        List<App> appList = util.parseExcelFileToBeans(xlsFileInputStream, configInputStream);

        for (App app : appList) {
            System.out.println(app.toString());
        }
        
        /*String [] args2 = {""};
        GroupingSample.main(args2);
*/

    }

}


http://www.yihaomen.com/article/java/530.htm

posted @ 2014-10-29 17:25 paulwong 阅读(1093) | 评论 (0)编辑 收藏

springMVC 文件下载

import java.io.File;  
import java.io.IOException;  
  
import org.apache.commons.io.FileUtils;  
import org.springframework.context.annotation.Scope;  
import org.springframework.http.HttpHeaders;  
import org.springframework.http.HttpStatus;  
import org.springframework.http.MediaType;  
import org.springframework.http.ResponseEntity;  
import org.springframework.stereotype.Component;  
import org.springframework.web.bind.annotation.RequestMapping;  
  
/** 
 * <一句话功能简述> 
 * <功能详细描述> 
 *  
 * 
@author  Administrator 
 * 
@version  [版本号, 2014年3月7日] 
 * 
@see  [相关类/方法] 
 * 
@since  [产品/模块版本] 
 
*/  
@Component  
@Scope("prototype")   
@RequestMapping("/downloadFile")  
public class DownloadAction  
{  
  
    @RequestMapping("download")    
    public ResponseEntity<byte[]> download() throws IOException {    
        String path="D:\\workspace\\.metadata\\.plugins\\org.eclipse.wst.server.core\\tmp0\\wtpwebapps\\springMVC\\WEB-INF\\upload\\图片10(定价后).xlsx";  
        File file=new File(path);  
        HttpHeaders headers = new HttpHeaders();    
        String fileName=new String("你好.xlsx".getBytes("UTF-8"),"iso-8859-1");//为了解决中文名称乱码问题  
        headers.setContentDispositionFormData("attachment", fileName);   
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);   
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),    
                                          headers, HttpStatus.CREATED);    
    }    
}  


JSP
<href="./downloadFile/download" >下载</a>  

posted @ 2014-10-29 17:17 paulwong 阅读(2623) | 评论 (2)编辑 收藏

一个使用MOCK的测试REST的基于SPRING的单元测试

https://github.com/spring-projects/spring-sync-samples/tree/master/spring-rest-todos


package todos;

import static org.hamcrest.Matchers.*;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;

import java.util.Arrays;

import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;

import com.fasterxml.jackson.databind.ObjectMapper;

/**
 * 
@author Roy Clarkson
 
*/
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = Application.class)
@Ignore
public class MainControllerTest {

    @Autowired
    private WebApplicationContext context;

    @Mock
    private TodoRepository repository;

    @InjectMocks
    TodoController mainController;

    private MockMvc mvc;

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
        mvc = MockMvcBuilders.standaloneSetup(mainController).build();
    }

    @Test
    public void testList() throws Exception {
        final Todo a = new Todo(1L, "a", false);
        final Todo b = new Todo(2L, "b", false);
        final Todo c = new Todo(3L, "c", false);
        when(repository.findAll()).thenReturn(Arrays.asList(a, b, c));

        mvc.perform(get("/todos")
                    .accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$", hasSize(3)))
                .andExpect(jsonPath("$[0].id", is(1)))
                .andExpect(jsonPath("$[0].description", is("a")))
                .andExpect(jsonPath("$[0].complete", is(false)))
                .andExpect(jsonPath("$[1].id", is(2)))
                .andExpect(jsonPath("$[1].description", is("b")))
                .andExpect(jsonPath("$[1].complete", is(false)))
                .andExpect(jsonPath("$[2].id", is(3)))
                .andExpect(jsonPath("$[2].description", is("c")))
                .andExpect(jsonPath("$[2].complete", is(false)));

         verify(repository, times(1)).findAll();
         verifyNoMoreInteractions(repository);
    }

    @Ignore
    @Test
    public void testPatch() throws Exception {

    }

    @Test
    public void testCreate() throws Exception {
        final Todo todo = new Todo(1L, "a", false);
        ObjectMapper objectMapper = new ObjectMapper();
        final byte[] bytes = objectMapper.writeValueAsBytes(todo);

        when(repository.save(Mockito.any(Todo.class))).thenReturn(todo);

        mvc.perform(post("/todos")
                    .accept(MediaType.APPLICATION_JSON)
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(bytes))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.id", is(1)))
                .andExpect(jsonPath("$.description", is("a")))
                .andExpect(jsonPath("$.complete", is(false)));

        verify(repository, times(1)).save(Mockito.any(Todo.class));
        verifyNoMoreInteractions(repository);
    }

    @Test
    public void testUpdateSameIds() throws Exception {
        final Todo updatedTodo = new Todo(1L, "z", true);
        ObjectMapper objectMapper = new ObjectMapper();
        byte[] bytes = objectMapper.writeValueAsBytes(updatedTodo);

        when(repository.save(Mockito.any(Todo.class))).thenReturn(updatedTodo);

        mvc.perform(put("/todos/{id}", 1L)
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(bytes))
                .andExpect(status().isNoContent());

        verify(repository, times(0)).delete(1L);
        verify(repository, times(1)).save(Mockito.any(Todo.class));
        verifyNoMoreInteractions(repository);
    }

    @Test
    public void testUpdateDifferentIds() throws Exception {
        final Todo updatedTodo = new Todo(99L, "z", true);
        ObjectMapper objectMapper = new ObjectMapper();
        byte[] bytes = objectMapper.writeValueAsBytes(updatedTodo);

        when(repository.save(Mockito.any(Todo.class))).thenReturn(updatedTodo);

        mvc.perform(put("/todos/{id}", 1L)
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(bytes))
                .andExpect(status().isNoContent());

        verify(repository, times(1)).delete(1L);
        verify(repository, times(1)).save(Mockito.any(Todo.class));
        verifyNoMoreInteractions(repository);
    }

    @Test
    public void testDelete() throws Exception {
//        this is how to test a void method with Mockito
//        doThrow(new IllegalArgumentException()).when(repository).delete(null);

        mvc.perform(delete("/todos/{id}", 1L))
                .andExpect(status().isNoContent());
    }

}

posted @ 2014-10-25 09:42 paulwong 阅读(3656) | 评论 (1)编辑 收藏

如何写好系统用例

关于系统用例的书籍,太多。不想在这里去解释什么是系统用例。但为什么要写系统用例呢,又如何写好呢?

写系统用例是为了更清晰的展示系统的业务场景的功能实现。也是为了给程序员参考的一个图。同时也是与客户沟通的桥梁。很多东西,千言万语,不如一张图那么直观。但在很多项目中,用例分析这个过程被忽略而过。

程序员往往只看到文本的需求,就自己开始做了,对于小项目或许这样可以,如果是大项目,后期肯定崩溃。

一个良好的系统用例,用图形的方式描述了客户的要求:
1. 有那些人去参与这个事件。

2.这些人具体要做什么 (可以理解为调用的方法)

3.这些人做这个事情,需要什么先决条件 (可以理解为参数,包括权限等等)

4.这些在做这些事情的时候,需要第三方帮忙吗?或者需要第三方系统接口吗?

5.做完这些事情,应该达到一个什么样的目的,也就是结果,这个结果会是下一个用例的输入吗?

当你有着人物,事件,参数,输入,输出的一张图 摆在眼前的时候,所有的事情的都清晰了。

看着这张图,就可以写出 相关的接口程序,实现方法等。

通过大量的系统用例,可以提取出公共的用例,比如权限等。从而抽象出公共的实现方法,才不会导致同一个方法,不同的程序员各自实现了一套。

以图书为例子,列表说明一个用例的主要部分,以及要表达清楚的地方。

 

用例名称

bu_借阅图书

用例描述

借阅人通过此用例向系统查询并提交借书请求

执行者

借阅人

前置条件

1.     借阅人借阅证件在有效期内

2.     借阅人没有逾期未归还的图书

后置条件

1.     创建借书定单

2.     更新借阅人借阅记录

主过程描述

1用户用借阅证提供的帐号登录系统,计算机显示我的图书馆界面

2.用户选择查询图书,计算机显示查询界面

3.用户按书名、作者、出版社查询,计算机显示查询结果

4.用户可单选或多选书本,并确认借阅。计算机显示确认借阅图书清单。

5.用户选择确认借阅,计算机显示借阅定单及费用

6用户选择提交定单,计算机显示提交结果和定单号

7.计算机执行后置条件。用例结束

分支过程描述

2.1.1用户选择查看原有定单,计算机执行4;

4.1.1用户可单选或多选书本,放入借书篮,计算机显示借书篮现有内容

4.1.2.1.1用户选择继续借书,计算机执行2

4.1.2.2.1用户选择提交借书篮,计算机执行4

4.2.1 用户选择放弃,计算机执行2

6.1.1用户选择保存定单,计算机保存并执行1

6.2.1用户选择放弃,计算机执行1

异常过程描述

1.1.1借阅证已过期,拒绝登录,用例结束

1.2.1借阅人有逾期未归还书本,启动bu_归还图书用例

5.1.1用户余额不足,计算机显示余额和所需金额

5.1.2.1.1用户选择续费,启动bu_交纳借阅费用例

5.1.2.2.1用户选择放弃,计算机执行1

业务规则

4.至少选择一本,至多选择三本

涉及的业务实体

Be_费用记录

Be_图书

Be_借书篮

Be_借阅定单

Be_借阅证

posted @ 2014-10-24 09:46 paulwong 阅读(1254) | 评论 (0)编辑 收藏

软件开发各种文档

现在的软件开发,越来越多的是文档的管理了,编写文档成了一个很重要的工作,而且维护这些文档也是一件很繁琐的工作,个人比较喜欢敏捷开发,代码即文档,用比较好的命名规范和简明扼要的注释标明代码用途即可,但这终归是自己理想中的软件开发,事实上这么多年做过的很多项目来看,客户是无论如何都需要文档的,即使这些文档或许不会看,但至少会给他们的老板汇报,给上级看,所以很多情况下文档成了是不是完成工作的标准了。我并不排斥文档,但中国的外包项目很少有时间去写文档,但如果真的有时间,完善这些文档还是很有好处的。整理了一些软件开发中常用的模板, 以后自己也可以参考。如果客户有自己的模板,当然也可以用客户的模板,下面这些模板都比较具备中国特色,特别适合给上级老板汇报,如果有这方面需求的,可以参考下:

下载文件 开发进度月报编写规范.doc

下载文件 测试分析报告编写规范.doc

下载文件 测试计划文档编写规范.doc

下载文件 概要设计说明书编写规范.doc

下载文件 开发进度月报编写规范.doc件

下载文件 模块开发卷宗编写规范.doc

下载文件 软件配置管理计划编写规范.doc

下载文件 软件需求说明书编写规范.doc

下载文件 软件质量保证计划编写规范.doc

下载文件 数据库设计说明书编写规范.doc

下载文件 数据要求说明书编写规范.doc

下载文件 详细设计说明书编写规范.doc

下载文件 项目开发总结报告编写规范.doc

下载文件 用户手册编写规范.doc

以上这些文档模板应该比较全面了,  在国内的项目开发中完全可以套用,如果是国外的项目或许有些不同,毕竟是不同的文化背景。

posted @ 2014-10-24 09:44 paulwong 阅读(340) | 评论 (0)编辑 收藏

FASTDFS常用命令

启动STORAGE SERVER
fdfs_storaged /etc/fdfs/storage.conf



启动TRACKER SERVER
fdfs_trackerd /etc/fdfs/tracker.conf



启动NGINX
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf


观看LOG
tail -f /home/storage1/fastdfs/logs/storaged.log



检查STORAGE SERVER
fdfs_monitor /etc/fdfs/client.conf


删除STORAGE SERVER
fdfs_monitor /etc/fdfs/client.conf delete group1 10.120.151.114


重启
/usr/local/bin/restart.sh fdfs_storaged /etc/fdfs/storage.conf
/usr/local/bin/restart.sh fdfs_trackerd /etc/fdfs/storage.conf


停止
/usr/local/bin/stop.sh fdfs_storaged /etc/fdfs/storage.conf
/usr/local/bin/stop.sh fdfs_trackerd /etc/fdfs/storage.conf



测试上传
fdfs_test /etc/fdfs/client.conf upload /usr/include/stdlib.h

 
查询文件是否存在
fdfs_file_info /etc/fdfs/client.conf group1/M00/00/D1/CniXclQ0vdfCNdkzAABGC4v7nb4822.png

posted @ 2014-10-14 14:23 paulwong 阅读(2654) | 评论 (0)编辑 收藏

FASTDFS的STORAGE SERVER的状态问题

STORAGE SERVER的状态通常有七种:
# FDFS_STORAGE_STATUS:INIT      :初始化,尚未得到同步已有数据的源服务器

# FDFS_STORAGE_STATUS:WAIT_SYNC :等待同步,已得到同步已有数据的源服务器

# FDFS_STORAGE_STATUS:SYNCING   :同步中

# FDFS_STORAGE_STATUS:DELETED   :已删除,该服务器从本组中摘除

# FDFS_STORAGE_STATUS:OFFLINE   :离线

# FDFS_STORAGE_STATUS:ONLINE    :在线,尚不能提供服务

# FDFS_STORAGE_STATUS:ACTIVE    :在线,可以提供服务


正常状态必须是ACTIVE,如果运行以下命令:
fdfs_monitor /etc/fdfs/client.conf


发现有以下状态的服务器:
Storage 4:
        ip_addr = 10.120.151.114  WAIT_SYNC


经过各种重启都不解决问题,只好先删除,再加入
#从集群中删除
fdfs_monitor /etc/fdfs/client.conf delete group1 10.120.151.114

#在114服务器中,删除数据文件夹
rm -rf /home/storage1/fastdfs/data

#重启114节点
fdfs_storaged /etc/fdfs/storage.conf


重新查状态
fdfs_monitor /etc/fdfs/client.conf


状态变正常了。

posted @ 2014-10-13 17:34 paulwong 阅读(7890) | 评论 (0)编辑 收藏

FASTDFS资源

分布式存储系统设计的关键问题
http://blog.csdn.net/zhengleiguo/article/details/37939743


分布式(集群)文件系统的设计
http://blog.csdn.net/zhengleiguo/article/details/31395139



fastdfs storage server的设计与实现
http://blog.csdn.net/zhengleiguo/article/details/34108169


FastDFS分布式文件系统的安装及配置-多服务器版等
http://wangying.sinaapp.com/archives/category/cachefilestorage/fastdfs








posted @ 2014-10-13 15:52 paulwong 阅读(338) | 评论 (0)编辑 收藏

FastDFS分布式文件系统的安装及配置-多服务器版

     摘要: FastDFS分布式文件系统的安装及配置 整体网络配置 1 Tracker Server  192.168.127.11  /home/fastdfs/trac...  阅读全文

posted @ 2014-10-13 15:47 paulwong 阅读(237) | 评论 (0)编辑 收藏

仅列出标题
共112页: First 上一页 40 41 42 43 44 45 46 47 48 下一页 Last