1 package org.codehaus.plexus.archiver;
2
3 /*
4 * Copyright (C) 2011-2016, Neticoa SAS France - Tous droits réservés.
5 * Author(s) : Franck Bonin, Neticoa SAS France
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 */
20
21 //import org.codehaus.plexus.archiver.util.ArchiveEntryUtils;
22 //import org.codehaus.plexus.components.io.attributes.SymlinkUtils;
23 import org.codehaus.plexus.components.io.fileselectors.FileSelector;
24 import org.codehaus.plexus.components.io.fileselectors.FileInfo;
25 //import org.codehaus.plexus.components.io.resources.PlexusIoResource;
26 import org.codehaus.plexus.logging.AbstractLogEnabled;
27 //import org.codehaus.plexus.util.FileUtils;
28 //import org.codehaus.plexus.util.IOUtil;
29 //import org.codehaus.plexus.util.StringUtils;
30
31
32 //import java.io.*;
33 import java.io.File;
34 import java.io.IOException;
35 //import java.util.ArrayList;
36 //import java.util.Date;
37 import java.util.List;
38 //import java.util.Iterator;
39
40 /**
41 * @author Franck Bonin
42 * @version $Revision$ $Date$
43 */
44 public abstract class AbstractArchiveContentLister
45 extends AbstractLogEnabled
46 implements ArchiveContentLister
47 {
48 private File sourceFile;
49
50 private FileSelector[] fileSelectors;
51
52 public AbstractArchiveContentLister()
53 {
54 }
55
56 public AbstractArchiveContentLister( final File sourceFile )
57 {
58 this.sourceFile = sourceFile;
59 }
60
61 public File getSourceFile()
62 {
63 return sourceFile;
64 }
65
66 public void setSourceFile( final File sourceFile )
67 {
68 this.sourceFile = sourceFile;
69 }
70
71 public final List<ArchiveContentEntry> list()
72 throws ArchiverException
73 {
74 validate();
75 return execute();
76 //runArchiveFinalizers();
77 }
78 /*
79 public final void list( final String path )
80 throws ArchiverException
81 {
82 validate( path );
83 execute( path );
84 //runArchiveFinalizers();
85 }
86 */
87 /*
88 public void addArchiveFinalizer( final ArchiveFinalizer finalizer )
89 {
90 if ( finalizers == null )
91 {
92 finalizers = new ArrayList();
93 }
94
95 finalizers.add( finalizer );
96 }
97
98 public void setArchiveFinalizers( final List archiveFinalizers )
99 {
100 finalizers = archiveFinalizers;
101 }
102
103 private void runArchiveFinalizers()
104 throws ArchiverException
105 {
106 if ( finalizers != null )
107 {
108 for (Object finalizer1 : finalizers) {
109 final ArchiveFinalizer finalizer = (ArchiveFinalizer) finalizer1;
110
111 finalizer.finalizeArchiveExtraction(this);
112 }
113 }
114 }
115 */
116 /*
117 protected void validate( final String path, final File outputDirectory )
118 {
119 }
120 */
121
122 protected void validate()
123 throws ArchiverException
124 {
125 if ( sourceFile == null )
126 {
127 throw new ArchiverException( "The source file isn't defined." );
128 }
129
130 if ( sourceFile.isDirectory() )
131 {
132 throw new ArchiverException( "The source must not be a directory." );
133 }
134
135 if ( !sourceFile.exists() )
136 {
137 throw new ArchiverException( "The source file " + sourceFile + " doesn't exist." );
138 }
139 /*
140 if ( destDirectory == null && destFile == null )
141 {
142 throw new ArchiverException( "The destination isn't defined." );
143 }
144
145 if ( destDirectory != null && destFile != null )
146 {
147 throw new ArchiverException( "You must choose between a destination directory and a destination file." );
148 }
149
150 if ( destDirectory != null && !destDirectory.isDirectory() )
151 {
152 destFile = destDirectory;
153 destDirectory = null;
154 }
155
156 if ( destFile != null && destFile.isDirectory() )
157 {
158 destDirectory = destFile;
159 destFile = null;
160 }
161 */
162 }
163
164 public void setFileSelectors( final FileSelector[] fileSelectors )
165 {
166 this.fileSelectors = fileSelectors;
167 }
168
169 public FileSelector[] getFileSelectors()
170 {
171 return fileSelectors;
172 }
173
174 protected boolean isSelected( final String fileName, final /*PlexusIoResource*/ FileInfo fileInfo )
175 throws ArchiverException
176 {
177 if ( fileSelectors != null )
178 {
179 for ( FileSelector fileSelector : fileSelectors )
180 {
181 try
182 {
183 if ( !fileSelector.isSelected( fileInfo ) )
184 {
185 return false;
186 }
187 }
188 catch ( final IOException e )
189 {
190 throw new ArchiverException( "Failed to check, whether " + fileInfo.getName() + " is selected: "
191 + e.getMessage(), e );
192 }
193 }
194 }
195 return true;
196 }
197
198 protected abstract List<ArchiveContentEntry> execute()
199 throws ArchiverException;
200
201 /*
202 protected abstract void execute( String path)
203 throws ArchiverException;
204 */
205
206 /*
207 protected void extractFile( final File srcF, final File dir, final InputStream compressedInputStream,
208 final String entryName, final Date entryDate, final boolean isDirectory,
209 final Integer mode, String symlinkDestination )
210 throws IOException, ArchiverException
211 {
212 // Hmm. Symlinks re-evaluate back to the original file here. Unsure if this is a good thing...
213 final File f = FileUtils.resolveFile( dir, entryName );
214
215 try
216 {
217 if ( !isOverwrite() && f.exists() && ( f.lastModified() >= entryDate.getTime() ) )
218 {
219 return;
220 }
221
222 // create intermediary directories - sometimes zip don't add them
223 final File dirF = f.getParentFile();
224 if ( dirF != null )
225 {
226 dirF.mkdirs();
227 }
228
229 if ( !StringUtils.isEmpty( symlinkDestination )){
230 SymlinkUtils.createSymbolicLink( f, new File( symlinkDestination) );
231 }
232 else if ( isDirectory )
233 {
234 f.mkdirs();
235 }
236 else
237 {
238 OutputStream out = null;
239 try
240 {
241 out = new FileOutputStream( f );
242
243 IOUtil.copy( compressedInputStream, out );
244 }
245 finally
246 {
247 IOUtil.close( out );
248 }
249 }
250
251 f.setLastModified( entryDate.getTime() );
252
253 if ( !isIgnorePermissions() && mode != null && !isDirectory)
254 {
255 ArchiveEntryUtils.chmod( f, mode, getLogger(), isUseJvmChmod() );
256 }
257 }
258 catch ( final FileNotFoundException ex )
259 {
260 getLogger().warn( "Unable to expand to file " + f.getPath() );
261 }
262 }
263 */
264 }