package org.odata4j.format.xml;
import java.io.Writer;
import java.util.List;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.odata4j.core.ODataConstants;
import org.odata4j.core.OEntity;
import org.odata4j.edm.EdmEntitySet;
import org.odata4j.format.FormatWriter;
import org.odata4j.internal.InternalUtil;
import org.odata4j.producer.EntitiesResponse;
import org.odata4j.stax2.QName2;
import org.odata4j.stax2.XMLFactoryProvider2;
import org.odata4j.stax2.XMLWriter2;
public class AtomFeedFormatWriter extends XmlFormatWriter implements FormatWriter<EntitiesResponse> {
@Override
public String getContentType() {
return ODataConstants.APPLICATION_ATOM_XML_CHARSET_UTF8;
}
@Override
public void write(UriInfo uriInfo, Writer w, EntitiesResponse response) {
String baseUri = uriInfo.getBaseUri().toString();
EdmEntitySet ees = response.getEntitySet();
String entitySetName = ees.getName();
DateTime utc = new DateTime().withZone(DateTimeZone.UTC);
String updated = InternalUtil.toString(utc);
XMLWriter2 writer = XMLFactoryProvider2.getInstance().newXMLWriterFactory2().createXMLWriter(w);
writer.startDocument();
writer.startElement(new QName2("feed"), atom);
writer.writeNamespace("m", m);
writer.writeNamespace("d", d);
writer.writeAttribute("xml:base", baseUri);
writeElement(writer, "title", entitySetName, "type", "text");
writeElement(writer, "id", baseUri + uriInfo.getPath());
writeElement(writer, "updated", updated);
writeElement(writer, "link", null, "rel", "self", "title", entitySetName, "href", entitySetName);
Integer inlineCount = response.getInlineCount();
if (inlineCount != null) {
writeElement(writer, "m:count", inlineCount.toString());
}
for (OEntity entity : response.getEntities()) {
writer.startElement("entry");
writeEntry(writer, entity, entity.getProperties(), entity.getLinks(), baseUri, updated, ees, true);
writer.endElement("entry");
}
if (response.getSkipToken() != null) {
//<link rel="next" href="https://odata.sqlazurelabs.com/OData.svc/v0.1/rp1uiewita/StackOverflow/Tags/?$filter=TagName%20gt%20'a'&$skiptoken=52" />
UriBuilder builder = uriInfo.getRequestUriBuilder().replaceQueryParam("$skiptoken", response.getSkipToken());
List<String> topParam = uriInfo.getQueryParameters().get("$top");
if (topParam != null) {
long top = Long.valueOf(topParam.get(0));
top -= response.getEntities().size();
if (top > 0) {
builder.replaceQueryParam("$top", top);
} else {
builder.replaceQueryParam("$top");
}
}
String nextHref = builder.build().toString();
writeElement(writer, "link", null, "rel", "next", "href", nextHref);
}
writer.endDocument();
}
}