package org.koshinuke.jgit.server;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.ext.MessageBodyWriter;
import org.eclipse.jgit.transport.PacketLineOut;
import org.eclipse.jgit.transport.RefAdvertiser;
import org.eclipse.jgit.transport.RefAdvertiser.PacketLineOutRefAdvertiser;
/**
* @author taichi
* @param <T>
*/
public abstract class AbstractPackInfoWriter<T> implements MessageBodyWriter<T> {
final String service;
final Class<?> writable;
@SafeVarargs
public AbstractPackInfoWriter(String service, T... type) {
this.service = service;
this.writable = type.getClass().getComponentType();
}
@Override
public boolean isWriteable(Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return this.writable.isAssignableFrom(type);
}
@Override
public long getSize(T t, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType) {
return -1;
}
@Override
public void writeTo(T t, Class<?> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, Object> httpHeaders,
OutputStream entityStream) throws IOException,
WebApplicationException {
try {
final PacketLineOut out = new PacketLineOut(entityStream);
out.writeString("# service=" + this.service + "\n");
out.end();
RefAdvertiser advertiser = new PacketLineOutRefAdvertiser(out);
this.advertise(t, advertiser);
} finally {
entityStream.flush();
}
}
protected abstract void advertise(T pack, RefAdvertiser advertiser)
throws IOException;
}