Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
dc-java
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
bltdc
dc-java
Commits
a831086f
Commit
a831086f
authored
Oct 21, 2020
by
huluobin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
4816c5c4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
198 additions
and
30 deletions
+198
-30
AmazonAdDownloadReportJob.java
...ain/java/com/bailuntec/job/AmazonAdDownloadReportJob.java
+10
-0
AmazonAdGenerateReportIdJob.java
...n/java/com/bailuntec/job/AmazonAdGenerateReportIdJob.java
+0
-0
AmazonAdDownloadReportJobTest.java
...java/com/bailuntec/job/AmazonAdDownloadReportJobTest.java
+2
-4
SyncCostFirstFinishJobTest.java
...st/java/com/bailuntec/job/SyncCostFirstFinishJobTest.java
+1
-1
EbayFinanceAdSyncJob.java
...src/main/java/com/bailuntec/job/EbayFinanceAdSyncJob.java
+9
-6
EbayFinanceAdSyncJobTest.java
...test/java/com/bailuntec/job/EbayFinanceAdSyncJobTest.java
+3
-2
Application.java
...nc-oms-order/src/main/java/com/bailuntec/Application.java
+10
-9
job.properties
...ase/base-sync-oms-order/src/main/resources/job.properties
+1
-1
DcAutoTurnover.java
...main/java/com/bailuntec/domain/entity/DcAutoTurnover.java
+0
-0
JobAmazonAdLogMapper.xml
...c/main/java/com/bailuntec/mapper/JobAmazonAdLogMapper.xml
+1
-1
ReadSessionUtil.java
...on/src/main/java/com/bailuntec/utils/ReadSessionUtil.java
+94
-0
db-dev.properties
data-common/src/main/resources/db-dev.properties
+5
-2
db-prod.properties
data-common/src/main/resources/db-prod.properties
+7
-2
logback.xml
data-common/src/main/resources/logback.xml
+1
-1
mybatis-readonly-config.xml
data-common/src/main/resources/mybatis-readonly-config.xml
+40
-0
readonly-db-dev.properties
data-common/src/main/resources/readonly-db-dev.properties
+4
-0
readonly-db-prod.properties
data-common/src/main/resources/readonly-db-prod.properties
+6
-0
AutoTurnoverJob.java
...over/src/main/java/com/bailuntec/job/AutoTurnoverJob.java
+1
-0
AutoTurnoverServiceImpl.java
...a/com/bailuntec/service/impl/AutoTurnoverServiceImpl.java
+3
-1
No files found.
data-base/base-sync-amazon-ad/src/main/java/com/bailuntec/job/AmazonAdDownloadReportJob.java
View file @
a831086f
...
...
@@ -107,6 +107,16 @@ public class AmazonAdDownloadReportJob implements SimpleJob {
dcBaseFinanceAmazonAdProduct
=
new
DcBaseFinanceAmazonAdProduct
();
}
BeanUtils
.
copyProperties
(
dcBaseFinanceAmazonAdProduct
,
amazonAdProduct
);
dcBaseFinanceAmazonAdProduct
.
setAccountId
(
jobAmazonAdLog
.
getAccountId
());
dcBaseFinanceAmazonAdProduct
.
setCompanyId
(
jobAmazonAdLog
.
getCompanyId
());
dcBaseFinanceAmazonAdProduct
.
setReportDate
(
jobAmazonAdLog
.
getReportDate
());
dcBaseFinanceAmazonAdProduct
.
setExchangeRate
(
CallBailunSystem
.
getExchangeRate
(
dcBaseFinanceAmazonAdProduct
.
getCurrency
(),
CurrencyType
.
CNY
.
value
(),
jobAmazonAdLog
.
getReportDate
().
atStartOfDay
()));
dcBaseFinanceAmazonAdProduct
.
setExchangeRateUsd
(
CallBailunSystem
.
getExchangeRate
(
dcBaseFinanceAmazonAdProduct
.
getCurrency
(),
CurrencyType
.
USD
.
value
(),
jobAmazonAdLog
.
getReportDate
().
atStartOfDay
()));
dcBaseFinanceAmazonAdProduct
.
setBjModifyTime
(
LocalDateTime
.
now
());
dcBaseFinanceAmazonAdProduct
.
setType
(
jobAmazonAdLog
.
getType
());
dcBaseFinanceAmazonAdProductMapper
.
upsertSelective
(
dcBaseFinanceAmazonAdProduct
);
}
}
...
...
data-base/base-sync-amazon-ad/src/main/java/com/bailuntec/job/AmazonAdGenerateReportIdJob.java
View file @
a831086f
This diff is collapsed.
Click to expand it.
data-base/base-sync-amazon-ad/src/test/java/com/bailuntec/job/AmazonAdDownloadReportJobTest.java
View file @
a831086f
...
...
@@ -3,7 +3,6 @@ package com.bailuntec.job;
import
com.bailuntec.domain.pojo.AmazonAdProduct
;
import
com.dangdang.ddframe.job.api.ShardingContext
;
import
com.dangdang.ddframe.job.executor.ShardingContexts
;
import
com.google.gson.Gson
;
import
com.google.gson.reflect.TypeToken
;
import
lombok.extern.slf4j.Slf4j
;
import
okhttp3.OkHttpClient
;
...
...
@@ -11,7 +10,7 @@ import okhttp3.Request;
import
okhttp3.Response
;
import
org.junit.jupiter.api.Test
;
import
java.io.
*
;
import
java.io.
IOException
;
import
java.lang.reflect.Type
;
import
java.util.HashMap
;
import
java.util.List
;
...
...
@@ -55,8 +54,7 @@ class AmazonAdDownloadReportJobTest {
}.
getType
();
StringBuilder
html
=
new
StringBuilder
();
StringBuilder
html
=
new
StringBuilder
();
Scanner
sc
=
new
Scanner
(
inputStream
);
while
(
sc
.
hasNextLine
())
{
...
...
data-base/base-sync-cost-first/src/test/java/com/bailuntec/job/SyncCostFirstFinishJobTest.java
View file @
a831086f
...
...
@@ -25,7 +25,7 @@ public class SyncCostFirstFinishJobTest {
SyncCostFirstFinishJob
syncCostFirstFinishJob
=
new
SyncCostFirstFinishJob
();
JobPointLog
jobPointLog
=
new
JobPointLog
(
"base-sync-cost-first-finish"
,
1
,
1000
,
1
,
1
,
LocalDateTime
.
of
(
2020
,
8
,
1
,
0
,
0
,
0
),
LocalDateTime
.
of
(
2020
,
10
,
9
,
0
,
0
,
0
));
LocalDateTime
.
of
(
2020
,
10
,
10
,
0
,
0
,
0
));
syncCostFirstFinishJob
.
executeJob
(
null
,
jobPointLog
);
}
...
...
data-base/base-sync-finance-ebay/src/main/java/com/bailuntec/job/EbayFinanceAdSyncJob.java
View file @
a831086f
...
...
@@ -57,11 +57,15 @@ public class EbayFinanceAdSyncJob extends PointJob {
for
(
JobAccountLog
jobAccountLog
:
listByPage
)
{
//先删除再更新
dcBaseFinanceEbayMapper
.
deleteByExample
(
DcBaseFinanceEbayExample
.
newAndCreateCriteria
()
.
andBjDateBetween
(
startTime
,
endTime
)
.
andAccountIdEqualTo
(
jobAccountLog
.
getAccountId
())
.
example
());
try
{
//先删除再更新
dcBaseFinanceEbayMapper
.
deleteByExample
(
DcBaseFinanceEbayExample
.
newAndCreateCriteria
()
.
andBjDateBetween
(
startTime
,
endTime
)
.
andAccountIdEqualTo
(
jobAccountLog
.
getAccountId
())
.
example
());
}
catch
(
Exception
ex
){
}
jobAccountLog
.
setStartTime
(
startTime
.
plusHours
(
15
));
jobAccountLog
.
setEndTime
(
endTime
.
plusHours
(
15
));
...
...
@@ -73,7 +77,6 @@ public class EbayFinanceAdSyncJob extends PointJob {
jobPointLog
.
setStartTime
(
startTime
.
plusDays
(
1
));
jobPointLog
.
setEndTime
(
endTime
.
plusDays
(
1
));
jobPointLogMapper
.
updateByPrimaryKey
(
jobPointLog
);
}
}
catch
(
Exception
e
)
{
...
...
data-base/base-sync-finance-ebay/src/test/java/com/bailuntec/job/EbayFinanceAdSyncJobTest.java
View file @
a831086f
...
...
@@ -7,6 +7,7 @@ import com.bailuntec.domain.example.DcBaseCompanyAccountExample;
import
com.bailuntec.domain.example.DcBaseFinanceEbayExample
;
import
com.bailuntec.mapper.DcBaseCompanyAccountMapper
;
import
com.bailuntec.mapper.DcBaseFinanceEbayMapper
;
import
com.bailuntec.support.PointJob
;
import
com.bailuntec.utils.SessionUtil
;
import
com.dangdang.ddframe.job.api.ShardingContext
;
import
com.dangdang.ddframe.job.executor.ShardingContexts
;
...
...
@@ -33,12 +34,12 @@ public class EbayFinanceAdSyncJobTest {
@Test
public
void
executeJob
()
{
EbayFinanceAdSync
Job
ebayFinanceAdSyncJob
=
new
EbayFinanceAdSyncJob
();
Point
Job
ebayFinanceAdSyncJob
=
new
EbayFinanceAdSyncJob
();
ShardingContext
shardingContext
=
new
ShardingContext
(
new
ShardingContexts
(
"x"
,
"base-sync-finance-ebay-ad"
,
1
,
null
,
new
HashMap
<>()),
0
);
ebayFinanceAdSyncJob
.
execute
Job
(
shardingContext
,
null
);
ebayFinanceAdSyncJob
.
execute
(
shardingContext
);
}
...
...
data-base/base-sync-oms-order/src/main/java/com/bailuntec/Application.java
View file @
a831086f
...
...
@@ -3,6 +3,7 @@ package com.bailuntec;
import
com.alibaba.druid.pool.DruidDataSource
;
import
com.bailuntec.job.OrderSyncJob
;
import
com.bailuntec.job.OrderSyncJob30
;
import
com.bailuntec.job.OrderSyncTask
;
import
com.bailuntec.listener.OrderSyncJobListener
;
import
com.bailuntec.utils.PropertiesUtil
;
import
com.dangdang.ddframe.job.config.JobCoreConfiguration
;
...
...
@@ -29,7 +30,7 @@ public class Application {
public
static
void
main
(
String
[]
args
)
{
new
JobScheduler
(
createRegistryCenter
(),
createJobConfiguration
(),
createJobEventConfiguration
(),
new
OrderSyncJobListener
()).
init
();
new
JobScheduler
(
createRegistryCenter
(),
createJobConfiguration1
(),
createJobEventConfiguration
(),
new
OrderSyncJobListener
()).
init
();
//
new JobScheduler(createRegistryCenter(), createJobConfiguration2(), createJobEventConfiguration(), new OrderSyncJobListener()).init();
new
JobScheduler
(
createRegistryCenter
(),
createJobConfiguration2
(),
createJobEventConfiguration
(),
new
OrderSyncJobListener
()).
init
();
}
...
...
@@ -60,14 +61,14 @@ public class Application {
return
LiteJobConfiguration
.
newBuilder
(
simpleJobConfig
).
build
();
}
//
private static LiteJobConfiguration createJobConfiguration2() {
//
JobCoreConfiguration simpleCoreConfig = JobCoreConfiguration.newBuilder(
//
propertiesUtil.getPropertyAsString("JOB_COROUTINE_NAME"),
//
propertiesUtil.getPropertyAsString("JOB_COROUTINE_CRON"),
//
propertiesUtil.getPropertyAsInt("SHARDING_TOTAL_COUNT")).build();
//
SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig, OrderSyncTask.class.getCanonicalName());
//
return LiteJobConfiguration.newBuilder(simpleJobConfig).build();
//
}
private
static
LiteJobConfiguration
createJobConfiguration2
()
{
JobCoreConfiguration
simpleCoreConfig
=
JobCoreConfiguration
.
newBuilder
(
propertiesUtil
.
getPropertyAsString
(
"JOB_COROUTINE_NAME"
),
propertiesUtil
.
getPropertyAsString
(
"JOB_COROUTINE_CRON"
),
propertiesUtil
.
getPropertyAsInt
(
"SHARDING_TOTAL_COUNT"
)).
build
();
SimpleJobConfiguration
simpleJobConfig
=
new
SimpleJobConfiguration
(
simpleCoreConfig
,
OrderSyncTask
.
class
.
getCanonicalName
());
return
LiteJobConfiguration
.
newBuilder
(
simpleJobConfig
).
build
();
}
private
static
JobEventConfiguration
createJobEventConfiguration
()
{
return
new
JobEventRdbConfiguration
(
setUpEventTraceDataSource
());
...
...
data-base/base-sync-oms-order/src/main/resources/job.properties
View file @
a831086f
...
...
@@ -19,7 +19,7 @@ JOB_NAME30=base-sync-oms-skus30
#JOB_NAME=base-sync-oms-order
JOB_CRON30
=
0 0 22,23,00 * * ? *
JOB_COROUTINE_NAME
=
base-sync-oms-order-task
2
JOB_COROUTINE_NAME
=
base-sync-oms-order-task
3
JOB_COROUTINE_CRON
=
0/1 * * * * ?
SHARDING_TOTAL_COUNT
=
1
data-common/src/main/java/com/bailuntec/domain/entity/DcAutoTurnover.java
View file @
a831086f
This diff is collapsed.
Click to expand it.
data-common/src/main/java/com/bailuntec/mapper/JobAmazonAdLogMapper.xml
View file @
a831086f
...
...
@@ -518,6 +518,6 @@
where status = 0
and bj_create
<
#{localDateTime}
and id % #{shardingContext.shardingTotalCount} = #{shardingContext.shardingItem}
order by
bj_modified desc
order by
report_date
</select>
</mapper>
data-common/src/main/java/com/bailuntec/utils/ReadSessionUtil.java
0 → 100644
View file @
a831086f
package
com
.
bailuntec
.
utils
;
import
com.bailuntec.domain.constant.CommonConstant
;
import
org.apache.ibatis.io.Resources
;
import
org.apache.ibatis.session.SqlSession
;
import
org.apache.ibatis.session.SqlSessionFactory
;
import
org.apache.ibatis.session.SqlSessionFactoryBuilder
;
import
java.io.Reader
;
public
class
ReadSessionUtil
{
//当前线程里面存放session
private
static
final
ThreadLocal
<
SqlSession
>
threadLocal
=
new
ThreadLocal
<>();
private
static
final
ThreadLocal
<
SqlSession
>
threadLocalTransction
=
new
ThreadLocal
<>();
private
static
Reader
reader
=
null
;
private
static
SqlSessionFactoryBuilder
builder
=
null
;
private
static
SqlSessionFactory
factory
=
null
;
//不允许对该类进行new操作
private
ReadSessionUtil
()
{
}
static
{
try
{
//1.加载配置文件
reader
=
Resources
.
getResourceAsReader
(
"mybatis-readonly-config.xml"
);
//2.得到工厂的创建对象
builder
=
new
SqlSessionFactoryBuilder
();
//3.得到工厂对象
factory
=
builder
.
build
(
reader
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
throw
new
RuntimeException
(
"SqlSessionFactory初始化失败, 请检查配置文件路径和内容"
);
}
}
//获取自动提交session
public
static
SqlSession
getSession
()
{
SqlSession
session
=
threadLocal
.
get
();
if
(
session
==
null
)
{
SqlSessionFactory
factory
=
getFactory
();
session
=
factory
.
openSession
(
true
);
threadLocal
.
set
(
session
);
}
return
session
;
}
//获取手动提交session
public
static
SqlSession
getTranstionSession
()
{
SqlSession
session
=
threadLocalTransction
.
get
();
if
(
session
==
null
)
{
SqlSessionFactory
factory
=
getFactory
();
session
=
factory
.
openSession
();
threadLocalTransction
.
set
(
session
);
}
return
session
;
}
//关闭session
public
static
void
closeTranstionSession
()
{
try
{
SqlSession
session
=
threadLocalTransction
.
get
();
if
(
session
!=
null
)
{
session
.
close
();
}
threadLocalTransction
.
set
(
null
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
throw
new
RuntimeException
(
"MYSQL关闭Session异常"
,
e
);
}
}
//关闭session
public
static
void
closeSession
()
{
try
{
SqlSession
session
=
threadLocal
.
get
();
if
(
session
!=
null
)
{
session
.
close
();
}
threadLocal
.
set
(
null
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
throw
new
RuntimeException
(
"MYSQL关闭Session异常"
,
e
);
}
}
//获得工厂对象
public
static
SqlSessionFactory
getFactory
()
{
if
(
factory
==
null
)
{
factory
=
builder
.
build
(
reader
);
}
return
factory
;
}
}
data-common/src/main/resources/db-dev.properties
View file @
a831086f
driver
=
com.mysql.jdbc.Driver
url
=
jdbc:mysql://gz-cdb-kp7s5i79.sql.tencentcdb.com:61691/bailun_datacenter?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username
=
root
password
=
#7kfnymAM$Y9-Ntf
\ No newline at end of file
password
=
#7kfnymAM$Y9-Ntf
readonly-url
=
jdbc:mysql://gz-cdbrg-qdyec2j3.sql.tencentcdb.com:59667/bailun_datacenter?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
readonly-username
=
root
readonly-password
=
#7kfnymAM$Y9-Ntf
data-common/src/main/resources/db-prod.properties
View file @
a831086f
driver
=
com.mysql.jdbc.Driver
url
=
jdbc:mysql://10.0.8.15:3306/bailun_datacenter?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username
=
root
password
=
#7kfnymAM$Y9-Ntf
\ No newline at end of file
password
=
#7kfnymAM$Y9-Ntf
readonly-url
=
jdbc:mysql://10.0.8.21:3306/bailun_datacenter?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
readonly-username
=
root
readonly-password
=
#7kfnymAM$Y9-Ntf
data-common/src/main/resources/logback.xml
View file @
a831086f
<?xml version="1.0" encoding="UTF-8"?>
<configuration
scan=
"
tru
e"
scanPeriod=
"60 seconds"
debug=
"true"
>
<configuration
scan=
"
fals
e"
scanPeriod=
"60 seconds"
debug=
"true"
>
<!-- 彩色日志格式 -->
<conversionRule
conversionWord=
"clr"
converterClass=
"org.springframework.boot.logging.logback.ColorConverter"
/>
<conversionRule
conversionWord=
"wex"
...
...
data-common/src/main/resources/mybatis-readonly-config.xml
0 → 100644
View file @
a831086f
<!--<?xml version="1.0" encoding="UTF-8" ?>-->
<!--<!DOCTYPE configuration-->
<!-- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"-->
<!-- "http://mybatis.org/dtd/mybatis-3-config.dtd">-->
<!--<configuration>-->
<!-- <!–<properties resource="db-tj.properties"/>–>-->
<!-- <properties resource="readonly-db-dev.properties"/>-->
<!-- <!– <properties resource="readonly-db-prod.properties"/>–>-->
<!-- <settings>-->
<!-- <setting name="mapUnderscoreToCamelCase" value="true"/>-->
<!-- </settings>-->
<!-- <typeAliases>-->
<!-- <typeAlias type="com.bailuntec.support.DruidDataSourceFactory" alias="DRUID"/>-->
<!-- <package name="com.bailuntec.domain"/>-->
<!-- </typeAliases>-->
<!-- <!– <plugins>–>-->
<!-- <!– <plugin interceptor="com.bailuntec.support.SqlCostInterceptor"/>–>-->
<!-- <!– </plugins>–>-->
<!-- <environments default="work">-->
<!-- <environment id="work">-->
<!-- <transactionManager type="JDBC"/>-->
<!-- <dataSource type="DRUID">-->
<!-- <property name="driver" value="${driver}"/>-->
<!-- <property name="url" value="${url}"/>-->
<!-- <property name="username" value="${username}"/>-->
<!-- <property name="password" value="${password}"/>-->
<!-- </dataSource>-->
<!-- </environment>-->
<!-- </environments>-->
<!-- <mappers>-->
<!-- <package name="com.bailuntec.mapper"/>-->
<!-- </mappers>-->
<!--</configuration>-->
data-common/src/main/resources/readonly-db-dev.properties
0 → 100644
View file @
a831086f
driver
=
com.mysql.jdbc.Driver
url
=
jdbc:mysql://gz-cdbrg-qdyec2j3.sql.tencentcdb.com:59667/bailun_datacenter?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username
=
root
password
=
#7kfnymAM$Y9-Ntf
data-common/src/main/resources/readonly-db-prod.properties
0 → 100644
View file @
a831086f
driver
=
com.mysql.jdbc.Driver
url
=
jdbc:mysql://10.0.8.21:3306/bailun_datacenter?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
username
=
root
password
=
#7kfnymAM$Y9-Ntf
data-show/show-auto-turnover/src/main/java/com/bailuntec/job/AutoTurnoverJob.java
View file @
a831086f
...
...
@@ -217,6 +217,7 @@ public class AutoTurnoverJob extends PointJob {
//库存对应的仓库
dcBaseWarehouse
=
baseWarehouseMapper
.
selectOneByExample
(
DcBaseWarehouseExample
.
newAndCreateCriteria
().
andWarehouseCodeEqualTo
(
warehouseCode
).
example
());
BigDecimal
incrementalRatio
=
BigDecimal
.
ONE
;
int
compareSales
=
0
;
//销量
DcAutoSalesMapper
autoSalesMapper
;
...
...
data-show/show-auto-turnover/src/main/java/com/bailuntec/service/impl/AutoTurnoverServiceImpl.java
View file @
a831086f
...
...
@@ -5,6 +5,7 @@ import com.bailuntec.domain.entity.DcAutoTurnover;
import
com.bailuntec.mapper.DcAutoSalesForecastStageConfigMapper
;
import
com.bailuntec.mapper.DcBaseOmsSkuMapper
;
import
com.bailuntec.service.AutoTurnoverService
;
import
com.bailuntec.utils.ReadSessionUtil
;
import
com.bailuntec.utils.SessionUtil
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.ibatis.session.SqlSession
;
...
...
@@ -29,7 +30,8 @@ public class AutoTurnoverServiceImpl implements AutoTurnoverService {
@Override
public
List
<
BigDecimal
>
getAutoTurnoverSaleDetails
(
DcAutoTurnover
dcAutoTurnover
,
int
turnoverDays
,
int
autoForecastDay
)
{
SqlSession
session
=
SessionUtil
.
getFactory
().
openSession
(
true
);
SqlSession
session
=
ReadSessionUtil
.
getFactory
().
openSession
(
true
);
// SqlSession readOnlySession = ReadSessionUtil.getFactory().openSession(true);
try
{
Queue
<
BigDecimal
>
forecastSalesDetails
=
new
LinkedList
<>();
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment