Return-Path: Delivered-To: apmail-geronimo-scm-archive@www.apache.org Received: (qmail 98010 invoked from network); 5 Oct 2009 18:57:06 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 5 Oct 2009 18:57:06 -0000 Received: (qmail 64943 invoked by uid 500); 5 Oct 2009 18:57:06 -0000 Delivered-To: apmail-geronimo-scm-archive@geronimo.apache.org Received: (qmail 64886 invoked by uid 500); 5 Oct 2009 18:57:06 -0000 Mailing-List: contact scm-help@geronimo.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: dev@geronimo.apache.org List-Id: Delivered-To: mailing list scm@geronimo.apache.org Received: (qmail 64877 invoked by uid 99); 5 Oct 2009 18:57:06 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 05 Oct 2009 18:57:06 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 05 Oct 2009 18:56:49 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E1AFD23889E7; Mon, 5 Oct 2009 18:55:02 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r821961 [14/30] - in /geronimo/sandbox/djencks/osgi/framework: ./ buildsupport/ buildsupport/car-maven-plugin/ buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/ buildsupport/geronimo-maven-plugin/src/main/jav... Date: Mon, 05 Oct 2009 18:54:56 -0000 To: scm@geronimo.apache.org From: djencks@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20091005185502.E1AFD23889E7@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoFileResourceCollection.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoFileResourceCollection.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoFileResourceCollection.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResource.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResource.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResource.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResource.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,66 @@ +package org.apache.geronimo.system.plugin.plexus.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 java.io.IOException; +import java.net.URL; + +import org.apache.geronimo.system.plugin.plexus.io.fileselectors.FileInfo; + + +/** + * A resource is a file-like entity. It may be an actual file, + * an URL, a zip entry, or something like that. + */ +public interface PlexusIoResource extends FileInfo +{ + /** + * Unknown resource size. + */ + public static final long UNKNOWN_RESOURCE_SIZE = -1; + + /** + * Unknown modification date + */ + public static final long UNKNOWN_MODIFICATION_DATE = 0; + + /** + * Returns the date, when the resource was last modified, if known. + * Otherwise, returns {@link #UNKNOWN_MODIFICATION_DATE}. + * @see java.io.File#lastModified() + */ + long getLastModified(); + + /** + * Returns, whether the resource exists. + */ + boolean isExisting(); + + /** + * Returns the resources size, if known. Otherwise returns + * {@link #UNKNOWN_RESOURCE_SIZE}. + */ + long getSize(); + + /** + * Returns an {@link URL}, which may be used to reference the + * resource, if possible. + * @return An URL referencing the resource, if possible, or null. + * In the latter case, you are forced to use {@link #getInputStream()}. + */ + URL getURL() throws IOException; +} \ No newline at end of file Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResource.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResource.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResource.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceCollection.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceCollection.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceCollection.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceCollection.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,64 @@ +package org.apache.geronimo.system.plugin.plexus.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 java.io.IOException; +import java.util.Iterator; + + +/** + * A resource collection is a set of {@link PlexusIoResource} instances. + */ +public interface PlexusIoResourceCollection +{ + /** + * Role of the ResourceCollection component. + */ + public static final String ROLE = PlexusIoResourceCollection.class.getName(); + + /** + * Role hint of the default resource collection, which is a set + * of files in a base directory. + */ + public static final String DEFAULT_ROLE_HINT = "default"; + + /** + * Returns an iterator over the resources in the collection. + */ + Iterator getResources() throws IOException; + + /** + * Returns the resources suggested name. This is used for + * integrating file mappers. + * @param resource A resource, which has been obtained by + * calling {@link #getResources()}. + */ + String getName( PlexusIoResource resource ) throws IOException; + + /** + * Returns the collections last modification time. For a + * collection of files, this might be the last modification + * time of the file, which has been modified at last. For an + * archive file, this might be the modification time of the + * archive file. + * @return {@link PlexusIoResource#UNKNOWN_MODIFICATION_DATE}, + * if the collections last modification time is unknown, + * otherwise the last modification time in milliseconds. + */ + long getLastModified() throws IOException; + +} \ No newline at end of file Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceCollection.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceCollection.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceCollection.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceWithAttributes.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceWithAttributes.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceWithAttributes.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceWithAttributes.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,29 @@ +package org.apache.geronimo.system.plugin.plexus.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.apache.geronimo.system.plugin.plexus.io.attributes.PlexusIoResourceAttributes; + +public interface PlexusIoResourceWithAttributes + extends PlexusIoResource +{ + + PlexusIoResourceAttributes getAttributes(); + + void setAttributes( PlexusIoResourceAttributes attributes ); + +} \ No newline at end of file Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceWithAttributes.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceWithAttributes.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoResourceWithAttributes.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoURLResource.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoURLResource.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoURLResource.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoURLResource.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,43 @@ +package org.apache.geronimo.system.plugin.plexus.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 java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class PlexusIoURLResource extends AbstractPlexusIoResource +{ + private URL url; + + + public InputStream getContents() throws IOException + { + return getURL().openStream(); + } + + public URL getURL() throws IOException + { + return url; + } + + public void setURL( URL pUrl ) + { + url = pUrl; + } + +} \ No newline at end of file Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoURLResource.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoURLResource.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoURLResource.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoZipFileResourceCollection.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoZipFileResourceCollection.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoZipFileResourceCollection.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoZipFileResourceCollection.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,85 @@ +package org.apache.geronimo.system.plugin.plexus.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 java.io.File; +import java.io.IOException; +import java.net.URL; +import java.util.Enumeration; +import java.util.Iterator; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + + +public class PlexusIoZipFileResourceCollection extends AbstractPlexusIoArchiveResourceCollection +{ + /** + * The zip file resource collections role hint. + */ + public static final String ROLE_HINT = "zipFile"; + + /** + * The zip file resource collections role hint for jar files. + */ + public static final String JAR_ROLE_HINT = "jarFile"; + + public PlexusIoZipFileResourceCollection() + { + + } + + protected Iterator getEntries() throws IOException + { + final File f = getFile(); + if ( f == null ) + { + throw new IOException( "The zip file has not been set." ); + } + final URL url = new URL( "jar:" + f.toURI().toURL() + "!/"); + final ZipFile zipFile = new ZipFile( f ); + final Enumeration en = zipFile.entries(); + return new Iterator(){ + public boolean hasNext() + { + return en.hasMoreElements(); + } + public Object next() + { + final ZipEntry entry = (ZipEntry) en.nextElement(); + final PlexusIoURLResource res = new PlexusIoURLResource(){ + public URL getURL() throws IOException + { + return new URL( url, entry.getName() ); + } + }; + final boolean dir = entry.isDirectory(); + res.setName( entry.getName() ); + res.setDirectory( dir ); + res.setExisting( true ); + res.setFile( !dir ); + long l = entry.getTime(); + res.setLastModified( l == -1 ? PlexusIoResource.UNKNOWN_MODIFICATION_DATE : l ); + res.setSize( dir ? PlexusIoResource.UNKNOWN_RESOURCE_SIZE : entry.getSize() ); + return res; + } + public void remove() + { + throw new UnsupportedOperationException( "Removing isn't implemented." ); + } + }; + } +} \ No newline at end of file Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoZipFileResourceCollection.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoZipFileResourceCollection.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/PlexusIoZipFileResourceCollection.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/package.html URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/package.html?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/package.html (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/package.html Mon Oct 5 18:54:50 2009 @@ -0,0 +1,10 @@ +Resources and Resource Collections +

Resources and Resource Collections

+

This package implements ideas, which have been shamelessly + copied from Ants resource collection framework. Basically, + a resource is an abstraction of file-like entities: An actual + file, an URL, a zip entry, and so on. On the other hand, + a resource collections is a collection of resources.

+

Resource collections can be copied, moved, archived, unarchived, + and so on.

+ Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/package.html ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/package.html ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/package.html ------------------------------------------------------------------------------ svn:mime-type = text/html Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResource.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResource.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResource.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResource.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,75 @@ +package org.apache.geronimo.system.plugin.plexus.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.apache.geronimo.system.plugin.plexus.io.resources.AbstractPlexusIoResource; +import org.apache.geronimo.system.plugin.plexus.io.resources.PlexusIoResource; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class PlexusIoProxyResource + extends AbstractPlexusIoResource +{ + + private final PlexusIoResource src; + + public PlexusIoProxyResource( PlexusIoResource plexusIoResource ) + { + this.src = plexusIoResource; + setName( src.getName() ); + } + + public long getLastModified() + { + return src.getLastModified(); + } + + public long getSize() + { + return src.getSize(); + } + + public boolean isDirectory() + { + return src.isDirectory(); + } + + public boolean isExisting() + { + return src.isExisting(); + } + + public boolean isFile() + { + return src.isFile(); + } + + public URL getURL() + throws IOException + { + return src.getURL(); + } + + public InputStream getContents() + throws IOException + { + return src.getContents(); + } + +} Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResource.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResource.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResource.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceCollection.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceCollection.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceCollection.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceCollection.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,183 @@ +package org.apache.geronimo.system.plugin.plexus.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.apache.geronimo.system.plugin.plexus.io.attributes.PlexusIoResourceAttributeUtils; +import org.apache.geronimo.system.plugin.plexus.io.attributes.PlexusIoResourceAttributes; +import org.apache.geronimo.system.plugin.plexus.io.attributes.SimpleResourceAttributes; +import org.apache.geronimo.system.plugin.plexus.io.filemappers.FileMapper; +import org.apache.geronimo.system.plugin.plexus.io.fileselectors.FileSelector; +import org.apache.geronimo.system.plugin.plexus.io.fileselectors.IncludeExcludeFileSelector; +import org.apache.geronimo.system.plugin.plexus.io.resources.AbstractPlexusIoResource; +import org.apache.geronimo.system.plugin.plexus.io.resources.AbstractPlexusIoResourceCollection; +import org.apache.geronimo.system.plugin.plexus.io.resources.PlexusIOResourceCollectionWithAttributes; +import org.apache.geronimo.system.plugin.plexus.io.resources.PlexusIoResource; +import org.apache.geronimo.system.plugin.plexus.io.resources.PlexusIoResourceCollection; +import org.apache.geronimo.system.plugin.plexus.io.resources.PlexusIoResourceWithAttributes; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + + +/** + * Implementation of {@link PlexusIoResourceCollection} for an archives + * contents. + */ +public class PlexusIoProxyResourceCollection + extends AbstractPlexusIoResourceCollection + implements PlexusIOResourceCollectionWithAttributes +{ + private PlexusIoResourceCollection src; + + private SimpleResourceAttributes defaultFileAttributes; + + private SimpleResourceAttributes defaultDirAttributes; + + private PlexusIoResourceAttributes overrideFileAttributes; + + private PlexusIoResourceAttributes overrideDirAttributes; + + /** + * Sets the archive to read. + */ + public void setSrc( PlexusIoResourceCollection src ) + { + this.src = src; + } + + /** + * Returns the archive to read. + */ + public PlexusIoResourceCollection getSrc() + { + return src; + } + + protected FileSelector getDefaultFileSelector() + { + IncludeExcludeFileSelector fileSelector = new IncludeExcludeFileSelector(); + fileSelector.setIncludes( getIncludes() ); + fileSelector.setExcludes( getExcludes() ); + fileSelector.setCaseSensitive( isCaseSensitive() ); + fileSelector.setUseDefaultExcludes( isUsingDefaultExcludes() ); + return fileSelector; + } + + public Iterator getResources() throws IOException + { + final List result = new ArrayList(); + final FileSelector fileSelector = getDefaultFileSelector(); + String prefix = getPrefix(); + if ( prefix != null && prefix.length() == 0 ) + { + prefix = null; + } + for ( Iterator iter = getSrc().getResources(); iter.hasNext(); ) + { + PlexusIoResource plexusIoResource = (PlexusIoResource) iter.next(); + + PlexusIoResourceAttributes attrs = null; + if ( plexusIoResource instanceof PlexusIoResourceWithAttributes ) + { + attrs = ((PlexusIoResourceWithAttributes)plexusIoResource).getAttributes(); + } + + if ( plexusIoResource.isDirectory() ) + { + attrs = PlexusIoResourceAttributeUtils.mergeAttributes( overrideDirAttributes, attrs, defaultDirAttributes ); + } + else + { + attrs = PlexusIoResourceAttributeUtils.mergeAttributes( overrideFileAttributes, attrs, defaultFileAttributes ); + } + + if ( !fileSelector.isSelected( plexusIoResource ) ) + { + continue; + } + if ( !isSelected( plexusIoResource ) ) + { + continue; + } + if ( plexusIoResource.isDirectory() && !isIncludingEmptyDirectories() ) + { + continue; + } + if ( prefix != null ) + { + String name = plexusIoResource.getName(); + + if ( plexusIoResource instanceof PlexusIoResourceWithAttributes ) + { + plexusIoResource = new PlexusIoProxyResourceWithAttributes( (PlexusIoResourceWithAttributes) plexusIoResource ); + } + else + { + plexusIoResource = new PlexusIoProxyResource( plexusIoResource ); + } + + ( (AbstractPlexusIoResource) plexusIoResource ).setName( prefix + name ); + } + + result.add( plexusIoResource ); + } + return result.iterator(); + } + + public String getName( PlexusIoResource resource ) + throws IOException + { + String name = resource.getName(); + final FileMapper[] mappers = getFileMappers(); + if ( mappers != null ) + { + for ( int i = 0; i < mappers.length; i++ ) + { + name = mappers[i].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(); + } + + public void setDefaultAttributes( int uid, String userName, int gid, String groupName, int fileMode, int dirMode ) + { + defaultFileAttributes = new SimpleResourceAttributes( uid, userName, gid, groupName, fileMode ); + defaultFileAttributes.setOctalMode( fileMode ); + + defaultDirAttributes = new SimpleResourceAttributes( uid, userName, gid, groupName, dirMode ); + defaultDirAttributes.setOctalMode( dirMode ); + } + + public void setOverrideAttributes( int uid, String userName, int gid, String groupName, int fileMode, int dirMode ) + { + overrideFileAttributes = new SimpleResourceAttributes( uid, userName, gid, groupName, fileMode ); + + overrideDirAttributes = new SimpleResourceAttributes( uid, userName, gid, groupName, dirMode ); + } +} \ No newline at end of file Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceCollection.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceCollection.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceCollection.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceWithAttributes.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceWithAttributes.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceWithAttributes.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceWithAttributes.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,76 @@ +package org.apache.geronimo.system.plugin.plexus.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.apache.geronimo.system.plugin.plexus.io.resources.AbstractPlexusIoResourceWithAttributes; +import org.apache.geronimo.system.plugin.plexus.io.resources.PlexusIoResourceWithAttributes; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class PlexusIoProxyResourceWithAttributes + extends AbstractPlexusIoResourceWithAttributes +{ + + private final PlexusIoResourceWithAttributes src; + + public PlexusIoProxyResourceWithAttributes( PlexusIoResourceWithAttributes plexusIoResource ) + { + this.src = plexusIoResource; + setName( src.getName() ); + setAttributes( src.getAttributes() ); + } + + public long getLastModified() + { + return src.getLastModified(); + } + + public long getSize() + { + return src.getSize(); + } + + public boolean isDirectory() + { + return src.isDirectory(); + } + + public boolean isExisting() + { + return src.isExisting(); + } + + public boolean isFile() + { + return src.isFile(); + } + + public URL getURL() + throws IOException + { + return src.getURL(); + } + + public InputStream getContents() + throws IOException + { + return src.getContents(); + } + +} Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceWithAttributes.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceWithAttributes.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/io/resources/proxy/PlexusIoProxyResourceWithAttributes.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/AbstractScanner.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/AbstractScanner.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/AbstractScanner.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/AbstractScanner.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,434 @@ +package org.apache.geronimo.system.plugin.plexus.util; + +/* + * Copyright 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 java.io.File; + +public abstract class AbstractScanner + implements Scanner +{ + /** + * Patterns which should be excluded by default, like SCM files + *
    + *
  • Misc: **/*~, **/#*#, **/.#*, **/%*%, **/._*
  • + *
  • CVS: **/CVS, **/CVS/**, **/.cvsignore
  • + *
  • RCS: **/RCS, **/RCS/**
  • + *
  • SCCS: **/SCCS, **/SCCS/**
  • + *
  • VSSercer: **/vssver.scc
  • + *
  • SVN: **/.svn, **/.svn/**
  • + *
  • GNU: **/.arch-ids, **/.arch-ids/**
  • + *
  • Bazaar: **/.bzr, **/.bzr/**
  • + *
  • SurroundSCM: **/.MySCMServerInfo
  • + *
  • Mac: **/.DS_Store
  • + *
  • Serena Dimension: **/.metadata, **/.metadata/**
  • + *
  • Mercurial: **/.hg, **/.hg/**
  • + *
  • GIT: **/.git, **/.git/**
  • + *
  • Bitkeeper: **/BitKeeper, **/BitKeeper/**, **/ChangeSet, **/ChangeSet/**
  • + *
  • Darcs: **/_darcs, **/_darcs/**, **/.darcsrepo, **/.darcsrepo/****/-darcs-backup*, **/.darcs-temp-mail + *
+ * + * @see #addDefaultExcludes() + */ + public static final String[] DEFAULTEXCLUDES = { + // Miscellaneous typical temporary files + "**/*~", + "**/#*#", + "**/.#*", + "**/%*%", + "**/._*", + + // CVS + "**/CVS", + "**/CVS/**", + "**/.cvsignore", + + // RCS + "**/RCS", + "**/RCS/**", + + // SCCS + "**/SCCS", + "**/SCCS/**", + + // Visual SourceSafe + "**/vssver.scc", + + // Subversion + "**/.svn", + "**/.svn/**", + + // Arch + "**/.arch-ids", + "**/.arch-ids/**", + + //Bazaar + "**/.bzr", + "**/.bzr/**", + + //SurroundSCM + "**/.MySCMServerInfo", + + // Mac + "**/.DS_Store", + + // Serena Dimensions Version 10 + "**/.metadata", + "**/.metadata/**", + + // Mercurial + "**/.hg", + "**/.hg/**", + + // git + "**/.git", + "**/.git/**", + + // BitKeeper + "**/BitKeeper", + "**/BitKeeper/**", + "**/ChangeSet", + "**/ChangeSet/**", + + // darcs + "**/_darcs", + "**/_darcs/**", + "**/.darcsrepo", + "**/.darcsrepo/**", + "**/-darcs-backup*", + "**/.darcs-temp-mail" + }; + + /** The patterns for the files to be included. */ + protected String[] includes; + + /** The patterns for the files to be excluded. */ + protected String[] excludes; + + /** + * Whether or not the file system should be treated as a case sensitive + * one. + */ + protected boolean isCaseSensitive = true; + + /** + * Sets whether or not the file system should be regarded as case sensitive. + * + * @param isCaseSensitive whether or not the file system should be + * regarded as a case sensitive one + */ + public void setCaseSensitive( boolean isCaseSensitive ) + { + this.isCaseSensitive = isCaseSensitive; + } + + /** + * Tests whether or not a given path matches the start of a given + * pattern up to the first "**". + *

+ * This is not a general purpose test and should only be used if you + * can live with false positives. For example, pattern=**\a + * and str=b will yield true. + * + * @param pattern The pattern to match against. Must not be + * null. + * @param str The path to match, as a String. Must not be + * null. + * + * @return whether or not a given path matches the start of a given + * pattern up to the first "**". + */ + protected static boolean matchPatternStart( String pattern, String str ) + { + return SelectorUtils.matchPatternStart( pattern, str ); + } + + /** + * Tests whether or not a given path matches the start of a given + * pattern up to the first "**". + *

+ * This is not a general purpose test and should only be used if you + * can live with false positives. For example, pattern=**\a + * and str=b will yield true. + * + * @param pattern The pattern to match against. Must not be + * null. + * @param str The path to match, as a String. Must not be + * null. + * @param isCaseSensitive Whether or not matching should be performed + * case sensitively. + * + * @return whether or not a given path matches the start of a given + * pattern up to the first "**". + */ + protected static boolean matchPatternStart( String pattern, String str, + boolean isCaseSensitive ) + { + return SelectorUtils.matchPatternStart( pattern, str, isCaseSensitive ); + } + + /** + * Tests whether or not a given path matches a given pattern. + * + * @param pattern The pattern to match against. Must not be + * null. + * @param str The path to match, as a String. Must not be + * null. + * + * @return true if the pattern matches against the string, + * or false otherwise. + */ + protected static boolean matchPath( String pattern, String str ) + { + return SelectorUtils.matchPath( pattern, str ); + } + + /** + * Tests whether or not a given path matches a given pattern. + * + * @param pattern The pattern to match against. Must not be + * null. + * @param str The path to match, as a String. Must not be + * null. + * @param isCaseSensitive Whether or not matching should be performed + * case sensitively. + * + * @return true if the pattern matches against the string, + * or false otherwise. + */ + protected static boolean matchPath( String pattern, String str, + boolean isCaseSensitive ) + { + return SelectorUtils.matchPath( pattern, str, isCaseSensitive ); + } + + /** + * Tests whether or not a string matches against a pattern. + * The pattern may contain two special characters:
+ * '*' means zero or more characters
+ * '?' means one and only one character + * + * @param pattern The pattern to match against. + * Must not be null. + * @param str The string which must be matched against the pattern. + * Must not be null. + * + * @return true if the string matches against the pattern, + * or false otherwise. + */ + public static boolean match( String pattern, String str ) + { + return SelectorUtils.match( pattern, str ); + } + + /** + * Tests whether or not a string matches against a pattern. + * The pattern may contain two special characters:
+ * '*' means zero or more characters
+ * '?' means one and only one character + * + * @param pattern The pattern to match against. + * Must not be null. + * @param str The string which must be matched against the pattern. + * Must not be null. + * @param isCaseSensitive Whether or not matching should be performed + * case sensitively. + * + * + * @return true if the string matches against the pattern, + * or false otherwise. + */ + protected static boolean match( String pattern, String str, + boolean isCaseSensitive ) + { + return SelectorUtils.match( pattern, str, isCaseSensitive ); + } + + + /** + * Sets the list of include patterns to use. All '/' and '\' characters + * are replaced by File.separatorChar, so the separator used + * need not match File.separatorChar. + *

+ * When a pattern ends with a '/' or '\', "**" is appended. + * + * @param includes A list of include patterns. + * May be null, indicating that all files + * should be included. If a non-null + * list is given, all elements must be + * non-null. + */ + public void setIncludes( String[] includes ) + { + if ( includes == null ) + { + this.includes = null; + } + else + { + this.includes = new String[includes.length]; + for ( int i = 0; i < includes.length; i++ ) + { + String pattern = includes[i].trim(); + if ( !pattern.startsWith( SelectorUtils.REGEX_HANDLER_PREFIX ) ) + { + pattern = pattern.replace( File.separatorChar == '/' ? '\\' : '/', File.separatorChar ); + } + + if ( pattern.endsWith( File.separator ) ) + { + pattern += "**"; + } + + this.includes[i] = pattern; + } + } + } + + /** + * Sets the list of exclude patterns to use. All '/' and '\' characters + * are replaced by File.separatorChar, so the separator used + * need not match File.separatorChar. + *

+ * When a pattern ends with a '/' or '\', "**" is appended. + * + * @param excludes A list of exclude patterns. + * May be null, indicating that no files + * should be excluded. If a non-null list is + * given, all elements must be non-null. + */ + public void setExcludes( String[] excludes ) + { + if ( excludes == null ) + { + this.excludes = null; + } + else + { + this.excludes = new String[excludes.length]; + for ( int i = 0; i < excludes.length; i++ ) + { + String pattern = excludes[i].trim(); + if ( !pattern.startsWith( SelectorUtils.REGEX_HANDLER_PREFIX ) ) + { + pattern = pattern.replace( File.separatorChar == '/' ? '\\' : '/', File.separatorChar ); + } + + if ( pattern.endsWith( File.separator ) ) + { + pattern += "**"; + } + + this.excludes[i] = pattern; + } + } + } + + + /** + * Tests whether or not a name matches against at least one include + * pattern. + * + * @param name The name to match. Must not be null. + * @return true when the name matches against at least one + * include pattern, or false otherwise. + */ + protected boolean isIncluded( String name ) + { + for ( int i = 0; i < includes.length; i++ ) + { + if ( matchPath( includes[i], name, isCaseSensitive ) ) + { + return true; + } + } + return false; + } + + /** + * Tests whether or not a name matches the start of at least one include + * pattern. + * + * @param name The name to match. Must not be null. + * @return true when the name matches against the start of at + * least one include pattern, or false otherwise. + */ + protected boolean couldHoldIncluded( String name ) + { + for ( int i = 0; i < includes.length; i++ ) + { + if ( matchPatternStart( includes[i], name, isCaseSensitive ) ) + { + return true; + } + } + return false; + } + + /** + * Tests whether or not a name matches against at least one exclude + * pattern. + * + * @param name The name to match. Must not be null. + * @return true when the name matches against at least one + * exclude pattern, or false otherwise. + */ + protected boolean isExcluded( String name ) + { + for ( int i = 0; i < excludes.length; i++ ) + { + if ( matchPath( excludes[i], name, isCaseSensitive ) ) + { + return true; + } + } + return false; + } + + /** + * Adds default exclusions to the current exclusions set. + */ + public void addDefaultExcludes() + { + int excludesLength = excludes == null ? 0 : excludes.length; + String[] newExcludes; + newExcludes = new String[excludesLength + DEFAULTEXCLUDES.length]; + if ( excludesLength > 0 ) + { + System.arraycopy( excludes, 0, newExcludes, 0, excludesLength ); + } + for ( int i = 0; i < DEFAULTEXCLUDES.length; i++ ) + { + newExcludes[i + excludesLength] = DEFAULTEXCLUDES[i]; + } + excludes = newExcludes; + } + + protected void setupDefaultFilters() + { + if ( includes == null ) + { + // No includes supplied, so set it to 'matches all' + includes = new String[1]; + includes[0] = "**"; + } + if ( excludes == null ) + { + excludes = new String[0]; + } + } +} Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/AbstractScanner.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/AbstractScanner.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/AbstractScanner.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/Base64.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/Base64.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/Base64.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/Base64.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,509 @@ +package org.apache.geronimo.system.plugin.plexus.util; + +/* + * Copyright 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. + */ + +/** + * Provides Base64 encoding and decoding as defined by RFC 2045. + * + *

This class implements section 6.8. Base64 Content-Transfer-Encoding + * from RFC 2045 Multipurpose Internet Mail Extensions (MIME) Part One: + * Format of Internet Message Bodies by Freed and Borenstein.

+ * + * @see RFC 2045 + * @author Apache Software Foundation + * @since 1.0-dev + * @version $Id: Base64.java 8010 2009-01-07 12:59:50Z vsiveton $ + */ +public class Base64 { + + // + // Source Id: Base64.java 161350 2005-04-14 20:39:46Z ggregory + // + + /** + * Chunk size per RFC 2045 section 6.8. + * + *

The {@value} character limit does not count the trailing CRLF, but counts + * all other characters, including any equal signs.

+ * + * @see RFC 2045 section 6.8 + */ + static final int CHUNK_SIZE = 76; + + /** + * Chunk separator per RFC 2045 section 2.1. + * + * @see RFC 2045 section 2.1 + */ + static final byte[] CHUNK_SEPARATOR = "\r\n".getBytes(); + + /** + * The base length. + */ + static final int BASELENGTH = 255; + + /** + * Lookup length. + */ + static final int LOOKUPLENGTH = 64; + + /** + * Used to calculate the number of bits in a byte. + */ + static final int EIGHTBIT = 8; + + /** + * Used when encoding something which has fewer than 24 bits. + */ + static final int SIXTEENBIT = 16; + + /** + * Used to determine how many bits data contains. + */ + static final int TWENTYFOURBITGROUP = 24; + + /** + * Used to get the number of Quadruples. + */ + static final int FOURBYTE = 4; + + /** + * Used to test the sign of a byte. + */ + static final int SIGN = -128; + + /** + * Byte used to pad output. + */ + static final byte PAD = (byte) '='; + + /** + * Contains the Base64 values 0 through 63 accessed by using character encodings as + * indices. + *

+ * For example, base64Alphabet['+'] returns 62. + *

+ *

+ * The value of undefined encodings is -1. + *

+ */ + private static byte[] base64Alphabet = new byte[BASELENGTH]; + + /** + *

+ * Contains the Base64 encodings A through Z, followed by a through + * z, followed by 0 through 9, followed by +, and + * /. + *

+ *

+ * This array is accessed by using character values as indices. + *

+ *

+ * For example, lookUpBase64Alphabet[62] returns '+'. + *

+ */ + private static byte[] lookUpBase64Alphabet = new byte[LOOKUPLENGTH]; + + // Populating the lookup and character arrays + static { + for (int i = 0; i < BASELENGTH; i++) { + base64Alphabet[i] = (byte) -1; + } + for (int i = 'Z'; i >= 'A'; i--) { + base64Alphabet[i] = (byte) (i - 'A'); + } + for (int i = 'z'; i >= 'a'; i--) { + base64Alphabet[i] = (byte) (i - 'a' + 26); + } + for (int i = '9'; i >= '0'; i--) { + base64Alphabet[i] = (byte) (i - '0' + 52); + } + + base64Alphabet['+'] = 62; + base64Alphabet['/'] = 63; + + for (int i = 0; i <= 25; i++) { + lookUpBase64Alphabet[i] = (byte) ('A' + i); + } + + for (int i = 26, j = 0; i <= 51; i++, j++) { + lookUpBase64Alphabet[i] = (byte) ('a' + j); + } + + for (int i = 52, j = 0; i <= 61; i++, j++) { + lookUpBase64Alphabet[i] = (byte) ('0' + j); + } + + lookUpBase64Alphabet[62] = (byte) '+'; + lookUpBase64Alphabet[63] = (byte) '/'; + } + + /** + * Returns whether or not the octect is in the base 64 alphabet. + * + * @param octect The value to test + * @return true if the value is defined in the the base 64 alphabet, false otherwise. + */ + private static boolean isBase64(byte octect) { + if (octect == PAD) { + return true; + } else if (octect < 0 || base64Alphabet[octect] == -1) { + return false; + } else { + return true; + } + } + + /** + * Tests a given byte array to see if it contains + * only valid characters within the Base64 alphabet. + * + * @param arrayOctect byte array to test + * @return true if all bytes are valid characters in the Base64 + * alphabet or if the byte array is empty; false, otherwise + */ + public static boolean isArrayByteBase64(byte[] arrayOctect) { + + arrayOctect = discardWhitespace(arrayOctect); + + int length = arrayOctect.length; + if (length == 0) { + // shouldn't a 0 length array be valid base64 data? + // return false; + return true; + } + for (int i = 0; i < length; i++) { + if (!isBase64(arrayOctect[i])) { + return false; + } + } + return true; + } + + /** + * Encodes binary data using the base64 algorithm but + * does not chunk the output. + * + * @param binaryData binary data to encode + * @return Base64 characters + */ + public static byte[] encodeBase64(byte[] binaryData) { + return encodeBase64(binaryData, false); + } + + /** + * Encodes binary data using the base64 algorithm and chunks + * the encoded output into 76 character blocks + * + * @param binaryData binary data to encode + * @return Base64 characters chunked in 76 character blocks + */ + public static byte[] encodeBase64Chunked(byte[] binaryData) { + return encodeBase64(binaryData, true); + } + + + /** + * Decodes a byte[] containing containing + * characters in the Base64 alphabet. + * + * @param pArray A byte array containing Base64 character data + * @return a byte array containing binary data + */ + public byte[] decode(byte[] pArray) { + return decodeBase64(pArray); + } + + /** + * Encodes binary data using the base64 algorithm, optionally + * chunking the output into 76 character blocks. + * + * @param binaryData Array containing binary data to encode. + * @param isChunked if true this encoder will chunk + * the base64 output into 76 character blocks + * @return Base64-encoded data. + */ + public static byte[] encodeBase64(byte[] binaryData, boolean isChunked) { + int lengthDataBits = binaryData.length * EIGHTBIT; + int fewerThan24bits = lengthDataBits % TWENTYFOURBITGROUP; + int numberTriplets = lengthDataBits / TWENTYFOURBITGROUP; + byte encodedData[] = null; + int encodedDataLength = 0; + int nbrChunks = 0; + + if (fewerThan24bits != 0) { + //data not divisible by 24 bit + encodedDataLength = (numberTriplets + 1) * 4; + } else { + // 16 or 8 bit + encodedDataLength = numberTriplets * 4; + } + + // If the output is to be "chunked" into 76 character sections, + // for compliance with RFC 2045 MIME, then it is important to + // allow for extra length to account for the separator(s) + if (isChunked) { + + nbrChunks = + (CHUNK_SEPARATOR.length == 0 ? 0 : (int) Math.ceil((float) encodedDataLength / CHUNK_SIZE)); + encodedDataLength += nbrChunks * CHUNK_SEPARATOR.length; + } + + encodedData = new byte[encodedDataLength]; + + byte k = 0, l = 0, b1 = 0, b2 = 0, b3 = 0; + + int encodedIndex = 0; + int dataIndex = 0; + int i = 0; + int nextSeparatorIndex = CHUNK_SIZE; + int chunksSoFar = 0; + + //log.debug("number of triplets = " + numberTriplets); + for (i = 0; i < numberTriplets; i++) { + dataIndex = i * 3; + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + b3 = binaryData[dataIndex + 2]; + + //log.debug("b1= " + b1 +", b2= " + b2 + ", b3= " + b3); + + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = + ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = + ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + byte val3 = + ((b3 & SIGN) == 0) ? (byte) (b3 >> 6) : (byte) ((b3) >> 6 ^ 0xfc); + + encodedData[encodedIndex] = lookUpBase64Alphabet[val1]; + //log.debug( "val2 = " + val2 ); + //log.debug( "k4 = " + (k<<4) ); + //log.debug( "vak = " + (val2 | (k<<4)) ); + encodedData[encodedIndex + 1] = + lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex + 2] = + lookUpBase64Alphabet[(l << 2) | val3]; + encodedData[encodedIndex + 3] = lookUpBase64Alphabet[b3 & 0x3f]; + + encodedIndex += 4; + + // If we are chunking, let's put a chunk separator down. + if (isChunked) { + // this assumes that CHUNK_SIZE % 4 == 0 + if (encodedIndex == nextSeparatorIndex) { + System.arraycopy( + CHUNK_SEPARATOR, + 0, + encodedData, + encodedIndex, + CHUNK_SEPARATOR.length); + chunksSoFar++; + nextSeparatorIndex = + (CHUNK_SIZE * (chunksSoFar + 1)) + + (chunksSoFar * CHUNK_SEPARATOR.length); + encodedIndex += CHUNK_SEPARATOR.length; + } + } + } + + // form integral number of 6-bit groups + dataIndex = i * 3; + + if (fewerThan24bits == EIGHTBIT) { + b1 = binaryData[dataIndex]; + k = (byte) (b1 & 0x03); + //log.debug("b1=" + b1); + //log.debug("b1<<2 = " + (b1>>2) ); + byte val1 = + ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + encodedData[encodedIndex] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex + 1] = lookUpBase64Alphabet[k << 4]; + encodedData[encodedIndex + 2] = PAD; + encodedData[encodedIndex + 3] = PAD; + } else if (fewerThan24bits == SIXTEENBIT) { + + b1 = binaryData[dataIndex]; + b2 = binaryData[dataIndex + 1]; + l = (byte) (b2 & 0x0f); + k = (byte) (b1 & 0x03); + + byte val1 = + ((b1 & SIGN) == 0) ? (byte) (b1 >> 2) : (byte) ((b1) >> 2 ^ 0xc0); + byte val2 = + ((b2 & SIGN) == 0) ? (byte) (b2 >> 4) : (byte) ((b2) >> 4 ^ 0xf0); + + encodedData[encodedIndex] = lookUpBase64Alphabet[val1]; + encodedData[encodedIndex + 1] = + lookUpBase64Alphabet[val2 | (k << 4)]; + encodedData[encodedIndex + 2] = lookUpBase64Alphabet[l << 2]; + encodedData[encodedIndex + 3] = PAD; + } + + if (isChunked) { + // we also add a separator to the end of the final chunk. + if (chunksSoFar < nbrChunks) { + System.arraycopy( + CHUNK_SEPARATOR, + 0, + encodedData, + encodedDataLength - CHUNK_SEPARATOR.length, + CHUNK_SEPARATOR.length); + } + } + + return encodedData; + } + + /** + * Decodes Base64 data into octects + * + * @param base64Data Byte array containing Base64 data + * @return Array containing decoded data. + */ + public static byte[] decodeBase64(byte[] base64Data) { + // RFC 2045 requires that we discard ALL non-Base64 characters + base64Data = discardNonBase64(base64Data); + + // handle the edge case, so we don't have to worry about it later + if (base64Data.length == 0) { + return new byte[0]; + } + + int numberQuadruple = base64Data.length / FOURBYTE; + byte decodedData[] = null; + byte b1 = 0, b2 = 0, b3 = 0, b4 = 0, marker0 = 0, marker1 = 0; + + // Throw away anything not in base64Data + + int encodedIndex = 0; + int dataIndex = 0; + { + // this sizes the output array properly - rlw + int lastData = base64Data.length; + // ignore the '=' padding + while (base64Data[lastData - 1] == PAD) { + if (--lastData == 0) { + return new byte[0]; + } + } + decodedData = new byte[lastData - numberQuadruple]; + } + + for (int i = 0; i < numberQuadruple; i++) { + dataIndex = i * 4; + marker0 = base64Data[dataIndex + 2]; + marker1 = base64Data[dataIndex + 3]; + + b1 = base64Alphabet[base64Data[dataIndex]]; + b2 = base64Alphabet[base64Data[dataIndex + 1]]; + + if (marker0 != PAD && marker1 != PAD) { + //No PAD e.g 3cQl + b3 = base64Alphabet[marker0]; + b4 = base64Alphabet[marker1]; + + decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex + 1] = + (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + decodedData[encodedIndex + 2] = (byte) (b3 << 6 | b4); + } else if (marker0 == PAD) { + //Two PAD e.g. 3c[Pad][Pad] + decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + } else if (marker1 == PAD) { + //One PAD e.g. 3cQ[Pad] + b3 = base64Alphabet[marker0]; + + decodedData[encodedIndex] = (byte) (b1 << 2 | b2 >> 4); + decodedData[encodedIndex + 1] = + (byte) (((b2 & 0xf) << 4) | ((b3 >> 2) & 0xf)); + } + encodedIndex += 3; + } + return decodedData; + } + + /** + * Discards any whitespace from a base-64 encoded block. + * + * @param data The base-64 encoded data to discard the whitespace + * from. + * @return The data, less whitespace (see RFC 2045). + */ + static byte[] discardWhitespace(byte[] data) { + byte groomedData[] = new byte[data.length]; + int bytesCopied = 0; + + for (int i = 0; i < data.length; i++) { + switch (data[i]) { + case (byte) ' ' : + case (byte) '\n' : + case (byte) '\r' : + case (byte) '\t' : + break; + default: + groomedData[bytesCopied++] = data[i]; + } + } + + byte packedData[] = new byte[bytesCopied]; + + System.arraycopy(groomedData, 0, packedData, 0, bytesCopied); + + return packedData; + } + + /** + * Discards any characters outside of the base64 alphabet, per + * the requirements on page 25 of RFC 2045 - "Any characters + * outside of the base64 alphabet are to be ignored in base64 + * encoded data." + * + * @param data The base-64 encoded data to groom + * @return The data, less non-base64 characters (see RFC 2045). + */ + static byte[] discardNonBase64(byte[] data) { + byte groomedData[] = new byte[data.length]; + int bytesCopied = 0; + + for (int i = 0; i < data.length; i++) { + if (isBase64(data[i])) { + groomedData[bytesCopied++] = data[i]; + } + } + + byte packedData[] = new byte[bytesCopied]; + + System.arraycopy(groomedData, 0, packedData, 0, bytesCopied); + + return packedData; + } + + /** + * Encodes a byte[] containing binary data, into a byte[] containing + * characters in the Base64 alphabet. + * + * @param pArray a byte array containing binary data + * @return A byte array containing only Base64 character data + */ + public byte[] encode(byte[] pArray) { + return encodeBase64(pArray, false); + } + +} Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/Base64.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/Base64.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/Base64.java ------------------------------------------------------------------------------ svn:mime-type = text/plain Added: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/CachedMap.java URL: http://svn.apache.org/viewvc/geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/CachedMap.java?rev=821961&view=auto ============================================================================== --- geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/CachedMap.java (added) +++ geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/CachedMap.java Mon Oct 5 18:54:50 2009 @@ -0,0 +1,407 @@ +/* + * J.A.D.E. Java(TM) Addition to Default Environment. + * Latest release available at http://jade.dautelle.com/ + * This class is public domain (not copyrighted). + */ +package org.apache.geronimo.system.plugin.plexus.util; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +/** + *

This class provides cache access to Map collections.

+ * + *

Instance of this class can be used as "proxy" for any collection + * implementing the java.util.Map interface.

+ * + *

Typically, {@link CachedMap} are used to accelerate access to + * large collections when the access to the collection is not evenly + * distributed (associative cache). The performance gain is about + * 50% for the fastest hash map collections (e.g. {@link FastMap}). + * For slower collections such as java.util.TreeMap, + * non-resizable {@link FastMap} (real-time) or database access, + * performance can be of several orders of magnitude.

+ * + *

Note: The keys used to access elements of a {@link CachedMap} do + * not need to be immutable as they are not stored in the cache + * (only keys specified by the {@link #put} method are). + * In other words, access can be performed using mutable keys as long + * as these keys can be compared for equality with the real map's keys + * (e.g. same hashCode values).

+ * + *

This implementation is not synchronized. Multiple threads accessing + * or modifying the collection must be synchronized externally.

+ * + *

This class is public domain (not copyrighted).

+ * + * @author Jean-Marie Dautelle + * @version 5.3, October 30, 2003 + */ +public final class CachedMap implements Map { + + /** + * Holds the FastMap backing this collection + * (null if generic backing map). + */ + private final FastMap _backingFastMap; + + /** + * Holds the generic map backing this collection. + */ + private final Map _backingMap; + + /** + * Holds the keys of the backing map (key-to-key mapping). + * (null if FastMap backing map). + */ + private final FastMap _keysMap; + + /** + * Holds the cache's mask (capacity - 1). + */ + private final int _mask; + + /** + * Holds the keys being cached. + */ + private final Object[] _keys; + + /** + * Holds the values being cached. + */ + private final Object[] _values; + + /** + * Creates a cached map backed by a {@link FastMap}. + * The default cache size and map capacity is set to 256 + * entries. + */ + public CachedMap() { + this(256, new FastMap()); + } + + /** + * Creates a cached map backed by a {@link FastMap} and having the + * specified cache size. + * + * @param cacheSize the cache size, the actual cache size is the + * first power of 2 greater or equal to cacheSize. + * This is also the initial capacity of the backing map. + */ + public CachedMap(int cacheSize) { + this(cacheSize, new FastMap(cacheSize)); + } + + /** + * Creates a cached map backed by the specified map and having the specified + * cache size. In order to maitain cache veracity, it is critical + * that all update to the backing map is accomplished through the + * {@link CachedMap} instance; otherwise {@link #flush} has to be called. + * + * @param cacheSize the cache size, the actual cache size is the + * first power of 2 greater or equal to cacheSize. + * @param backingMap the backing map to be "wrapped" in a cached map. + */ + public CachedMap(int cacheSize, Map backingMap) { + + // Find a power of 2 >= minimalCache + int actualCacheSize = 1; + while (actualCacheSize < cacheSize) { + actualCacheSize <<= 1; + } + + // Sets up cache. + _keys = new Object[actualCacheSize]; + _values = new Object[actualCacheSize]; + _mask = actualCacheSize - 1; + + // Sets backing map references. + if (backingMap instanceof FastMap) { + _backingFastMap = (FastMap)backingMap; + _backingMap = _backingFastMap; + _keysMap = null; + } else { + _backingFastMap = null; + _backingMap = backingMap; + _keysMap = new FastMap(backingMap.size()); + for (Iterator i= backingMap.keySet().iterator(); i.hasNext();) { + Object key = i.next(); + _keysMap.put(key, key); + } + } + } + + /** + * Returns the actual cache size. + * + * @return the cache size (power of 2). + */ + public int getCacheSize() { + return _keys.length; + } + + /** + * Returns the backing map. If the backing map is modified directly, + * this {@link CachedMap} has to be flushed. + * + * @return the backing map. + * @see #flush + */ + public Map getBackingMap() { + return (_backingFastMap != null) ? _backingFastMap : _backingMap; + } + + /** + * Flushes the key/value pairs being cached. This method should be called + * if the backing map is externally modified. + */ + public void flush() { + for (int i=0; i < _keys.length; i++) { + _keys[i] = null; + _values[i] = null; + } + + if (_keysMap != null) { + // Re-populates keys from backing map. + for (Iterator i= _backingMap.keySet().iterator(); i.hasNext();) { + Object key = i.next(); + _keysMap.put(key, key); + } + } + } + + /** + * Returns the value to which this map maps the specified key. + * First, the cache is being checked, then if the cache does not contains + * the specified key, the backing map is accessed and the key/value + * pair is stored in the cache. + * + * @param key the key whose associated value is to be returned. + * @return the value to which this map maps the specified key, or + * null if the map contains no mapping for this key. + * @throws ClassCastException if the key is of an inappropriate type for + * the backing map (optional). + * @throws NullPointerException if the key is null. + */ + public Object get(Object key) { + int index = key.hashCode() & _mask; + return key.equals(_keys[index]) ? + _values[index] : getCacheMissed(key, index); + } + private Object getCacheMissed(Object key, int index) { + if (_backingFastMap != null) { + Map.Entry entry = _backingFastMap.getEntry(key); + if (entry != null) { + _keys[index] = entry.getKey(); + Object value = entry.getValue(); + _values[index] = value; + return value; + } else { + return null; + } + } else { // Generic backing map. + Object mapKey = _keysMap.get(key); + if (mapKey != null) { + _keys[index] = mapKey; + Object value = _backingMap.get(key); + _values[index] = value; + return value; + } else { + return null; + } + } + } + + /** + * Associates the specified value with the specified key in this map. + * + * @param key the key with which the specified value is to be associated. + * @param value the value to be associated with the specified key. + * @return the previous value associated with specified key, or + * null if there was no mapping for the key. + * @throws UnsupportedOperationException if the put operation + * is not supported by the backing map. + * @throws ClassCastException if the class of the specified key or value + * prevents it from being stored in this map. + * @throws IllegalArgumentException if some aspect of this key or value + * prevents it from being stored in this map. + * @throws NullPointerException if the key is null. + */ + public Object put(Object key, Object value) { + // Updates the cache. + int index = key.hashCode() & _mask; + if (key.equals(_keys[index]) ) { + _values[index] = value; + } else if (_keysMap != null) { // Possibly a new key. + _keysMap.put(key, key); + } + + // Updates the backing map. + return _backingMap.put(key, value); + } + + /** + * Removes the mapping for this key from this map if it is present. + * + * @param key key whose mapping is to be removed from the map. + * @return previous value associated with specified key, + * or null if there was no mapping for key. + * @throws ClassCastException if the key is of an inappropriate type for + * the backing map (optional). + * @throws NullPointerException if the key is null. + * @throws UnsupportedOperationException if the remove method + * is not supported by the backing map. + */ + public Object remove(Object key) { + // Removes from cache. + int index = key.hashCode() & _mask; + if (key.equals(_keys[index]) ) { + _keys[index] = null; + } + // Removes from key map. + if (_keysMap != null) { + _keysMap.remove(key); + } + // Removes from backing map. + return _backingMap.remove(key); + } + + /** + * Indicates if this map contains a mapping for the specified key. + * + * @param key the key whose presence in this map is to be tested. + * @return true if this map contains a mapping for the + * specified key; false otherwise. + */ + public boolean containsKey(Object key) { + // Checks the cache. + int index = key.hashCode() & _mask; + if (key.equals(_keys[index]) ) { + return true; + } else { // Checks the backing map. + return _backingMap.containsKey(key); + } + } + + /** + * Returns the number of key-value mappings in this map. If the + * map contains more than Integer.MAX_VALUE elements, + * returns Integer.MAX_VALUE. + * + * @return the number of key-value mappings in this map. + */ + public int size() { + return _backingMap.size(); + } + + /** + * Returns true if this map contains no key-value mappings. + * + * @return true if this map contains no key-value mappings. + */ + public boolean isEmpty() { + return _backingMap.isEmpty(); + } + + /** + * Returns true if this map maps one or more keys to the + * specified value. + * + * @param value value whose presence in this map is to be tested. + * @return true if this map maps one or more keys to the + * specified value. + * @throws ClassCastException if the value is of an inappropriate type for + * the backing map (optional). + * @throws NullPointerException if the value is null and the + * backing map does not not permit null values. + */ + public boolean containsValue(Object value) { + return _backingMap.containsValue(value); + } + + /** + * Copies all of the mappings from the specified map to this map + * (optional operation). This method automatically flushes the cache. + * + * @param map the mappings to be stored in this map. + * @throws UnsupportedOperationException if the putAll method + * is not supported by the backing map. + * @throws ClassCastException if the class of a key or value in the + * specified map prevents it from being stored in this map. + * @throws IllegalArgumentException some aspect of a key or value in the + * specified map prevents it from being stored in this map. + * @throws NullPointerException the specified map is null, or + * if the backing map does not permit null keys or + * values, and the specified map contains null keys or + * values. + */ + public void putAll(Map map) { + _backingMap.putAll(map); + flush(); + } + + /** + * Removes all mappings from this map (optional operation). This method + * automatically flushes the cache. + * + * @throws UnsupportedOperationException if clear is not supported by the + * backing map. + */ + public void clear() { + _backingMap.clear(); + flush(); + } + + /** + * Returns an unmodifiable view of the keys contained in this + * map. + * + * @return an unmodifiable view of the keys contained in this map. + */ + public Set keySet() { + return Collections.unmodifiableSet(_backingMap.keySet()); + } + + /** + * Returns an unmodifiable view of the values contained in this map. + * + * @return an unmodifiable view of the values contained in this map. + */ + public Collection values() { + return Collections.unmodifiableCollection(_backingMap.values()); + } + + /** + * Returns an unmodifiable view of the mappings contained in this + * map. Each element in the returned set is a Map.Entry. + * + * @return an unmodifiable view of the mappings contained in this map. + */ + public Set entrySet() { + return Collections.unmodifiableSet(_backingMap.entrySet()); + } + + + /** + * Compares the specified object with this map for equality. Returns + * true if the given object is also a map and the two Maps + * represent the same mappings. + * + * @param o object to be compared for equality with this map. + * @return true if the specified object is equal to this map. + */ + public boolean equals(Object o) { + return _backingMap.equals(o); + } + + /** + * Returns the hash code value for this map. + * + * @return the hash code value for this map. + */ + public int hashCode() { + return _backingMap.hashCode(); + } +} \ No newline at end of file Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/CachedMap.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/CachedMap.java ------------------------------------------------------------------------------ svn:keywords = Date Revision Propchange: geronimo/sandbox/djencks/osgi/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/plexus/util/CachedMap.java ------------------------------------------------------------------------------ svn:mime-type = text/plain