/*
 * Copyright to the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.rioproject.deploy;

import org.rioproject.exec.ExecDescriptor;

import java.io.Serializable;
import java.util.*;

/**
 * The {@code SystemComponent} holds details for a required system component.
 *
 * @author Dennis Reedy
 */
public class SystemComponent implements Serializable {
    private static final long serialVersionUID = 2L;
    private final String name;
    private final String className;
    private final Map<String, Object> attributes = new HashMap<String, Object>();
    private StagedSoftware stagedSoftware;
    private ExecDescriptor execDescriptor;
    private boolean exclude = false;

    /**
     * Create a SystemComponent
     *
     * @param name A short name, typically the name of the class sans the
     * package name. Must not be null.
     */
    public SystemComponent(final String name) {
        this(name, null, null);
    }

    /**
     * Create a SystemComponent
     *
     * @param name A short name, typically the name of the class sans the
     * package name, if null, is derived from the className parameter. Must
     * not be null if the classname parameter is null
     * @param className Either the class simple name or the fully qualified classname,
     * must not be null if the name parameter is null
     */
    public SystemComponent(final String name, final String className) {
        if (name == null && className == null)
            throw new IllegalArgumentException("name and className are null");
        this.className = className;
        this.name = name;
    }

    /**
     * Create a SystemComponent
     *
     * @param name A short name, typically the name of the class sans the
     * package name, if null, is derived from the className parameter. Must
     * not be null if the classname parameter is null
     * @param className Either the class simple name or the fully qualified classname,
     * must not be null if the name parameter is null
     * @param attributes Collection of name value pairs to evaluate, optional
     */
    public SystemComponent(final String name,
                           final String className,
                           final Map<String, Object> attributes) {
        this(name, className);
        if (attributes != null)
            this.attributes.putAll(attributes);
    }

    /**
     * Get the className property
     *
     * @return the classname
     */
    public String getClassName() {
        return (className);
    }

    /**
     * Get the name property
     *
     * @return The name
     */
    public String getName() {
        return (name);
    }

    /**
     * Get the attribute Map. If there are no attributes an empty Map will
     * be returned
     *
     * @return The attribute Map
     */
    public Map<String, Object> getAttributes() {
        return (attributes);
    }

    /**
     * Associates the specified value with the specified key as a required attribute.
     *
     * @param key key with which the specified value is to be associated, ignored if {@code null}
     * @param value value to be associated with the specified key, ignored if {@code null}
     */
    public void put(final String key, final Object value) {
        if(key!=null && value!=null) {
            attributes.put(key, value);
        }
    }

    /**
     * Copies all of the mappings from the specified map
     *
     * @param attributes map to be stored.
     */
    public void putAll(final Map<String, Object> attributes) {
        if(attributes!=null) {
            this.attributes.putAll(attributes);
        }
    }

    public boolean exclude() {
        return exclude;
    }

    public void setExclude(boolean exclude) {
        this.exclude = exclude;
    }

    /**
     * Set the StagedSoftware for this system component
     *
     * @param staged Associated StagedSoftware
     */
    public void setStagedSoftware(final StagedSoftware staged) {
        stagedSoftware = staged;
    }

    /**
     * Get the StagedSoftware for this system component
     *
     * @return The associated StagedSoftware. If there is no
     * StagedSoftware, return null
     */
    public StagedSoftware getStagedSoftware() {
        return stagedSoftware;
    }

    /**
     * Get the ExecDescriptor
     *
     * @return The ExecDescriptor
     */
    public ExecDescriptor getExecDescriptor() {
        return execDescriptor;
    }

    /**
     * Set the ExecDescriptor
     *
     * @param execDescriptor The ExecDescriptor
     */
    public void setExecDescriptor(final ExecDescriptor execDescriptor) {
        this.execDescriptor = execDescriptor;
    }

    /**
     * Provide a String representation
     */
    public String toString() {
        StringBuilder buff = new StringBuilder();
        buff.append("Name=").append(name == null ? "<null>" : name).append(", ");
        buff.append("ClassName=").append(className == null ? "<null>" : className).append(", ");
        buff.append("Attributes=").append(attributes.toString());
        return (buff.toString());
    }
}

@@ -5343,24 +5343,51 @@
 gBuilder();%0A
+        if(name!=null)%0A    
         buff
@@ -5395,25 +5395,26 @@
 append(%22Name
-=
+: 
 %22).append(na
@@ -5419,50 +5419,56 @@
 name
- == null ? %22%3Cnull%3E%22 : name).append(%22, %22);%0A
+).append(%22, %22);%0A        if(className!=null)%0A    
     
@@ -5493,17 +5493,18 @@
 lassName
-=
+: 
 %22).appen
@@ -5518,118 +5518,128 @@
 Name
- == null ? %22%3Cnull%3E%22 : className).append(%22, %22);%0A        buff.append(%22Attributes=%22).append(attributes.toString()
+).append(%22, %22);%0A        buff.append(attributes.toString()).append(%22, %22);%0A        buff.append(%22Exclude: %22).append(exclude
 );%0A 

Improve SystemComponent.toString()