/*******************************************************************************
* 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.maven.internal.recommendedupdatesites;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.eclipse.skalli.commons.UUIDUtils;
import org.eclipse.skalli.model.ext.maven.recommendedupdatesites.RecommendedUpdateSites;
import org.eclipse.skalli.model.ext.maven.recommendedupdatesites.UpdateSite;
import org.eclipse.skalli.services.extension.rest.RestConverterBase;
import org.eclipse.skalli.services.extension.rest.RestUtils;
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;
public class UpdateSitesConverter extends RestConverterBase<RecommendedUpdateSites> {
public static final String API_VERSION = "1.0"; //$NON-NLS-1$
public static final String NAMESPACE = "http://www.eclipse.org/skalli/2010/API/Extension-Maven"; //$NON-NLS-1$
public UpdateSitesConverter() {
super(RecommendedUpdateSites.class);
}
@SuppressWarnings("nls")
@Override
protected void marshal(RecommendedUpdateSites recommendedUpdateSites) throws IOException {
writer.object("updateSites");
namespaces();
apiVersion();
writer.pair("name", recommendedUpdateSites.getName());
writer.pair("description", recommendedUpdateSites.getDescription());
writer.pair("shortName", recommendedUpdateSites.getShortName());
if (writer.isMediaType(MediaType.APPLICATION_JSON)) {
writer.key("items");
}
writer.array("updateSite");
for (UpdateSite updateSite : recommendedUpdateSites.getUpdateSites()) {
writer.object()
.links()
.link(PROJECT_RELATION, RestUtils.URL_PROJECTS, updateSite.getProjectUUID())
.link(PROJECT_PERMALINK, RestUtils.URL_BROWSE, updateSite.getProjectUUID())
.end()
.pair("projectUUID", updateSite.getProjectUUID())
.pair("groupId", updateSite.getGroupId())
.pair("artifactId", updateSite.getArtifactId())
.pair("name", updateSite.getName())
.pair("description", updateSite.getDescription())
.end();
}
writer.end();
writer.end();
}
public UpdateSitesConverter(String host) {
super(RecommendedUpdateSites.class, "updateSites", host); //$NON-NLS-1$
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
RecommendedUpdateSites recommendedUpdateSites = (RecommendedUpdateSites) source;
marshalNSAttributes(writer);
marshalApiVersion(writer);
writeNode(writer, "name", recommendedUpdateSites.getName());//$NON-NLS-1$
writeNode(writer, "description", recommendedUpdateSites.getDescription());//$NON-NLS-1$
writeNode(writer, "shortName", recommendedUpdateSites.getShortName());//$NON-NLS-1$
List<UpdateSite> updateSites = recommendedUpdateSites.getUpdateSites();
for (UpdateSite updateSite : updateSites) {
writer.startNode("updateSite"); //$NON-NLS-1$
writeNode(writer, "projectUUID", updateSite.getProjectUUID().toString()); //$NON-NLS-1$
writeNode(writer, "groupId", updateSite.getGroupId()); //$NON-NLS-1$
writeNode(writer, "artifactId", updateSite.getArtifactId()); //$NON-NLS-1$
writeNode(writer, "name", updateSite.getName()); //$NON-NLS-1$
writeNode(writer, "description", updateSite.getDescription()); //$NON-NLS-1$
writer.endNode();
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
RecommendedUpdateSites updateSites = iterateNodes(null, reader, context);
return updateSites;
}
private RecommendedUpdateSites iterateNodes(RecommendedUpdateSites updateSites, HierarchicalStreamReader reader,
UnmarshallingContext context) {
if (updateSites == null) {
updateSites = new RecommendedUpdateSites();
}
while (reader.hasMoreChildren()) {
reader.moveDown();
String field = reader.getNodeName();
String value = reader.getValue();
if ("updateSites".equals(field) && reader.hasMoreChildren()) { //$NON-NLS-1$
iterateNodes(updateSites, reader, context);
} else if ("updateSite".equals(field) && reader.hasMoreChildren()) { //$NON-NLS-1$
List<UpdateSite> sites = iterateUpdateSiteNodes(reader, context);
for (UpdateSite site : sites) {
updateSites.addUpdateSite(site);
}
} else if ("name".equals(field)) { //$NON-NLS-1$
updateSites.setName(value);
} else if ("shortName".equals(field)) { //$NON-NLS-1$
updateSites.setShortName(value);
} else if ("description".equals(field)) { //$NON-NLS-1$
updateSites.setDescription(value);
}
reader.moveUp();
}
return updateSites;
}
private List<UpdateSite> iterateUpdateSiteNodes(HierarchicalStreamReader reader, UnmarshallingContext context) {
List<UpdateSite> updateSites = new ArrayList<UpdateSite>();
UpdateSite updateSite = new UpdateSite();
while (reader.hasMoreChildren()) {
reader.moveDown();
String field = reader.getNodeName();
String value = reader.getValue();
if ("projectUUID".equals(field)) { //$NON-NLS-1$
if(UUIDUtils.isUUID(value)){
UUID uuid = UUID.fromString(value);
updateSite.setProjectUUID(uuid);
}
} else if ("name".equals(field)) { //$NON-NLS-1$
updateSite.setName(value);
} else if ("description".equals(field)) { //$NON-NLS-1$
updateSite.setDescription(value);
} else if ("groupId".equals(field)) { //$NON-NLS-1$
updateSite.setGroupId(value);
} else if ("artifactId".equals(field)) { //$NON-NLS-1$
updateSite.setArtifactId(value);
}
reader.moveUp();
}
updateSites.add(updateSite);
return updateSites;
}
@Override
public String getApiVersion() {
return API_VERSION;
}
@Override
public String getNamespace() {
return NAMESPACE;
}
@Override
public String getXsdFileName() {
return "update-sites.xsd"; //$NON-NLS-1$
}
}