/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.tuscany.sca.binding.atom.provider;
import java.util.Date;
import org.apache.abdera.factory.Factory;
import org.apache.abdera.model.Content;
import org.apache.abdera.model.Link;
import org.apache.abdera.model.Content.Type;
import org.apache.tuscany.sca.data.collection.Entry;
import org.apache.tuscany.sca.data.collection.Item;
import org.apache.tuscany.sca.databinding.Mediator;
import org.apache.tuscany.sca.interfacedef.DataType;
/**
* Utility methods used in this package.
*
* @version $Rev$ $Date$
*/
class AtomBindingUtil {
/**
* Create a data item from an Atom entry.
* @param feedEntry
* @param itemClassType
* @param itemXMLType
* @param mediator
* @return
*/
static Entry<Object, Object> entry(org.apache.abdera.model.Entry feedEntry,
DataType<?> itemClassType, DataType<?> itemXMLType, Mediator mediator) {
if (feedEntry != null) {
if (itemClassType.getPhysical() == Item.class || feedEntry.getContentType() == Type.HTML ) {
String key = feedEntry.getId().toString();
Item item = new Item();
item.setTitle(feedEntry.getTitle());
item.setContents(feedEntry.getContent());
for (Link link : feedEntry.getLinks()) {
if (link.getRel() == null || "self".equals(link.getRel())) {
if (item.getLink() == null) {
item.setLink(link.getHref().toString());
}
} else if ("related".equals(link.getRel())) {
item.setRelated(link.getHref().toString());
} else if ("alternate".equals(link.getRel())) {
item.setAlternate(link.getHref().toString());
}
}
item.setDate(feedEntry.getUpdated());
return new Entry<Object, Object>(key, item);
} else {
String key = null;
if ( feedEntry.getId() != null) {
key = feedEntry.getId().toString();
}
// Create the item from XML
if (feedEntry.getContentElement().getElements().size() == 0) {
return null;
}
String value = feedEntry.getContent();
Object data = mediator.mediate(value, itemXMLType, itemClassType, null);
return new Entry<Object, Object>(key, data);
}
} else {
return null;
}
}
/**
* Create an Atom entry for a key and item from a collection.
* @param entry
* @param itemClassType
* @param itemXMLType
* @param mediator
* @param factory
* @return
*/
static org.apache.abdera.model.Entry feedEntry(Entry<Object, Object> entry,
DataType<?> itemClassType, DataType<?> itemXMLType, Mediator mediator,
Factory factory) {
Object key = entry.getKey();
Object data = entry.getData();
if (data instanceof Item) {
Item item = (Item)data;
org.apache.abdera.model.Entry feedEntry = factory.newEntry();
if (key != null) {
feedEntry.setId(key.toString());
}
feedEntry.setTitle(item.getTitle());
feedEntry.setContentAsHtml(item.getContents());
String href = item.getLink();
if (href == null && key != null) {
href = key.toString();
}
if (href != null) {
feedEntry.addLink(href);
}
String related = item.getRelated();
if (related != null) {
feedEntry.addLink(related, "related");
}
String alternate = item.getAlternate();
if (alternate != null) {
feedEntry.addLink(alternate, "alternate");
}
Date date = item.getDate();
if (date != null) {
feedEntry.setUpdated(date);
}
return feedEntry;
} else if (data != null) {
org.apache.abdera.model.Entry feedEntry = factory.newEntry();
feedEntry.setId(key.toString());
feedEntry.setTitle("item");
// Convert the item to XML
String value = mediator.mediate(data, itemClassType, itemXMLType, null).toString();
Content content = factory.newContent();
content.setContentType(Content.Type.XML);
content.setValue(value);
feedEntry.setContentElement(content);
feedEntry.addLink(key.toString());
return feedEntry;
} else {
return null;
}
}
}