/*
* Copyright (C) 2015 Red Hat, Inc. and/or its affiliates.
*
* 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.jboss.errai.reflections;
import com.google.common.base.Predicates;
import org.junit.Assert;
import org.junit.Test;
import org.jboss.errai.reflections.util.ClasspathHelper;
import org.jboss.errai.reflections.vfs.Vfs;
import org.jboss.errai.reflections.vfs.ZipDir;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collection;
/** */
public class VfsTest {
private void testVfsDir(URL url) {
Assert.assertNotNull(url);
Vfs.Dir dir = Vfs.fromURL(url);
Assert.assertNotNull(dir);
Iterable<Vfs.File> files = dir.getFiles();
Vfs.File first = files.iterator().next();
Assert.assertNotNull(first);
first.getName();
try {
first.openInputStream();
} catch (IOException e) {
throw new RuntimeException(e);
}
dir.close();
}
@Test
public void vfsFromJar() {
testVfsDir(getSomeJar());
}
@Test
public void vfsFromDir() {
testVfsDir(getSomeDirectory());
}
@Test
public void vfsFromJarFileUrl() throws MalformedURLException {
testVfsDir(new URL("jar:file:" + getSomeJar().getPath() + "!/"));
}
@Test
public void findFilesFromEmptyMatch() throws MalformedURLException {
final URL jar = getSomeJar();
final Iterable<Vfs.File> files = Vfs.findFiles(java.util.Arrays.asList(jar), Predicates.<Vfs.File>alwaysFalse());
Assert.assertNotNull(files);
Assert.assertFalse(files.iterator().hasNext());
}
// @Test
public void vfsFromHttpUrl() throws MalformedURLException {
Vfs.addDefaultURLTypes(new Vfs.UrlType() {
public boolean matches(URL url) {return url.getProtocol().equals("http");}
public Vfs.Dir createDir(final URL url) {return new HttpDir(url);}
});
testVfsDir(new URL("http://mirrors.ibiblio.org/pub/mirrors/maven2/org/slf4j/slf4j-api/1.5.6/slf4j-api-1.5.6.jar"));
}
//this is just for the test...
static class HttpDir implements Vfs.Dir {
private final File file;
private final ZipDir zipDir;
private final String path;
HttpDir(URL url) {
this.path = url.toExternalForm();
try {file = downloadTempLocally(url);}
catch (IOException e) {throw new RuntimeException(e);}
zipDir = new ZipDir(file.getAbsolutePath());
}
public String getPath() {return path;}
public Iterable<Vfs.File> getFiles() {return zipDir.getFiles();}
public void close() {file.delete();}
private static java.io.File downloadTempLocally(URL url) throws IOException {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
if (connection.getResponseCode() == 200) {
java.io.File temp = java.io.File.createTempFile("urlToVfs", "tmp");
FileOutputStream out = new FileOutputStream(temp);
DataInputStream in = new DataInputStream(connection.getInputStream());
int len; byte ch[] = new byte[1024];
while ((len = in.read(ch)) != -1) {out.write(ch, 0, len);}
connection.disconnect();
return temp;
}
return null;
}
}
@Test
public void vfsFromJarWithInnerJars() {
//todo?
}
//
public URL getSomeJar() {
Collection<URL> urls = ClasspathHelper.forClassLoader();
for (URL url : urls) {
if (url.getFile().endsWith(".jar")) {
return url;
}
}
Assert.fail("could not find jar url");
return null;
}
private URL getSomeDirectory() {
try {
return new File(ReflectionsTest.getUserDir()).toURI().toURL();
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
}