Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package org.dfr.dfr.worker; import io.vertx.core.AbstractVerticle; import io.vertx.core.Future; import io.vertx.core.json.Json; import io.vertx.core.json.JsonArray; import io.vertx.core.json.JsonObject; import io.vertx.ext.jdbc.JDBCClient; import io.vertx.ext.sql.ResultSet; import io.vertx.ext.sql.SQLConnection; import io.vertx.ext.sql.UpdateResult; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import org.dfr.dfr.ErrorCode; import org.dfr.dfr.request.AddAssetRequest; import org.dfr.dfr.request.ChangePasswordRequest; import org.dfr.dfr.request.GeneralResponse; import org.dfr.dfr.request.GetAssetRequest; import org.dfr.dfr.request.MemberRegisterRequest; import org.dfr.dfr.request.ProfileRequest; import org.dfr.dfr.request.ProfileUpdateRequest; import org.dfr.dfr.request.UpdateAssetRequest; /** * * @author fian.manafe */ public class MemberWorker extends AbstractVerticle { @Override public void start(Future<Void> fut) { JsonObject config = new JsonObject(); config.put("url", "jdbc:mysql://localhost:3306/latihan"); config.put("driver_class", "com.mysql.jdbc.Driver"); config.put("user", "root"); config.put("password", "admin"); JDBCClient client = JDBCClient.createShared(vertx, config, "memberds"); final Validator v = Validation.buildDefaultValidatorFactory().getValidator(); SimpleDateFormat mysqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); vertx.eventBus().consumer("MemberWorker#Register").handler(h -> { MemberRegisterRequest req = null; try { req = Json.decodeValue(h.body().toString(), MemberRegisterRequest.class); } catch (Exception e) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } Set<ConstraintViolation<MemberRegisterRequest>> vr = v.validate(req); if (!vr.isEmpty()) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON) .setMessage(vr.iterator().next().getMessage()))); return; } final MemberRegisterRequest r = req; final HashMap<String, Object> smap = new HashMap(); client.getConnection(ch -> { if (ch.succeeded()) { SQLConnection c = ch.result(); Future<Void> f1 = Future.future(); c.setAutoCommit(false, f1.completer()); f1.compose(o -> { Future<ResultSet> f2 = Future.future(); c.queryWithParams("select username from member where username=?", new JsonArray().add(r.getUsername()), f2.completer()); return f2; }).compose(res -> { Future<ResultSet> f2 = Future.future(); if (res.getNumRows() != 0) { f2.fail(ErrorCode.USER_EXIST); } else { c.queryWithParams("select email from member where email=?", new JsonArray().add(r.getEmail()), f2.completer()); } return f2; }).compose(res -> { if (res.getNumRows() > 0) { return Future.failedFuture(ErrorCode.EMAIL_EXIST); } else { try { r.setPassword(hash(r.getPassword())); } catch (Exception e) { return Future.failedFuture(ErrorCode.SERVER_ERROR); } Future<UpdateResult> f2 = Future.future(); c.updateWithParams("insert into member(username,password,email) values (?,?,?)", new JsonArray().add(r.getUsername()).add(r.getPassword()).add(r.getEmail()), f2.completer()); return f2; } }).compose(res -> { Future<UpdateResult> f2 = Future.future(); c.updateWithParams("insert into profile(member_id) values(?)", new JsonArray().add(res.getKeys().getLong(0)), f2.completer()); return f2; }).compose(res -> { Future<Void> cfut = Future.future(); c.commit(cfut.completer()); return cfut; }).setHandler(ch1 -> { if (ch1.succeeded()) { c.close(close -> { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE))); }); } else { c.rollback(rr -> { c.close(close -> { h.reply(Json.encode(new GeneralResponse().setCode(ch1.cause().getMessage()) .setMessage(ErrorCode.getMessage(ch1.cause().getMessage())))); }); }); } }); } else { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR) .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR)))); } }); }); vertx.eventBus().consumer("MemberWorker#ProfileUpdate").handler(h -> { ProfileUpdateRequest req = null; try { req = Json.decodeValue(h.body().toString(), ProfileUpdateRequest.class); } catch (Exception e) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } Set<ConstraintViolation<ProfileUpdateRequest>> vr = v.validate(req); if (!vr.isEmpty()) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON) .setMessage(vr.iterator().next().getMessage()))); return; } ProfileUpdateRequest rq = req; client.getConnection(connection -> { if (connection.succeeded()) { HashMap<String, Object> sm = new HashMap<String, Object>(); SQLConnection con = connection.result(); Future<Void> ac = Future.future(); con.setAutoCommit(false, ac.completer()); ac.compose(rv -> { Future<ResultSet> lock = Future.future(); con.queryWithParams( "select p.* from profile p inner join member m on p.member_id=m.member_id where m.username=? and m.password=? for update", new JsonArray().add(rq.getUsername()).add(rq.getPassword()), lock.completer()); return lock; }).compose(r -> { if (r.getNumRows() == 0) { return Future.failedFuture(ErrorCode.USERNAME_PASSWORD_NOT_MATCH); } long member_id = r.getRows().iterator().next().getLong("member_id"); Future<UpdateResult> up = Future.future(); con.updateWithParams( "update profile set name=?, phone=?, address=?, company_name=?, company_address=? where member_id=?", new JsonArray().add(rq.getName()).add(rq.getPhone()).add(rq.getAddress()) .add(rq.getCompanyName()).add(rq.getCompanyAddress()).add(member_id), up.completer()); return up; }).compose(ok -> { Future<Void> commitFu = Future.future(); con.commit(commitFu.completer()); return commitFu; }).setHandler(th -> { if (th.succeeded()) { con.close(cr -> { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE))); }); } else { con.rollback(rh -> { con.close(cl -> { h.reply(Json.encode(new GeneralResponse().setCode(th.cause().getMessage()) .setMessage(ErrorCode.getMessage(th.cause().getMessage())))); }); }); } }); } else { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR) .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR)))); } }); }); vertx.eventBus().consumer("MemberWorker#GetProfile").handler(h -> { ProfileRequest req = null; try { req = Json.decodeValue(h.body().toString(), ProfileRequest.class); } catch (Exception e) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } Set<ConstraintViolation<ProfileRequest>> rV = v.validate(req); if (!rV.isEmpty()) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } final ProfileRequest r = req; client.getConnection(cH -> { if (cH.succeeded()) { SQLConnection c = cH.result(); Future<Void> f = Future.future(); c.setAutoCommit(true, f.completer()); f.compose(res -> { Future<ResultSet> f0 = Future.future(); c.queryWithParams("select member_id from member m where m.username=? and m.password=?", new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer()); return f0; }).compose(res -> { Future<ResultSet> f0 = Future.future(); if (res.getNumRows() <= 0) { f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH); } else { c.queryWithParams("select * from profile where member_id=?", new JsonArray().add(res.getRows().iterator().next().getLong("member_id")), f0.completer()); } return f0; }).setHandler(rh -> { c.close(); if (rh.succeeded()) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE) .setData(rh.result().getRows().get(0)))); } else { h.reply(Json.encode(new GeneralResponse().setCode(rh.cause().getMessage()) .setMessage(ErrorCode.getMessage(rh.cause().getMessage())))); } }); } else { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR) .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR)))); } }); }); vertx.eventBus().consumer("MemberWorker#ChangePassword").handler(h -> { ChangePasswordRequest req = null; try { req = Json.decodeValue(h.body().toString(), ChangePasswordRequest.class); } catch (Exception e) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } Set<ConstraintViolation<ChangePasswordRequest>> rV = v.validate(req); if (!rV.isEmpty()) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } final ChangePasswordRequest r = req; client.getConnection(connection -> { if (connection.succeeded()) { SQLConnection c = connection.result(); Future<Void> f1 = Future.future(); c.setAutoCommit(false, f1.completer()); f1.compose(vo -> { Future<ResultSet> f = Future.future(); c.queryWithParams("select member_id from member where username=? and password=? for update", new JsonArray().add(r.getUsername()).add(r.getPassword()), f.completer()); return f; }).compose(res -> { Future<UpdateResult> f0 = Future.future(); if (res.getNumRows() <= 0) { f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH); } else { long member_id = res.getRows().iterator().next().getLong("member_id"); String hash = null; try { hash = hash(r.getNewPassword()); } catch (Exception e) { return Future.failedFuture(ErrorCode.SERVER_ERROR); } c.updateWithParams("update member set password=? where member_id=?", new JsonArray().add(hash).add(member_id), f0.completer()); } return f0; }).compose(res -> { Future<Void> cf = Future.future(); c.commit(cf.completer()); return cf; }).setHandler(ch -> { if (ch.succeeded()) { c.close(); h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE))); } else { ch.cause().printStackTrace(); c.rollback(rh -> { c.close(); h.reply(Json.encode(new GeneralResponse().setCode(ch.cause().getMessage()) .setMessage(ErrorCode.getMessage(ch.cause().getMessage())))); }); } }); } else { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR) .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR)))); } }); }); vertx.eventBus().consumer("MembrWorker#AddAsset").handler(h -> { AddAssetRequest req = null; try { req = Json.decodeValue(h.body().toString(), AddAssetRequest.class); } catch (Exception e) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } Set<ConstraintViolation<AddAssetRequest>> res = v.validate(req); if (!res.isEmpty()) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON) .setMessage(res.iterator().next().getMessage()))); return; } AddAssetRequest r = req; client.getConnection(connection -> { if (connection.succeeded()) { SQLConnection con = connection.result(); Future<Void> f = Future.future(); con.setAutoCommit(false, f.completer()); f.compose(vo -> { Future<ResultSet> f1 = Future.future(); con.queryWithParams("select * from member where username=? and password=?", new JsonArray().add(r.getUsername()).add(r.getPassword()), f1.completer()); return f1; }).compose(re -> { Future<UpdateResult> f1 = Future.future(); if (re.getNumRows() <= 0) { System.out.println(Json.encode(re)); System.out.println(Json.encode(r)); f1.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH); } else { long member_id = re.getRows().iterator().next().getLong("member_id"); con.updateWithParams( "insert into assets (member_id,debit_credit,asset_name,asset_value,date_time,description) values(?,?,?,?,?,?)", new JsonArray().add(member_id).add(r.getDebitCredit()).add(r.getAssetName()) .add(r.getAssetValue()).add(mysqlFormat.format(new Date())) .add(r.getDescription()), f1.completer()); } return f1; }).compose(re -> { Future<Void> end = Future.future(); con.commit(end.completer()); return end; }).setHandler(ch -> { if (ch.succeeded()) { con.close(); h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE))); } else { con.rollback(rh -> { con.close(); h.reply(Json.encode(new GeneralResponse().setCode(ch.cause().getMessage()) .setMessage(ErrorCode.getMessage(ch.cause().getMessage())))); }); } }); } else { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR) .setMessage(ErrorCode.getMessage(ErrorCode.SERVER_ERROR)))); } }); }); vertx.eventBus().consumer("AssetWorker#GetAsset").handler(h -> { GetAssetRequest req = null; try { req = Json.decodeValue(h.body().toString(), GetAssetRequest.class); } catch (Exception e) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } Set<ConstraintViolation<GetAssetRequest>> res = v.validate(req); if (!res.isEmpty()) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON) .setMessage(res.iterator().next().getMessage()))); return; } GetAssetRequest r = req; client.getConnection(connection -> { if (connection.succeeded()) { SQLConnection c = connection.result(); Future<Void> vo = Future.future(); c.setAutoCommit(true, vo.completer()); vo.compose(re -> { Future<ResultSet> f0 = Future.future(); c.queryWithParams("select member_id from member where username=? and password=?", new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer()); return f0; }).compose(re -> { Future<ResultSet> f0 = Future.future(); if (re.getNumRows() <= 0) { f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH); } else { long member_id = re.getRows().iterator().next().getLong("member_id"); c.queryWithParams("select * from assets where member_id=?", new JsonArray().add(member_id), f0.completer()); } return f0; }).setHandler(resp -> { if (resp.succeeded()) { h.reply(Json.encodePrettily(new GeneralResponse().setCode(ErrorCode.COMPLETE) .setData(resp.result().getRows()))); } else { h.reply(Json.encode(new GeneralResponse().setCode(resp.cause().getMessage()) .setMessage(ErrorCode.getMessage(resp.cause().getMessage())))); } c.close(); }); } else { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR) .setMessage(connection.cause().getMessage()))); } }); }); vertx.eventBus().consumer("AssetWorker#UpdateAsset").handler(h -> { UpdateAssetRequest req = null; try { req = Json.decodeValue(h.body().toString(), UpdateAssetRequest.class); } catch (Exception e) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON))); return; } Set<ConstraintViolation<UpdateAssetRequest>> res = v.validate(req); if (!res.isEmpty()) { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.INVALID_JSON) .setMessage(res.iterator().next().getMessage()))); return; } final UpdateAssetRequest r = req; client.getConnection(connection -> { if (connection.succeeded()) { SQLConnection con = connection.result(); Future<Void> f = Future.future(); con.setAutoCommit(false, f.completer()); f.compose(vo -> { Future<ResultSet> f0 = Future.future(); con.queryWithParams("select member_id from member where username=? and password=?", new JsonArray().add(r.getUsername()).add(r.getPassword()), f0.completer()); return f0; }).compose(rs -> { Future<ResultSet> f0 = Future.future(); if (rs.getNumRows() <= 0) { f0.fail(ErrorCode.USERNAME_PASSWORD_NOT_MATCH); } else { long member_id = rs.getRows().iterator().next().getLong("member_id"); con.queryWithParams("select * from assets where asset_id=? and member_id=? for update", new JsonArray().add(r.getAssetId()).add(member_id), f0.completer()); } return f0; }).compose(rs -> { Future<UpdateResult> f0 = Future.future(); con.updateWithParams( "update assets set debit_credit=?,asset_name=?,asset_value=?,date_time=?,description=? where asset_id=?", new JsonArray().add(r.getDebitCredit()).add(r.getAssetName()).add(r.getAssetValue()) .add(mysqlFormat.format(new Date())).add(r.getDescription()) .add(r.getAssetId()), f0.completer()); return f0; }).compose(rs -> { Future<Void> cf = Future.future(); con.commit(cf.completer()); return cf; }).setHandler(sh -> { if (sh.succeeded()) { con.close(); h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.COMPLETE))); } else { con.rollback(rh -> { con.close(); h.reply(Json.encode(new GeneralResponse().setCode(sh.cause().getMessage()) .setMessage(ErrorCode.getMessage(sh.cause().getMessage())))); }); } }); } else { h.reply(Json.encode(new GeneralResponse().setCode(ErrorCode.SERVER_ERROR))); } }); }); fut.complete(); } static String hash(String input) throws NoSuchAlgorithmException { MessageDigest mDigest = MessageDigest.getInstance("SHA-512"); byte[] result = mDigest.digest(input.getBytes()); StringBuilder sb = new StringBuilder(); for (int i = 0; i < result.length; i++) { sb.append(Integer.toString((result[i] & 0xff) + 0x100, 16).substring(1)); } return sb.toString(); } }