/*
* Copyright (c) 2013 Oracle Corporation.
* 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:
* Winston Prakash
*/
package org.eclipse.hudson.security.team;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import java.io.StringWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* A team item that has team based isolation information.
*
* @since 3.2.0
* @author Winston Prakash
*/
public class TeamItem {
private String id;
/**
* When visibility is set, then those teams can use this slave to build
* their jobs
*/
protected Set<String> visibilityToTeams = new HashSet<String>();
private transient boolean moveAllowed = true;
public TeamItem() {
}
public TeamItem(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
void addVisibility(String teamName) {
if (!visibilityToTeams.contains(teamName)) {
visibilityToTeams.add(teamName);
}
}
void removeVisibility(String teamName) {
if (visibilityToTeams.contains(teamName)) {
visibilityToTeams.remove(teamName);
}
}
void removeAllVisibilities() {
visibilityToTeams.clear();
}
Set<String> getVisiblities() {
return visibilityToTeams;
}
public String getVisiblitiesAsString() {
if (!visibilityToTeams.isEmpty()) {
StringWriter strWriter = new StringWriter();
Iterator iterator = visibilityToTeams.iterator();
while (iterator.hasNext()) {
strWriter.append((String) iterator.next());
if (iterator.hasNext()) {
strWriter.append(":");
};
}
return strWriter.toString();
}
return "";
}
public Boolean isVisible(String name) {
return visibilityToTeams.contains(name);
}
public boolean isMoveAllowed() {
return moveAllowed;
}
public void setMoveAllowed(boolean moveAllowed) {
this.moveAllowed = moveAllowed;
}
public static class ConverterImpl implements Converter {
@Override
public boolean canConvert(Class type) {
return type == TeamItem.class;
}
@Override
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
TeamItem teamItem = (TeamItem) source;
writer.startNode("id");
writer.setValue(teamItem.id);
writer.endNode();
StringWriter strWriter = new StringWriter();
if (teamItem.visibilityToTeams.size() > 0) {
for (String teamName : teamItem.visibilityToTeams) {
strWriter.append(teamName);
strWriter.append(",");
}
writer.startNode("visibility");
writer.setValue(strWriter.toString());
writer.endNode();
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext uc) {
TeamItem teamItem = new TeamItem();
while (reader.hasMoreChildren()) {
reader.moveDown();
if ("id".equals(reader.getNodeName())) {
teamItem.id = reader.getValue();
}
if ("visibility".equals(reader.getNodeName())) {
String teamNames = reader.getValue();
teamItem.visibilityToTeams.addAll(Arrays.asList(teamNames.split(",")));
}
reader.moveUp();
}
return teamItem;
}
}
}