Commit d1042f1e authored by Bc. Pavol Beňko's avatar Bc. Pavol Beňko
Browse files

No commit message

No commit message
parent 9d6dea07
/dist/
/build/
\ No newline at end of file
......@@ -24,163 +24,251 @@ import java.util.logging.Level;
import java.util.logging.Logger;
import module.PoolRequest;
import module.modules.*;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;
public class JedisListener extends JedisPubSub{
private static final Logger log = Logger.getLogger(Config.class.getName());
Jedis jedis = JedisConnection.getConnection();
@Override
public void onMessage(String channel, String message) {
switch(channel){
case "AmountOfTransferredDataTable": {
log.log(Level.INFO, "New message for module AmountOfTransferredData received", AmountOfTransferredData.getInstance().getModuleName());
if(Config.AmountOfTransferredData==true){
jedis.set("AmountOfTransferredDataTableSIG", "OK");
AmountOfTransferredData.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(AmountOfTransferredData.getInstance().getState()==Thread.State.WAITING){
synchronized(AmountOfTransferredData.getInstance()){
AmountOfTransferredData.getInstance().notify();
}
}
}
}break;
case "AmountOfTransferredData": {
log.log(Level.INFO, "New message for module AmountOfTransferredData received", AmountOfTransferredData.getInstance().getModuleName());
if(Config.AmountOfTransferredData==true){
jedis.set("AmountOfTransferredDataSIG", "OK");
AmountOfTransferredData.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(AmountOfTransferredData.getInstance().getState()==Thread.State.WAITING){
synchronized(AmountOfTransferredData.getInstance()){
AmountOfTransferredData.getInstance().notify();
}
}
}
}break;
case "BandwidthHistoryTrend": {
log.log(Level.INFO, "New message for module BandwidthHistoryTrend received", BandwidthHistoryTrend.getInstance().getModuleName());
if(Config.BandwidthHistoryTrend==true){
jedis.set("BandwidthHistoryTrendSIG", "OK");
BandwidthHistoryTrend.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(BandwidthHistoryTrend.getInstance().getState()==Thread.State.WAITING){
synchronized(BandwidthHistoryTrend.getInstance()){
BandwidthHistoryTrend.getInstance().notify();
}
}
}
}break;
case "AverageDownloadUploadPacket": {
log.log(Level.INFO, "New message for module AverageOfTransferredDataPacket received", AverageDownloadUploadPacket.getInstance().getModuleName());
if(Config.AverageOfTransferredDataPacket==true){
jedis.set("AverageDownloadUploadPacketSIG", "OK");
AverageDownloadUploadPacket.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(AverageDownloadUploadPacket.getInstance().getState()==Thread.State.WAITING){
synchronized(AverageDownloadUploadPacket.getInstance()){
AverageDownloadUploadPacket.getInstance().notify();
}
}
}
}break;
case "MaximumDownloadUpload": {
log.log(Level.INFO, "New message for module MaximumDownloadUpload received", MaximumDownloadUpload.getInstance().getModuleName());
if(Config.MaximumDownloadUpload==true){
jedis.set("MaximumDownloadUploadSIG", "OK");
MaximumDownloadUpload.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(MaximumDownloadUpload.getInstance().getState()==Thread.State.WAITING){
synchronized(MaximumDownloadUpload.getInstance()){
MaximumDownloadUpload.getInstance().notify();
}
}
}
}break;
case "AmountOfTransferredDataPacket": {
log.log(Level.INFO, "New message for module AmountOfTransferredDataPacket received", AmountOfTransferredDataPacket.getInstance().getModuleName());
if(Config.AmountOfTransferredDataPacket==true){
jedis.set("AmountOfTransferredDataPacketSIG", "OK");
AmountOfTransferredDataPacket.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(AmountOfTransferredDataPacket.getInstance().getState()==Thread.State.WAITING){
synchronized(AmountOfTransferredDataPacket.getInstance()){
AmountOfTransferredDataPacket.getInstance().notify();
}
}
}
}break;
case "BandwidthHistoryTrendPacket": {
log.log(Level.INFO, "New message for module BandwidthHistoryTrendPacket received", BandwidthHistoryTrendPacket.getInstance().getModuleName());
if(Config.BandwidthHistoryTrendPacket==true){
jedis.set("BandwidthHistoryTrendPacketSIG", "OK");
BandwidthHistoryTrendPacket.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(BandwidthHistoryTrendPacket.getInstance().getState()==Thread.State.WAITING){
synchronized(BandwidthHistoryTrendPacket.getInstance()){
BandwidthHistoryTrendPacket.getInstance().notify();
}
}
}
}break;
case "AverageMiniTable": {
log.log(Level.INFO, "New message for module AverageMiniTable received", AverageMiniTable.getInstance().getModuleName());
if(Config.AverageMiniTable==true){
jedis.set("AverageMiniTableSIG", "OK");
AverageMiniTable.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(AverageMiniTable.getInstance().getState()==Thread.State.WAITING){
synchronized(AverageMiniTable.getInstance()){
AverageMiniTable.getInstance().notify();
}
}
}
}break;
case "HistoryTrendFlows": {
log.log(Level.INFO, "New message for module HistoryTrendFlows received", HistoryTrendFlows.getInstance().getModuleName());
if(Config.HistoryTrendFlows==true){
jedis.set("HistoryTrendFlowsSIG", "OK");
HistoryTrendFlows.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(HistoryTrendFlows.getInstance().getState()==Thread.State.WAITING){
synchronized(HistoryTrendFlows.getInstance()){
HistoryTrendFlows.getInstance().notify();
}
}
}
}break;
case "AverageDownloadUpload": {
log.log(Level.INFO, "New message for module AverageOfTransferredData received", AverageDownloadUpload.getInstance().getModuleName());
if(Config.AverageOfTransferredData==true){
jedis.set("AverageDownloadUploadSIG", "OK");
AverageDownloadUpload.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(AverageDownloadUpload.getInstance().getState()==Thread.State.WAITING){
synchronized(AverageDownloadUpload.getInstance()){
AverageDownloadUpload.getInstance().notify();
}
}
}
}break;
case "HistoryTable": {
log.log(Level.INFO, "New message for module HistoryTable received", HistoryTable.getInstance().getModuleName());
if(Config.HistoryTable==true){
jedis.set("HistoryTableSIG", "OK");
HistoryTable.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(HistoryTable.getInstance().getState()==Thread.State.WAITING){
synchronized(HistoryTable.getInstance()){
HistoryTable.getInstance().notify();
}
}
}
}break;
case "AmountMiniTable": {
log.log(Level.INFO, "New message for module AmountMiniTable received", AmountMiniTable.getInstance().getModuleName());
if(Config.AmountMiniTable==true){
jedis.set("AmountMiniTableSIG", "OK");
AmountMiniTable.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(AmountMiniTable.getInstance().getState()==Thread.State.WAITING){
synchronized(AmountMiniTable.getInstance()){
AmountMiniTable.getInstance().notify();
}
}
}
}break;
case "NumberOfFlows": {
log.log(Level.INFO, "New message for module NumberOfFlows received", NumberOfFlows.getInstance().getModuleName());
if(Config.NumberOfFlows==true){
jedis.set("NumberOfFlowsSIG", "OK");
NumberOfFlows.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(NumberOfFlows.getInstance().getState()==Thread.State.WAITING){
synchronized(NumberOfFlows.getInstance()){
NumberOfFlows.getInstance().notify();
}
}
}
}break;
case "PingTime": {
log.log(Level.INFO, "New message for module PingTime received", PingTime.getInstance().getModuleName());
if(Config.PingTime==true){
jedis.set("PingTimeSIG", "OK");
PingTime.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(PingTime.getInstance().getState()==Thread.State.WAITING){
synchronized(PingTime.getInstance()){
PingTime.getInstance().notify();
}
}
}
}break;
case "TopDownloader": {
log.log(Level.INFO, "New message for module TopDownloader received", TopDownloader.getInstance().getModuleName());
if(Config.TopDownloader==true){
jedis.set("TopDownloaderSIG", "OK");
TopDownloader.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(TopDownloader.getInstance().getState()==Thread.State.WAITING){
synchronized(TopDownloader.getInstance()){
TopDownloader.getInstance().notify();
}
}
}
}break;
case "TopUploader": {
log.log(Level.INFO, "New message for module TopUploader received", TopUploader.getInstance().getModuleName());
if(Config.TopUploader==true){
jedis.set("TopUploaderSIG", "OK");
TopUploader.getInstance().getPoolRequest().add(new PoolRequest.Request(channel, message));
System.out.println("Prijata sprava z webu: "+message);
if(TopUploader.getInstance().getState()==Thread.State.WAITING){
synchronized(TopUploader.getInstance()){
TopUploader.getInstance().notify();
}
}
}
}break;
default: log.log(Level.WARNING, "Modul {0} is not exist", channel); break;
}
}
@Override
......
......@@ -40,7 +40,7 @@ public class Config {
public static String dbHost="localhost";
public static String dbPort="27017";
public static String dbName="monica";
public static String dbName="monica2";
public static String dbLogin="bm";
public static String dbPassword="bm";
......
......@@ -230,6 +230,7 @@ public class PrepareStatement {
boolean contain=true;
for (String requiredAttribute : m.getRequiredAttribute()) {
if(jo.has(requiredAttribute)==false){
System.out.println("sprava neobsahuje atribut+:"+ requiredAttribute);
contain=false;
}
}
......
......@@ -71,9 +71,7 @@ public class CalculateTransferedData {
long startRecord= (long)row.get("flowStartMilliseconds");
long endRecord= (long)row.get("flowEndMilliseconds");
long octets= (long)row.get("octetDeltaCount");
if(octets==0){
break;
}
if(startRecord>= getStartInterval() && endRecord<= getEndInterval()){
am+= octets;
}else if(startRecord< getStartInterval() && endRecord> getEndInterval()){
......@@ -97,9 +95,7 @@ public class CalculateTransferedData {
long startRecord= (long)row.get("flowStartMilliseconds");
long endRecord= (long)row.get("flowEndMilliseconds");
long octets= (long)row.get("octetDeltaCount");
if(octets==0){
break;
}
if((startRecord<getStartInterval() && endRecord<getStartInterval())||(startRecord>getEndInterval() && endRecord>getEndInterval())){
......
......@@ -68,9 +68,7 @@ public class CalculateTransferedDataPacket {
long startRecord= (long)row.get("flowStartMilliseconds");
long endRecord= (long)row.get("flowEndMilliseconds");
long octets= (long)row.get("packetDeltaCount");
if(octets==0){
break;
}
if(startRecord>= getStartInterval() && endRecord<= getEndInterval()){
am+= octets;
}else if(startRecord< getStartInterval() && endRecord> getEndInterval()){
......
......@@ -40,6 +40,7 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
*
* @author esperian
......@@ -51,7 +52,6 @@ public class AmountMiniTable extends AbstractModule{
public static AmountMiniTable getInstance(){
if(AmountMiniTableInstance==null){
AmountMiniTableInstance = new AmountMiniTable();
calculate= new CalculateTransferedData();
......@@ -122,10 +122,9 @@ public class AmountMiniTable extends AbstractModule{
DBObject condition = new BasicDBObject("$match",query.get());
DBObject select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1).append("rid", 1));
DBObject sortFields = new BasicDBObject("octetDeltaCount", -1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
Iterator<DBObject> result= aggOut.results().iterator();
//System.out.println("1---"+(((Collection<DBObject>) aggOut.results()).size()));
calculate.processData(result);
......@@ -142,11 +141,7 @@ public class AmountMiniTable extends AbstractModule{
condition = new BasicDBObject("$match",query.get());
select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1).append("rid", 1));
sortFields = new BasicDBObject("octetDeltaCount", -1);
sort = new BasicDBObject("$sort", sortFields );
aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
result= aggOut.results().iterator();
//System.out.println("2---"+(((Collection<DBObject>) aggOut.results()).size()));
......
......@@ -21,6 +21,7 @@ package module.modules;
import com.mongodb.AggregationOutput;
import com.mongodb.BasicDBObject;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.QueryBuilder;
import connctions.DatabaseConnection;
......@@ -115,16 +116,15 @@ public class AmountOfTransferredData extends AbstractModule{
//inak namapujeme query a vyberieme potrebne polozky
DBObject condition = new BasicDBObject("$match",query.get());
DBObject select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1));
DBObject sortFields = new BasicDBObject("octetDeltaCount", -1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
Iterator<DBObject> result= aggOut.results().iterator();
db.disconnect();
calculate.processData(result);
Double value = calculate.getResutValue();
System.out.println(new JSONObject().put("name", "AmountOfTransferredData").put("status", "ok").put("response", value).toString());
//System.out.println(new JSONObject().put("name", "AmountOfTransferredData").put("status", "ok").put("response", value).toString());
getJedis().publish("ResponseAmountOfTransferredData",new JSONObject().put("name", "AmountOfTransferredData").put("status", "ok").put("response", value).toString());
endT=new Date().getTime();
......
......@@ -96,7 +96,7 @@ public class AmountOfTransferredDataPacket extends AbstractModule {
obj = new JSONObject(getPoolRequest().get().request);
QueryBuilder query = getPrepareStatement().getStatement(obj, this);
//v pripade ze nejaky atribuch chýba
if (query == null) {
getJedis().publish("ResponseAmountOfTransferredDataPacket", ModuleResponse.sentData("AmountOfTransferredDataPacket", "error", "Some of required attribute is missing").toString());
......@@ -110,10 +110,7 @@ public class AmountOfTransferredDataPacket extends AbstractModule {
DBObject condition = new BasicDBObject("$match", query.get());
DBObject select = new BasicDBObject("$project", new BasicDBObject("flowId", 1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("packetDeltaCount", 1));
DBObject sortFields = new BasicDBObject("packetDeltaCount", -1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut = db.getDatabase().getCollection("records_main").aggregate(condition, select, sort);
AggregationOutput aggOut = db.getDatabase().getCollection("records_main").aggregate(condition, select);
Iterator<DBObject> result = aggOut.results().iterator();
......
......@@ -106,10 +106,7 @@ public class AverageDownloadUpload extends AbstractModule{
DBObject condition = new BasicDBObject("$match",query.get());
DBObject select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1).append("rid", 1));
DBObject sortFields = new BasicDBObject("octetDeltaCount", -1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
Iterator<DBObject> result= aggOut.results().iterator();
db.disconnect();
......
......@@ -111,10 +111,7 @@ public class AverageDownloadUploadPacket extends AbstractModule{
DBObject condition = new BasicDBObject("$match",query.get());
DBObject select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("packetDeltaCount", 1).append("rid", 1));
DBObject sortFields = new BasicDBObject("packetDeltaCount", -1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
Iterator<DBObject> result= aggOut.results().iterator();
db.disconnect();
......
......@@ -121,10 +121,7 @@ public void run() {
DBObject condition = new BasicDBObject("$match",query.get());
DBObject select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1).append("rid", 1));
DBObject sortFields = new BasicDBObject("octetDeltaCount", -1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
Iterator<DBObject> result= aggOut.results().iterator();
//System.out.println("1---"+(((Collection<DBObject>) aggOut.results()).size()));
calculate.processData(result);
......@@ -141,11 +138,7 @@ public void run() {
condition = new BasicDBObject("$match",query.get());
select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1).append("rid", 1));
sortFields = new BasicDBObject("octetDeltaCount", -1);
sort = new BasicDBObject("$sort", sortFields );
aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
Iterator<DBObject> result2= aggOut.results().iterator();
db.disconnect();
//System.out.println("2---"+(((Collection<DBObject>) aggOut.results()).size()));
......
......@@ -150,29 +150,25 @@ public class BandwidthHistoryTrend extends AbstractModule{
DBObject condition = new BasicDBObject("$match",guery.get());
DBObject select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1));
DBObject sortFields = new BasicDBObject("flowStartMilliseconds", 1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
Iterator<DBObject> result= aggOut.results().iterator();
int i=0;
while(result.hasNext()){
DBObject oo= result.next();
long s = (long) oo.get("flowStartMilliseconds");
long e = (long) oo.get("flowEndMilliseconds");
if(!table.containsKey(s)){
table.put(s, 0.0);
table2.add(s);
i++;
}
if(!table.containsKey(e)){
table.put(e, 0.0);
table2.add(e);
i++;
}
DBObject oo= result.next();
long s = (long) oo.get("flowStartMilliseconds");
long e = (long) oo.get("flowEndMilliseconds");
if(!table.containsKey(s)){
table.put(s, 0.0);
table2.add(s);
i++;
}
if(!table.containsKey(e)){
table.put(e, 0.0);
table2.add(e);
i++;
}
}
return table2;
}
......
......@@ -168,10 +168,7 @@ public class HistoryTable extends AbstractModule{
DBObject condition = new BasicDBObject("$match",query.get());
DBObject select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1));
DBObject sortFields = new BasicDBObject("octetDeltaCount", -1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
Iterator<DBObject> result= aggOut.results().iterator();
calculate.processData(result);
......@@ -183,7 +180,7 @@ public class HistoryTable extends AbstractModule{
DBObject condition2 = new BasicDBObject("$match",query2.get());
DBObject select2= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1));
AggregationOutput aggOut2=db.getDatabase().getCollection("records_main").aggregate(condition2,select2,sort);
AggregationOutput aggOut2=db.getDatabase().getCollection("records_main").aggregate(condition2,select2);
Iterator<DBObject> result2= aggOut2.results().iterator();
calculate.processData(result2);
......
......@@ -106,10 +106,7 @@ public class MaximumDownloadUpload extends AbstractModule{
DBObject condition = new BasicDBObject("$match",query.get());
DBObject select= new BasicDBObject("$project",new BasicDBObject("flowId",1).append("flowStartMilliseconds", 1).append("flowEndMilliseconds", 1).append("octetDeltaCount", 1).append("rid", 1));
DBObject sortFields = new BasicDBObject("flowStartMilliseconds", -1);
DBObject sort = new BasicDBObject("$sort", sortFields );
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select,sort);
AggregationOutput aggOut=db.getDatabase().getCollection("records_main").aggregate(condition,select);
db.disconnect();
calculate.processDataPerSec(aggOut);
......
......@@ -107,7 +107,6 @@ public class TopDownloader extends AbstractModule{
getJedis().publish("ResponseTopDownloader",ModuleResponse.sentData("TopDownloader", "error", "Some of required attribute is missing").toString());
}else{
JSONArray time =obj.getJSONArray("time");
calculate.setStartInterval(new Long(time.getLong(0)));
calculate.setEndInterval(new Long(time.getLong(1)));
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment