package org.codehaus.plexus.components.io.resources.proxy; /* * 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.PlexusIoResourceAttributes; import org.codehaus.plexus.components.io.attributes.SimpleResourceAttributes; import org.codehaus.plexus.components.io.filemappers.FileMapper; import org.codehaus.plexus.components.io.fileselectors.FileSelector; import org.codehaus.plexus.components.io.fileselectors.IncludeExcludeFileSelector; import org.codehaus.plexus.components.io.functions.InputStreamTransformer; import org.codehaus.plexus.components.io.functions.NameSupplier; import org.codehaus.plexus.components.io.functions.ResourceAttributeSupplier; import org.codehaus.plexus.components.io.resources.AbstractPlexusIoResourceCollection; import org.codehaus.plexus.components.io.resources.AbstractPlexusIoResourceCollectionWithAttributes; import org.codehaus.plexus.components.io.resources.PlexusIoResource; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; import org.codehaus.plexus.components.io.resources.Stream; import javax.annotation.Nonnull; import java.io.IOException; import java.util.Iterator; /** * Implementation of {@link PlexusIoResourceCollection} for an archives contents. */ public class PlexusIoProxyResourceCollection extends AbstractPlexusIoResourceCollectionWithAttributes { private PlexusIoResourceCollection src; public PlexusIoProxyResourceCollection( @Nonnull PlexusIoResourceCollection src ) { this.src = src; } /** * Returns the archive to read. */ public PlexusIoResourceCollection getSrc() { return src; } public void setDefaultAttributes( final int uid, final String userName, final int gid, final String groupName, final int fileMode, final int dirMode ) { setDefaultFileAttributes( new SimpleResourceAttributes( uid, userName, gid, groupName, fileMode ) ); setDefaultDirAttributes( new SimpleResourceAttributes( 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( new SimpleResourceAttributes( uid, userName, gid, groupName, fileMode ) ); setOverrideDirAttributes( new SimpleResourceAttributes( uid, userName, gid, groupName, dirMode ) ); } @Override public void setStreamTransformer( InputStreamTransformer streamTransformer ) { if (src instanceof AbstractPlexusIoResourceCollection ){ ((AbstractPlexusIoResourceCollection)src).setStreamTransformer( streamTransformer ); } super.setStreamTransformer( streamTransformer ); } protected FileSelector getDefaultFileSelector() { final IncludeExcludeFileSelector fileSelector = new IncludeExcludeFileSelector(); fileSelector.setIncludes( getIncludes() ); fileSelector.setExcludes( getExcludes() ); fileSelector.setCaseSensitive( isCaseSensitive() ); fileSelector.setUseDefaultExcludes( isUsingDefaultExcludes() ); return fileSelector; } private String getNonEmptyPrfix(){ String prefix = getPrefix(); if ( prefix != null && prefix.length() == 0 ) { return null; } return prefix; } class FwdIterator extends ForwardingIterator { Iterator<PlexusIoResource> iter; private final FileSelector fileSelector = getDefaultFileSelector(); private final String prefix = getNonEmptyPrfix(); FwdIterator( Iterator<PlexusIoResource> resources ) { super( resources); this.iter = resources; } /** * Returns the next resource or null if no next resource; */ protected PlexusIoResource getNextResource() throws IOException { if (!iter.hasNext()) return null; PlexusIoResource plexusIoResource = iter.next(); while ( (!fileSelector.isSelected( plexusIoResource ) || !isSelected( plexusIoResource )) || (plexusIoResource.isDirectory() && !isIncludingEmptyDirectories())) { if (!iter.hasNext()) return null; plexusIoResource = iter.next(); } PlexusIoResourceAttributes attrs = null; if ( plexusIoResource instanceof ResourceAttributeSupplier ) { attrs = ( (ResourceAttributeSupplier) plexusIoResource ).getAttributes(); } if ( attrs == null ) { attrs = SimpleResourceAttributes.lastResortDummyAttributesForBrokenOS(); } attrs = mergeAttributes(attrs, plexusIoResource.isDirectory()); if ( prefix != null ) { final String name = plexusIoResource.getName(); final PlexusIoResourceAttributes attrs2= attrs; DualSupplier supplier = new DualSupplier() { public String getName() { return prefix + name; } public PlexusIoResourceAttributes getAttributes() { return attrs2; } }; plexusIoResource = ProxyFactory.createProxy( plexusIoResource, supplier ); } return plexusIoResource; } } public Stream stream() { return getSrc().stream(); } public Iterator<PlexusIoResource> getResources() throws IOException { return new FwdIterator( getSrc().getResources() ); } abstract static class DualSupplier implements NameSupplier, ResourceAttributeSupplier { } public String getName( final PlexusIoResource resource ) { String name = resource.getName(); final FileMapper[] mappers = getFileMappers(); if ( mappers != null ) { for ( FileMapper mapper : mappers ) { name = mapper.getMappedFileName( name ); } } /* * The prefix is applied when creating the resource. return PrefixFileMapper.getMappedFileName( getPrefix(), * name ); */ return name; } public long getLastModified() throws IOException { return src.getLastModified(); } }