org.eclipse.californium.core.Utils Maven / Gradle / Ivy
/*******************************************************************************
* Copyright (c) 2015 Institute for Pervasive Computing, ETH Zurich and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v1.0 which accompany this distribution.
*
* The Eclipse Public License is available at
* http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
* http://www.eclipse.org/org/documents/edl-v10.html.
*
* Contributors:
* Matthias Kovatsch - creator and main architect
* Martin Lanter - architect and re-implementation
* Dominique Im Obersteg - parsers and initial implementation
* Daniel Pauli - parsers and initial implementation
* Kai Hudalla - logging
* Achim Kraus (Bosch Software Innovations GmbH) - add toHexText
* (for message tracing)
******************************************************************************/
package org.eclipse.californium.core;
import java.util.concurrent.ThreadFactory;
import org.eclipse.californium.core.coap.MediaTypeRegistry;
import org.eclipse.californium.core.coap.Request;
import org.eclipse.californium.core.coap.Response;
/**
* The class Utils contains auxiliary methods for Californium.
*
*/
public class Utils {
/*
* Prevent initialization
*/
private Utils() { }
/**
* Converts the specified byte array to a hexadecimal string.
*
* @param bytes the byte array
* @return the hexadecimal code string
*/
public static String toHexString(byte[] bytes) {
if (bytes == null) return "null";
StringBuilder sb = new StringBuilder();
for(byte b:bytes)
sb.append(String.format("%02x", b & 0xFF));
return sb.toString();
}
/**
* Converts the specified byte array up to the specified length into a hexadecimal text.
* Separate bytes by spaces and group them in lines. Append length of array, if specified
* length is smaller then the length of the array.
*
* @param bytes the array of bytes. If null, the text "null" is returned.
* @param length length up to the bytes should be converted into hexadecimal text.
* If larger then the array length, reduce it to the array length.
* @return byte array as hexadecimal text
*/
public static String toHexText(byte[] bytes, int length) {
if (bytes == null) return "null";
if (length > bytes.length) length = bytes.length;
StringBuilder sb = new StringBuilder();
if (16 < length) sb.append('\n');
for(int index = 0; index < length; ++index) {
sb.append(String.format("%02x", bytes[index] & 0xFF));
if (31 == (31 & index)) {
sb.append('\n');
} else {
sb.append(' ');
}
}
if (length < bytes.length) {
sb.append(" .. ").append(bytes.length).append(" bytes");
}
return sb.toString();
}
/**
* Formats a {@link Request} into a readable String representation.
*
* @param r the Request
* @return the pretty print
*/
public static String prettyPrint(Request r) {
StringBuilder sb = new StringBuilder();
sb.append("==[ CoAP Request ]=============================================\n");
sb.append(String.format("MID : %d\n", r.getMID()));
sb.append(String.format("Token : %s\n", r.getTokenString()));
sb.append(String.format("Type : %s\n", r.getType().toString()));
sb.append(String.format("Method : %s\n", r.getCode().toString()));
sb.append(String.format("Options: %s\n", r.getOptions().toString()));
sb.append(String.format("Payload: %d Bytes\n", r.getPayloadSize()));
if (r.getPayloadSize() > 0 && MediaTypeRegistry.isPrintable(r.getOptions().getContentFormat())) {
sb.append("---------------------------------------------------------------");
sb.append(r.getPayloadString());
}
sb.append("===============================================================");
return sb.toString();
}
/**
* Formats a {@link CoapResponse} into a readable String representation.
*
* @param r the CoapResponse
* @return the pretty print
*/
public static String prettyPrint(CoapResponse r) {
return prettyPrint(r.advanced());
}
/**
* Formats a {@link Response} into a readable String representation.
*
* @param r the Response
* @return the pretty print
*/
public static String prettyPrint(Response r) {
StringBuilder sb = new StringBuilder();
sb.append("==[ CoAP Response ]============================================\n");
sb.append(String.format("MID : %d\n", r.getMID()));
sb.append(String.format("Token : %s\n", r.getTokenString()));
sb.append(String.format("Type : %s\n", r.getType().toString()));
sb.append(String.format("Status : %s\n", r.getCode().toString()));
sb.append(String.format("Options: %s\n", r.getOptions().toString()));
sb.append(String.format("Payload: %d Bytes\n", r.getPayloadSize()));
if (r.getPayloadSize() > 0 && MediaTypeRegistry.isPrintable(r.getOptions().getContentFormat())) {
sb.append("---------------------------------------------------------------\n");
sb.append(r.getPayloadString());
sb.append("\n");
}
sb.append("===============================================================");
return sb.toString();
}
/**
* A factory to create executor services with daemon threads.
*/
public static class DaemonThreadFactory implements ThreadFactory {
public Thread newThread(Runnable r) {
Thread thread = new Thread(r);
thread.setDaemon(true);
return thread;
}
}
}