001 /*
002 * Licensed under the Apache License, Version 2.0 (the "License");
003 * you may not use this file except in compliance with the License.
004 * You may obtain a copy of the License at
005 *
006 * http://www.apache.org/licenses/LICENSE-2.0
007 *
008 * Unless required by applicable law or agreed to in writing, software
009 * distributed under the License is distributed on an "AS IS" BASIS,
010 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
011 * See the License for the specific language governing permissions and
012 * limitations under the License.
013 */
014 package org.apache.commons.classscan.builtin;
015
016 import java.io.File;
017 import java.io.FileNotFoundException;
018 import java.io.IOException;
019 import java.net.URI;
020 import java.net.URISyntaxException;
021 import java.net.URL;
022
023 import org.apache.commons.classscan.MetaRegistry;
024 import org.apache.commons.classscan.spi.ClassPathElementFactory;
025 import org.apache.commons.classscan.spi.model.SpiClassPathElement;
026
027 public class DefaultClassPathElementFactory implements ClassPathElementFactory {
028
029 @Override
030 public SpiClassPathElement getClassPathElement(MetaRegistry metaRegistry, URL url) throws IOException {
031 String scheme= url.getProtocol();
032 if(scheme.equals("file")) {
033 try {
034 return createFileClassPathElement(url);
035 } catch (URISyntaxException e) {
036 FileNotFoundException ex = new FileNotFoundException(url.toExternalForm()+" not found");
037 ex.initCause(e);
038 throw ex;
039 }
040 }
041 else if(scheme.equals("jar")) {
042 return new JarClassPathElement(url);
043 }
044
045 return null;
046 }
047
048 private SpiClassPathElement createFileClassPathElement(URL url) throws IOException, URISyntaxException {
049 File location = new File(url.toURI());
050 if (!location.canRead()) {
051 throw new FileNotFoundException(location + " can not be read");
052 }
053
054 if (location.isDirectory()) {
055 return new FileClassPathElement(location);
056 }
057
058 URI fileUri = location.toURI();
059 URI jarURI = new URI("jar:" + fileUri.toString() + "!/");
060 return new JarClassPathElement(jarURI.toURL());
061 }
062 }