1   package org.codehaus.mojo.natives.util;
2   
3   import java.io.File;
4   import java.io.IOException;
5   
6   import org.codehaus.plexus.util.StringUtils;
7   
8   public class FileUtil
9   {
10  
11      
12  
13  
14  
15  
16  
17  
18  
19  
20      public static File getRelativeFile( File workingDirectory, File targetFile )
21      {
22          try
23          {
24              
25              
26              
27              String canonicalBase = workingDirectory.getCanonicalFile().getAbsolutePath();
28  
29              if ( canonicalBase.charAt( canonicalBase.length() - 1 ) == File.separatorChar )
30              {
31                  canonicalBase = canonicalBase.substring( 0, canonicalBase.length() - 1 );
32              }
33  
34              
35              
36              
37  
38              String canonicalTarget;
39  
40              if ( System.getProperty( "os.name" ).equals( "OS/400" ) )
41              {
42                  canonicalTarget = targetFile.getPath();
43              }
44              else
45              {
46                  canonicalTarget = targetFile.getCanonicalPath();
47              }
48  
49              if ( canonicalTarget.charAt( canonicalTarget.length() - 1 ) == File.separatorChar )
50              {
51                  canonicalTarget = canonicalTarget.substring( 0, canonicalTarget.length() - 1 );
52              }
53  
54              if ( canonicalTarget.equals( canonicalBase ) )
55              {
56                  return new File( "." );
57              }
58  
59              
60              
61              
62              if ( canonicalBase.substring( 0, 2 ).equals( "\\\\" ) )
63              {
64                  
65                  
66                  
67                  int endPrefix = canonicalBase.indexOf( '\\', 2 );
68                  String prefix1 = canonicalBase.substring( 0, endPrefix );
69                  String prefix2 = canonicalTarget.substring( 0, endPrefix );
70                  if ( !prefix1.equals( prefix2 ) )
71                  {
72                      return new File( canonicalTarget );
73                  }
74              }
75              else
76              {
77                  if ( canonicalBase.substring( 1, 3 ).equals( ":\\" ) )
78                  {
79                      int endPrefix = 2;
80                      String prefix1 = canonicalBase.substring( 0, endPrefix );
81                      String prefix2 = canonicalTarget.substring( 0, endPrefix );
82                      if ( !prefix1.equals( prefix2 ) )
83                      {
84                          return new File( canonicalTarget );
85                      }
86                  }
87                  else
88                  {
89                      if ( canonicalBase.charAt( 0 ) == '/' )
90                      {
91                          if ( canonicalTarget.charAt( 0 ) != '/' )
92                          {
93                              return new File( canonicalTarget );
94                          }
95                      }
96                  }
97              }
98  
99              char separator = File.separatorChar;
100             int lastSeparator = -1;
101             int minLength = canonicalBase.length();
102 
103             if ( canonicalTarget.length() < minLength )
104             {
105                 minLength = canonicalTarget.length();
106             }
107 
108             int firstDifference = minLength + 1;
109 
110             
111             
112             
113             for ( int i = 0; i < minLength; i++ )
114             {
115                 if ( canonicalTarget.charAt( i ) == canonicalBase.charAt( i ) )
116                 {
117                     if ( canonicalTarget.charAt( i ) == separator )
118                     {
119                         lastSeparator = i;
120                     }
121                 }
122                 else
123                 {
124                     firstDifference = lastSeparator + 1;
125                     break;
126                 }
127             }
128 
129             StringBuffer relativePath = new StringBuffer( 50 );
130 
131             
132             
133             
134             
135             if ( canonicalBase.length() > firstDifference )
136             {
137                 relativePath.append( ".." );
138                 for ( int i = firstDifference; i < canonicalBase.length(); i++ )
139                 {
140                     if ( canonicalBase.charAt( i ) == separator )
141                     {
142                         relativePath.append( separator );
143                         relativePath.append( ".." );
144                     }
145                 }
146             }
147 
148             if ( canonicalTarget.length() > firstDifference )
149             {
150                 
151                 
152                 
153 
154                 if ( relativePath.length() > 0 )
155                 {
156                     relativePath.append( separator );
157                 }
158 
159                 relativePath.append( canonicalTarget.substring( firstDifference ) );
160             }
161 
162             return new File( relativePath.toString() );
163 
164         }
165         catch ( IOException ex )
166         {
167             
168         }
169 
170         return targetFile;
171 
172     }
173 
174     public static File[] breakPaths( String paths )
175     {
176         String[] tokens = StringUtils.split( paths, "," );
177 
178         File[] files = new File[tokens.length];
179 
180         for ( int i = 0; i < tokens.length; ++i )
181         {
182             files[i] = new File( tokens[i] );
183         }
184 
185         return files;
186     }
187 
188     
189 
190 
191 
192 
193     public static String truncatePath( String path, String baseDirectory )
194     {
195         if ( path.indexOf( baseDirectory ) >= 0 )
196         {
197             path = path.substring( path.indexOf( baseDirectory ) + baseDirectory.length() );
198             if ( path.startsWith( File.separator ) )
199             {
200                 path = path.substring( File.separator.length() );
201             }
202         }
203         return path;
204     }
205 }