Initial commit
This commit is contained in:
78
src/main/java/ch/hevs/isi/MinecraftController.java
Normal file
78
src/main/java/ch/hevs/isi/MinecraftController.java
Normal file
@ -0,0 +1,78 @@
|
||||
package ch.hevs.isi;
|
||||
|
||||
import ch.hevs.isi.utils.Utility;
|
||||
|
||||
public class MinecraftController {
|
||||
|
||||
public static boolean ERASE_PREVIOUS_DATA_INB_DB = false;
|
||||
|
||||
public static void usage() {
|
||||
System.out.println();
|
||||
System.out.println("You're reading this message because no parameter (or not the needed ones) has been passed to the application.");
|
||||
System.out.println();
|
||||
System.out.println("In development mode, just add to your running configuration the needed parameters (see usage below).");
|
||||
System.out.println("In running mode, the application's usage is the following:");
|
||||
System.out.println("java MinecraftController <InfluxDB Server> <DB Name> <DB Measurement> <DB Username> <ModbusTCP Server> <ModbusTCP port> [-modbus4j] [-keepAlive]");
|
||||
System.out.println("where:");
|
||||
System.out.println("- <InfluxDB Server>: The complete URL of the InfluxDB server, including the protocol (http or https)...");
|
||||
System.out.println(" Example: https://influx.sdi.hevs.ch");
|
||||
System.out.println("- <DB Name>: The name of the Influx DB to use. For this project, this name is the name of the group you've been affected to. (SInXX)");
|
||||
System.out.println("- <DB Username: The user's name to use to access the DB. It's also your group's name. (SInXX)");
|
||||
System.out.println("- <ModbusTCP Server>: The IP address of the Minecraft ModbusTCP server (default value: localhost)");
|
||||
System.out.println("- <ModbusTCP port>: The port number of the Minecraft ModbusTCP server (default value: 1502)");
|
||||
System.out.println("- [-eraseDB]: Optional parameter! If set, the application will erase the previous data in InfluxDB...");
|
||||
System.out.println();
|
||||
System.exit(1);
|
||||
}
|
||||
|
||||
@SuppressWarnings("all")
|
||||
public static void main(String[] args) {
|
||||
|
||||
// ------------------------------------- DO NOT CHANGE THE FOLLOWING LINES -------------------------------------
|
||||
String dbProtocol = "http";
|
||||
String dbHostName = "localhost";
|
||||
String dbName = "labo";
|
||||
String dbUserName = "root";
|
||||
String dbPassword = "root";
|
||||
|
||||
String modbusTcpHost = "localhost";
|
||||
int modbusTcpPort = 1502;
|
||||
|
||||
// Check the number of arguments and show usage message if the number does not match.
|
||||
String[] parameters = null;
|
||||
|
||||
// If there is only one number given as parameter, construct the parameters according the group number.
|
||||
if (args.length >= 5) {
|
||||
parameters = args;
|
||||
|
||||
// Decode parameters for influxDB
|
||||
String[] dbParams = parameters[0].split("://");
|
||||
if (dbParams.length != 2) {
|
||||
usage();
|
||||
}
|
||||
|
||||
dbProtocol = dbParams[0];
|
||||
dbHostName = dbParams[1];
|
||||
dbName = parameters[1];
|
||||
dbUserName = parameters[2];
|
||||
dbPassword = Utility.md5sum(dbUserName);
|
||||
|
||||
// Decode parameters for Modbus TCP
|
||||
modbusTcpHost = parameters[3];
|
||||
modbusTcpPort = Integer.parseInt(parameters[4]);
|
||||
|
||||
for (int i = 5; i < args.length; i++) {
|
||||
if (parameters[i].compareToIgnoreCase("-erasedb") == 0) {
|
||||
ERASE_PREVIOUS_DATA_INB_DB = true;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
usage();
|
||||
}
|
||||
|
||||
// ------------------------------------ /DO NOT CHANGE THE FOLLOWING LINES -------------------------------------
|
||||
|
||||
// Start coding here ...
|
||||
|
||||
}
|
||||
}
|
1
src/main/java/ch/hevs/isi/core/package-info.java
Normal file
1
src/main/java/ch/hevs/isi/core/package-info.java
Normal file
@ -0,0 +1 @@
|
||||
package ch.hevs.isi.core;
|
113
src/main/java/ch/hevs/isi/db/TimeManager.java
Normal file
113
src/main/java/ch/hevs/isi/db/TimeManager.java
Normal file
@ -0,0 +1,113 @@
|
||||
package ch.hevs.isi.db;
|
||||
|
||||
import java.time.*;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
|
||||
/**
|
||||
* TimeManager Class
|
||||
*
|
||||
* This class allows to calculate a timestamp taking into account the time index of Minecraft Electrical Age and its
|
||||
* time acceleration. (1 day = 10 minutes)
|
||||
* You also have to indicate a number of days to subtract from the current time which will determine the time t0 which
|
||||
* defines the starting time of the simulation.
|
||||
*/
|
||||
public class TimeManager {
|
||||
|
||||
// Start time
|
||||
private final LocalDateTime t0;
|
||||
|
||||
// days since beginning of game
|
||||
private long days;
|
||||
|
||||
// previous value of "CLOCK_FLOAT" coming from Minecraft EA
|
||||
private float lastEaClock;
|
||||
|
||||
// timestamp for InfluxDB
|
||||
private long nanosForDB;
|
||||
|
||||
|
||||
/* ************************************************************************************************************ */
|
||||
/* Constructors */
|
||||
/* ************************************************************************************************************ */
|
||||
/**
|
||||
* Constructor of TimeManager class, where the start time of the game is calculated from today at midnight minus
|
||||
* the given number of days. Today at midnight, from local time.
|
||||
*
|
||||
* @param minusDays The number of days to subtract to the current day.
|
||||
*/
|
||||
public TimeManager(int minusDays) {
|
||||
t0 = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT).minusDays(minusDays);
|
||||
days = 0;
|
||||
lastEaClock = 0f;
|
||||
nanosForDB = 0;
|
||||
}
|
||||
|
||||
|
||||
/* ************************************************************************************************************ */
|
||||
/* Public methods */
|
||||
/* ************************************************************************************************************ */
|
||||
/**
|
||||
* This method takes the index of the Electrical-Age clock and generates the corresponding timestamp.
|
||||
*
|
||||
* @param strEaClock The EA clock given as a {@code String}
|
||||
*/
|
||||
public void setTimestamp(String strEaClock) {
|
||||
setTimestamp(Float.parseFloat(strEaClock));
|
||||
}
|
||||
|
||||
/**
|
||||
* This method takes the index of the Electrical-Age clock and generates the corresponding timestamp.
|
||||
*
|
||||
* @param eaClock The EA clock given as a {@code float}
|
||||
*/
|
||||
public void setTimestamp(float eaClock) {
|
||||
// eaClock: value read in data point with label "CLOCK_FLOAT", if it's less then the previous one, it means
|
||||
// that a day has passed !
|
||||
if (eaClock < lastEaClock)
|
||||
days++;
|
||||
|
||||
// Storing the EA Clock and computing the corresponding nanoseconds...
|
||||
lastEaClock = eaClock;
|
||||
long nanoOfDay = Math.round(eaClock * (24 * 3600E9));
|
||||
|
||||
// Creates a timestamp from t0 and adding to it the passed days and the nanoseconds of the current days
|
||||
LocalDateTime tInsert = t0.plusDays(days);
|
||||
tInsert = tInsert.plus(Duration.ofNanos(nanoOfDay));
|
||||
System.out.println("tInsert in method: " + tInsert.format(DateTimeFormatter.ISO_DATE_TIME));
|
||||
|
||||
// Getting the related timestamp in nanoseconds according to the local time zone
|
||||
ZoneId zoneId = ZoneId.systemDefault();
|
||||
nanosForDB = tInsert.atZone(zoneId).toEpochSecond() * 1000000000;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gives the actual timestamp according to the EA clock.
|
||||
*
|
||||
* @return The timestamp in nanoseconds
|
||||
*/
|
||||
public long getNanosForDB() {
|
||||
return nanosForDB; // nanos for writing in DB
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns {@code true}
|
||||
* @return
|
||||
*/
|
||||
public boolean isLastDay() {
|
||||
return (days % 3) == 2;
|
||||
}
|
||||
|
||||
/* ************************************************************************************************************ */
|
||||
/* */
|
||||
/* Public Main */
|
||||
/* */
|
||||
/* ************************************************************************************************************ */
|
||||
public static void main(String[] args) {
|
||||
TimeManager tm = new TimeManager(3);
|
||||
System.out.println("t0: " + tm.t0.toString());
|
||||
tm.setTimestamp(0.5f);
|
||||
System.out.println("nanosForDBs: " + tm.getNanosForDB());
|
||||
tm.setTimestamp("0.1");
|
||||
System.out.println("nanosForDBs: " + tm.getNanosForDB());
|
||||
}
|
||||
}
|
1
src/main/java/ch/hevs/isi/db/package-info.java
Normal file
1
src/main/java/ch/hevs/isi/db/package-info.java
Normal file
@ -0,0 +1 @@
|
||||
package ch.hevs.isi.db;
|
1
src/main/java/ch/hevs/isi/field/package-info.java
Normal file
1
src/main/java/ch/hevs/isi/field/package-info.java
Normal file
@ -0,0 +1 @@
|
||||
package ch.hevs.isi.field;
|
422
src/main/java/ch/hevs/isi/utils/Utility.java
Normal file
422
src/main/java/ch/hevs/isi/utils/Utility.java
Normal file
@ -0,0 +1,422 @@
|
||||
package ch.hevs.isi.utils;
|
||||
|
||||
|
||||
import java.io.*;
|
||||
import java.math.BigInteger;
|
||||
import java.nio.ByteBuffer;
|
||||
import java.nio.ByteOrder;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
|
||||
/**
|
||||
* This class contains some useful Java methods to manipulate Modbus data.
|
||||
*
|
||||
* @author Michael Clausen
|
||||
* @author Cedric Crettaz
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public class Utility {
|
||||
/** Default size for the TCP input stream */
|
||||
public static final int TCP_BUFFER_SIZE = 4096;
|
||||
|
||||
/** Object to get some random values... */
|
||||
public static Random rnd = new Random(1);
|
||||
|
||||
/**
|
||||
* Calculates and returns the CRC using the data passed in parameters.
|
||||
*
|
||||
* @param data a byte array containing the data to send
|
||||
* @param offset the offset
|
||||
* @param len the data length
|
||||
* @return byte[] the CRC
|
||||
*/
|
||||
public static byte[] calculateCRC(byte[] data , int offset , int len)
|
||||
{
|
||||
int crc = 0x0000FFFF;
|
||||
for (int i = 0 ; i < len ; i++)
|
||||
{
|
||||
crc = crc ^ Utility.unsignedByteToSignedInt(data[i + offset]);
|
||||
for (int j = 0 ; j < 8 ; j++)
|
||||
{
|
||||
int tmp = crc;
|
||||
int carryFlag = tmp & 0x0001;
|
||||
crc = crc >> 1;
|
||||
if (carryFlag == 1)
|
||||
{
|
||||
crc = crc ^ 0xA001;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
byte[] result = new byte[2];
|
||||
result[0] = (byte)(crc & 0xFF);
|
||||
result[1] = (byte)((crc & 0xFF00) >> 8);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks the CRC and returns true if it is correct, otherwise false.
|
||||
*
|
||||
* @param data a byte array containing the data to send
|
||||
* @param offset the offset
|
||||
* @param len the data length
|
||||
* @param crc a byte array containing the CRC to check
|
||||
* @return boolean true if the CRC is correct, otherwise false
|
||||
*/
|
||||
public static boolean checkCRC(byte[] data , int offset , int len , byte[] crc)
|
||||
{
|
||||
byte[] calcCrc = Utility.calculateCRC(data , offset , len);
|
||||
return (calcCrc[0] == crc[0] && calcCrc[1] == crc[1]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns a <code>float</code> value from array of bytes. This byte's array can only be 2 or 4 bytes long.
|
||||
* @param bytes The array of bytes to convert.
|
||||
* @param offset The position where the method has to start to get the bytes from.
|
||||
* @param size The amount of bytes to convert.
|
||||
* @return A <code>Float</code> value or <code>null</code> if the process failed.
|
||||
*/
|
||||
public static Float bytesToFloat(byte[] bytes, int offset, int size) {
|
||||
|
||||
if (size == 2 || size == 4) {
|
||||
byte[] tmp = new byte[4];
|
||||
System.arraycopy(bytes, offset, tmp, 0, size);
|
||||
try {
|
||||
return ByteBuffer.wrap(tmp).order(ByteOrder.BIG_ENDIAN).getFloat();
|
||||
} catch (Exception e) {
|
||||
DEBUG("utils", "Utility", "bytesToFloat()", "ByteBufferException : " + e.getMessage());
|
||||
}
|
||||
} else {
|
||||
DEBUG("utils", "Utility", "bytesToFloat()", "ERROR: size MUST be 2 or 4 !!!");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an unsigned byte to a signed integer.
|
||||
*
|
||||
* @param from an unsigned byte to convert to a signed integer
|
||||
* @return int a signed integer
|
||||
*/
|
||||
public static int unsignedByteToSignedInt(byte from)
|
||||
{
|
||||
return 0x000000FF & (int)from;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to convert a byte array in a string made up of hex (0,.. 9, a,..f)
|
||||
* @param b The array of bytes to be convert in HEX characters.
|
||||
* @return A string representing the given array of byte in HEX values.
|
||||
*/
|
||||
public static String getHexString(byte[] b) {
|
||||
return getHexString(b, 0, b.length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to convert a byte array in a string made up of hex (0,.. 9, a,..f)
|
||||
* @param b The byte array to convert in HEX string
|
||||
* @param offset The index where we start to convert from.
|
||||
* @param length The amount of bytes to convert in HEX string
|
||||
* @return A String representing the HEX values of the selected bytes of the array.
|
||||
*/
|
||||
public static String getHexString(byte[] b, int offset, int length) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
for (int i = offset; i < offset+length; i++) {
|
||||
result.append(Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1));
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility method to convert a byte array in a string made up of hex (0,.. 9, a,..f) and
|
||||
* format the string with `0xCC` where CC is the string in HEX
|
||||
* @param b The byte array to convert in HEX string
|
||||
* @param offset The index where we start to convert from.
|
||||
* @param length The amount of bytes to convert in HEX string
|
||||
* @return A String representing the HEX values of the selected bytes of the array.
|
||||
*/
|
||||
public static String getHexStringForDebug(byte[] b, int offset, int length) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
for (int i = offset; i < offset+length; i++) {
|
||||
result.append("0x");
|
||||
result.append(Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1));
|
||||
result.append(" ");
|
||||
}
|
||||
return result.toString().trim();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* To be used to make a thread waiting for a certain amount of time
|
||||
* @param thread The thread to be stopped
|
||||
* @param millis The amount of time in [ms] to stop the thread.
|
||||
*/
|
||||
public static void threadWait(Thread thread, long millis) {
|
||||
try {
|
||||
thread.wait(millis);
|
||||
} catch(InterruptedException ie) {
|
||||
DEBUG("utils", "Utility", "threadWait()", "InterruptedException : " + ie.getMessage());
|
||||
} catch (NullPointerException npe) {
|
||||
DEBUG("utils", "Utility", "threadWait()", "The given Thread is NULL !");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* To wait some times ...
|
||||
*/
|
||||
public static void waitSomeTime(int ms) {
|
||||
try {
|
||||
Thread.sleep(ms);
|
||||
} catch (InterruptedException e) {
|
||||
DEBUG("utils", "Utility", "waitSomeTime()", "InterruptedException : " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the md5 of any input...
|
||||
* @param msg The input string to process
|
||||
* @return The md5 of the input string.
|
||||
*/
|
||||
public static String md5sum(String msg)
|
||||
{
|
||||
try {
|
||||
MessageDigest md = MessageDigest.getInstance("md5");
|
||||
return String.format("%032x", new BigInteger(1, md.digest(msg.getBytes(StandardCharsets.UTF_8))));
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
DEBUG("utils", "Utility", "md5sum()", "NoSuchAlgorithmException : " + e.getMessage());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieves a random value rounded to 2 decimal...
|
||||
*
|
||||
* @param factor A coefficient which the random value is multiplied with.
|
||||
* @return A random value rounded to 2 decimal converted to a String.
|
||||
*/
|
||||
public static String getStringRndVal(int factor) {
|
||||
float val = (float) rnd.nextDouble()*factor*10;
|
||||
return String.format("%.2f", val).replace(",", ".");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads the incoming data from an input stream as long as there is
|
||||
* something to read and saved the data in an array of bytes.
|
||||
*
|
||||
* The method is blocking !
|
||||
* This method blocks until input data is available, end of file is detected,
|
||||
* or an exception is thrown.
|
||||
*
|
||||
* If the length of of read data is zero, then no bytes are read and an empty
|
||||
* array of bytes is returned; otherwise, there is an attempt to read at least
|
||||
* one byte. If no byte is available because the stream is at the end of the
|
||||
* file, the value -1 is returned; otherwise, at least one byte is read and
|
||||
* returned as an array of bytes.
|
||||
*
|
||||
* @param in The input Stream where to read the data coming from.
|
||||
* @return The read data as an <code>array of bytes</code>. Or null if the
|
||||
* has been closed by the peer while waiting for incoming data.
|
||||
* @throws IOException If the first byte cannot be read for any reason other
|
||||
* than the end of the file, if the input stream has been
|
||||
* closed, or if some other I/O error occurs.
|
||||
*/
|
||||
public static byte[] readBytes(InputStream in) throws IOException
|
||||
{
|
||||
byte[] buffer = new byte[TCP_BUFFER_SIZE];
|
||||
|
||||
// Read the incoming data
|
||||
int b = in.read(buffer);
|
||||
|
||||
// Creates an array of bytes with the right size
|
||||
if (b == -1) return null; // the connection has been canceled by the peer
|
||||
else if (b == 0) return new byte[0]; // empty data
|
||||
else { // The received data
|
||||
byte[] rBytes = new byte[b];
|
||||
System.arraycopy(buffer, 0, rBytes, 0, b);
|
||||
return rBytes;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads from the given input stream an amount of bytes and retrieves these data as
|
||||
* an array of bytes. This method is
|
||||
*
|
||||
* The method is blocking !
|
||||
*
|
||||
* @param in The input Stream where to read the data coming from.
|
||||
* @param len The number of bytes to be read from the input stream.
|
||||
*
|
||||
* @return The read data as an <code>array of bytes</code>.
|
||||
*
|
||||
* @throws IOException If the first byte cannot be read for any reason other
|
||||
* than the end of the file, if the input stream has been
|
||||
* closed, or if some other I/O error occurs.
|
||||
*/
|
||||
public static byte[] readNBytes(InputStream in, int len) throws IOException
|
||||
{
|
||||
byte[] buffer = new byte[len];
|
||||
|
||||
// Checks that there is enough available data to read from the input stream
|
||||
int counter = 0;
|
||||
while (in.available() < len) {
|
||||
Utility.waitSomeTime(2);
|
||||
if (++counter > 10)
|
||||
return null;
|
||||
}
|
||||
|
||||
// Read the incoming data
|
||||
int b = in.read(buffer, 0, len);
|
||||
|
||||
// Creates an array of bytes with the right size
|
||||
if (b == -1) return null; // the connection has been canceled by the peer
|
||||
else if (b == 0) return new byte[0]; // empty data
|
||||
else return buffer; // The received data
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads lines of text from the given input stream. A line is considered to be terminated by any one of a
|
||||
* line feed ('\n'), a carriage return ('\r'), or a carriage return followed immediately by a line feed.
|
||||
*
|
||||
* @param in The Input Stream to read from.
|
||||
* @return A list of String, without any line-termination characters, corresponding to each line read from the
|
||||
* input stream, or an empty list if the end of the stream has been reached.
|
||||
* @throws IOException If an I/O error occurs
|
||||
*/
|
||||
public static List<String> readLine(InputStream in) throws IOException {
|
||||
List<String> result = new LinkedList<>();
|
||||
|
||||
while (in.available() == 0) {
|
||||
Utility.waitSomeTime(10);
|
||||
}
|
||||
|
||||
while (in.available() != 0)
|
||||
{
|
||||
byte[] b = readBytes(in);
|
||||
|
||||
if (b != null && b.length > 0) {
|
||||
String res = new String(b);
|
||||
String[] l = null;
|
||||
if (res.indexOf('\r') != -1) {
|
||||
res = res.replace("\n", "");
|
||||
l = res.split("\r");
|
||||
} else if (res.indexOf('\n') != -1) {
|
||||
res = res.replace("\r", "");
|
||||
l = res.split("\n");
|
||||
}
|
||||
|
||||
if (l != null) {
|
||||
result.addAll(Arrays.asList(l));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send the data contained in the given array of bytes through the output
|
||||
* stream. It raises an IOException if something goes wrong.
|
||||
* The method returns the amount of bytes sent.
|
||||
*
|
||||
* @param out The Output Stream to send the data to.
|
||||
* @param toSend The data to send
|
||||
* @throws IOException If an I/O error occurs
|
||||
*/
|
||||
public static void writeLine(OutputStream out, byte[] toSend) throws IOException {
|
||||
|
||||
if (toSend[toSend.length - 1] == '\n' || toSend[toSend.length - 1] == '\r')
|
||||
out.write(toSend);
|
||||
else {
|
||||
byte[] temp = new byte[toSend.length + 2];
|
||||
System.arraycopy(toSend, 0, temp, 0, toSend.length);
|
||||
temp[temp.length - 2] = (byte) '\r';
|
||||
temp[temp.length - 1] = (byte) '\n';
|
||||
out.write(temp);
|
||||
}
|
||||
|
||||
out.flush();
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to use to access a file in your resources folder...
|
||||
* @param pathName folder's name (if exists) from `resources`
|
||||
* @param fileName Name of the file to access
|
||||
*
|
||||
* @return A BufferedReader related to the file you want to work with, or null if the file could not be reached.
|
||||
*/
|
||||
public static BufferedReader fileParser(String pathName, String fileName) {
|
||||
// set relative path
|
||||
InputStream is;
|
||||
if (pathName == null) {
|
||||
is = ClassLoader.getSystemClassLoader().getResourceAsStream(fileName);
|
||||
} else {
|
||||
is = ClassLoader.getSystemClassLoader().getResourceAsStream(pathName + "/" + fileName);
|
||||
}
|
||||
|
||||
if (is != null) {
|
||||
return new BufferedReader(new InputStreamReader(is));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
// DEBUG System.out
|
||||
public static void DEBUG(String className, String method, String msg) {
|
||||
DEBUG(null, className, method, msg);
|
||||
}
|
||||
|
||||
public static void DEBUG(Object object, String method, String msg) {
|
||||
String className = object.getClass().getSimpleName();
|
||||
String[] packages = object.getClass().getPackage().getName().split("\\.");
|
||||
if (packages.length > 1)
|
||||
DEBUG(packages[packages.length-1], className, method, msg);
|
||||
else if (packages.length == 1)
|
||||
DEBUG(packages[0], className, method, msg);
|
||||
else
|
||||
DEBUG(null, className, method, msg);
|
||||
}
|
||||
|
||||
public static void DEBUG(String packageName, String className, String method, String msg) {
|
||||
final int nameLength = 25;
|
||||
int millis = Calendar.getInstance().get(Calendar.MILLISECOND);
|
||||
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
|
||||
|
||||
className = className.trim().replace("[", "").replace("]", "");
|
||||
if (packageName != null)
|
||||
className = packageName + ":" + className;
|
||||
|
||||
String cn = " [" + className + "] ";
|
||||
StringBuilder logMsg = new StringBuilder();
|
||||
|
||||
// set the time
|
||||
logMsg.append(sdf.format(Calendar.getInstance().getTime())).append(".").append(String.format("%3d", millis));
|
||||
|
||||
// Append Packages and ClassName
|
||||
logMsg.append(cn);
|
||||
|
||||
// Append Method
|
||||
StringBuilder met = new StringBuilder(method.trim().replace("(", "").replace(")", ""));
|
||||
met.append("() > ");
|
||||
while (met.length() < nameLength) {
|
||||
met.append(" ");
|
||||
}
|
||||
logMsg.append(met);
|
||||
|
||||
// Append message if exists
|
||||
if (msg != null) {
|
||||
logMsg.append(msg);
|
||||
}
|
||||
|
||||
if (logMsg.toString().endsWith("\n")) {
|
||||
System.out.print(logMsg);
|
||||
} else {
|
||||
System.out.println(logMsg);
|
||||
}
|
||||
}
|
||||
}
|
1
src/main/java/ch/hevs/isi/web/package-info.java
Normal file
1
src/main/java/ch/hevs/isi/web/package-info.java
Normal file
@ -0,0 +1 @@
|
||||
package ch.hevs.isi.web;
|
Reference in New Issue
Block a user