package cloudone.internal.provider;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.time.Duration;
import java.time.temporal.ChronoUnit;
/**
* @author Martin Mares (martin.mares at oracle.com)
*/
@Produces("text/plain")
public class DurationMessageBodyWriter implements MessageBodyWriter<Duration> {
@Override
public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return Duration.class.isAssignableFrom(type);
}
@Override
public long getSize(Duration duration, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
return 0;
}
@Override
public void writeTo(Duration duration, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
if (duration == null) {
entityStream.write("00:00:00,000".getBytes());
return;
}
StringBuilder result = new StringBuilder(20);
long dur = duration.toMillis();
//Days
long l = dur / ChronoUnit.DAYS.getDuration().toMillis();
if (l > 0) {
result.append(l).append("D ");
dur -= l * ChronoUnit.DAYS.getDuration().toMillis();
}
//Hours
l = dur / ChronoUnit.HOURS.getDuration().toMillis();
if (l < 10) {
result.append('0');
}
result.append(l).append(':');
dur -= l * ChronoUnit.HOURS.getDuration().toMillis();
//Minutes
l = dur / ChronoUnit.MINUTES.getDuration().toMillis();
if (l < 10) {
result.append('0');
}
result.append(l).append(':');
dur -= l * ChronoUnit.MINUTES.getDuration().toMillis();
//Seconds
l = dur / ChronoUnit.SECONDS.getDuration().toMillis();
if (l < 10) {
result.append('0');
}
result.append(l).append(',');
dur -= l * ChronoUnit.SECONDS.getDuration().toMillis();
//Millis
if (dur < 100) {
result.append('0');
if (dur < 10) {
result.append('0');
}
}
result.append(dur);
//WRITE IT
entityStream.write(result.toString().getBytes());
}
}