//package org.apache.dubbo.benchmark.service;
//
//import com.google.protobuf.util.Timestamps;
//import org.apache.dubbo.benchmark.bean.PagePB;
//
//import java.util.ArrayList;
//import java.util.Arrays;
//import java.util.List;
//
//
//public class UserServiceImplPb implements UserServicePb {
//    @Override
//    public PagePB.Response createUser(PagePB.Request request) {
//        final PagePB.Response.Builder builder = PagePB.Response.newBuilder();
//        if (request.getUser() == null) {
//            builder.setState(false);
//        } else {
//            builder.setState(true);
//        }
//        return builder.build();
//    }
//
//    @Override
//    public PagePB.Response existUser(PagePB.Request request) {
//        String email = request.getEmail();
//        final PagePB.Response.Builder builder = PagePB.Response.newBuilder();
//        if (email == null || email.isEmpty()) {
//            builder.setState(true);
//        }else if (email.charAt(email.length() - 1) < '5') {
//            builder.setState(false);
//        }
//
//        builder.setState(true);
//        return builder.build();
//    }
//
//    @Override
//    public PagePB.Response listUser(PagePB.Request request) {
//
//        final PagePB.Page.Builder page = PagePB.Page.newBuilder();
//        List<PagePB.User> userList = new ArrayList<>(15);
//
//        for (int i = 0; i < 15; i++) {
//            final PagePB.User.Builder user = PagePB.User.newBuilder();
//
//            user.setId(i);
//            user.setName(new String("Doug Lea"));
//            user.setSex(1);
//            user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
//            user.setEmail(new String("dong.lea@gmail.com"));
//            user.setMobile(new String("18612345678"));
//            user.setAddress(new String("北京市 中关村 中关村大街1号 鼎好大厦 1605"));
//            user.setIcon(new String("https://www.baidu.com/img/bd_logo1.png"));
//            user.setStatus(1);
//            user.setCreateTime(Timestamps.fromMillis(System.currentTimeMillis()));
//            user.setUpdateTime(user.getCreateTime());
//            List<Integer> permissions = new ArrayList<Integer>(
//                    Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));
//            user.addAllPermissions(permissions);
//            userList.add(user.build());
//        }
//
//        page.setPageNo(request.getPage());
//        page.setTotal(1000);
//        page.addAllUsers(userList);
//
//        return PagePB.Response.newBuilder().setPage(page.build()).build();
//    }
//
//    @Override
//    public PagePB.Response getUser(PagePB.Request request) {
//        final long id = request.getId();
//        final PagePB.User.Builder user = PagePB.User.newBuilder();
//        user.setId(id);
//        user.setName(new String("Doug Lea"));
//        user.setSex(1);
//        user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
//        user.setEmail(new String("dong.lea@gmail.com"));
//        user.setMobile(new String("18612345678"));
//        user.setAddress(new String("北京市 中关村 中关村大街1号 鼎好大厦 1605"));
//        user.setIcon(new String("https://www.baidu.com/img/bd_logo1.png"));
//        user.setStatus(1);
//        user.setCreateTime(Timestamps.fromMillis(System.currentTimeMillis()));
//        user.setUpdateTime(user.getCreateTime());
//        List<Integer> permissions = new ArrayList<Integer>(
//                Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92));
//        user.addAllPermissions(permissions);
//
//        return PagePB.Response.newBuilder().setUser(user.build()).build();
//    }
//}
