mcconnell 2004/05/09 16:51:08 Modified: composition/impl/src/java/org/apache/avalon/composition/model/impl DefaultClassLoaderContext.java DefaultClassLoaderModel.java DefaultContainmentModel.java DefaultModelFactory.java DefaultSystemContext.java DirectoryScanner.java Scanner.java composition/spi/src/java/org/apache/avalon/composition/provider ClassLoaderContext.java SystemContext.java merlin/impl/src/java/org/apache/avalon/merlin/impl DefaultFactory.java merlin/install merlin.nsi versioning avalon-merlin.ent Removed: composition/impl/src/java/org/apache/avalon/composition/util StringHelper.java Log: Remove the nasty static utility class StringHelper and place equivalent functionality under the SystemContext. Revision Changes Path 1.8 +29 -14 avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultClassLoaderContext.java Index: DefaultClassLoaderContext.java =================================================================== RCS file: /home/cvs/avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultClassLoaderContext.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- DefaultClassLoaderContext.java 17 Mar 2004 10:39:10 -0000 1.7 +++ DefaultClassLoaderContext.java 9 May 2004 23:51:08 -0000 1.8 @@ -24,6 +24,7 @@ import org.apache.avalon.composition.model.TypeRepository; import org.apache.avalon.composition.model.ServiceRepository; import org.apache.avalon.composition.provider.ClassLoaderContext; +import org.apache.avalon.composition.provider.SystemContext; import org.apache.avalon.repository.Repository; @@ -109,6 +110,11 @@ */ private final URL[] m_implied; + /** + * The system context. + */ + private final SystemContext m_system; + //============================================================== // constructor //============================================================== @@ -117,16 +123,17 @@ * Creation of a root classloader context. * * @param logger the logging channel to assign to the classloader model + * @param system the system context * @param repository a local repository * @param base the system base directory * @param parent the parent classloader * @param directive the classloader directive */ public DefaultClassLoaderContext( - Logger logger, Repository repository, File base, + Logger logger, SystemContext system, ClassLoader parent, ClassLoaderDirective directive ) { - this( logger, repository, base, parent, + this( logger, system, parent, new OptionalPackage[0], null, null, null, directive, null ); } @@ -134,6 +141,7 @@ * Creation of a new classloader context. * * @param logger the logging channel to assign to the classloader model + * @param system the system context * @param repository a local repository * @param base the system base directory * @param parent the parent classloader @@ -146,7 +154,7 @@ * @param directive the classloader directive */ public DefaultClassLoaderContext( - Logger logger, Repository repository, File base, + Logger logger, SystemContext system, ClassLoader parent, OptionalPackage[] packages, ExtensionManager manager, TypeRepository types, ServiceRepository services, @@ -157,14 +165,6 @@ { throw new NullPointerException( "logger" ); } - if( repository == null ) - { - throw new NullPointerException( "repository" ); - } - if( base == null ) - { - throw new NullPointerException( "base" ); - } if( parent == null ) { throw new NullPointerException( "parent" ); @@ -177,16 +177,21 @@ { throw new NullPointerException( "directive" ); } + if( system == null ) + { + throw new NullPointerException( "system" ); + } m_logger = logger; - m_repository = repository; - m_base = base; + m_repository = system.getRepository(); + m_base = system.getAnchorDirectory(); m_parent = parent; m_packages = packages; m_manager = manager; m_types = types; m_services = services; m_directive = directive; + m_system = system; if( implied == null ) { @@ -293,6 +298,16 @@ public ClassLoaderDirective getClassLoaderDirective() { return m_directive; + } + + /** + * Return the system context. + * + * @return the system context + */ + public SystemContext getSystemContext() + { + return m_system; } /** 1.20 +14 -10 avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultClassLoaderModel.java Index: DefaultClassLoaderModel.java =================================================================== RCS file: /home/cvs/avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultClassLoaderModel.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- DefaultClassLoaderModel.java 1 May 2004 17:03:43 -0000 1.19 +++ DefaultClassLoaderModel.java 9 May 2004 23:51:08 -0000 1.20 @@ -45,7 +45,7 @@ import org.apache.avalon.composition.model.ServiceRepository; import org.apache.avalon.composition.model.ModelException; import org.apache.avalon.composition.provider.ClassLoaderContext; -import org.apache.avalon.composition.util.StringHelper; +import org.apache.avalon.composition.provider.SystemContext; import org.apache.avalon.extension.Extension; import org.apache.avalon.extension.manager.ExtensionManager; @@ -152,7 +152,7 @@ { getLocalLogger().debug( "base: " + - StringHelper.toString( context.getBaseDirectory() ) ); + context.getSystemContext().toString( context.getBaseDirectory() ) ); } File base = context.getBaseDirectory(); @@ -186,7 +186,7 @@ if( getLocalLogger().isDebugEnabled() ) { String str = "classpath: " - + StringHelper.toString( m_classpath ); + + context.getSystemContext().toString( m_classpath ); getLocalLogger().debug( str ); } @@ -204,7 +204,8 @@ ArrayList types = new ArrayList(); ArrayList services = new ArrayList(); Logger scannerLogger = getLocalLogger().getChildLogger( "scanner" ); - Scanner scanner = new Scanner( scannerLogger, m_classLoader ); + SystemContext system = context.getSystemContext(); + Scanner scanner = new Scanner( scannerLogger, system, m_classLoader ); scanner.scan( m_urls, types, services ); // @@ -368,13 +369,14 @@ Logger logger, ContainmentProfile profile, URL[] implied ) { Repository repository = m_context.getRepository(); + SystemContext system = m_context.getSystemContext(); File base = m_context.getBaseDirectory(); OptionalPackage[] packages = getOptionalPackages(); ClassLoaderDirective directive = profile.getClassLoaderDirective(); return new DefaultClassLoaderContext( - logger, repository, base, m_classLoader, packages, + logger, system, m_classLoader, packages, m_extension, m_types, m_services, directive, implied ); } @@ -416,7 +418,7 @@ { if( getLogger().isDebugEnabled() ) { - getLogger().debug( "implicit entries: " + implicit.length ); + getLocalLogger().debug( "implicit entries: " + implicit.length ); } for( int i=0; i<implicit.length; i++ ) @@ -432,7 +434,7 @@ if( files.length > 0 ) { - if( getLogger().isDebugEnabled() ) + if( getLocalLogger().isDebugEnabled() ) { getLogger().debug( "included entries: " + files.length ); } @@ -488,7 +490,8 @@ final Extension[] available = Extension.getAvailable( manifests ); final Extension[] required = Extension.getRequired( manifests ); - m_manager.scanDependencies( required, available, dependencies, unsatisfied ); + m_manager.scanDependencies( + required, available, dependencies, unsatisfied ); if( 0 != unsatisfied.size() ) { final int size = unsatisfied.size(); @@ -616,7 +619,8 @@ public File[] expandFileSetDirectives ( File base, FilesetDirective[] filesets ) throws IOException, IllegalStateException { - getLocalLogger().debug("base=[" + base + "]"); + //getLocalLogger().debug("base=[" + base + "]"); + ArrayList list = new ArrayList(); for( int i=0; i<filesets.length; i++ ) 1.45 +4 -3 avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java Index: DefaultContainmentModel.java =================================================================== RCS file: /home/cvs/avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultContainmentModel.java,v retrieving revision 1.44 retrieving revision 1.45 diff -u -r1.44 -r1.45 --- DefaultContainmentModel.java 1 May 2004 17:03:43 -0000 1.44 +++ DefaultContainmentModel.java 9 May 2004 23:51:08 -0000 1.45 @@ -56,7 +56,7 @@ import org.apache.avalon.composition.provider.SecurityModel; import org.apache.avalon.composition.provider.ComponentContext; import org.apache.avalon.composition.provider.ContainmentContext; -import org.apache.avalon.composition.util.StringHelper; +import org.apache.avalon.composition.provider.SystemContext; import org.apache.avalon.composition.util.DefaultState; import org.apache.avalon.logging.provider.LoggingManager; @@ -949,8 +949,9 @@ if( getLogger().isDebugEnabled() ) { + SystemContext system = m_context.getSystemContext(); final String message = - StringHelper.toString( REZ.getString( "containment.add", name ) ); + REZ.getString( "containment.add", system.toString( name ) ); getLogger().debug( message ); } 1.16 +2 -5 avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultModelFactory.java Index: DefaultModelFactory.java =================================================================== RCS file: /home/cvs/avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultModelFactory.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- DefaultModelFactory.java 1 Apr 2004 04:06:52 -0000 1.15 +++ DefaultModelFactory.java 9 May 2004 23:51:08 -0000 1.16 @@ -356,16 +356,13 @@ try { - Repository repository = m_system.getRepository(); - File base = m_system.getAnchorDirectory(); - ClassLoader root = m_system.getAPIClassLoader(); ClassLoaderDirective classLoaderDirective = profile.getClassLoaderDirective(); ClassLoaderContext classLoaderContext = new DefaultClassLoaderContext( - logger, repository, base, root, + logger, m_system, root, classLoaderDirective ); ClassLoaderModel classLoaderModel = 1.32 +79 -1 avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultSystemContext.java Index: DefaultSystemContext.java =================================================================== RCS file: /home/cvs/avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DefaultSystemContext.java,v retrieving revision 1.31 retrieving revision 1.32 diff -u -r1.31 -r1.32 --- DefaultSystemContext.java 4 Apr 2004 23:33:56 -0000 1.31 +++ DefaultSystemContext.java 9 May 2004 23:51:08 -0000 1.32 @@ -406,9 +406,87 @@ getRuntime().release( model, instance ); } + /** + * Prepare a string representation of an object for presentation. + * @param object the object to parse + * @return the presentation string + */ + public String toString( Object object ) + { + if( object == null ) return ""; + + if( object instanceof String ) + { + return processString( (String) object ); + } + else + { + return processString( object.toString() ); + } + } + + /** + * Prepare a string representation of an object for presentation. + * @param name the value to parse + * @return the presentation string + */ + public String processString( String name ) + { + if( name == null ) return ""; + + String str = name.replace( '\\', '/' ); + + String base = getBaseDirectory().toString().replace( '\\', '/' ); + if( str.indexOf( base ) > -1 ) + { + return getString( str, base, "${merlin.dir}" ); + } + + final String dir = + System.getProperty( "user.dir" ).replace( '\\', '/' ); + if( str.indexOf( dir ) > -1 ) + { + return getString( str, dir, "${user.dir}" ); + } + + return name; + } + + /** + * Prepare a string representation of an object array for presentation. + * @param objects the array of objects + * @return the presentation string + */ + public String toString( Object[] objects ) + { + StringBuffer buffer = new StringBuffer(); + for( int i=0; i<objects.length; i++ ) + { + if( i > 0 ) buffer.append( ";" ); + buffer.append( toString( objects[i] ) ); + } + return buffer.toString(); + } + //------------------------------------------------------------------ // runtime operations //------------------------------------------------------------------ + + private String getString( String name, String pattern, String replacement ) + { + final int n = name.indexOf( pattern ); + if( n == -1 ) return name; + if( name.startsWith( pattern ) ) + { + return replacement + name.substring( pattern.length() ); + } + else + { + String header = name.substring( 0, n ); + String tail = name.substring( n + pattern.length() ); + return header + replacement + tail; + } + } /** * Return the runtime factory. 1.7 +353 -171 avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DirectoryScanner.java Index: DirectoryScanner.java =================================================================== RCS file: /home/cvs/avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/DirectoryScanner.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- DirectoryScanner.java 30 Apr 2004 14:05:59 -0000 1.6 +++ DirectoryScanner.java 9 May 2004 23:51:08 -0000 1.7 @@ -231,7 +231,8 @@ * @return <code>true</code> if the pattern matches against the string, * or <code>false</code> otherwise. */ - protected static boolean matchPath(String pattern, String str) { + protected static boolean matchPath(String pattern, String str) + { return ScannerUtils.matchPath(pattern, str); } @@ -249,7 +250,8 @@ * or <code>false</code> otherwise. */ protected static boolean matchPath(String pattern, String str, - boolean isCaseSensitive) { + boolean isCaseSensitive) + { return ScannerUtils.matchPath(pattern, str, isCaseSensitive); } @@ -267,7 +269,8 @@ * @return <code>true</code> if the string matches against the pattern, * or <code>false</code> otherwise. */ - public static boolean match(String pattern, String str) { + public static boolean match(String pattern, String str) + { return ScannerUtils.match(pattern, str); } @@ -289,7 +292,8 @@ * or <code>false</code> otherwise. */ protected static boolean match(String pattern, String str, - boolean isCaseSensitive) { + boolean isCaseSensitive) + { return ScannerUtils.match(pattern, str, isCaseSensitive); } @@ -300,7 +304,8 @@ * contents of the <code>defaultExcludes</code> * <code>Vector</code>. */ - public static String[] getDefaultExcludes() { + public static String[] getDefaultExcludes() + { return (String[]) defaultExcludes.toArray(new String[defaultExcludes .size()]); } @@ -314,8 +319,10 @@ * <code>false</code> if it already * existed. */ - public static boolean addDefaultExclude(String s) { - if (defaultExcludes.indexOf(s) == -1) { + public static boolean addDefaultExclude(String s) + { + if (defaultExcludes.indexOf(s) == -1) + { defaultExcludes.add(s); return true; } @@ -331,17 +338,20 @@ * <code>false</code> if <code>s</code> was not * in the default excludes list to begin with */ - public static boolean removeDefaultExclude(String s) { + public static boolean removeDefaultExclude(String s) + { return defaultExcludes.remove(s); } /** * Go back to the hard wired default exclude patterns */ - public static void resetDefaultExcludes() { + public static void resetDefaultExcludes() + { defaultExcludes = new Vector(); - for (int i = 0; i < DEFAULTEXCLUDES.length; i++) { + for (int i = 0; i < DEFAULTEXCLUDES.length; i++) + { defaultExcludes.add(DEFAULTEXCLUDES[i]); } } @@ -355,7 +365,8 @@ * @param basedir The base directory to scan. * Must not be <code>null</code>. */ - public void setBasedir(String basedir) { + public void setBasedir(String basedir) + { setBasedir(new File(basedir.replace('/', File.separatorChar).replace( '\\', File.separatorChar))); } @@ -367,7 +378,8 @@ * @param basedir The base directory for scanning. * Should not be <code>null</code>. */ - public void setBasedir(File basedir) { + public void setBasedir(File basedir) + { this.basedir = basedir; } @@ -377,7 +389,8 @@ * * @return the base directory to be scanned */ - public File getBasedir() { + public File getBasedir() + { return basedir; } @@ -387,7 +400,8 @@ * @return whether or not the scanning is case sensitive * @since ant 1.6 */ - public boolean isCaseSensitive() { + public boolean isCaseSensitive() + { return isCaseSensitive; } /** @@ -397,7 +411,8 @@ * @param isCaseSensitive whether or not the file system should be * regarded as a case sensitive one */ - public void setCaseSensitive(boolean isCaseSensitive) { + public void setCaseSensitive(boolean isCaseSensitive) + { this.isCaseSensitive = isCaseSensitive; } @@ -408,7 +423,8 @@ * * @since ant 1.6 */ - public boolean isFollowSymlinks() { + public boolean isFollowSymlinks() + { return followSymlinks; } @@ -417,7 +433,8 @@ * * @param followSymlinks whether or not symbolic links should be followed */ - public void setFollowSymlinks(boolean followSymlinks) { + public void setFollowSymlinks(boolean followSymlinks) + { this.followSymlinks = followSymlinks; } @@ -434,16 +451,22 @@ * list is given, all elements must be * non-<code>null</code>. */ - public void setIncludes(String[] includes) { - if (includes == null) { + public void setIncludes(String[] includes) + { + if (includes == null) + { this.includes = null; - } else { + } + else + { this.includes = new String[includes.length]; - for (int i = 0; i < includes.length; i++) { + for (int i = 0; i < includes.length; i++) + { String pattern; pattern = includes[i].replace('/', File.separatorChar).replace( '\\', File.separatorChar); - if (pattern.endsWith(File.separator)) { + if (pattern.endsWith(File.separator)) + { pattern += "**"; } this.includes[i] = pattern; @@ -464,16 +487,22 @@ * should be excluded. If a non-<code>null</code> list is * given, all elements must be non-<code>null</code>. */ - public void setExcludes(String[] excludes) { - if (excludes == null) { + public void setExcludes(String[] excludes) + { + if( excludes == null) + { this.excludes = null; - } else { + } + else + { this.excludes = new String[excludes.length]; - for (int i = 0; i < excludes.length; i++) { + for (int i = 0; i < excludes.length; i++) + { String pattern; pattern = excludes[i].replace('/', File.separatorChar).replace( '\\', File.separatorChar); - if (pattern.endsWith(File.separator)) { + if (pattern.endsWith(File.separator)) + { pattern += "**"; } this.excludes[i] = pattern; @@ -486,7 +515,8 @@ * * @param selectors specifies the selectors to be invoked on a scan */ - public void setSelectors(FileSelector[] selectors) { + public void setSelectors(FileSelector[] selectors) + { this.selectors = selectors; } @@ -498,7 +528,8 @@ * @return <code>true</code> if all files and directories which have * been found so far have been included. */ - public boolean isEverythingIncluded() { + public boolean isEverythingIncluded() + { return everythingIncluded; } @@ -511,30 +542,37 @@ * incorrectly (i.e. if it is <code>null</code>, doesn't exist, * or isn't a directory). */ - public void scan() throws IllegalStateException, IOException { - if (basedir == null) { + public void scan() throws IllegalStateException, IOException + { + if (basedir == null) + { throw new IllegalStateException("No basedir set"); } - if (!basedir.exists()) { + if (!basedir.exists()) + { System.out.println("basedir=[" + basedir + "]"); throw new IllegalStateException("basedir " + basedir + " does not exist"); } - if (!basedir.isDirectory()) { + if (!basedir.isDirectory()) + { throw new IllegalStateException("basedir " + basedir + " is not a directory"); } - if (includes == null) { + if (includes == null) + { // No includes supplied, so set it to 'matches all' includes = new String[1]; includes[0] = "*.jar"; } - if (excludes == null) { + if (excludes == null) + { excludes = new String[0]; } - if (selectors == null) { + if (selectors == null) + { selectors = new FileSelector[1]; selectors[0] = new DefaultFileSelector(); } @@ -548,17 +586,26 @@ dirsExcluded = new Vector(); dirsDeselected = new Vector(); - if (isIncluded("")) { - if (!isExcluded("")) { - if (isSelected("", basedir)) { + if (isIncluded("")) + { + if (!isExcluded("")) + { + if (isSelected("", basedir)) + { dirsIncluded.addElement(""); - } else { + } + else + { dirsDeselected.addElement(""); } - } else { + } + else + { dirsExcluded.addElement(""); } - } else { + } + else + { dirsNotIncluded.addElement(""); } checkIncludePatterns(); @@ -570,23 +617,31 @@ * this routine is actually checking all the include patterns in * order to avoid scanning everything under base dir */ - private void checkIncludePatterns() throws IOException { + private void checkIncludePatterns() throws IOException + { Hashtable newroots = new Hashtable(); // put in the newroots vector the include patterns without // wildcard tokens - for (int icounter = 0; icounter < includes.length; icounter++) { + + for( int icounter = 0; icounter < includes.length; icounter++ ) + { String newpattern = ScannerUtils.rtrimWildcardTokens(includes[icounter]); newroots.put(newpattern, includes[icounter]); - getLogger().debug("newpattern=[" + newpattern + "]; " + - "includes[" + icounter + "]=[" + includes[icounter] + "]"); + getLogger().debug( + "newpattern=[" + newpattern + "]; " + + "includes[" + icounter + "]=[" + + includes[icounter] + "]" ); } - if (newroots.containsKey("")) { + if (newroots.containsKey("")) + { // we are going to scan everything anyway scandir(basedir, "", true); - } else { + } + else + { // only scan directories that can include matched files or // directories Enumeration enum2 = newroots.keys(); @@ -595,7 +650,8 @@ canonBase = basedir.getCanonicalFile(); getLogger().debug("canonBase=[" + canonBase + "]"); - while (enum2.hasMoreElements()) { + while (enum2.hasMoreElements()) + { String currentelement = (String) enum2.nextElement(); getLogger().debug("currentelement=[" + currentelement + "]"); String originalpattern = (String) newroots.get(currentelement); @@ -603,68 +659,93 @@ File myfile = new File(basedir, currentelement); getLogger().debug("myfile=[" + myfile.getAbsolutePath() + "]"); - if (myfile.exists()) { + if (myfile.exists()) + { // may be on a case insensitive file system. We want // the results to show what's really on the disk, so // we need to double check. File canonFile = myfile.getCanonicalFile(); String path = fileUtils.removeLeadingPath(canonBase, canonFile); - if (!path.equals(currentelement) || ON_VMS) { + if (!path.equals(currentelement) || ON_VMS) + { myfile = findFile(basedir, currentelement); - if (myfile != null) { + if( null != myfile ) + { currentelement = - fileUtils.removeLeadingPath(basedir, - myfile); + fileUtils.removeLeadingPath( + basedir, myfile ); } } } - if ((myfile == null || !myfile.exists()) && !isCaseSensitive) { + if( ( myfile == null || !myfile.exists() ) && !isCaseSensitive ) + { File f = findFileCaseInsensitive(basedir, currentelement); - if (f.exists()) { + if (f.exists()) + { // adapt currentelement to the case we've // actually found - currentelement = fileUtils.removeLeadingPath(basedir, - f); + currentelement = + fileUtils.removeLeadingPath( + basedir, f ); myfile = f; } } - if (myfile != null && myfile.exists()) { + if( myfile != null && myfile.exists() ) + { if (!followSymlinks - && isSymlink(basedir, currentelement)) { + && isSymlink(basedir, currentelement)) + { continue; } - if (myfile.isDirectory()) { + if (myfile.isDirectory()) + { getLogger().debug("file is a directory!"); - if (isIncluded(currentelement) - && currentelement.length() > 0) { - getLogger().debug("calling accounForIncludedDir(" + - currentelement + "," + myfile.getAbsolutePath() + ")"); - accountForIncludedDir(currentelement, myfile, true); - } else { - if (currentelement.length() > 0) { - if (currentelement.charAt(currentelement - .length() - 1) - != File.separatorChar) { + if( isIncluded(currentelement) + && currentelement.length() > 0) + { + getLogger().debug( + "calling accounForIncludedDir(" + + currentelement + "," + + myfile.getAbsolutePath() + + ")" ); + accountForIncludedDir( currentelement, myfile, true ); + } + else + { + if (currentelement.length() > 0) + { + if( + currentelement.charAt( + currentelement.length() - 1) + != File.separatorChar ) + { currentelement = - currentelement + File.separatorChar; + currentelement + File.separatorChar; } } - getLogger().debug("calling scandir(" + - myfile.getAbsolutePath() + "," + - currentelement + ")"); - scandir(myfile, currentelement, true); + getLogger().debug( + "calling scandir(" + + myfile.getAbsolutePath() + + "," + + currentelement + + ")" ); + scandir( myfile, currentelement, true ); } - } else { - if (isCaseSensitive - && originalpattern.equals(currentelement)) { + } + else + { + if( isCaseSensitive + && originalpattern.equals(currentelement) ) + { accountForIncludedFile(currentelement, myfile); - } else if (!isCaseSensitive - && originalpattern - .equalsIgnoreCase(currentelement)) { + } + else if( !isCaseSensitive + && originalpattern.equalsIgnoreCase(currentelement) ) + { accountForIncludedFile(currentelement, myfile); } } @@ -697,21 +778,28 @@ { getLogger().debug("Inside scandir"); - if (dir == null) { + if (dir == null) + { throw new IOException("dir must not be null."); - } else if (!dir.exists()) { + } + else if (!dir.exists()) + { throw new IOException(dir + " doesn't exists."); - } else if (!dir.isDirectory()) { + } + else if (!dir.isDirectory()) + { throw new IOException(dir + " is not a directory."); } // avoid double scanning of directories, can only happen in fast mode - if (fast && hasBeenScanned(vpath)) { + if (fast && hasBeenScanned(vpath)) + { return; } String[] newfiles = dir.list(); - if (newfiles == null) { + if (newfiles == null) + { /* * two reasons are mentioned in the API docs for File.list * (1) dir is not a directory. This is impossible as @@ -719,26 +807,38 @@ * (2) an IO error occurred (why doesn't it throw an exception * then???) */ - throw new IOException("IO error scanning directory " - + dir.getAbsolutePath()); + throw new IOException( + "IO error scanning directory " + + dir.getAbsolutePath()); } - if (!followSymlinks) { + if (!followSymlinks) + { Vector noLinks = new Vector(); - for (int i = 0; i < newfiles.length; i++) { - try { - if (fileUtils.isSymbolicLink(dir, newfiles[i])) { + for (int i = 0; i < newfiles.length; i++) + { + try + { + if (fileUtils.isSymbolicLink(dir, newfiles[i])) + { String name = vpath + newfiles[i]; File file = new File(dir, newfiles[i]); - if (file.isDirectory()) { + if (file.isDirectory()) + { dirsExcluded.addElement(name); - } else { + } + else + { filesExcluded.addElement(name); } - } else { + } + else + { noLinks.addElement(newfiles[i]); } - } catch (IOException ioe) { + } + catch (IOException ioe) + { String msg = "IOException caught while checking " + "for links, couldn't get canonical path!"; // will be caught and redirected to Ant's logging system @@ -750,32 +850,44 @@ noLinks.copyInto(newfiles); } - for (int i = 0; i < newfiles.length; i++) { + for (int i = 0; i < newfiles.length; i++) + { String name = vpath + newfiles[i]; File file = new File(dir, newfiles[i]); getLogger().debug("file=[" + file.getAbsolutePath() + "]"); - if (file.isDirectory()) { + if (file.isDirectory()) + { getLogger().debug("this is a directory."); - if (isIncluded(name)) { + if (isIncluded(name)) + { getLogger().debug("and it will be included"); accountForIncludedDir(name, file, fast); - } else { + } + else + { getLogger().debug("and it will not be included"); everythingIncluded = false; dirsNotIncluded.addElement(name); - if (fast && couldHoldIncluded(name)) { + if (fast && couldHoldIncluded(name)) + { scandir(file, name + File.separator, fast); } } - if (!fast) { + if (!fast) + { scandir(file, name + File.separator, fast); } - } else if (file.isFile()) { + } + else if (file.isFile()) + { getLogger().debug("this is a file"); - if (isIncluded(name)) { + if (isIncluded(name)) + { getLogger().debug("and it will be included"); accountForIncludedFile(name, file); - } else { + } + else + { getLogger().debug("and it will not be included"); everythingIncluded = false; filesNotIncluded.addElement(name); @@ -789,19 +901,27 @@ * @param name path of the file relative to the directory of the fileset * @param file included file */ - private void accountForIncludedFile(String name, File file) { + private void accountForIncludedFile(String name, File file) + { if (!filesIncluded.contains(name) && !filesExcluded.contains(name) - && !filesDeselected.contains(name)) { + && !filesDeselected.contains(name)) + { - if (!isExcluded(name)) { - if (isSelected(name, file)) { + if (!isExcluded(name)) + { + if (isSelected(name, file)) + { filesIncluded.addElement(name); - } else { + } + else + { everythingIncluded = false; filesDeselected.addElement(name); } - } else { + } + else + { everythingIncluded = false; filesExcluded.addElement(name); } @@ -822,35 +942,45 @@ if (!dirsIncluded.contains(name) && !dirsExcluded.contains(name) - && !dirsDeselected.contains(name)) { + && !dirsDeselected.contains(name)) + { getLogger().debug("waypoint-1"); - if (!isExcluded(name)) { + if (!isExcluded(name)) + { getLogger().debug("waypoint-2a"); - if (isSelected(name, file)) { + if (isSelected(name, file)) + { getLogger().debug("waypoint-3a"); dirsIncluded.addElement(name); - if (fast) { + if (fast) + { getLogger().debug("calling scandir(" + file.getAbsolutePath() + "," + name + File.separator); scandir(file, name + File.separator, fast); } - } else { + } + else + { getLogger().debug("waypoint-3b"); everythingIncluded = false; dirsDeselected.addElement(name); - if (fast && couldHoldIncluded(name)) { + if (fast && couldHoldIncluded(name)) + { getLogger().debug("waypoint-4b"); scandir(file, name + File.separator, fast); } } - } else { + } + else + { getLogger().debug("waypoint-2b"); everythingIncluded = false; dirsExcluded.addElement(name); - if (fast && couldHoldIncluded(name)) { + if (fast && couldHoldIncluded(name)) + { getLogger().debug("waypoint-3c"); scandir(file, name + File.separator, fast); } @@ -866,9 +996,12 @@ * @return <code>true</code> when the name matches against at least one * include pattern, or <code>false</code> otherwise. */ - protected boolean isIncluded(String name) { - for (int i = 0; i < includes.length; i++) { - if (matchPath(includes[i], name, isCaseSensitive)) { + protected boolean isIncluded(String name) + { + for (int i = 0; i < includes.length; i++) + { + if (matchPath(includes[i], name, isCaseSensitive)) + { return true; } } @@ -883,10 +1016,14 @@ * @return <code>true</code> when the name matches against the start of at * least one include pattern, or <code>false</code> otherwise. */ - protected boolean couldHoldIncluded(String name) { - for (int i = 0; i < includes.length; i++) { - if (matchPatternStart(includes[i], name, isCaseSensitive)) { - if (isMorePowerfulThanExcludes(name, includes[i])) { + protected boolean couldHoldIncluded(String name) + { + for (int i = 0; i < includes.length; i++) + { + if (matchPatternStart(includes[i], name, isCaseSensitive)) + { + if (isMorePowerfulThanExcludes(name, includes[i])) + { return true; } } @@ -909,10 +1046,13 @@ * @param includepattern one include pattern * @return true if there is no exclude pattern more powerful than this include pattern */ - private boolean isMorePowerfulThanExcludes(String name, String includepattern) { + private boolean isMorePowerfulThanExcludes(String name, String includepattern) + { String soughtexclude = name + File.separator + "**"; - for (int counter = 0; counter < excludes.length; counter++) { - if (excludes[counter].equals(soughtexclude)) { + for (int counter = 0; counter < excludes.length; counter++) + { + if (excludes[counter].equals(soughtexclude)) + { return false; } } @@ -927,8 +1067,10 @@ * @return <code>true</code> when the name matches against at least one * exclude pattern, or <code>false</code> otherwise. */ - protected boolean isExcluded(String name) { - for (int i = 0; i < excludes.length; i++) { + protected boolean isExcluded(String name) + { + for (int i = 0; i < excludes.length; i++) + { if (matchPath(excludes[i], name, isCaseSensitive)) { return true; } @@ -944,10 +1086,14 @@ * @return <code>false</code> when the selectors says that the file * should not be selected, <code>true</code> otherwise. */ - protected boolean isSelected(String name, File file) { - if (selectors != null) { - for (int i = 0; i < selectors.length; i++) { - if (!selectors[i].isSelected(basedir, name, file)) { + protected boolean isSelected(String name, File file) + { + if (selectors != null) + { + for (int i = 0; i < selectors.length; i++) + { + if (!selectors[i].isSelected(basedir, name, file)) + { return false; } } @@ -963,7 +1109,8 @@ * @return the names of the files which matched at least one of the * include patterns and none of the exclude patterns. */ - public String[] getIncludedFiles() { + public String[] getIncludedFiles() + { String[] files = new String[filesIncluded.size()]; filesIncluded.copyInto(files); Arrays.sort(files); @@ -981,7 +1128,8 @@ * * @since Ant 1.6 */ - private String[] list(File file) { + private String[] list(File file) + { String[] files = (String[]) fileListMap.get(file); if (files == null) { files = file.list(); @@ -1006,8 +1154,8 @@ private File findFileCaseInsensitive(File base, String path) throws IOException { - File f = findFileCaseInsensitive(base, - ScannerUtils.tokenizePath(path)); + File f = findFileCaseInsensitive( + base, ScannerUtils.tokenizePath(path)); return f == null ? new File(base, path) : f; } @@ -1023,26 +1171,35 @@ private File findFileCaseInsensitive(File base, Vector pathElements) throws IOException { - if (pathElements.size() == 0) { + if (pathElements.size() == 0) + { return base; - } else { - if (!base.isDirectory()) { + } + else + { + if (!base.isDirectory()) + { return null; } String[] files = list(base); - if (files == null) { + if (files == null) + { throw new IOException("IO error scanning directory " + base.getAbsolutePath()); } String current = (String) pathElements.remove(0); - for (int i = 0; i < files.length; i++) { - if (files[i].equals(current)) { + for (int i = 0; i < files.length; i++) + { + if (files[i].equals(current)) + { base = new File(base, files[i]); return findFileCaseInsensitive(base, pathElements); } } - for (int i = 0; i < files.length; i++) { - if (files[i].equalsIgnoreCase(current)) { + for (int i = 0; i < files.length; i++) + { + if (files[i].equalsIgnoreCase(current)) + { base = new File(base, files[i]); return findFileCaseInsensitive(base, pathElements); } @@ -1059,7 +1216,8 @@ * * @since Ant 1.6 */ - private File findFile(File base, String path) throws IOException { + private File findFile(File base, String path) throws IOException + { return findFile(base, ScannerUtils.tokenizePath(path)); } @@ -1071,21 +1229,29 @@ * * @since Ant 1.6 */ - private File findFile(File base, Vector pathElements) throws IOException { - if (pathElements.size() == 0) { + private File findFile(File base, Vector pathElements) throws IOException + { + if (pathElements.size() == 0) + { return base; - } else { - if (!base.isDirectory()) { + } + else + { + if (!base.isDirectory()) + { return null; } String[] files = list(base); - if (files == null) { + if (files == null) + { throw new IOException("IO error scanning directory " + base.getAbsolutePath()); } String current = (String) pathElements.remove(0); - for (int i = 0; i < files.length; i++) { - if (files[i].equals(current)) { + for (int i = 0; i < files.length; i++) + { + if (files[i].equals(current)) + { base = new File(base, files[i]); return findFile(base, pathElements); } @@ -1099,7 +1265,8 @@ * basedir? * @since Ant 1.6 */ - private boolean isSymlink(File base, String path) { + private boolean isSymlink(File base, String path) + { return isSymlink(base, ScannerUtils.tokenizePath(path)); } @@ -1108,17 +1275,25 @@ * basedir? * @since Ant 1.6 */ - private boolean isSymlink(File base, Vector pathElements) { - if (pathElements.size() > 0) { + private boolean isSymlink(File base, Vector pathElements) + { + if (pathElements.size() > 0) + { String current = (String) pathElements.remove(0); - try { - if (fileUtils.isSymbolicLink(base, current)) { + try + { + if (fileUtils.isSymbolicLink(base, current)) + { return true; - } else { + } + else + { base = new File(base, current); return isSymlink(base, pathElements); } - } catch (IOException ioe) { + } + catch (IOException ioe) + { String msg = "IOException caught while checking " + "for links, couldn't get canonical path!"; // will be caught and redirected to Ant's logging system @@ -1140,30 +1315,35 @@ * * <p>Registers the given directory as scanned as a side effect.</p> */ - private boolean hasBeenScanned(String vpath) { + private boolean hasBeenScanned(String vpath) + { return !scannedDirs.add(vpath); } /** * Clear internal caches. */ - private void clearCaches() { + private void clearCaches() + { fileListMap.clear(); scannedDirs.clear(); } - public String toString() { + public String toString() + { StringBuffer buffer = new StringBuffer(); buffer.append("{basedir=[" + basedir.getAbsolutePath() + "];"); buffer.append("isCaseSensitive=[" + isCaseSensitive + "];"); buffer.append("includes=("); - for (int i = 0; i < includes.length; i++) { + for (int i = 0; i < includes.length; i++) + { if (i != 0) buffer.append(","); buffer.append(includes[i]); } buffer.append(");"); buffer.append("excludes=("); - for (int i = 0; i < excludes.length; i++) { + for (int i = 0; i < excludes.length; i++) + { if (i != 0) buffer.append(","); buffer.append(excludes[i]); } @@ -1171,11 +1351,13 @@ return buffer.toString(); } - public Logger getLogger() { + public Logger getLogger() + { return m_logger; } - public void setLogger(Logger logger) { + public void setLogger(Logger logger) + { m_logger = logger; } 1.10 +17 -5 avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/Scanner.java Index: Scanner.java =================================================================== RCS file: /home/cvs/avalon/composition/impl/src/java/org/apache/avalon/composition/model/impl/Scanner.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- Scanner.java 17 Mar 2004 10:39:10 -0000 1.9 +++ Scanner.java 9 May 2004 23:51:08 -0000 1.10 @@ -31,7 +31,7 @@ import org.apache.avalon.composition.model.ModelException; import org.apache.avalon.composition.data.builder.ProfilePackageBuilder; -import org.apache.avalon.composition.util.StringHelper; +import org.apache.avalon.composition.provider.SystemContext; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.logger.AbstractLogEnabled; @@ -94,6 +94,11 @@ */ private ClassLoader m_classloader; + /** + * System context. + */ + private SystemContext m_system; + //=================================================================== // constructor //=================================================================== @@ -106,13 +111,18 @@ * @param logger the logging channel * @param classloader the classloader */ - public Scanner( Logger logger, ClassLoader classloader ) + public Scanner( Logger logger, SystemContext system, ClassLoader classloader ) { if( classloader == null ) { throw new NullPointerException( "classloader" ); } + if( system == null ) + { + throw new NullPointerException( "system" ); + } m_classloader = classloader; + m_system = system; enableLogging( logger ); } @@ -147,7 +157,7 @@ final String message = REZ.getString( "scanner.scanning", - StringHelper.toString( url.toString() ) ); + m_system.toString( url.toString() ) ); getLogger().debug( message ); } @@ -195,7 +205,9 @@ if( !uri.toString().endsWith( "!/" ) ) { final String error = - REZ.getString( "scanner.nested-jar-unsupported.error", url.toString() ); + REZ.getString( + "scanner.nested-jar-unsupported.error", + url.toString() ); throw new ModelException( error ); } 1.2 +7 -1 avalon/composition/spi/src/java/org/apache/avalon/composition/provider/ClassLoaderContext.java Index: ClassLoaderContext.java =================================================================== RCS file: /home/cvs/avalon/composition/spi/src/java/org/apache/avalon/composition/provider/ClassLoaderContext.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- ClassLoaderContext.java 10 Feb 2004 16:23:35 -0000 1.1 +++ ClassLoaderContext.java 9 May 2004 23:51:08 -0000 1.2 @@ -116,4 +116,10 @@ */ URL[] getImplicitURLs(); + /** + * Return the system context. + * + * @return the system context + */ + SystemContext getSystemContext(); } 1.8 +16 -1 avalon/composition/spi/src/java/org/apache/avalon/composition/provider/SystemContext.java Index: SystemContext.java =================================================================== RCS file: /home/cvs/avalon/composition/spi/src/java/org/apache/avalon/composition/provider/SystemContext.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- SystemContext.java 4 Apr 2004 23:33:56 -0000 1.7 +++ SystemContext.java 9 May 2004 23:51:08 -0000 1.8 @@ -173,4 +173,19 @@ * @exception Exception if a deployment error occurs */ void release( DeploymentModel model, Object instance ); + + /** + * Prepare a string representation of an object for presentation. + * @param object the object to parse + * @return the presentation string + */ + String toString( Object object ); + + /** + * Prepare a string representation of an object array for presentation. + * @param objects the array of objects + * @return the presentation string + */ + String toString( Object[] objects ); + } 1.43 +5 -6 avalon/merlin/impl/src/java/org/apache/avalon/merlin/impl/DefaultFactory.java Index: DefaultFactory.java =================================================================== RCS file: /home/cvs/avalon/merlin/impl/src/java/org/apache/avalon/merlin/impl/DefaultFactory.java,v retrieving revision 1.42 retrieving revision 1.43 diff -u -r1.42 -r1.43 --- DefaultFactory.java 19 Apr 2004 10:50:42 -0000 1.42 +++ DefaultFactory.java 9 May 2004 23:51:08 -0000 1.43 @@ -39,7 +39,6 @@ import org.apache.avalon.composition.model.impl.DefaultSystemContextFactory; import org.apache.avalon.composition.provider.SystemContext; import org.apache.avalon.composition.provider.SystemContextFactory; -import org.apache.avalon.composition.util.StringHelper; import org.apache.avalon.framework.logger.Logger; import org.apache.avalon.framework.configuration.Configuration; @@ -227,7 +226,7 @@ buffer.append( "\n" ); buffer.append( REZ.getString( "info.listing" ) ); buffer.append( LINE ); - createInfoListing( buffer, hosts, m_context, criteria ); + createInfoListing( buffer, hosts, m_context, criteria, systemContext ); buffer.append( "\n" ); buffer.append( LINE ); getLogger().info( buffer.toString() ); @@ -268,7 +267,7 @@ { getLogger().debug( "installing: " - + StringHelper.toString( url ) ); + + systemContext.toString( url ) ); } try @@ -701,7 +700,7 @@ private void createInfoListing( StringBuffer buffer, String[] hosts, InitialContext context, - KernelCriteria criteria ) + KernelCriteria criteria, SystemContext system ) { buffer.append( "\n" ); buffer.append( @@ -814,7 +813,7 @@ for( int i=0; i<hosts.length; i++ ) { if( i>0 ) buffer.append( "," ); - buffer.append( StringHelper.toString( hosts[i] ) ); + buffer.append( system.toString( hosts[i] ) ); } buffer.append( "\n ${merlin.deployment} == " ); @@ -822,7 +821,7 @@ for( int i=0; i<urls.length; i++ ) { if( i>0 ) buffer.append( "," ); - buffer.append( StringHelper.toString( urls[i] ) ); + buffer.append( system.toString( urls[i] ) ); } } 1.4 +1 -1 avalon/merlin/install/merlin.nsi Index: merlin.nsi =================================================================== RCS file: /home/cvs/avalon/merlin/install/merlin.nsi,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- merlin.nsi 8 May 2004 23:04:46 -0000 1.3 +++ merlin.nsi 9 May 2004 23:51:08 -0000 1.4 @@ -26,7 +26,7 @@ ;General Name "Merlin Platform 3.3" - OutFile "merlin-install-3.3.0-RC5.exe" + OutFile "merlin-install-3.3.0-RC6.exe" ;Folder selection page InstallDir "C:\merlin" 1.12 +1 -1 avalon/versioning/avalon-merlin.ent Index: avalon-merlin.ent =================================================================== RCS file: /home/cvs/avalon/versioning/avalon-merlin.ent,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- avalon-merlin.ent 8 May 2004 18:24:18 -0000 1.11 +++ avalon-merlin.ent 9 May 2004 23:51:08 -0000 1.12 @@ -47,7 +47,7 @@ <!ENTITY merlin-id "merlin"> <!ENTITY merlin-spec "3.3"> -<!ENTITY merlin-product-version "3.3-RC5"> +<!ENTITY merlin-product-version "3.3-RC6"> <!ENTITY merlin-api-id "merlin-api"> <!ENTITY merlin-api-version "3.3.0">
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]