001 /* 002 * Copyright 2004-2005 Stephen J. McConnell. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 013 * implied. 014 * 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package net.dpml.transit.tools; 020 021 import java.io.File; 022 import java.net.URL; 023 import java.net.URI; 024 025 import org.apache.tools.ant.Project; 026 import org.apache.tools.ant.BuildException; 027 import org.apache.tools.ant.taskdefs.ImportTask; 028 029 import net.dpml.transit.Artifact; 030 import net.dpml.util.PropertyResolver; 031 032 /** 033 * Ant task that provides support for the import of build file templates 034 * via an artifact url. 035 * 036 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a> 037 * @version 1.0.3 038 */ 039 public class ImportArtifactTask extends ImportTask 040 { 041 /** 042 * A flag indicating that nested directives have been provided. 043 */ 044 private boolean m_flag = false; 045 046 private boolean m_init = false; 047 048 /** 049 * Set the project. 050 * @param project the current project 051 */ 052 public void setProject( Project project ) 053 { 054 super.setProject( project ); 055 setTaskName( "import" ); 056 } 057 058 /** 059 * Task initialization. 060 */ 061 public synchronized void init() 062 { 063 if( !m_init ) 064 { 065 TransitTask.initialize( this ); 066 super.init(); 067 m_init = true; 068 } 069 } 070 071 // ------------------------------------------------------------------------ 072 // Task 073 // ------------------------------------------------------------------------ 074 075 /** 076 * Set the file to import. Any symbolic references in the supplied 077 * file argument will be resolved prior to invoking the standard setFile 078 * operation. 079 * 080 * @param file the template filename 081 */ 082 public void setFile( String file ) 083 { 084 String path = PropertyResolver.resolve( file ); 085 super.setFile( path ); 086 } 087 088 /** 089 * Set the artifact to import. 090 * @param uri the artifact to import into the build file 091 * @exception BuildException if an error occurs while attempting to 092 * resolve the artifact uri 093 */ 094 public void setUri( URI uri ) throws BuildException 095 { 096 try 097 { 098 URL url = Artifact.toURL( uri ); 099 File local = (File) url.getContent( new Class[]{File.class} ); 100 super.setFile( local.getAbsolutePath() ); 101 } 102 catch( Exception e ) 103 { 104 final String error = 105 "Could not import the resource from the uri [" 106 + uri 107 + "]"; 108 throw new BuildException( error, e ); 109 } 110 } 111 112 /** 113 * Execute the import. 114 */ 115 public void execute() 116 { 117 try 118 { 119 super.execute(); 120 } 121 catch( BuildException e ) 122 { 123 throw e; 124 } 125 catch( Throwable e ) 126 { 127 final String error = 128 "Input (super).execute() failed."; 129 throw new BuildException( error, e ); 130 } 131 } 132 } 133