package org.simpleframework.xml.transform;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import org.simpleframework.xml.transform.Transform;
class DateFormatter implements Transform<Date> {
private AtomicInteger count;
private TaskQueue queue;
private String format;
public DateFormatter(String format) {
this(format, 10);
}
public DateFormatter(String format, int count) {
this.count = new AtomicInteger(count);
this.queue = new TaskQueue(count);
this.format = format;
}
public Date read(String value) throws Exception {
return borrow().read(value);
}
public String write(Date value) throws Exception {
return borrow().write(value);
}
private Task borrow() throws InterruptedException {
int size = count.get();
if(size > 0) {
int next = count.getAndDecrement();
if(next > 0) {
return new Task(format);
}
}
return queue.take();
}
private void release(Task task) {
queue.offer(task);
}
private class Task {
private SimpleDateFormat format;
public Task(String format) {
this.format = new SimpleDateFormat(format);
}
public Date read(String value) throws ParseException {
try {
return format.parse(value);
} finally {
release(this);
}
}
public String write(Date value) {
try {
return format.format(value);
} finally {
release(this);
}
}
}
private class TaskQueue extends LinkedBlockingQueue<Task> {
public TaskQueue(int size) {
super(size);
}
}
}