You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by mc...@apache.org on 2004/01/31 14:29:50 UTC
cvs commit: avalon/repository/cli .cvsignore maven.xml project.properties project.xml
mcconnell 2004/01/31 05:29:50
Modified: repository .cvsignore LICENSE.txt README.TXT maven.xml
project.xml
repository/main/src/java/org/apache/avalon/repository/main
AbstractBuilder.java DefaultBuilder.java
DefaultInitialContext.java
repository/spi/src/java/org/apache/avalon/repository/provider
Builder.java InitialContext.java
Added: repository/cli .cvsignore maven.xml project.properties
project.xml
Log:
Update build procedure to include:
1. consitent deliverable naming convention
2. automation of MD5 and ASC file creation for jar and distribution artifacts
System changes encompassing:
1. updates to the InitialContext and Builder interface and implementation to support target class retrival and bar exansion
2. addition of a commandline interface supporting bar file retrival
3. implementation of bar expansion via the InitialContext
Admin updates include ASL 2.0 in main license file
Revision Changes Path
1.2 +2 -1 avalon/repository/.cvsignore
Index: .cvsignore
===================================================================
RCS file: /home/cvs/avalon/repository/.cvsignore,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- .cvsignore 4 Dec 2003 22:02:38 -0000 1.1
+++ .cvsignore 31 Jan 2004 13:29:49 -0000 1.2
@@ -3,4 +3,5 @@
target
.classpath
.project
-build.xml
\ No newline at end of file
+build.xml
+build.properties
\ No newline at end of file
1.3 +176 -16 avalon/repository/LICENSE.txt
Index: LICENSE.txt
===================================================================
RCS file: /home/cvs/avalon/repository/LICENSE.txt,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- LICENSE.txt 24 Jan 2004 23:20:03 -0000 1.2
+++ LICENSE.txt 31 Jan 2004 13:29:49 -0000 1.3
@@ -1,16 +1,176 @@
-/*
- * Copyright 2004 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.
- */
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
1.3 +22 -4 avalon/repository/README.TXT
Index: README.TXT
===================================================================
RCS file: /home/cvs/avalon/repository/README.TXT,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- README.TXT 8 Dec 2003 12:48:48 -0000 1.2
+++ README.TXT 31 Jan 2004 13:29:49 -0000 1.3
@@ -11,8 +11,26 @@
container facilities that serves at the overal bootstrapping
platform.
-Build instructions
-------------------
+Binary Installation Procedure
+-----------------------------
+
+After downloading and unpacking the distribution you should copy
+or move the directory 'avalon-VERSION' to a convinient location and
+then declare an environment variable AVALON_HOME to reference this
+directory. You should also include AVALON_HOME/bin in you system
+PATH. To verify your installation - invoke the following command
+from a new command window:
+
+ repository -info
+
+This will list information about the default cache directory, hosts
+and working directory. For additional command options use:
+
+ repository -help
+
+
+CVS Build instructions
+----------------------
Build Dependencies: Maven beta10 or later.
@@ -34,12 +52,12 @@
Structure
---------
-The repository facility is structured into 7 build subprojects.
+The repository facility is structured into 8 build subprojects.
* api -- the client API
+* cli -- the command line tools
* impl -- the default implementation
* main -- the bootstrap deliverable
-* plugin -- maven plugin supporting artifact metadata generation
* site -- site documentation
* spi -- interfaces and imutable classes required by a repository
implementation (in addition to the api)
1.9 +139 -26 avalon/repository/maven.xml
Index: maven.xml
===================================================================
RCS file: /home/cvs/avalon/repository/maven.xml,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- maven.xml 25 Dec 2003 00:56:39 -0000 1.8
+++ maven.xml 31 Jan 2004 13:29:49 -0000 1.9
@@ -1,9 +1,26 @@
<project default="avalon:build" xmlns:maven="jelly:maven" xmlns:j="jelly:core" xmlns:util="jelly:util" xmlns:ant="jelly:ant">
- <ant:property name="pom.organization.identifier" value="ASF"/>
- <ant:property name="pom.specificationVersion" value="1.2"/>
- <ant:property name="maven.docs.src" value="${basedir}/site/xdocs"/>
- <ant:property file="project.properties"/>
+ <!--
+ ==============================================================================
+ switches
+ ==============================================================================
+ -->
+
+ <ant:property name="avalon.snapshot" value="true"/>
+
+ <!--
+ ==============================================================================
+ dependent properties
+ ==============================================================================
+ -->
+
+ <ant:property name="avalon.cli.version" value="1.3-SNAPSHOT"/>
+
+ <!--
+ ==============================================================================
+ derived properties
+ ==============================================================================
+ -->
<ant:property name="maven.dist.assembly.dir"
value="${maven.build.dir}/temp"/>
@@ -12,12 +29,29 @@
<ant:property name="maven.dist.src.archive.dir"
value="${maven.dist.assembly.dir}/src"/>
<ant:property name="maven.dist.bin.assembly.dir"
- value="${maven.dist.assembly.dir}/bin/${pom.artifactId}"/>
+ value="${maven.dist.assembly.dir}/bin/avalon-${pom.currentVersion}"/>
<ant:property name="maven.dist.src.assembly.dir"
value="${maven.dist.assembly.dir}/src/${pom.artifactId}"/>
<ant:property name="maven.dist.dir"
value="${maven.build.dir}/distributions"/>
+ <!--
+ ==============================================================================
+ structural properties
+ ==============================================================================
+ -->
+
+ <ant:property name="pom.specificationVersion" value="1.2"/>
+ <ant:property name="pom.organization.identifier" value="ASF"/>
+ <ant:property name="maven.docs.src" value="${basedir}/site/xdocs"/>
+ <ant:property file="project.properties"/>
+
+ <!--
+ ==============================================================================
+ build the repository package
+ ==============================================================================
+ -->
+
<goal name="avalon:build" description="Build the Repository.">
<maven:reactor basedir="${basedir}"
@@ -28,7 +62,7 @@
ignoreFailures="false"
postProcessing="true" />
- <ant:copy todir="${maven.build.dir}">
+ <ant:copy todir="${maven.build.dir}/jars">
<j:forEach var="child" items="${reactorProjects}">
<ant:fileset dir="${child.file.parentFile}/target">
<ant:include name="${child.artifactId}-${child.currentVersion}.jar"/>
@@ -36,7 +70,33 @@
</ant:fileset>
</j:forEach>
</ant:copy>
-
+ <j:forEach var="child" items="${reactorProjects}">
+ <j:set var="path" value="${child.artifactId}-${child.currentVersion}"/>
+ <util:file var="jarFile" name="${maven.build.dir}/jars/${path}.jar"/>
+ <j:if test="${jarFile.exists()}">
+ <checksum file="${jarFile}"/>
+ <j:if test="${maven.gpg.exe != ''}">
+ <ant:exec executable="${maven.gpg.exec}">
+ <ant:arg value="--armour"/>
+ <ant:arg value="--yes"/>
+ <ant:arg value="-b"/>
+ <ant:arg value="${jarFile}"/>
+ </ant:exec>
+ </j:if>
+ </j:if>
+ <util:file var="metaFile" name="${maven.build.dir}/jars/${path}.jar.meta"/>
+ <j:if test="${metaFile.exists()}">
+ <checksum file="${metaFile}"/>
+ <j:if test="${maven.gpg.exe != ''}">
+ <ant:exec executable="${maven.gpg.exec}">
+ <ant:arg value="--armour"/>
+ <ant:arg value="--yes"/>
+ <ant:arg value="-b"/>
+ <ant:arg value="${metaFile}"/>
+ </ant:exec>
+ </j:if>
+ </j:if>
+ </j:forEach>
</goal>
<goal name="avalon:clean" prereqs="clean" description="Clean all subprojects.">
@@ -67,7 +127,7 @@
<goal
name="xdist:build"
- prereqs="xdist:build-bin,xdist:build-src"
+ prereqs="xdist:build-setup,xdist:build-bin,xdist:build-src"
description="Build a complete distribution.">
</goal>
@@ -76,54 +136,89 @@
description="Set up directories for a distribution build">
<ant:delete dir="${maven.dist.dir}"/>
<ant:mkdir dir="${maven.dist.dir}"/>
- </goal>
+ <j:choose>
+ <j:when test="${avalon.snapshot}">
+ <maven:snapshot project="${pom}"/>
+ <j:set var="timestamp" value="${snapshotSignature.substring(18)}"/>
+ <j:set var="binary.name" value="${maven.final.name}-${timestamp}-dist"/>
+ <j:set var="source.name" value="${maven.final.name}-${timestamp}-src"/>
+ <echo>Snapshot Packaging: ${timestamp}</echo>
+ </j:when>
+ <j:otherwise>
+ <j:set var="binary.name" value="${maven.final.name}-dist"/>
+ <j:set var="source.name" value="${maven.final.name}-src"/>
+ <echo>Release Packaging: ${pom.currentVersion}</echo>
+ </j:otherwise>
+ </j:choose>
+
+ </goal>
<goal
name="xdist:build-bin"
- prereqs="xdist:build-setup,xdist:prepare-bin-filesystem"
+ prereqs="xdist:prepare-bin-filesystem"
description="Build the binary distribution.">
<!-- Create a tar.gz file -->
- <ant:tar longfile="gnu" tarfile="${maven.dist.dir}/${maven.final.name}.tar">
+ <ant:tar longfile="gnu" tarfile="${maven.dist.dir}/${binary.name}.tar">
<ant:tarfileset dir="${maven.dist.bin.archive.dir}"/>
</ant:tar>
<ant:gzip
- zipfile="${maven.dist.dir}/${maven.final.name}.tar.gz"
- src="${maven.dist.dir}/${maven.final.name}.tar"
+ zipfile="${maven.dist.dir}/${binary.name}.tar.gz"
+ src="${maven.dist.dir}/${binary.name}.tar"
/>
- <checksum file="${maven.dist.dir}/${maven.final.name}.tar.gz"/>
- <ant:delete file="${maven.dist.dir}/${maven.final.name}.tar"/>
+ <ant:delete file="${maven.dist.dir}/${binary.name}.tar"/>
+ <checksum file="${maven.dist.dir}/${binary.name}.tar.gz"/>
+ <ant:exec executable="${maven.gpg.exec}">
+ <ant:arg value="--armour"/>
+ <ant:arg value="-b"/>
+ <ant:arg value="${maven.dist.dir}/${binary.name}.tar.gz"/>
+ </ant:exec>
<!-- Create a zip file -->
- <ant:zip zipfile="${maven.dist.dir}/${maven.final.name}.zip">
+ <ant:zip zipfile="${maven.dist.dir}/${binary.name}.zip">
<ant:zipfileset dir="${maven.dist.bin.archive.dir}"/>
</ant:zip>
- <checksum file="${maven.dist.dir}/${maven.final.name}.zip"/>
+ <checksum file="${maven.dist.dir}/${binary.name}.zip"/>
+ <ant:exec executable="${maven.gpg.exec}">
+ <ant:arg value="--armour"/>
+ <ant:arg value="-b"/>
+ <ant:arg value="${maven.dist.dir}/${binary.name}.zip"/>
+ </ant:exec>
</goal>
<goal
name="xdist:build-src"
- prereqs="xdist:build-setup,xdist:prepare-src-filesystem"
+ prereqs="xdist:prepare-src-filesystem"
description="Build the source distribution.">
<!-- Create a tar.gz file -->
- <ant:tar longfile="gnu" tarfile="${maven.dist.dir}/${maven.final.name}-src.tar">
+ <ant:tar longfile="gnu" tarfile="${maven.dist.dir}/${source.name}.tar">
<ant:tarfileset dir="${maven.dist.src.archive.dir}"/>
</ant:tar>
<ant:gzip
- zipfile="${maven.dist.dir}/${maven.final.name}-src.tar.gz"
- src="${maven.dist.dir}/${maven.final.name}-src.tar"
+ zipfile="${maven.dist.dir}/${source.name}.tar.gz"
+ src="${maven.dist.dir}/${source.name}.tar"
/>
- <checksum file="${maven.dist.dir}/${maven.final.name}-src.tar.gz"/>
- <ant:delete file="${maven.dist.dir}/${maven.final.name}-src.tar"/>
+ <ant:delete file="${maven.dist.dir}/${source.name}.tar"/>
+ <checksum file="${maven.dist.dir}/${source.name}.tar.gz"/>
+ <ant:exec executable="${maven.gpg.exec}">
+ <ant:arg value="--armour"/>
+ <ant:arg value="-b"/>
+ <ant:arg value="${maven.dist.dir}/${source.name}.tar.gz"/>
+ </ant:exec>
<!-- Create a zip file -->
- <ant:zip zipfile="${maven.dist.dir}/${maven.final.name}-src.zip">
+ <ant:zip zipfile="${maven.dist.dir}/${source.name}.zip">
<ant:zipfileset dir="${maven.dist.src.archive.dir}"/>
</ant:zip>
- <checksum file="${maven.dist.dir}/${maven.final.name}-src.zip"/>
+ <checksum file="${maven.dist.dir}/${source.name}.zip"/>
+ <ant:exec executable="${maven.gpg.exec}">
+ <ant:arg value="--armour"/>
+ <ant:arg value="-b"/>
+ <ant:arg value="${maven.dist.dir}/${source.name}.zip"/>
+ </ant:exec>
</goal>
<goal
@@ -140,16 +235,34 @@
<ant:copy todir="${maven.dist.bin.assembly.dir}">
<ant:fileset dir=".">
<ant:include name="LICENSE*"/>
+ <ant:include name="README*"/>
</ant:fileset>
</ant:copy>
<!-- Copy Jars -->
+ <ant:copy todir="${maven.dist.bin.assembly.dir}/repository/avalon-repository">
+ <ant:fileset dir="${maven.build.dir}">
+ <ant:include name="jars/*.*"/>
+ </ant:fileset>
+ </ant:copy>
+
+ <!-- Copy Docs -->
<ant:copy todir="${maven.dist.bin.assembly.dir}">
<ant:fileset dir="${maven.build.dir}">
- <ant:include name="*.jar"/>
<ant:include name="docs/**"/>
</ant:fileset>
</ant:copy>
+
+ <!-- Copy Bin -->
+ <ant:copy todir="${maven.dist.bin.assembly.dir}/bin">
+ <ant:fileset dir="${basedir}/cli/bin">
+ <ant:include name="**"/>
+ </ant:fileset>
+ <filterset>
+ <filter token="AVALON_CLI_VERSION" value="${avalon.cli.version}"/>
+ </filterset>
+ </ant:copy>
+
</goal>
<goal
1.12 +1 -1 avalon/repository/project.xml
Index: project.xml
===================================================================
RCS file: /home/cvs/avalon/repository/project.xml,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- project.xml 26 Dec 2003 09:22:38 -0000 1.11
+++ project.xml 31 Jan 2004 13:29:49 -0000 1.12
@@ -6,7 +6,7 @@
<groupId>avalon</groupId>
<id>avalon-repository</id>
<name>Avalon Repository</name>
- <currentVersion>1.2</currentVersion>
+ <currentVersion>1.3</currentVersion>
<organization>
<name>Apache Software Foundation</name>
1.6 +3 -6 avalon/repository/main/src/java/org/apache/avalon/repository/main/AbstractBuilder.java
Index: AbstractBuilder.java
===================================================================
RCS file: /home/cvs/avalon/repository/main/src/java/org/apache/avalon/repository/main/AbstractBuilder.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- AbstractBuilder.java 24 Jan 2004 23:20:05 -0000 1.5
+++ AbstractBuilder.java 31 Jan 2004 13:29:50 -0000 1.6
@@ -92,15 +92,12 @@
* @exception RepositoryException if a factory creation error occurs
*/
protected Factory createDelegate(
- ClassLoader classloader, String factory, InitialContext context )
+ ClassLoader classloader, Class clazz, InitialContext context )
throws RepositoryException
{
-
if( null == classloader ) throw new NullPointerException( "classloader" );
- if( null == factory ) throw new NullPointerException( "factory" );
+ if( null == clazz ) throw new NullPointerException( "clazz" );
if( null == context ) throw new NullPointerException( "context" );
-
- Class clazz = loadFactoryClass( classloader, factory );
try
{
1.12 +52 -24 avalon/repository/main/src/java/org/apache/avalon/repository/main/DefaultBuilder.java
Index: DefaultBuilder.java
===================================================================
RCS file: /home/cvs/avalon/repository/main/src/java/org/apache/avalon/repository/main/DefaultBuilder.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- DefaultBuilder.java 24 Jan 2004 23:20:05 -0000 1.11
+++ DefaultBuilder.java 31 Jan 2004 13:29:50 -0000 1.12
@@ -198,9 +198,12 @@
private final InitialContext m_context;
/**
- * The application factory established by the loader to which
- * requests for default criteria and instance creation are
- * delegated.
+ * The factory class established by the builder.
+ */
+ private final Class m_class;
+
+ /**
+ * The factory instance.
*/
private final Factory m_delegate;
@@ -218,11 +221,7 @@
public DefaultBuilder( InitialContext context, Artifact artifact )
throws Exception
{
- this(
- context,
- //Thread.currentThread().getContextClassLoader(),
- null,
- artifact );
+ this( context, null, artifact );
}
/**
@@ -269,24 +268,31 @@
}
m_classloader = m_repository.getClassLoader( parent, artifact );
- Class clazz = loadFactoryClass( m_classloader, classname );
+ m_class = loadFactoryClass( m_classloader, classname );
- try
+ if( Factory.class.isAssignableFrom( m_class ) )
{
- m_delegate = createDelegate( m_classloader, classname, m_context );
+ try
+ {
+ m_delegate = createDelegate( m_classloader, m_class, m_context );
+ }
+ catch( Throwable e )
+ {
+ final String error =
+ "Unable to establish a factory for the supplied artifact:";
+ StringBuffer buffer = new StringBuffer( error );
+ buffer.append( "\n artifact: " + artifact );
+ buffer.append( "\n build: " + descriptor.getBuild() );
+ buffer.append( "\n factory: " + descriptor.getFactory() );
+ buffer.append( "\n source: "
+ + m_class.getProtectionDomain().getCodeSource().getLocation() );
+ buffer.append( "\n repository: " + m_repository );
+ throw new RepositoryException( buffer.toString(), e );
+ }
}
- catch( Throwable e )
+ else
{
- final String error =
- "Unable to establish a factory for the supplied artifact:";
- StringBuffer buffer = new StringBuffer( error );
- buffer.append( "\n artifact: " + artifact );
- buffer.append( "\n build: " + descriptor.getBuild() );
- buffer.append( "\n factory: " + descriptor.getFactory() );
- buffer.append( "\n source: "
- + clazz.getProtectionDomain().getCodeSource().getLocation() );
- buffer.append( "\n repository: " + m_repository );
- throw new RepositoryException( buffer.toString(), e );
+ m_delegate = null;
}
}
@@ -295,12 +301,34 @@
//-----------------------------------------------------------
/**
+ * Return the primary class established by the builder.
+ * @return the main class
+ */
+ public Class getFactoryClass()
+ {
+ return m_class;
+ }
+
+ /**
* Return the factory established by the loader.
* @return the delegate factory
+ * @exception RepositoryRuntimeException if the declared class does
+ * not implement the factory interface
+ * @see getFactoryClass
*/
public Factory getFactory()
{
- return m_delegate;
+ if( null != m_delegate )
+ {
+ return m_delegate;
+ }
+ else
+ {
+ final String error =
+ "Supplied class [" + m_class.getName()
+ + "] does not implement the Factory interface.";
+ throw new RepositoryRuntimeException( error );
+ }
}
/**
1.16 +167 -10 avalon/repository/main/src/java/org/apache/avalon/repository/main/DefaultInitialContext.java
Index: DefaultInitialContext.java
===================================================================
RCS file: /home/cvs/avalon/repository/main/src/java/org/apache/avalon/repository/main/DefaultInitialContext.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- DefaultInitialContext.java 25 Jan 2004 13:17:50 -0000 1.15
+++ DefaultInitialContext.java 31 Jan 2004 13:29:50 -0000 1.16
@@ -23,21 +23,23 @@
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
-
import java.lang.reflect.Constructor;
import java.lang.NoSuchMethodException;
-
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.Properties;
-import java.text.ParseException;
-import java.util.StringTokenizer;
-
import java.net.URL;
import java.net.URLConnection;
import java.net.URLClassLoader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
+import java.net.JarURLConnection;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.Properties;
+import java.text.ParseException;
+import java.util.StringTokenizer;
+import java.util.jar.Manifest;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
import javax.naming.NamingException;
import javax.naming.NamingEnumeration;
@@ -75,6 +77,11 @@
//------------------------------------------------------------------
/**
+ * Group identifier manifest key.
+ */
+ public static final String BLOCK_GROUP_KEY = "Block-Group";
+
+ /**
* The name of the properties file to be searched for confiuration
* properties. Seaches will be conducted on the current directory and
* the user's home directory.
@@ -303,7 +310,7 @@
try
{
- m_delegate = createDelegate( classloader, factory, this );
+ m_delegate = createDelegate( classloader, clazz, this );
}
catch( Throwable e )
{
@@ -387,9 +394,159 @@
return new DefaultBuilder( this, classloader, artifact );
}
+ /**
+ * Install a block archive into the repository.
+ * @param url the block archive url
+ * @return the block manifest
+ */
+ public Manifest install( URL url ) throws RepositoryException
+ {
+ String path = url.getFile();
+
+ try
+ {
+ File temp = File.createTempFile( "avalon-", "-bar" );
+ temp.delete();
+ LoaderUtils.getResource( url.toString(), temp, true );
+ temp.deleteOnExit();
+ StringBuffer buffer = new StringBuffer();
+ Manifest manifest = expand( temp.toURL(), buffer );
+
+ //
+ // need a logging solution
+ //
+
+ System.out.println( buffer.toString() );
+ return manifest;
+ }
+ catch( RepositoryException e )
+ {
+ throw e;
+ }
+ catch( Throwable e )
+ {
+ final String error =
+ "Cannot install target: " + url;
+ throw new RepositoryException( error, e );
+ }
+ }
+
// ------------------------------------------------------------------------
// implementation
// ------------------------------------------------------------------------
+
+ /**
+ * Expand a block archive into the repository.
+ * @param url the block archive url
+ * @param buffer a string buffer against which messages may be logged
+ * @return the block manifest
+ */
+ private Manifest expand( URL url, StringBuffer buffer ) throws RepositoryException
+ {
+ try
+ {
+ URL jurl = new URL( "jar:" + url.toString() + "!/" );
+ JarURLConnection connection = (JarURLConnection) jurl.openConnection();
+ Manifest manifest = connection.getManifest();
+
+ final String group = getBlockGroup( manifest );
+
+ buffer.append( "\nBlock Group: " + group );
+ final File root = new File( m_cache, group );
+ buffer.append( "\nLocal target: " + root );
+ JarFile jar = connection.getJarFile();
+ Enumeration entries = jar.entries();
+ while( entries.hasMoreElements() )
+ {
+ ZipEntry entry = (ZipEntry) entries.nextElement();
+ if( !entry.getName().startsWith( "META-INF" ) )
+ {
+ installEntry( buffer, root, jar, entry );
+ }
+ }
+ buffer.append( "\nInstall successful." );
+ return manifest;
+ }
+ catch( Throwable e )
+ {
+ final String error =
+ "Could not install block: " + url;
+ throw new RepositoryException( error, e );
+ }
+ }
+
+ private String getBlockGroup( Manifest manifest )
+ {
+ return (String) manifest.getMainAttributes().getValue( BLOCK_GROUP_KEY );
+ }
+
+ /**
+ * Internal utility to install a entry from a jar file into the local repository.
+ * @param buffer the buffer to log messages to
+ * @param root the root directory corresponding to the bar group
+ * @param jar the block archive
+ * @param entry the entry from the archive to install
+ */
+ private void installEntry(
+ StringBuffer buffer, File root, JarFile jar, ZipEntry entry ) throws Exception
+ {
+ if( entry.isDirectory() ) return;
+
+ final String name = entry.getName();
+ File file = new File( root, name );
+
+ long timestamp = entry.getTime();
+ if( file.exists() )
+ {
+ if( file.lastModified() == timestamp )
+ {
+ buffer.append( "\nEntry: " + name + " (already exists)" );
+ return;
+ }
+ else if( file.lastModified() > timestamp )
+ {
+ buffer.append( "\nEntry: " + name + " (local version is more recent)" );
+ return;
+ }
+ else
+ {
+ buffer.append( "\nEntry: " + name + " (updating local version)" );
+ }
+ }
+ else
+ {
+ buffer.append( "\nEntry: " + name );
+ }
+
+ InputStream is = jar.getInputStream( entry );
+ if ( is == null )
+ {
+ final String error =
+ "Entry returned a null input stream: " + name;
+ buffer.append( "\n " + error );
+ throw new IOException( error );
+ }
+
+ file.getParentFile().mkdirs();
+ FileOutputStream fos = new FileOutputStream( file );
+ byte[] buf = new byte[100 * 1024];
+ int length;
+ while ( ( length = is.read( buf ) ) >= 0 )
+ {
+ fos.write( buf, 0, length );
+ }
+ fos.close();
+ is.close();
+
+ if ( timestamp < 0 )
+ {
+ file.setLastModified( System.currentTimeMillis() );
+ }
+ else
+ {
+ file.setLastModified( timestamp );
+ }
+ }
private Attributes loadAttributes( File cache, String[] hosts, Artifact artifact )
throws RepositoryException
1.5 +8 -2 avalon/repository/spi/src/java/org/apache/avalon/repository/provider/Builder.java
Index: Builder.java
===================================================================
RCS file: /home/cvs/avalon/repository/spi/src/java/org/apache/avalon/repository/provider/Builder.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Builder.java 24 Jan 2004 23:20:05 -0000 1.4
+++ Builder.java 31 Jan 2004 13:29:50 -0000 1.5
@@ -24,7 +24,13 @@
* @version $Revision$ $Date$
*/
public interface Builder
-{
+{
+ /**
+ * Return the primary class established by the builder.
+ * @return the class
+ */
+ Class getFactoryClass();
+
/**
* Return the factory established by the builder.
*
1.7 +13 -1 avalon/repository/spi/src/java/org/apache/avalon/repository/provider/InitialContext.java
Index: InitialContext.java
===================================================================
RCS file: /home/cvs/avalon/repository/spi/src/java/org/apache/avalon/repository/provider/InitialContext.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- InitialContext.java 25 Jan 2004 13:17:51 -0000 1.6
+++ InitialContext.java 31 Jan 2004 13:29:50 -0000 1.7
@@ -17,7 +17,9 @@
package org.apache.avalon.repository.provider;
+import java.net.URL;
import java.io.File;
+import java.util.jar.Manifest;
import org.apache.avalon.repository.Artifact;
import org.apache.avalon.repository.RepositoryException;
@@ -42,6 +44,9 @@
*/
String HOSTS_KEY = "avalon.repository.hosts";
+ String LINE =
+ "\n-----------------------------------------------------------";
+
/**
* Return the base working directory.
*
@@ -86,5 +91,12 @@
*/
Builder newBuilder( ClassLoader classloader, Artifact artifact )
throws Exception;
+
+ /**
+ * Install a block archive into the repository.
+ * @param url the block archive url
+ * @return the block manifest
+ */
+ Manifest install( URL url ) throws RepositoryException;
}
1.1 avalon/repository/cli/.cvsignore
Index: .cvsignore
===================================================================
maven.log
velocity.log
target
.classpath
.project
build.xml
1.1 avalon/repository/cli/maven.xml
Index: maven.xml
===================================================================
<project default="jar:install" xmlns:maven="jelly:maven" xmlns:j="jelly:core" xmlns:util="jelly:util" xmlns:ant="jelly:ant">
<preGoal name="jar:jar">
<j:forEach var="dep" items="${pom.dependencies}">
<unzip src="${pom.getDependencyPath( dep.getId() )}"
dest="${maven.build.dir}/classes">
<patternset>
<exclude name="META-INF/**"/>
<exclude name="*.meta"/>
</patternset>
</unzip>
</j:forEach>
</preGoal>
</project>
1.1 avalon/repository/cli/project.properties
Index: project.properties
===================================================================
#
# main class
#
maven.jar.mainclass = org.apache.avalon.repository.cli.Main
1.1 avalon/repository/cli/project.xml
Index: project.xml
===================================================================
<?xml version="1.0" encoding="ISO-8859-1"?>
<project>
<extend>${basedir}/../project.xml</extend>
<groupId>avalon-repository</groupId>
<id>avalon-repository-cli</id>
<name>Avalon Repository CLI</name>
<currentVersion>1.3-SNAPSHOT</currentVersion>
<package>org.apache.avalon.repository.cli</package>
<inceptionYear>2002</inceptionYear>
<shortDescription>Avalon Repository CLI</shortDescription>
<dependencies>
<dependency>
<groupId>avalon-repository</groupId>
<artifactId>avalon-repository-main</artifactId>
<version>1.3-SNAPSHOT</version>
</dependency>
<dependency>
<id>commons-cli</id>
<version>1.0</version>
</dependency>
<dependency>
<id>excalibur-i18n</id>
<version>1.1</version>
</dependency>
</dependencies>
</project>
---------------------------------------------------------------------
To unsubscribe, e-mail: cvs-unsubscribe@avalon.apache.org
For additional commands, e-mail: cvs-help@avalon.apache.org