import javax.management.openmbean.CompositeData;
import javax.management.openmbean.CompositeDataSupport;
import javax.management.openmbean.CompositeType;
import javax.management.openmbean.OpenDataException;

import sun.management.LazyCompositeData;
import sun.management.MappedMXBeanType;

public class NameCompositeData extends LazyCompositeData {
    private final Name name;

    public NameCompositeData(Name name) {
        this.name = name;
    }

    public Name getName() {
        return name;
    }
    
    public static CompositeData toCompositeData(Name name) {
        NameCompositeData namecd = new NameCompositeData(name);
        return namecd.getCompositeData();
    }

    protected CompositeData getCompositeData() {
        final Object[] nameItemValues = {
            new String(name.getFirstName()),
            new String(name.getLastName())
        };

        try {
            return new CompositeDataSupport(nameCompositeType,
                                            nameItemNames,
                                            nameItemValues);
        } catch (OpenDataException ex) {
            InternalError e1 = new InternalError(ex.getMessage());
            e1.initCause(ex);
            throw e1;
        }
    }
    
    private static final CompositeType nameCompositeType;
    static {
        try {
            nameCompositeType = (CompositeType)MappedMXBeanType.toOpenType(Name.class);
        } catch (OpenDataException ex) {
            InternalError e1 = new InternalError(ex.getMessage());
            e1.initCause(ex);
            throw e1;
        }
    }

    static CompositeType getNameCompositeType() {
        return nameCompositeType;
    }

    private static final String FIRST = "first";
    private static final String LAST = "last";

    private static final String[] nameItemNames = {
        FIRST,
        LAST,
    };

    public static String getFirst(CompositeData cd) {
        return (String)cd.get(FIRST);
    }

    public static String getLast(CompositeData cd) {
        return (String)cd.get(LAST);
    }

    public static void validateCompositeData(CompositeData cd) {
        if (cd == null) {
            throw new NullPointerException("Null CompositeData");
        }

        if (!isTypeMatched(nameCompositeType, cd.getCompositeType())) {
            throw new IllegalArgumentException(
                "Unexpected composite type for Name");
        }
    }
}


