package org.apache.maven.plugin.ear;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 */

import org.codehaus.plexus.util.xml.XMLWriter;

/**
 * The representation of a security-role entry within an application.xml file.
 * 
 * @author <a href="snicoll@apache.org">Stephane Nicoll</a>
 * @version $Id$
 */
class SecurityRole
{

    protected static final String SECURITY_ROLE = "security-role";

    protected static final String ID_ATTRIBUTE = "id";

    protected static final String DESCRIPTION = "description";

    protected static final String ROLE_NAME = "role-name";

    private final String roleName;

    private final String roleNameId;

    private final String roleId;

    private final String description;

    private final String descriptionId;

    public SecurityRole( String roleName, String roleNameId, String roleId, String description, String descriptionId )
    {
        if ( roleName == null )
        {
            throw new NullPointerException( "role-name in security-role element could not be null." );
        }
        this.roleName = roleName;
        this.roleNameId = roleNameId;
        this.roleId = roleId;
        this.description = description;
        this.descriptionId = descriptionId;
    }

    public String getRoleName()
    {
        return roleName;
    }

    public String getRoleNameId()
    {
        return roleNameId;
    }

    public String getRoleId()
    {
        return roleId;
    }

    public String getDescription()
    {
        return description;
    }

    public String getDescriptionId()
    {
        return descriptionId;
    }

    /**
     * Appends the <tt>XML</tt> representation of this security role.
     * 
     * @param writer the writer to use
     */
    public void appendSecurityRole( XMLWriter writer )
    {
        writer.startElement( SECURITY_ROLE );

        // role id
        if ( getRoleId() != null )
        {
            writer.addAttribute( ID_ATTRIBUTE, getRoleId() );
        }

        // description
        if ( getDescription() != null )
        {
            writer.startElement( DESCRIPTION );
            if ( getDescriptionId() != null )
            {
                writer.addAttribute( ID_ATTRIBUTE, getDescriptionId() );
            }
            writer.writeText( getDescription() );
            writer.endElement();

        }

        // role name
        writer.startElement( ROLE_NAME );
        if ( getRoleNameId() != null )
        {
            writer.addAttribute( ID_ATTRIBUTE, getRoleNameId() );
        }
        writer.writeText( getRoleName() );
        writer.endElement();

        // end of security-role
        writer.endElement();
    }

    public String toString()
    {
        return "Security role " + getRoleName();
    }

}
