/*******************************************************************************
 * Copyright (c) 2010, 2011 Sonatype, Inc.
 * 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:
 *    Sonatype, Inc. - initial API and implementation
 *******************************************************************************/
package org.eclipse.aether.ant.types;

import java.util.ArrayList;
import java.util.List;

import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.DataType;
import org.apache.tools.ant.types.Reference;
import org.eclipse.aether.ant.AntRepoSys;

/**
 */
public class Authentication
    extends DataType
{

    private String username;

    private String password;

    private String privateKeyFile;

    private String passphrase;

    private List<String> servers = new ArrayList<String>();

    @Override
    public void setProject( Project project )
    {
        super.setProject( project );

        AntRepoSys.getInstance( project ).addAuthentication( this );
    }

    protected Authentication getRef()
    {
        return (Authentication) getCheckedRef();
    }

    public void setRefid( Reference ref )
    {
        if ( username != null || password != null || privateKeyFile != null || passphrase != null )
        {
            throw tooManyAttributes();
        }
        super.setRefid( ref );
    }

    public String getUsername()
    {
        if ( isReference() )
        {
            return getRef().getUsername();
        }
        return username;
    }

    public void setUsername( String username )
    {
        checkAttributesAllowed();
        this.username = username;
    }

    public String getPassword()
    {
        if ( isReference() )
        {
            return getRef().getPassword();
        }
        return password;
    }

    public void setPassword( String password )
    {
        checkAttributesAllowed();
        this.password = password;
    }

    public String getPrivateKeyFile()
    {
        if ( isReference() )
        {
            return getRef().getPrivateKeyFile();
        }
        return privateKeyFile;
    }

    public void setPrivateKeyFile( String privateKeyFile )
    {
        checkAttributesAllowed();
        this.privateKeyFile = privateKeyFile;
    }

    public String getPassphrase()
    {
        if ( isReference() )
        {
            return getRef().getPassphrase();
        }
        return passphrase;
    }

    public void setPassphrase( String passphrase )
    {
        checkAttributesAllowed();
        this.passphrase = passphrase;
    }

    public List<String> getServers()
    {
        if ( isReference() )
        {
            return getRef().getServers();
        }
        return servers;
    }

    public void setServers( String servers )
    {
        checkAttributesAllowed();
        this.servers.clear();
        String[] split = servers.split( "[;:]" );
        for ( String server : split )
        {
            server = server.trim();
            if ( server.length() > 0 )
            {
                this.servers.add( server );
            }
        }
    }

}
