/* * The MIT License * * Copyright 2011 Sony Ericsson Mobile Communications. All rights reserved. * Copyright 2012 Sony Mobile Communications AB. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.sonyericsson.hudson.plugins.metadata.model.definitions; import com.sonyericsson.hudson.plugins.metadata.Messages; import com.sonyericsson.hudson.plugins.metadata.model.MetadataParent; import com.sonyericsson.hudson.plugins.metadata.model.values.AbstractMetadataValue; import com.sonyericsson.hudson.plugins.metadata.model.values.ParentUtil; import com.sonyericsson.hudson.plugins.metadata.model.values.TreeNodeMetadataValue; import com.sonyericsson.hudson.plugins.metadata.model.values.MetadataValue; import hudson.Extension; import hudson.ExtensionList; import hudson.model.Hudson; import net.sf.json.JSON; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.StaplerRequest; import java.util.Collection; import java.util.LinkedList; import java.util.List; /** * A metadata definition containing other metadata definitions as children. * * @author Tomas Westling <thomas.westling@sonyericsson.com> */ @edu.umd.cs.findbugs.annotations.SuppressWarnings( value = "UG_SYNC_SET_UNSYNC_GET", justification = "It is synchronized") public class TreeNodeMetadataDefinition extends AbstractMetadataDefinition implements MetadataParent<MetadataDefinition> { private List<MetadataDefinition> children; /** * Standard constructor. * @param name the name. * @param description the description. * @param children the children of this node. * @param exposedToEnvironment if all children of the value of this definition should be exposed to the build as an * environment variable. */ @DataBoundConstructor public TreeNodeMetadataDefinition(String name, String description, List<MetadataDefinition> children, boolean exposedToEnvironment) { super(name, description, exposedToEnvironment); setChildren(children); this.children = children; } /** * Standard constructor. * * @param name the name. */ public TreeNodeMetadataDefinition(String name) { super(name); this.children = new LinkedList<MetadataDefinition>(); } /** * Standard Constructor. * * @param name the name * @param description the description. */ public TreeNodeMetadataDefinition(String name, String description) { super(name, description); this.children = new LinkedList<MetadataDefinition>(); } /** * Standard constructor. * * @param name the name. * @param children the children of this node. */ public TreeNodeMetadataDefinition(String name, List<MetadataDefinition> children) { super(name); setChildren(children); } @Override public synchronized MetadataDefinition getChild(String name) { return ParentUtil.getChildValue(children, name); } @Override public synchronized int indexOf(String name) { return ParentUtil.getChildIndex(children, name); } @Override public synchronized MetadataDefinition setChild(int index, MetadataDefinition value) { return children.set(index, value); } /** * Sets {@link #children} and sets their parent to this. * * @param children the children. */ private synchronized void setChildren(List<MetadataDefinition> children) { if (children != null) { this.children = children; for (MetadataDefinition child : this.children) { child.setParent(this); } } else { this.children = new LinkedList<MetadataDefinition>(); } } @Override public synchronized Collection<MetadataDefinition> addChild(MetadataDefinition definition) { return ParentUtil.addChildValue(this, children, definition); } @Override public synchronized Collection<MetadataDefinition> addChildren(Collection<MetadataDefinition> definitions) { return ParentUtil.addChildValues(this, children, definitions); } /** * Getter for the children of this tree node, used by stapler to create the entire tree. * @return the children. */ public synchronized Collection<MetadataDefinition> getChildren() { return children; } @Override public Collection<String> getChildNames() { Collection<MetadataDefinition> childList = getChildren(); List<String> list = new LinkedList<String>(); if (childList != null) { for (MetadataDefinition def : childList) { list.add(def.getName()); } } return list; } @Override public synchronized AbstractMetadataValue createValue(Object o) { TreeNodeMetadataValue val = new TreeNodeMetadataValue(this.getName(), this.getDescription()); if (o instanceof MetadataValue) { val.addChild((MetadataValue)o); } val.setExposeToEnvironment(isExposedToEnvironment()); return val; } @Override public JSON toJson() { throw new UnsupportedOperationException("Not implemented!"); } @Override public boolean requiresReplacement() { return false; } @Override public synchronized Object getDefaultValue() { return children; } /** * The Descriptor. */ @Extension public static class TreeNodeMetaDataDefinitionDescriptor extends AbstractMetadataDefinition.AbstractMetaDataDefinitionDescriptor { @Override public String getDisplayName() { return Messages.TreeNodeMetadataDefinition_DisplayName(); } /** * Returns all the registered meta data definition descriptors. For use in a hetero-list. * * @param request the current request. * @return the descriptors. */ public List<AbstractMetaDataDefinitionDescriptor> getDefinitionDescriptors(StaplerRequest request) { List<AbstractMetaDataDefinitionDescriptor> list = new LinkedList<AbstractMetaDataDefinitionDescriptor>(); ExtensionList<AbstractMetaDataDefinitionDescriptor> extensionList = Hudson.getInstance().getExtensionList(AbstractMetaDataDefinitionDescriptor.class); for (AbstractMetaDataDefinitionDescriptor d : extensionList) { list.add(d); } return list; } } }