/*******************************************************************************
* 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.core.rest.resources;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;
import org.eclipse.skalli.model.ExtensionEntityBase;
import org.eclipse.skalli.model.Member;
import org.eclipse.skalli.model.Project;
import org.eclipse.skalli.services.Services;
import org.eclipse.skalli.services.extension.ExtensionService;
import org.eclipse.skalli.services.extension.ExtensionServices;
import org.eclipse.skalli.services.extension.rest.RestConverter;
import org.eclipse.skalli.services.extension.rest.RestException;
import org.eclipse.skalli.services.role.RoleProvider;
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 ProjectConverter extends CommonProjectConverter {
/**
* Create a <code>ProjectConverter</code> for rendering of
* projects without any extensions.
*/
public ProjectConverter() {
super();
}
/**
* Create a <code>ProjectConverter</code> for rendering of
* projects with selected extensions.
*
* @param extensions the extensions to render, or <code>null</code>
* if no extensions should be rendered. If the array contains the
* entry <tt>"*"</tt> or {@link CommonProjectConverter#ALL_EXTENSIONS}
* is passed as argument, all extensions will be rendered.
*/
public ProjectConverter(String[] extensions) {
super(extensions);
}
@SuppressWarnings("nls")
@Override
public void marshal(Project project) throws IOException {
writer.object("project");
namespaces();
commonAttributes(project);
super.marshal(project);
writer.end();
}
@Override
protected Project unmarshal() throws RestException, IOException {
return super.unmarshal();
}
@Deprecated
public ProjectConverter(String host) {
super(host);
}
@Deprecated
public ProjectConverter(String host, String[] extensions) {
super(host, extensions);
}
@Override
@Deprecated
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
marshalNSAttributes(writer);
marshalCommonAttributes(writer, (Project)source);
super.marshal(source, writer, context);
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Project project = iterateProjectNodes(null, reader, context);
return project;
}
private Project iterateProjectNodes(Project project, HierarchicalStreamReader reader,
UnmarshallingContext context) {
if (project == null) {
project = new Project();
}
while (reader.hasMoreChildren()) {
reader.moveDown();
String field = reader.getNodeName();
String value = reader.getValue();
if ("members".equals(field) && reader.hasMoreChildren()) { //$NON-NLS-1$
iterateProjectNodes(project, reader, context);
} else if ("extensions".equals(field) && reader.hasMoreChildren()) { //$NON-NLS-1$
Set<ExtensionEntityBase> extensions = iterateExtensions(reader, context);
for (ExtensionEntityBase extension : extensions) {
project.addExtension(extension);
}
} else if ("id".equals(field)) { //$NON-NLS-1$
project.setProjectId(value);
} else if ("name".equals(field)) { //$NON-NLS-1$
project.setName(value);
} else if ("shortName".equals(field)) { //$NON-NLS-1$
project.setShortName(value);
} else if ("uuid".equals(field)) { //$NON-NLS-1$
project.setUuid(UUID.fromString(value));
} else if ("description".equals(field)) { //$NON-NLS-1$
project.setDescription(value);
} else if ("member".equals(field)) { //$NON-NLS-1$
iterateMemberNodes(project, reader);
}
reader.moveUp();
}
return project;
}
private void iterateMemberNodes(Project project, HierarchicalStreamReader reader) {
Member member = new Member(null);
while (reader.hasMoreChildren()) {
reader.moveDown();
String field = reader.getNodeName();
String value = reader.getValue();
if ("userId".equals(field)) { //$NON-NLS-1$
member.setUserID(value);
} else if ("role".equals(field)) { //$NON-NLS-1$
for (RoleProvider roleProvider : Services.getServices(RoleProvider.class)) {
roleProvider.addMember(project, member, value);
}
}
reader.moveUp();
}
}
private Set<ExtensionEntityBase> iterateExtensions(HierarchicalStreamReader reader,
UnmarshallingContext context) {
HashSet<ExtensionEntityBase> extensions = new HashSet<ExtensionEntityBase>();
while (reader.hasMoreChildren()) {
reader.moveDown();
String field = reader.getNodeName();
for (ExtensionService<?> extensionService: ExtensionServices.getAll()) {
if (extensionService.getExtensionClass().equals(Project.class)) {
continue;
}
if (extensionService.getShortName().equals(field)) {
RestConverter<?> converter = extensionService.getRestConverter(getHost());
ExtensionEntityBase extension = (ExtensionEntityBase) context.convertAnother(null,
extensionService.getExtensionClass(), converter);
extensions.add(extension);
}
}
reader.moveUp();
}
return extensions;
}
}