From b90e825fab22d58a6ad6860bc0c4f5584e56a5e6 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Tue, 10 Nov 2020 16:31:57 +0800
Subject: [PATCH] modify
---
src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java | 14 +
src/main/resources/mapper/member/SrcAddressDao.xml | 19 +-
src/test/java/com/xcong/excoin/GuijiTest.java | 12 +
src/main/java/com/xcong/excoin/quartz/job/TRC20OrderJob.java | 40 +++++
src/test/java/com/xcong/excoin/FilterTest.java | 93 ++++++++++++
src/main/java/com/xcong/excoin/utils/TRC20ApiUtils.java | 60 +++++++-
src/test/java/com/xcong/excoin/SRCTest.java | 98 +++++++++++++
src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java | 30 ++++
pom.xml | 18 ++
src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java | 2
10 files changed, 343 insertions(+), 43 deletions(-)
diff --git a/pom.xml b/pom.xml
index e767fbc..38f95c9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -282,6 +282,24 @@
<version>4.3.5</version>
</dependency>
<!-- submail邮件 end -->
+
+ <!-- 引入poi,解析workbook视图 -->
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi</artifactId>
+ <version>3.16</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.poi</groupId>
+ <artifactId>poi-ooxml</artifactId>
+ <version>3.14</version>
+ </dependency>
+ <!-- 处理excel和上面功能是一样的-->
+ <dependency>
+ <groupId>net.sourceforge.jexcelapi</groupId>
+ <artifactId>jxl</artifactId>
+ <version>2.6.10</version>
+ </dependency>
</dependencies>
<build>
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
index ad69c67..c1ea35c 100644
--- a/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/Impl/BlockSeriveImpl.java
@@ -6,7 +6,10 @@
import javax.annotation.Resource;
import com.xcong.excoin.modules.blackchain.service.*;
+import com.xcong.excoin.modules.coin.dao.TrcAddressDao;
+import com.xcong.excoin.modules.coin.entity.TrcAddressEntity;
import com.xcong.excoin.rabbit.producer.UsdtUpdateProducer;
+import com.xcong.excoin.utils.TRC20ApiUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -30,6 +33,8 @@
MemberDao memberDao;
@Resource
MemberCoinAddressDao memberMapper;
+ @Resource
+ private TrcAddressDao trcAddressDao;
@Resource
private UsdtUpdateProducer usdtUpdateProducer;
@@ -50,6 +55,31 @@
if ("USDT".equals(symbol)) {
memberCoinAddress = memberMapper.selectBlockAddressWithTag(Long.parseLong(mId), symbol, lable);
+
+ TrcAddressEntity srcAddressEntity = trcAddressDao.selectSrcAddressByMemberId(member.getId());
+ if (srcAddressEntity != null) {
+ map.put("trc20_address", srcAddressEntity.getAddress());
+ map.put("trc20_label", "TRC20");
+ } else {
+ // 分布式redis锁
+ for (;;) {
+ boolean flag = redisUtil.setNotExist("LOCK_TRC20", 1, 5);
+ if (!flag) {
+ continue;
+ }
+
+ TrcAddressEntity address = trcAddressDao.selectOneSrcAddressUnUse();
+ address.setMemberId(member.getId());
+ address.setIsUse(1);
+
+ TRC20ApiUtils.createWallet(member.getId(), member.getInviteId(), "USDT", address.getAddress());
+ trcAddressDao.updateById(address);
+
+ map.put("trc20_address", address.getAddress());
+ map.put("trc20_label", "TRC20");
+ break;
+ }
+ }
} else {
memberCoinAddress = memberMapper.selectBlockAddress(Long.parseLong(mId), symbol);
}
diff --git a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java
index 51094c8..88f8461 100644
--- a/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java
+++ b/src/main/java/com/xcong/excoin/modules/blackchain/service/UsdtEthService.java
@@ -101,7 +101,7 @@
}
} else {
String hash = ethService.ethSend(TOTAL_PRIVATE, TOTAL_ADDRESS, address, ETH_FEE,gasPrice);
- log.info("转手续费:{}", hash);
+ log.info("转手续费:{}, address: {}", hash, address);
}
}
}
diff --git a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
index 7c3ef40..b4f35f7 100644
--- a/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
+++ b/src/main/java/com/xcong/excoin/modules/member/service/impl/MemberServiceImpl.java
@@ -35,10 +35,7 @@
import com.xcong.excoin.modules.platform.dao.PlatformSymbolsCoinDao;
import com.xcong.excoin.modules.platform.entity.PlatformFeeSettingEntity;
import com.xcong.excoin.modules.platform.entity.PlatformSymbolsCoinEntity;
-import com.xcong.excoin.utils.MessageSourceUtils;
-import com.xcong.excoin.utils.RedisUtils;
-import com.xcong.excoin.utils.ShareCodeUtil;
-import com.xcong.excoin.utils.ThreadPoolUtils;
+import com.xcong.excoin.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -908,7 +905,7 @@
BigDecimal coinNumber = memberSubmitCoinApplyDto.getCoinNumber();
if (availableBalance.compareTo(BigDecimal.ZERO) > 0
&& availableBalance.compareTo(coinNumber) >= 0) {
- //新增提币记录
+ //新增提币记录
MemberCoinWithdrawEntity memberCoinWithdrawEntity = new MemberCoinWithdrawEntity();
memberCoinWithdrawEntity.setAddress(memberSubmitCoinApplyDto.getAddress());
memberCoinWithdrawEntity.setAmount(coinNumber);
@@ -917,6 +914,13 @@
memberCoinWithdrawEntity.setMemberId(memberId);
memberCoinWithdrawEntity.setStatus(MemberCoinWithdrawEntity.STATUS_DOING);
+ if ("TRC20".equals(memberSubmitCoinApplyDto.getLable()) && CoinTypeEnum.USDT.name().equals(memberSubmitCoinApplyDto.getSymbol())) {
+ String orderNo = commonservice.generateOrderNo(memberId);
+ TRC20ApiUtils.coinApply(orderNo, memberId.toString(), CoinTypeEnum.USDT.name(), coinNumber.toPlainString(), memberSubmitCoinApplyDto.getAddress());
+ memberCoinWithdrawEntity.setTag(orderNo);
+ memberCoinWithdrawEntity.setLabel("TRC20");
+ }
+
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("symbol", memberSubmitCoinApplyDto.getSymbol());
columnMap.put("address", memberSubmitCoinApplyDto.getAddress());
diff --git a/src/main/java/com/xcong/excoin/quartz/job/TRC20OrderJob.java b/src/main/java/com/xcong/excoin/quartz/job/TRC20OrderJob.java
index 4240da6..ab29562 100644
--- a/src/main/java/com/xcong/excoin/quartz/job/TRC20OrderJob.java
+++ b/src/main/java/com/xcong/excoin/quartz/job/TRC20OrderJob.java
@@ -1,7 +1,37 @@
-package com.xcong.excoin.quartz.job;/**
-*
-* @author wzy
-* @date 2020-11-05
-**/
+package com.xcong.excoin.quartz.job;
+
+import cn.hutool.core.collection.CollUtil;
+import com.xcong.excoin.modules.member.dao.MemberCoinWithdrawDao;
+import com.xcong.excoin.modules.member.entity.MemberCoinWithdrawEntity;
+import com.xcong.excoin.utils.TRC20ApiUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author wzy
+ * @date 2020-11-05
+ **/
+@Slf4j
+@Component
public class TRC20OrderJob {
+
+ @Resource
+ private MemberCoinWithdrawDao memberCoinWithdrawDao;
+
+ public void trc20WithdrawOrder() {
+ Map<String, Object> param = new HashMap<>();
+ param.put("label", "TRC20");
+ param.put("status", 1);
+ List<MemberCoinWithdrawEntity> withdrawEntities = memberCoinWithdrawDao.selectByMap(param);
+ if (CollUtil.isNotEmpty(withdrawEntities)) {
+ for (MemberCoinWithdrawEntity withdrawEntity : withdrawEntities) {
+ String applyOrderInfo = TRC20ApiUtils.getApplyOrderInfo(withdrawEntity.getTag());
+ }
+ }
+ }
}
diff --git a/src/main/java/com/xcong/excoin/utils/TRC20ApiUtils.java b/src/main/java/com/xcong/excoin/utils/TRC20ApiUtils.java
index dde4c24..02cb361 100644
--- a/src/main/java/com/xcong/excoin/utils/TRC20ApiUtils.java
+++ b/src/main/java/com/xcong/excoin/utils/TRC20ApiUtils.java
@@ -3,6 +3,8 @@
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.common.exception.GlobalException;
+import lombok.extern.slf4j.Slf4j;
import java.math.BigDecimal;
import java.util.HashMap;
@@ -12,26 +14,62 @@
* @author wzy
* @date 2020-11-05
**/
+@Slf4j
public class TRC20ApiUtils {
- private static final String SRC_API = "http://27.50.59.35:5002/";
+ private static final String TRC20_API = "http://27.50.59.35:5002/";
private static final String SIGN_STR = "w@a!llokmet";
- public static void apply() {
+ /**
+ * 提币申请
+ */
+ public static void coinApply(String orderNo, String userId, String symbol, String amount, String toAddress) {
Map<String, Object> param = new HashMap<>();
- String orderNo = "123445";
- String userid = "11";
- String symbol = "USDT";
- String amount = "1";
- String toAddress = "Ox";
param.put("orderno", orderNo);
- param.put("userid", userid);
+ param.put("userid", userId);
param.put("symbol", symbol);
param.put("toAddress", toAddress);
param.put("amount", new BigDecimal(amount));
- param.put("sign", SecureUtil.md5(orderNo + userid + symbol + amount + toAddress + SIGN_STR));
- HttpRequest request = HttpRequest.post(SRC_API + "transout/created");
+ param.put("sign", SecureUtil.md5(orderNo + userId + symbol + amount + toAddress + SIGN_STR));
+ HttpRequest request = HttpRequest.post(TRC20_API + "transout/created");
String body = request.body(JSONObject.toJSONString(param)).execute().body();
- System.out.println(body);
+ if (!"200".equals(JSONObject.parseObject(body).getString("code"))) {
+ log.error("TRC20提币申请失败 : {}", body);
+ throw new GlobalException("提币申请失败");
+ }
}
+
+ /**
+ * 提币订单查询
+ *
+ * @param orderNo 订单编号
+ */
+ public static String getApplyOrderInfo(String orderNo) {
+ String body = HttpRequest.get(TRC20_API + "transout/gettransout?orderNo=" + orderNo).execute().body();
+ if (!"200".equals(JSONObject.parseObject(body).getString("code"))) {
+ log.error("TRC20获取订单失败:{}, {}", orderNo, body);
+ throw new GlobalException("获取订单失败");
+ }
+
+ return JSONObject.parseObject(body).getString("row");
+ }
+
+ public static void createWallet(Long userId, String userName, String symbol, String address) {
+ Map<String, Object> param = new HashMap<>();
+ param.put("userId", userId);
+ param.put("symbol", symbol);
+ param.put("userName", userName);
+ param.put("walletAddress", address);
+ param.put("accountFlag", 1);
+ param.put("sign", SecureUtil.md5(userId + symbol + address + SIGN_STR));
+ String body = HttpRequest.post(TRC20_API + "account/created").body(JSONObject.toJSONString(param)).execute().body();
+ if (!"200".equals(JSONObject.parseObject(body).getString("code"))) {
+ log.error("TRC20创建钱包失败:{}, {}, {}", userId, address, body);
+ throw new GlobalException("获取订单失败");
+ }
+ }
+
+ public static void main(String[] args) {
+ createWallet(1L, "1", "USDT", "11");
+ }
}
diff --git a/src/main/resources/mapper/member/SrcAddressDao.xml b/src/main/resources/mapper/member/SrcAddressDao.xml
index a649376..1737811 100644
--- a/src/main/resources/mapper/member/SrcAddressDao.xml
+++ b/src/main/resources/mapper/member/SrcAddressDao.xml
@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
-<mapper namespace="com.xcong.excoin.modules.coin.dao.MemberSelectSymbolsDao">
-
- <select id="selectSymbolByMemIdAndSymbol" resultType="com.xcong.excoin.modules.member.entity.MemberSelectSymbolsEntity">
- select id id,symbol symbol,member_id memberId from member_select_symbols where member_id = #{memberId} and symbol = #{symbol}
- </select>
-
- <select id="selectSymbolByMemId" resultType="com.xcong.excoin.modules.member.entity.MemberSelectSymbolsEntity">
- select id id,symbol symbol,member_id memberId from member_select_symbols where member_id = #{memberId} GROUP BY symbol
- </select>
-
+<mapper namespace="com.xcong.excoin.modules.coin.dao.TrcAddressDao">
+
+ <select id="selectSrcAddressByMemberId" resultType="com.xcong.excoin.modules.coin.entity.TrcAddressEntity">
+ select * from trc_address where member_id=#{memberId} and is_use=1
+ </select>
+
+ <select id="selectOneSrcAddressUnUse" resultType="com.xcong.excoin.modules.coin.entity.TrcAddressEntity">
+ select * from trc_address where is_use=2 limit 1
+ </select>
</mapper>
\ No newline at end of file
diff --git a/src/test/java/com/xcong/excoin/FilterTest.java b/src/test/java/com/xcong/excoin/FilterTest.java
index fe53525..4346a08 100644
--- a/src/test/java/com/xcong/excoin/FilterTest.java
+++ b/src/test/java/com/xcong/excoin/FilterTest.java
@@ -1,7 +1,90 @@
-package com.xcong.excoin;/**
-*
-* @author wzy
-* @date 2020-11-04
-**/
+package com.xcong.excoin;
+
+import com.xcong.excoin.modules.blackchain.service.EthUsdtContract;
+import lombok.extern.slf4j.Slf4j;
+import org.junit.jupiter.api.Test;
+import org.web3j.crypto.Credentials;
+import org.web3j.protocol.Web3j;
+import org.web3j.protocol.core.DefaultBlockParameterName;
+import org.web3j.protocol.core.DefaultBlockParameterNumber;
+import org.web3j.protocol.core.methods.request.EthFilter;
+import org.web3j.protocol.http.HttpService;
+import org.web3j.tx.gas.StaticGasProvider;
+
+import java.math.BigInteger;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author wzy
+ * @date 2020-11-04
+ **/
+@Slf4j
public class FilterTest {
+
+
+ public static BigInteger GAS_PRICE = BigInteger.valueOf(45000000000L);
+ //public static final BigInteger GAS_LIMIT = BigInteger.valueOf(4300000L);
+ public static final BigInteger GAS_LIMIT = BigInteger.valueOf(2000000L);
+
+ private static Web3j web3;
+
+ private static String blockchainNode = "http://114.55.250.231:8545";
+
+ private static String contractAddr = "0xdac17f958d2ee523a2206206994597c13d831ec7";
+
+
+ // 操作账号
+ private static String privateKey = "4576fafdd215f52051c60e04618ef8997fbc5cee8413d3b34d210e296e6e9a3d";
+ @Test
+ public void testAA() {
+ BigInteger blockNum = new BigInteger("11189995");
+ Credentials credentials = Credentials.create(privateKey);
+ EthUsdtContract contract = EthUsdtContract.load(contractAddr, getInstance(), credentials, getStaticGasProvider());
+ EthFilter filter = getFilter(blockNum);
+ Map<String,BigInteger> map = new HashMap<String,BigInteger>();
+ map.put("blockNum",blockNum);
+
+ contract.transferEventFlowable(filter).subscribe(e->{
+// System.out.println(1);
+// Thread.sleep(60);
+// System.out.println(2);
+ });
+ }
+
+ public static void main(String[] args) {
+ BigInteger blockNum = new BigInteger("11190135");
+ Credentials credentials = Credentials.create(privateKey);
+ EthUsdtContract contract = EthUsdtContract.load(contractAddr, getInstance(), credentials, getStaticGasProvider());
+ EthFilter filter = getFilter(blockNum);
+ Map<String,BigInteger> map = new HashMap<String,BigInteger>();
+ map.put("blockNum",blockNum);
+
+ contract.transferEventFlowable(filter).subscribe(e->{
+ Thread.sleep(120);
+ });
+ }
+
+ private static Web3j getInstance() {
+ if (web3 == null) {
+ HttpService httpService = new HttpService(blockchainNode);
+ web3 = Web3j.build(httpService);
+ }
+ return web3;
+ }
+
+ private static EthFilter getFilter(BigInteger startBlock) {
+ if (startBlock != null) {
+ EthFilter filter = new EthFilter(new DefaultBlockParameterNumber(startBlock),
+ DefaultBlockParameterName.LATEST, contractAddr);
+ return filter;
+ } else {
+ return new EthFilter(DefaultBlockParameterName.EARLIEST,
+ DefaultBlockParameterName.LATEST, contractAddr);
+ }
+ }
+
+ private static StaticGasProvider getStaticGasProvider(){
+ return new StaticGasProvider(GAS_PRICE,GAS_LIMIT);
+ }
}
diff --git a/src/test/java/com/xcong/excoin/GuijiTest.java b/src/test/java/com/xcong/excoin/GuijiTest.java
index 295adcf..4ef29a9 100644
--- a/src/test/java/com/xcong/excoin/GuijiTest.java
+++ b/src/test/java/com/xcong/excoin/GuijiTest.java
@@ -23,7 +23,7 @@
import lombok.extern.slf4j.Slf4j;
@Slf4j
-@SpringBootTest
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class GuijiTest {
private static final BigDecimal LIMIT = new BigDecimal("50");
@@ -41,6 +41,16 @@
@Resource
private MemberWalletCoinDao memberWalletCoinDao;
+ @Test
+ public void poolTest() {
+ String address = "0x19177bfd062852a4398cae3ab701a82a6b959bf2";
+ EthService ethService = new EthService();
+ BigDecimal balance = ethService.tokenGetBalance(address);
+ BigDecimal eth = EthService.getEthBlance(address);
+
+ log.info("--->{}, {}", balance, eth);
+ }
+
public void pool() throws ExecutionException, InterruptedException {
//List<MemberCoinChargeEntity> list = memberCoinChargeDao.selectAllBySymbolAndTag(CoinTypeEnum.USDT.name(), "ERC20", 1);
List<MemberCoinChargeEntity> list = new ArrayList<MemberCoinChargeEntity>();
diff --git a/src/test/java/com/xcong/excoin/SRCTest.java b/src/test/java/com/xcong/excoin/SRCTest.java
index 0513d06..5169f21 100644
--- a/src/test/java/com/xcong/excoin/SRCTest.java
+++ b/src/test/java/com/xcong/excoin/SRCTest.java
@@ -1,7 +1,95 @@
-package com.xcong.excoin;/**
-*
-* @author wzy
-* @date 2020-11-05
-**/
+package com.xcong.excoin;
+
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.http.HttpRequest;
+import com.alibaba.fastjson.JSONObject;
+import com.xcong.excoin.modules.coin.dao.TrcAddressDao;
+import com.xcong.excoin.modules.coin.entity.TrcAddressEntity;
+import com.xcong.excoin.utils.TRC20ApiUtils;
+import org.apache.catalina.security.SecurityUtil;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author wzy
+ * @date 2020-11-05
+ **/
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SRCTest {
+
+ private static final String SRC_API = "http://27.50.59.35:5002/";
+
+ private static final String SIGN_STR = "w@a!llokmet";
+
+ public static void main(String[] args) {
+ Map<String, Object> param = new HashMap<>();
+ String orderNo = "123445";
+ String userid = "11";
+ String symbol = "USDT";
+ String amount = "1";
+ String toAddress = "Ox";
+ param.put("orderno", orderNo);
+ param.put("userid", userid);
+ param.put("symbol", symbol);
+ param.put("toAddress", toAddress);
+ param.put("amount", new BigDecimal(amount));
+ param.put("sign", SecureUtil.md5(orderNo + userid + symbol + amount + toAddress + SIGN_STR));
+ HttpRequest request = HttpRequest.post(SRC_API + "transout/created");
+ String body = request.body(JSONObject.toJSONString(param)).execute().body();
+ System.out.println(body);
+ }
+
+ private static void sign() {
+
+ }
+
+ @Autowired
+ private TrcAddressDao srcAddressDao;
+
+ @Test
+ public void addressInsertTest() throws IOException {
+ File file = new File("/Users/helius/Desktop/src20.xls");
+ FileInputStream input = new FileInputStream(file);
+
+ Workbook wb = null;
+ if (file.getName().endsWith(".xls")) {
+ wb = new HSSFWorkbook(input);
+ } else if (file.getName().endsWith(".xlsx")) {
+ wb = new XSSFWorkbook(input);
+ }
+
+ Sheet sheet = wb.getSheetAt(0);
+ int lastRowNum = sheet.getLastRowNum();
+ for (int i = 0; i < lastRowNum; i++) {
+ Row row = sheet.getRow(i);
+ Cell cell = row.getCell(0);
+ TrcAddressEntity addressEntity = new TrcAddressEntity();
+ addressEntity.setAddress(cell.getStringCellValue().trim());
+ addressEntity.setIsUse(2);
+ srcAddressDao.insert(addressEntity);
+ }
+ }
+
+ @Test
+ public void createTest() {
+ System.out.println(System.currentTimeMillis());
+ TRC20ApiUtils.createWallet(1L, "111111", "USDT", "111111111");
+ System.out.println(System.currentTimeMillis());
+ }
}
--
Gitblit v1.9.1