001    // Copyright 2004, 2005 The Apache Software Foundation
002    //
003    // Licensed under the Apache License, Version 2.0 (the "License");
004    // you may not use this file except in compliance with the License.
005    // You may obtain a copy of the License at
006    //
007    //     http://www.apache.org/licenses/LICENSE-2.0
008    //
009    // Unless required by applicable law or agreed to in writing, software
010    // distributed under the License is distributed on an "AS IS" BASIS,
011    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012    // See the License for the specific language governing permissions and
013    // limitations under the License.
014    
015    package org.apache.examples;
016    
017    import java.net.URL;
018    import java.util.ArrayList;
019    import java.util.List;
020    import java.util.Locale;
021    
022    import org.apache.hivemind.ClassResolver;
023    import org.apache.hivemind.ModuleDescriptorProvider;
024    import org.apache.hivemind.Registry;
025    import org.apache.hivemind.Resource;
026    import org.apache.hivemind.impl.DefaultClassResolver;
027    import org.apache.hivemind.impl.RegistryBuilder;
028    import org.apache.hivemind.impl.XmlModuleDescriptorProvider;
029    import org.apache.hivemind.util.FileResource;
030    import org.apache.hivemind.util.URLResource;
031    
032    /**
033     * Utilities needed by the examples.
034     * 
035     * @author Howard Lewis Ship
036     */
037    public class ExampleUtils
038    {
039        /**
040         * Builds a Registry for a file stored in the src/descriptor/META-INF directory.
041         * 
042         * @param fileName --
043         *            the name of the module descriptor file.
044         */
045        public static Registry buildRegistry(String fileName)
046        {
047            // The examples package is structured oddly (so that it doesn't interfere with
048            // the main HiveMind framework tests), so we have to go through some gyrations
049            // here that aren't necessary in an ordinary HiveMind application.
050    
051            String projectRoot = System.getProperty("PROJECT_ROOT", ".");
052            String path = projectRoot + "/examples/src/descriptor/META-INF/" + fileName;
053    
054            ClassResolver resolver = new DefaultClassResolver();
055    
056            // Register the examples.xml file, which (given its non-standard name)
057            // is not visible.
058            ModuleDescriptorProvider provider = new XmlModuleDescriptorProvider(resolver,
059                    new FileResource(path));
060            return buildRegistry(provider);
061        }
062        
063        /**
064         * Convenience method for invoking {@link #buildClasspathRegistry(String[])} with only a single
065         * file.
066         */
067        public static Registry buildClasspathRegistry(String file) throws Exception
068        {
069            return buildClasspathRegistry(new String[] { file });
070        }
071    
072        /**
073         * Builds a registry for files in the classpath.
074         */
075        public static Registry buildClasspathRegistry(String[] files) throws Exception
076        {
077            ClassResolver resolver = new DefaultClassResolver();
078    
079            List descriptorResources = new ArrayList();
080            for (int i = 0; i < files.length; i++)
081            {
082                Resource resource = getResource(files[i]);
083                descriptorResources.add(resource);
084            }
085    
086            ModuleDescriptorProvider provider = new XmlModuleDescriptorProvider(resolver,
087                    descriptorResources);
088    
089            return buildRegistry(provider);
090        }
091        
092        protected static Registry buildRegistry(ModuleDescriptorProvider customProvider)
093        {
094            ClassResolver resolver = new DefaultClassResolver();
095    
096            RegistryBuilder builder = new RegistryBuilder();
097    
098            builder.addModuleDescriptorProvider(new XmlModuleDescriptorProvider(resolver));
099            builder.addModuleDescriptorProvider(customProvider);
100    
101            return builder.constructRegistry(Locale.getDefault());
102        }
103        
104        /**
105         * Returns the given file as a {@link Resource} from the classpath. Typically, this is to find
106         * files in the same folder as the invoking class.
107         */
108        protected static Resource getResource(String file)
109        {
110            URL url = ExampleUtils.class.getResource(file);
111    
112            if (url == null)
113                throw new NullPointerException("No resource named '" + file + "'.");
114    
115            return new URLResource(url);
116        }
117    
118    }