Hi All,

        Attached is a simple link task which allows you to create unix
        links from ant build files. It supports both hard and symbolic links.

        I'm definitely an ant beginner - so please feel free to point out any
        mistakes. I want to learn the right way to do things.

        Couple of questions - how do we handle platform specific tasks like
        this ? (ie. is it acceptable for general consumption ?, core or
        optional, or neither ?).

        I'm intending to add support for target directories as well.
        
                ie. ln TARGET-0...[TARGET-N] DIRECTORY
        
        and the option of removing existing destination files, if people would
        find that useful ?

        Any implementation ideas for non UNIX platforms ??

        Cheers,

        Marcus

-- 
        .....
     ,,$$$$$$$$$,      Marcus Crafter
    ;$'      '$$$$:    Computer Systems Engineer
    $:         $$$$:   Open Software Associates GmbH
     $       o_)$$$:   82-84 Mainzer Landstrasse
     ;$,    _/\ &&:'   60327 Frankfurt Germany
       '     /( &&&
           \_&&&&'     Email : [EMAIL PROTECTED]
          &&&&.        Business Hours : +49 69 9757 200
    &&&&&&&:           After Hours    : +49 69 49086750

/*
 * The Apache Software License, Version 1.1
 *
 * Copyright (c) 1999 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution, if
 *    any, must include the following acknowlegement:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowlegement may appear in the software itself,
 *    if and wherever such third-party acknowlegements normally appear.
 *
 * 4. The names "The Jakarta Project", "Ant", and "Apache Software
 *    Foundation" must not be used to endorse or promote products derived
 *    from this software without prior written permission. For written
 *    permission, please contact [EMAIL PROTECTED]
 *
 * 5. Products derived from this software may not be called "Apache"
 *    nor may "Apache" appear in their names without prior written
 *    permission of the Apache Group.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 */

package org.apache.tools.ant.taskdefs;

import java.io.*;
import org.apache.tools.ant.*;
import org.apache.tools.ant.types.Commandline;

/**
 * Task to create a link (optionally symbolic) from one file to another.
 *
 * @author [EMAIL PROTECTED]
 */
public class Link extends Task {

    public void setFile(File src) {
        this.src = src;
    }

    public void setToFile(File dest) {
        this.dest = dest;
    }

    public void setSymbolic(boolean symbolic) {
        this.symbolic = symbolic;
    }

    public void execute() throws BuildException {

        if (src == null || !src.exists()) {
            throw new BuildException(
              "The file attribute must be present, and name an existing file",
              location
            );
        }

        if (dest == null || dest.exists()) {
            throw new BuildException(
              "The toFile attribute must be present, and not name an " +
	      "existing file", location
            );
        }

        if (src.equals(dest)) {
            throw new BuildException(
              "Source filename cannot be the destination filename.", location
            );
        }

        log("Linking " + src + (symbolic ? ", symbolically" : "") +
            " to " + dest, Project.MSG_INFO
           );

        linkFile(src, dest, symbolic);
    }

    private void linkFile(File from, File to, boolean symbolic)
    throws BuildException {

        Commandline link = new Commandline();
        link.setExecutable("ln");

        if (symbolic)
            link.createArgument().setValue("-s");
        link.createArgument().setFile(from);
        link.createArgument().setFile(to);

        Execute ex =
          new Execute(
            new LogStreamHandler(
              this, Project.MSG_INFO, Project.MSG_WARN
            ), null
          );
        ex.setCommandline(link.getCommandline());

        try {
            ex.execute();
        } catch (IOException e) {
            throw new BuildException(e);
        }
    }

    private File src;
    private File dest;
    private boolean symbolic = true;
}

Reply via email to