/*******************************************************************************
* Copyright (c) 2010-2014 SAP AG and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* SAP AG - initial API and implementation
*******************************************************************************/
package org.eclipse.skalli.model.ext.linkgroups.internal;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.eclipse.skalli.commons.CollectionUtils;
import org.eclipse.skalli.commons.Link;
import org.eclipse.skalli.model.ext.linkgroups.LinkGroup;
import org.eclipse.skalli.model.ext.linkgroups.LinkGroupsProjectExt;
import org.eclipse.skalli.services.extension.rest.RestConverterBase;
import org.eclipse.skalli.services.extension.rest.RestException;
import org.restlet.data.MediaType;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
class LinkGroupsConverter extends RestConverterBase<LinkGroupsProjectExt> {
public static final String API_VERSION = "1.0"; //$NON-NLS-1$
public static final String NAMESPACE = "http://www.eclipse.org/skalli/2010/API/Extension-LinkGroups"; //$NON-NLS-1$
public LinkGroupsConverter() {
super(LinkGroupsProjectExt.class);
}
@SuppressWarnings("nls")
@Override
protected void marshal(LinkGroupsProjectExt extension) throws IOException {
Collection<LinkGroup> linkGroups = extension.getLinkGroups();
if (CollectionUtils.isNotBlank(linkGroups)) {
if (writer.isMediaType(MediaType.APPLICATION_JSON)) {
writer.key("items").array();
} else {
writer.array("linkGroups", "linkGroup");
}
for (LinkGroup linkGroup : linkGroups) {
writer.object();
writer.attribute("caption", linkGroup.getCaption());
if (writer.isMediaType(MediaType.APPLICATION_JSON)) {
writer.key("links");
}
writer.array("link");
for (Link link : linkGroup.getItems()) {
if (link != null) {
writer.object();
writer.attribute("ref", link.getUrl());
writer.value(link.getLabel());
writer.end();
}
}
writer.end();
writer.end();
}
writer.end();
}
}
@Override
protected LinkGroupsProjectExt unmarshal() throws RestException, IOException {
return unmarshal(new LinkGroupsProjectExt());
}
@SuppressWarnings("nls")
private LinkGroupsProjectExt unmarshal(LinkGroupsProjectExt ext) throws RestException, IOException {
while (reader.hasMore()) {
if (reader.isKey("items")) {
ext.setLinkGroups(readLinkGroups(null));
} else if (reader.isKey("linkGroups")) {
ext.setLinkGroups(readLinkGroups("linkGroup"));
} else {
reader.skip();
}
}
return ext;
}
private List<LinkGroup> readLinkGroups(String itemKey) throws RestException, IOException {
List<LinkGroup> linkGroups = new ArrayList<LinkGroup>();
reader.array(itemKey);
while (reader.hasMore()) {
LinkGroup linkGroup = readLinkGroup();
if (StringUtils.isNotBlank(linkGroup.getCaption())) {
linkGroups.add(linkGroup);
}
}
reader.end();
return linkGroups;
}
@SuppressWarnings("nls")
private LinkGroup readLinkGroup() throws RestException, IOException {
LinkGroup linkGroup = new LinkGroup();
reader.object();
while (reader.hasMore()) {
if (reader.isKey("caption")) { //$NON-NLS-1$
linkGroup.setCaption(reader.attributeString());
} else if (reader.isKey("links") || reader.isArray()) {
readLinks(linkGroup);
} else {
reader.skip();
}
}
reader.end();
return linkGroup;
}
@SuppressWarnings("nls")
private void readLinks(LinkGroup linkGroup) throws RestException, IOException {
reader.array("link");
while (reader.hasMore()) {
Link link = readLink();
if (StringUtils.isNotBlank(link.getLabel()) && StringUtils.isNotBlank(link.getUrl())) {
linkGroup.add(link);
}
}
reader.end();
}
@SuppressWarnings("nls")
private Link readLink() throws RestException, IOException {
Link link = new Link();
reader.object();
while (reader.hasMore()) {
if (reader.isKey("ref")) {
link.setUrl(reader.attributeString());
} else if (reader.isValue()) {
link.setLabel(reader.valueString());
} else {
reader.skip();
}
}
reader.end();
return link;
}
@Deprecated
public LinkGroupsConverter(String host) {
super(LinkGroupsProjectExt.class, "linkGroups", host); //$NON-NLS-1$
}
@Deprecated
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
LinkGroupsProjectExt ext = (LinkGroupsProjectExt) source;
Collection<LinkGroup> linkGroups = ext.getLinkGroups();
if (linkGroups != null && !linkGroups.isEmpty()) {
writer.startNode("linkGroups"); //$NON-NLS-1$
for (LinkGroup linkGroup : linkGroups) {
writer.startNode("linkGroup"); //$NON-NLS-1$
writer.addAttribute("caption", linkGroup.getCaption()); //$NON-NLS-1$
for (Link link : linkGroup.getItems()) {
if (link != null) {
writer.startNode("link"); //$NON-NLS-1$
writer.addAttribute("ref", link.getUrl()); //$NON-NLS-1$
writer.setValue(link.getLabel());
writer.endNode();
}
}
writer.endNode();
}
writer.endNode();
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
return iterateNodes(null, reader, context);
}
private LinkGroupsProjectExt iterateNodes(LinkGroupsProjectExt ext, HierarchicalStreamReader reader,
UnmarshallingContext context) {
if (ext == null) {
ext = new LinkGroupsProjectExt();
}
while (reader.hasMoreChildren()) {
reader.moveDown();
String field = reader.getNodeName();
if ("linkGroups".equals(field)) { //$NON-NLS-1$
iterateNodes(ext, reader, context);
} else if ("linkGroup".equals(field)) { //$NON-NLS-1$
String caption = reader.getAttribute("caption"); //$NON-NLS-1$
LinkGroup linkGroup = new LinkGroup();
linkGroup.setCaption(caption);
iterateLinkNodes(linkGroup, reader);
ext.getLinkGroups().add(linkGroup);
}
reader.moveUp();
}
return ext;
}
private void iterateLinkNodes(LinkGroup linkGroup, HierarchicalStreamReader reader) {
while (reader.hasMoreChildren()) {
reader.moveDown();
String field = reader.getNodeName();
String value = reader.getValue();
if ("link".equals(field)) { //$NON-NLS-1$
String ref = reader.getAttribute("ref"); //$NON-NLS-1$
linkGroup.add(new Link(ref, value));
}
reader.moveUp();
}
}
@Override
public String getApiVersion() {
return API_VERSION;
}
@Override
public String getNamespace() {
return NAMESPACE;
}
@Override
public String getXsdFileName() {
return "extension-linkgroups.xsd"; //$NON-NLS-1$
}
}