package com.temenos.useragent.generic.mediatype;
/*
* #%L
* useragent-generic-java
* %%
* Copyright (C) 2012 - 2016 Temenos Holdings N.V.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.abdera.Abdera;
import org.apache.abdera.model.Document;
import org.apache.abdera.model.Element;
import org.apache.abdera.model.Entry;
import org.apache.abdera.model.Feed;
import org.apache.commons.io.IOUtils;
import com.temenos.useragent.generic.Link;
import com.temenos.useragent.generic.PayloadHandler;
import com.temenos.useragent.generic.internal.DefaultEntityWrapper;
import com.temenos.useragent.generic.internal.EntityWrapper;
import com.temenos.useragent.generic.internal.LinkImpl;
import com.temenos.useragent.generic.internal.NullEntityWrapper;
/**
* A payload handler for <i>application/atom+xml</i> media type.
*
* @author ssethupathi
*
*/
public class AtomPayloadHandler implements PayloadHandler {
private AtomEntryHandler entityTransformer = new AtomEntryHandler();
private boolean isCollection;
private Feed feed;
private String parameter; // not used yet
public AtomPayloadHandler() {
feed = new Abdera().newFeed();
}
@Override
public boolean isCollection() {
return isCollection;
}
public List<Link> links() {
if (isCollection()) {
return buildLinks(feed.getLinks());
} else {
return entityTransformer.getLinks();
}
}
@Override
public List<EntityWrapper> entities() {
List<EntityWrapper> entityWrappers = new ArrayList<EntityWrapper>();
for (Entry entry : feed.getEntries()) {
EntityWrapper entityWrapper = new DefaultEntityWrapper();
AtomEntryHandler entryHandler = new AtomEntryHandler();
entryHandler.setEntry(entry);
entityWrapper.setHandler(entryHandler);
entityWrappers.add(entityWrapper);
}
return entityWrappers;
}
@Override
public void setPayload(String payload) {
if (payload == null) {
throw new IllegalArgumentException("Payload is null");
}
Document<Element> payloadDoc = null;
try {
payloadDoc = new Abdera().getParser().parse(
IOUtils.toInputStream(payload));
} catch (Exception e) {
throw new IllegalArgumentException(
"Unexpected payload for media type '" + AtomUtil.MEDIA_TYPE
+ "'.", e);
}
QName rootElementQName = payloadDoc.getRoot().getQName();
if (new QName(AtomUtil.NS_ATOM, "feed").equals(rootElementQName)) {
feed = (Feed) payloadDoc.getRoot();
isCollection = true;
} else if (new QName(AtomUtil.NS_ATOM, "entry")
.equals(rootElementQName)) {
entityTransformer.setEntry((Entry) payloadDoc.getRoot());
isCollection = false;
} else {
throw new IllegalArgumentException(
"Unexpected payload for media type '" + AtomUtil.MEDIA_TYPE
+ "'. Payload [" + payloadDoc.getRoot().toString()
+ "]");
}
}
@Override
public EntityWrapper entity() {
if (!isCollection) {
EntityWrapper wrapper = new DefaultEntityWrapper();
wrapper.setHandler(entityTransformer);
return wrapper;
}
return new NullEntityWrapper();
}
@Override
public void setParameter(String parameter) {
this.parameter = parameter;
}
private List<Link> buildLinks(List<org.apache.abdera.model.Link> abderaLinks) {
List<Link> links = new ArrayList<Link>();
for (org.apache.abdera.model.Link abderaLink : abderaLinks) {
links.add(new LinkImpl.Builder(abderaLink.getAttributeValue("href"))
.baseUrl(AtomUtil.getBaseUrl(feed))
.rel(AtomUtil.extractRel(abderaLink
.getAttributeValue("rel")))
.title(abderaLink.getAttributeValue("title"))
.description(
AtomUtil.extractDescription(abderaLink
.getAttributeValue("rel"))).build());
}
return links;
}
}