Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Proposal implementation of IOResource #45

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions core/src/main/java/org/htsjdk/core/io/IOResource.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.htsjdk.core.io;

import java.io.IOException;
import java.net.URI;

/**
* IO resource for HTSJDK.
*
* @author Daniel Gomez-Sanchez (magicDGS)
*/
public interface IOResource<READER, WRITER> {

public String uriIdentifier();

public READER openReader() throws IOException;

public WRITER openWriter() throws IOException;

}
73 changes: 73 additions & 0 deletions core/src/main/java/org/htsjdk/core/io/IOResourceFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package org.htsjdk.core.io;

import org.htsjdk.core.io.internal.PathResourceProvider;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import java.util.ServiceLoader;

/**
* @author Daniel Gomez-Sanchez (magicDGS)
*/
public final class IOResourceFactory {

// installed providers
private static volatile List<IOResourceProvider<?, ?>> installedProviders;

public static final void registerProvider(final IOResourceProvider<?, ?> provider) {
if (provider.uriIdentifier().equalsIgnoreCase(PathResourceProvider.INSTANCE.uriIdentifier())) {
throw new IllegalArgumentException();
}
getLoadedProviders().add(provider);
}

private static final List<IOResourceProvider<?, ?>> getLoadedProviders() {
if (installedProviders == null) {
ServiceLoader<IOResourceProvider> sl = ServiceLoader
.load(IOResourceProvider.class, ClassLoader.getSystemClassLoader());

for (IOResourceProvider provider: sl) {

final String identifier = provider.uriIdentifier();

// register if it is not the default
if (!identifier.equalsIgnoreCase(PathResourceProvider.INSTANCE.uriIdentifier())) {
// first one takes effec
installedProviders.add(provider);
}
}
}
return installedProviders;
}

public static final IOResource<InputStream, OutputStream> getDefault(final String resourceString) {
return PathResourceProvider.INSTANCE.create(resourceString);
}

public static final IOResource<InputStream, OutputStream> getDefault(final URI resourceUri) {
return PathResourceProvider.INSTANCE.create(resourceUri);
}

public IOResource<?, ?> get(final String resourceString) {
try {
return get(new URI(resourceString));
} catch (final URISyntaxException e) {
// try to use the default
return getDefault(resourceString);
}
}

public IOResource<?, ?> get(final URI resourceUri) {
if (resourceUri.getScheme() != null) {
for (final IOResourceProvider<?, ?> provider: getLoadedProviders()) {
if (resourceUri.getScheme().equalsIgnoreCase(provider.uriIdentifier())) {
return provider.create(resourceUri);
}
}
}
return getDefault(resourceUri);
}
}
17 changes: 17 additions & 0 deletions core/src/main/java/org/htsjdk/core/io/IOResourceProvider.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.htsjdk.core.io;

import java.net.URI;

/**
* Service class.
*
* @author Daniel Gomez-Sanchez (magicDGS)
*/
public interface IOResourceProvider<READER, WRITER> {

public String uriIdentifier();

public IOResource<READER, WRITER> create(final String resourceString);

public IOResource<READER, WRITER> create(final URI resourceUri);
}
37 changes: 37 additions & 0 deletions core/src/main/java/org/htsjdk/core/io/internal/PathResource.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.htsjdk.core.io.internal;

import org.htsjdk.core.io.IOResource;
import org.htsjdk.core.io.IOResourceFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;

/**
* @author Daniel Gomez-Sanchez (magicDGS)
*/
class PathResource implements IOResource<InputStream, OutputStream> {

private final Path path;

PathResource(final Path path) {
this.path = path;
}

@Override
public String uriIdentifier() {
return PathResourceProvider.INSTANCE.uriIdentifier();
}

@Override
public InputStream openReader() throws IOException {
return Files.newInputStream(path);
}

@Override
public OutputStream openWriter() throws IOException {
return Files.newOutputStream(path);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package org.htsjdk.core.io.internal;

import org.htsjdk.core.io.IOResource;
import org.htsjdk.core.io.IOResourceFactory;
import org.htsjdk.core.io.IOResourceProvider;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.nio.file.Paths;

/**
* @author Daniel Gomez-Sanchez (magicDGS)
*/
public class PathResourceProvider implements IOResourceProvider<InputStream, OutputStream> {

public static final PathResourceProvider INSTANCE = new PathResourceProvider();

// singleton
private PathResourceProvider() {}

@Override
public String uriIdentifier() {
return "file"; // files are always handled by java.nio.Path
}

@Override
public IOResource<InputStream, OutputStream> create(String resourceString) {
return new PathResource(Paths.get(resourceString));
}

@Override
public IOResource<InputStream, OutputStream> create(URI resourceUri) {
return new PathResource(Paths.get(resourceUri));
}
}