package com.scrivenvar.definition;
import com.scrivenvar.Services;
import com.scrivenvar.definition.yaml.YamlFileDefinitionSource;
import com.scrivenvar.predicates.files.FileTypePredicate;
import com.scrivenvar.service.Settings;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
import java.util.List;
public class DefinitionFactory {
private static final String EXTENSIONS_PREFIX = "file.ext.definition";
private final Settings settings = Services.load( Settings.class );
public DefinitionFactory() {
}
public DefinitionSource fileDefinitionSource( final Path path ) {
final Settings properties = getSettings();
final Iterator<String> keys = properties.getKeys( EXTENSIONS_PREFIX );
DefinitionSource result = new EmptyDefinitionSource();
while( keys.hasNext() ) {
final String key = keys.next();
final List<String> patterns = properties.getStringSettingList( key );
final FileTypePredicate predicate = new FileTypePredicate( patterns );
if( predicate.test( path.toFile() ) ) {
final String filetype = key.replace( EXTENSIONS_PREFIX + ".", "" );
result = createFileDefinitionSource( filetype, path );
}
}
return result;
}
public DefinitionSource createDefinitionSource( final String path ) {
final String protocol = getProtocol( path );
DefinitionSource result = new EmptyDefinitionSource();
switch( protocol ) {
case "file":
result = fileDefinitionSource( Paths.get( path ) );
break;
default:
unknownDefinitionSource( protocol, path );
break;
}
return result;
}
private DefinitionSource createFileDefinitionSource(
final String filetype, final Path path ) {
DefinitionSource result = new EmptyDefinitionSource();
switch( filetype ) {
case "yaml":
result = new YamlFileDefinitionSource( path );
break;
default:
unknownDefinitionSource( filetype, path.toString() );
break;
}
return result;
}
private void unknownDefinitionSource( final String type, final String path ) {
throw new IllegalArgumentException(
"Unknown type '" + type + "' for " + path + "."
);
}
private Settings getSettings() {
return this.settings;
}
private String getProtocol( final String source ) {
String protocol = null;
try {
final URI uri = new URI( source );
if( uri.isAbsolute() ) {
protocol = uri.getScheme();
} else {
final URL url = new URL( source );
protocol = url.getProtocol();
}
} catch( final URISyntaxException | MalformedURLException e ) {
if( source.startsWith( "//" ) ) {
throw new IllegalArgumentException( "Relative context: " + source );
} else {
final File file = new File( source );
protocol = getProtocol( file );
}
}
return protocol;
}
private String getProtocol( final File file ) {
String result;
try {
result = file.toURI().toURL().getProtocol();
} catch( Exception e ) {
result = "unknown";
}
return result;
}
}