Author: mcconnell
Date: Sun Jun 27 08:23:57 2004
New Revision: 22201
Added:
avalon/trunk/central/laboratory/cache/
avalon/trunk/central/laboratory/cache/build.xml
avalon/trunk/central/laboratory/cache/etc/
avalon/trunk/central/laboratory/cache/etc/main/
avalon/trunk/central/laboratory/cache/etc/main/BLOCK-INF/
avalon/trunk/central/laboratory/cache/etc/main/BLOCK-INF/block.xml
avalon/trunk/central/laboratory/cache/src/
avalon/trunk/central/laboratory/cache/src/main/
avalon/trunk/central/laboratory/cache/src/main/org/
avalon/trunk/central/laboratory/cache/src/main/org/apache/
avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/
avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/
avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/DefaultCache.java
avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/DefaultCache.xconfig
avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/package.html
Log:
Add private repository cache component.
Added: avalon/trunk/central/laboratory/cache/build.xml
==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/cache/build.xml Sun Jun 27 08:23:57 2004
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<project name="avalon-planet-cache" default="install" basedir="."
+ xmlns:x="antlib:org.apache.avalon.tools">
+
+ <x:home index="../../system/index.xml"/>
+ <import file="../../system/build/standard.xml"/>
+
+ <target name="package" depends="standard.package">
+ <x:declare/>
+ </target>
+
+</project>
Added: avalon/trunk/central/laboratory/cache/etc/main/BLOCK-INF/block.xml
==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/cache/etc/main/BLOCK-INF/block.xml Sun Jun 27 08:23:57 2004
@@ -0,0 +1,33 @@
+
+<!--
+Embedded block directive for cache component.
+-->
+
+<container name="repository">
+
+ <!-- TODO: figure out how to put the classpath in automatically -->
+
+ <classloader>
+ <classpath>
+ <artifact>jar:avalon/framework/avalon-framework-api#4.3.0-DEV</artifact>
+ <artifact>jar:avalon/repository/avalon-repository-main#2.1.0-DEV</artifact>
+ <artifact>jar:avalon/repository/avalon-repository-spi#2.0.0</artifact>
+ <artifact>jar:avalon/repository/avalon-repository-api#2.1.0-DEV</artifact>
+ <artifact>jar:avalon/repository/avalon-repository-util#2.0.0</artifact>
+ <artifact>jar:avalon/util/avalon-util-exception#1.0.0</artifact>
+ <artifact>jar:avalon/util/avalon-util-env#1.1.1</artifact>
+ <artifact>jar:avalon/util/avalon-util-i18n#1.0.0</artifact>
+ <artifact>jar:avalon/util/avalon-util-criteria#1.1.0</artifact>
+ <artifact>jar:avalon/util/avalon-util-defaults#1.2.1</artifact>
+ <artifact>jar:avalon/planet/avalon-planet-cache#1.0.0-DEV</artifact>
+ </classpath>
+ </classloader>
+
+ <services>
+ <service type="org.apache.avalon.repository.Repository"/>
+ </services>
+
+ <component name="cache"
+ class="org.apache.avalon.cache.DefaultCache"/>
+
+</container>
Added: avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/DefaultCache.java
==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/DefaultCache.java Sun Jun 27 08:23:57 2004
@@ -0,0 +1,258 @@
+/*
+ * Copyright 2004 The Apache Software 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.
+ */
+
+package org.apache.avalon.cache;
+
+import java.net.URL;
+import java.io.File;
+import java.io.IOException;
+import javax.naming.directory.Attributes;
+
+import org.apache.avalon.framework.logger.Logger;
+import org.apache.avalon.framework.context.Context;
+import org.apache.avalon.framework.context.ContextException;
+import org.apache.avalon.framework.configuration.Configuration;
+import org.apache.avalon.framework.configuration.ConfigurationException;
+
+import org.apache.avalon.repository.Artifact;
+import org.apache.avalon.repository.Repository;
+import org.apache.avalon.repository.RepositoryException;
+import org.apache.avalon.repository.provider.InitialContext;
+import org.apache.avalon.repository.provider.InitialContextFactory;
+import org.apache.avalon.repository.main.DefaultInitialContextFactory;
+
+/**
+ * A component implementing a file cache using the Avalon Repository API
+ * as the service contract.
+ *
+ * @avalon.component name="cache" lifestyle="singleton"
+ * @avalon.service type="org.apache.avalon.repository.Repository"
+ * @avalon.attribute key="urn:composition:deployment.timeout" value="0"
+ * @author <a href="mailto:[email protected]">Avalon Development Team</a>
+ * @version $Revision: 1.6 $
+ */
+public class DefaultCache implements Repository
+{
+ public static final String DEFAULT_CACHE_KEY = "cache";
+ public static final String DEFAULT_CACHE_NAME = "cache";
+ public static final String CACHE_DIR_KEY = "urn:avalon:cache.dir";
+ public static final String CACHE_KEY_KEY = "urn:avalon:cache.key";
+
+ private final Logger m_logger;
+ private final Repository m_repository;
+
+ /**
+ * Creation of a new cashe instance. The cache implementation
+ * will establish a cache relative to the supplied context
+ * entry urn:avalon:cache.dir" if supplied (optional context entry).
+ * If not declared the cache will be established under ${avalon.home}/cache
+ * (where ${avalon.home} is the value of the file returned from
+ * "urn:avalon:home".
+ *
+ * @avalon.entry key="urn:avalon:home" type="java.io.File"
+ * @avalon.entry key="urn:avalon:cache.dir" type="java.io.File" optional="true"
+ * @avalon.entry key="urn:avalon:cache.key" optional="true"
+ *
+ * @param logger the assigned logging channel
+ * @param context the component context
+ * @param config the component configuration
+ */
+ public DefaultCache( Logger logger, Context context, Configuration config )
+ throws ContextException, ConfigurationException,
+ RepositoryException, IOException
+ {
+ m_logger = logger;
+
+ File basedir = (File) context.get( "urn:avalon:home" );
+ File cache = getCacheDirectory( basedir, context );
+ String key = getCacheKey( context );
+
+
+ String host = config.getAttribute( "default" );
+ Configuration conf = config.getChild( "hosts" );
+ Configuration[] children = conf.getChildren( "host" );
+ String[] hosts = new String[ children.length ];
+ for( int i=0; i<hosts.length; i++ )
+ {
+ Configuration child = children[i];
+ hosts[i] = child.getValue();
+ }
+
+ m_repository = setupRepository( basedir, cache, key, hosts, host );
+
+ getLogger().debug( "Cache: [" + cache + "].");
+ }
+
+ //---------------------------------------------------------------------
+ // Repository
+ //---------------------------------------------------------------------
+
+ /**
+ * Return the metadata of an artifact as attributes.
+ * @param artifact the artifact
+ * @return the attributes resolved relative to the artifact address
+ * @exception RepositoryException if an error occurs while resolving
+ * artifact metadata attributes
+ */
+ public Attributes getAttributes( Artifact artifact )
+ throws RepositoryException
+ {
+ return m_repository.getAttributes( artifact );
+ }
+
+ /**
+ * Get a resource url relative to the supplied artifact.
+ *
+ * @param artifact the artifact describing the resource
+ * @return the resource url
+ */
+ public URL getResource( Artifact artifact ) throws RepositoryException
+ {
+ return m_repository.getResource( artifact );
+ }
+
+ /**
+ * Return the set of available artifacts capable of providing the
+ * supplied service class.
+ *
+ * @return the set of candidate factory artifacts
+ */
+ public Artifact[] getCandidates( Class service )
+ {
+ return m_repository.getCandidates( service );
+ }
+
+ /**
+ * Creates a ClassLoader chain returning the lowest ClassLoader containing
+ * the jar artifact in the loader's path. The dependencies of the argument
+ * artifact jar and an api, spi and implementation attribute on the jar and
+ * its dependencies are used to construct the ClassLoaders.
+ *
+ * @param artifact the implementation artifact
+ * @return the lowest ClassLoader in a chain
+ * @throws RepositoryException if there is a problem caching and accessing
+ * repository artifacts and reading their attributes.
+ */
+ public ClassLoader getClassLoader( Artifact artifact )
+ throws RepositoryException
+ {
+ return m_repository.getClassLoader( artifact );
+ }
+
+ /**
+ * Creates a ClassLoader chain returning the lowest ClassLoader containing
+ * the jar artifact in the loader's path. The dependencies of the argument
+ * artifact jar and an api, spi and implementation attribute on the jar and
+ * its dependencies are used to construct the ClassLoaders.
+ *
+ * @param parent the parent classloader
+ * @param artifact the implementation artifact
+ * @return the lowest ClassLoader in a chain
+ * @throws RepositoryException if there is a problem caching and accessing
+ * repository artifacts and reading their attributes.
+ */
+ public ClassLoader getClassLoader( ClassLoader parent, Artifact artifact )
+ throws RepositoryException
+ {
+ return m_repository.getClassLoader( parent, artifact );
+ }
+
+ //---------------------------------------------------------------------
+ // private
+ //---------------------------------------------------------------------
+
+ private File getCacheDirectory( File basedir, Context context )
+ throws ContextException
+ {
+ File cache = (File) context.get( CACHE_DIR_KEY );
+ if( null == cache )
+ {
+ return new File( basedir, DEFAULT_CACHE_NAME );
+ }
+ else
+ {
+ return cache;
+ }
+ }
+
+ private String getCacheKey( Context context ) throws ContextException
+ {
+ String key = (String) context.get( CACHE_KEY_KEY );
+ if( null == key )
+ {
+ return DEFAULT_CACHE_KEY;
+ }
+ else
+ {
+ return key;
+ }
+ }
+
+ private Repository setupRepository(
+ File basedir, File cache, String key, String[] hosts, String host )
+ throws RepositoryException, IOException
+ {
+ getLogger().debug( "Repository context factory creation." );
+
+ InitialContextFactory factory =
+ new DefaultInitialContextFactory( key, cache );
+ factory.setCacheDirectory( cache );
+
+ if( hosts.length > 0 )
+ {
+ factory.setHosts( hosts );
+ }
+ else
+ {
+ factory.setHosts( new String[]{ host } );
+ }
+
+ getLogger().debug( "Repository context creation." );
+
+ InitialContext context = factory.createInitialContext();
+
+ //
+ // prints out the working and cache directory, and the
+ // set of initial hosts assigned to the initial context
+ //
+
+ if( getLogger().isDebugEnabled() )
+ {
+ getLogger().debug(
+ "InitialContext work: "
+ + context.getInitialWorkingDirectory() );
+ getLogger().debug(
+ "InitialContext cache: "
+ + context.getInitialCacheDirectory() );
+ final String[] theHosts = context.getInitialHosts();
+ for( int i=0; i<theHosts.length; i++ )
+ {
+ getLogger().debug(
+ " host (" + (i+1) + "): "
+ + theHosts[i] );
+ }
+ }
+
+ getLogger().debug( "Repository creation." );
+
+ return context.getRepository();
+ }
+
+ private Logger getLogger()
+ {
+ return m_logger;
+ }
+}
Added: avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/DefaultCache.xconfig
==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/DefaultCache.xconfig Sun Jun 27 08:23:57 2004
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+ * Copyright 2004 The Apache Software 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.
+-->
+
+<configuration default="http://www.dpml.net/"/>
Added: avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/package.html
==============================================================================
--- (empty file)
+++ avalon/trunk/central/laboratory/cache/src/main/org/apache/avalon/cache/package.html Sun Jun 27 08:23:57 2004
@@ -0,0 +1,5 @@
+
+<body>
+<p>
+A component that implements a repository service.</p>
+</body>
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.