package org.codehaus.plexus.components.io.resources; /* * Copyright 2007 The Codehaus Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import org.codehaus.plexus.components.io.attributes.Java7FileAttributes; import org.codehaus.plexus.components.io.attributes.Java7Reflector; import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils; import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes; import org.codehaus.plexus.components.io.attributes.SimpleResourceAttributes; import org.codehaus.plexus.components.io.functions.PlexusIoResourceConsumer; import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.StringUtils; import java.io.Closeable; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * Implementation of {@link PlexusIoResourceCollection} for the set * of files in a common directory. */ public class PlexusIoFileResourceCollection extends AbstractPlexusIoResourceCollectionWithAttributes { /** * Role hint of this component */ public static final String ROLE_HINT = "files"; private File baseDir; private boolean isFollowingSymLinks = true; public PlexusIoFileResourceCollection() { } public PlexusIoResource resolve( final PlexusIoResource resource ) throws IOException { return resource; } @Override public InputStream getInputStream( PlexusIoResource resource ) throws IOException { return resource.getContents(); } @Override public String getName( PlexusIoResource resource ) { return resource.getName(); } /** * @param baseDir The base directory of the file collection */ public void setBaseDir( File baseDir ) { this.baseDir = baseDir; } /** * @return Returns the file collections base directory. */ public File getBaseDir() { return baseDir; } /** * @return Returns, whether symbolic links should be followed. * Defaults to true. */ public boolean isFollowingSymLinks() { return isFollowingSymLinks; } /** * @param pIsFollowingSymLinks whether symbolic links should be followed */ @SuppressWarnings({ "UnusedDeclaration" }) public void setFollowingSymLinks( boolean pIsFollowingSymLinks ) { isFollowingSymLinks = pIsFollowingSymLinks; } public void setDefaultAttributes( final int uid, final String userName, final int gid, final String groupName, final int fileMode, final int dirMode ) { setDefaultFileAttributes( createDefaults(uid, userName, gid, groupName, fileMode) ); setDefaultDirAttributes( createDefaults(uid, userName, gid, groupName, dirMode) ); } public void setOverrideAttributes( final int uid, final String userName, final int gid, final String groupName, final int fileMode, final int dirMode ) { setOverrideFileAttributes( createDefaults( uid, userName, gid, groupName, fileMode ) ); setOverrideDirAttributes( createDefaults(uid, userName, gid, groupName, dirMode) ); } private static PlexusIoResourceAttributes createDefaults( final int uid, final String userName, final int gid, final String groupName, final int mode ) { return new SimpleResourceAttributes( uid, userName, gid, groupName, mode >= 0 ? mode : -1 ); } @Override public void setPrefix(String prefix) { char nonSeparator = File.separatorChar == '/' ?'\\' : '/'; super.setPrefix(StringUtils.replace( prefix, nonSeparator, File.separatorChar)); } private void addResources( List<PlexusIoResource> result, String[] resources, Map<String, PlexusIoResourceAttributes> attributesByPath ) throws IOException { final File dir = getBaseDir(); for ( String name : resources ) { String sourceDir = name.replace( '\\', '/' ); File f = new File( dir, sourceDir ); PlexusIoResourceAttributes attrs = attributesByPath.get( name.length() > 0 ? name : "." ); if ( attrs == null ) { attrs = attributesByPath.get( f.getAbsolutePath() ); } if ( attrs == null ) { attrs = SimpleResourceAttributes.lastResortDummyAttributesForBrokenOS(); } attrs = mergeAttributes( attrs, f.isDirectory() ); String remappedName = getName( name ); PlexusIoResource resource = ResourceFactory.createResource( f, remappedName, null, getStreamTransformer(), attrs ); if ( isSelected( resource ) ) { result.add( resolve(resource) ); } } } private void addResourcesJava7( List<PlexusIoResource> result, String[] resources ) throws IOException { final File dir = getBaseDir(); final HashMap<Integer, String> cache1 = new HashMap<Integer, String>(); final HashMap<Integer, String> cache2 = new HashMap<Integer, String>(); for ( String name : resources ) { String sourceDir = name.replace( '\\', '/' ); File f = new File( dir, sourceDir ); PlexusIoResourceAttributes attrs = new Java7FileAttributes( f, cache1, cache2 ); attrs = mergeAttributes( attrs, f.isDirectory() ); String remappedName = getName( name ); PlexusIoResource resource = ResourceFactory.createResource( f, remappedName, null, getStreamTransformer(), attrs ); if ( isSelected( resource ) ) { result.add( resource ); } } } public Stream stream() { return new Stream() { public void forEach( PlexusIoResourceConsumer resourceConsumer ) throws IOException { Iterator<PlexusIoResource> resources = getResources(); while (resources.hasNext()){ PlexusIoResource next = resources.next(); if (isSelected( next )) { resourceConsumer.accept( next ); } } if (resources instanceof Closeable ) { ((Closeable)resources).close(); } } }; } public Iterator<PlexusIoResource> getResources() throws IOException { final DirectoryScanner ds = new DirectoryScanner(); final File dir = getBaseDir(); ds.setBasedir( dir ); final String[] inc = getIncludes(); if ( inc != null && inc.length > 0 ) { ds.setIncludes( inc ); } final String[] exc = getExcludes(); if ( exc != null && exc.length > 0 ) { ds.setExcludes( exc ); } if ( isUsingDefaultExcludes() ) { ds.addDefaultExcludes(); } ds.setCaseSensitive( isCaseSensitive() ); ds.setFollowSymlinks( isFollowingSymLinks() ); ds.scan(); if ( Java7Reflector.isAtLeastJava7() ) { final List<PlexusIoResource> result = new ArrayList<PlexusIoResource>(); if ( isIncludingEmptyDirectories() ) { String[] dirs = ds.getIncludedDirectories(); addResourcesJava7( result, dirs ); } String[] files = ds.getIncludedFiles(); addResourcesJava7( result, files ); return result.iterator(); } else { Map<String, PlexusIoResourceAttributes> attributesByPath = PlexusIoResourceAttributeUtils.getFileAttributesByPath( getBaseDir() ); final List<PlexusIoResource> result = new ArrayList<PlexusIoResource>(); if ( isIncludingEmptyDirectories() ) { String[] dirs = ds.getIncludedDirectories(); addResources( result, dirs, attributesByPath ); } String[] files = ds.getIncludedFiles(); addResources( result, files, attributesByPath ); return result.iterator(); } } }