Skip to content

Commit

Permalink
bug fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
apb2006 committed May 18, 2016
1 parent 5858d97 commit f44a814
Show file tree
Hide file tree
Showing 15 changed files with 190 additions and 61 deletions.
24 changes: 23 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,24 @@
# file-walker
File list and search in the XProc style
File list and search in the XProc style.
````
import module namespace fw="quodatum.file.walker";
declare namespace c="http://www.w3.org/ns/xproc-step";
fw:directory-list($test:dir,map{"depth":-1})
````
see https://www.w3.org/TR/xproc/#c.directory-list

Also testing the performance of the built-in file module against
a Java SimpleFileVisitor implementation.
https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitResult.html

## Performance

````
<testsuites time="PT9M22.656S">
<testsuite name="file:///C:/Users/andy/git/file-walker/src/test/test.xqm" time="PT9M22.654S" tests="2" failures="0" errors="0" skipped="0">
<testcase name="directory-list" time="PT5M36.935S"/>
<testcase name="directory-list-xq" time="PT3M45.697S"/>
</testsuite>
</testsuites>
````
26 changes: 25 additions & 1 deletion dist/doc/file-walker.xqm.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<xqdoc:xqdoc xmlns:xqdoc="http://www.xqdoc.org/1.0">
<xqdoc:control>
<xqdoc:date>2016-05-11T13:40:39.256+01:00</xqdoc:date>
<xqdoc:date>2016-05-18T18:17:23.616+01:00</xqdoc:date>
<xqdoc:version>1.1</xqdoc:version>
</xqdoc:control>
<xqdoc:module type="library">
Expand Down Expand Up @@ -78,6 +78,30 @@
<xqdoc:type>element(c:directory)</xqdoc:type>
</xqdoc:return>
</xqdoc:function>
<xqdoc:function arity="3">
<xqdoc:comment>
<xqdoc:description>list contents using xquery</xqdoc:description>
</xqdoc:comment>
<xqdoc:name>xpf:directory-list-xq2</xqdoc:name>
<xqdoc:signature>declare function xpf:directory-list-xq2($path as xs:string, $options as map(*), $depth as xs:integer) as element(c:directory)</xqdoc:signature>
<xqdoc:parameters>
<xqdoc:parameter>
<xqdoc:name>path</xqdoc:name>
<xqdoc:type>xs:string</xqdoc:type>
</xqdoc:parameter>
<xqdoc:parameter>
<xqdoc:name>options</xqdoc:name>
<xqdoc:type>map(*)</xqdoc:type>
</xqdoc:parameter>
<xqdoc:parameter>
<xqdoc:name>depth</xqdoc:name>
<xqdoc:type>xs:integer</xqdoc:type>
</xqdoc:parameter>
</xqdoc:parameters>
<xqdoc:return>
<xqdoc:type>element(c:directory)</xqdoc:type>
</xqdoc:return>
</xqdoc:function>
<xqdoc:function arity="1">
<xqdoc:name>xpf:directory-list-xq</xqdoc:name>
<xqdoc:signature>declare function xpf:directory-list-xq($path as xs:string) as element(c:directory)</xqdoc:signature>
Expand Down
Binary file removed dist/quodatum-files-0.1.4.xar
Binary file not shown.
16 changes: 16 additions & 0 deletions makejar.jardesc
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
<jardesc>
<jar path="file-walker/src/main/content/quodatum-files-0.1.5.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/file-walker/makjar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/>
<manifest generateManifest="true" manifestLocation="" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
<sealing sealJar="false">
<packagesToSeal/>
<packagesToUnSeal/>
</sealing>
</manifest>
<selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false">
<javaElement handleIdentifier="=file-walker/src\/java"/>
</selectedElements>
</jardesc>
2 changes: 1 addition & 1 deletion makjar.jardesc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="WINDOWS-1252" standalone="no"?>
<jardesc>
<jar path="file-walker/src/main/content/quodatum-files-0.1.4.jar"/>
<jar path="file-walker/src/main/content/quodatum-files-0.1.7.jar"/>
<options buildIfNeeded="true" compress="true" descriptionLocation="/file-walker/makjar.jardesc" exportErrors="true" exportWarnings="true" includeDirectoryEntries="false" overwrite="true" saveDescription="true" storeRefactorings="false" useSourceFolders="false"/>
<storedRefactorings deprecationInfo="true" structuralOnly="false"/>
<selectedProjects/>
Expand Down
12 changes: 12 additions & 0 deletions package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,17 @@
<version num="0.1.4">
<!-- generated: {fn:current-dateTime()} -->
</version>
<version num="0.1.5">
<!-- generated: {fn:current-dateTime()} -->
</version>
<version num="0.1.6">
<!-- generated: {fn:current-dateTime()} -->
</version>
<version num="0.1.7">
<!-- generated: {fn:current-dateTime()} -->
</version>
<version num="0.1.8">
<!-- generated: {fn:current-dateTime()} -->
</version>
</pkg>
</repo>
16 changes: 11 additions & 5 deletions src/java/com/quodatum/file/Runner.java
Original file line number Diff line number Diff line change
@@ -1,18 +1,24 @@
package com.quodatum.file;

import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.EnumSet;

import com.quodatum.file.Walker;

import org.basex.query.value.Value;
import org.basex.query.value.map.Map;

public class Runner {
public static Value filewalk(final String path) throws IOException {
Path startingDir = Paths.get(path);
Walker pf = new Walker();
Files.walkFileTree(startingDir, pf);
return pf.result();
public static Value filewalk(final String path,final Map options ) throws IOException {
Path startingDir = Paths.get(path);
System.out.print(options);
EnumSet<FileVisitOption> opts = EnumSet.of(FileVisitOption.FOLLOW_LINKS);
Walker walk = new Walker(startingDir);
Files.walkFileTree(startingDir,opts, Integer.MAX_VALUE, walk);
return walk.result();
}
}
94 changes: 54 additions & 40 deletions src/java/com/quodatum/file/Walker.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
package com.quodatum.file;

/*
* file walker
* @see https://docs.oracle.com/javase/7/docs/api/java/nio/file/FileVisitResult.html
Expand All @@ -10,55 +11,68 @@
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayDeque;
import java.util.Deque;

import org.basex.query.value.Value;
import org.basex.query.value.ValueBuilder;
import org.basex.query.value.node.FElem;

public class Walker extends SimpleFileVisitor<Path> {
final String cns="http://www.w3.org/ns/xproc-step";
ValueBuilder vb = new ValueBuilder();
void FileWork(ValueBuilder avb ){
vb=avb;
};
final String cns = "http://www.w3.org/ns/xproc-step";

Deque<FElem> stack = new ArrayDeque<FElem>();
FElem site;

public Value result(){
public Walker(Path startingDir) {
site= new FElem("directory", cns)
.add("name",startingDir.getFileName().toString())
.add("xml:base",startingDir.toUri().toString());
}

public Value result() {
ValueBuilder vb = new ValueBuilder();
vb.add(site);
return vb.value();
}

// Print information about
// each type of file.
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attr) {
FElem elem = new FElem("file",cns)
.add("name", file.getFileName().toString());
vb.add(elem);
return CONTINUE;
}

// Print each directory visited.
@Override
public FileVisitResult postVisitDirectory(Path dir,
IOException exc) {
FElem elem = new FElem("directory",cns)
.add("name", dir.getFileName().toString())
.add("xml:base", dir.toString());
vb.add(elem);
return CONTINUE;
}
// Print information about
// each type of file.
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attr) {
FElem elem = new FElem("file", cns).add("name", file.getFileName()
.toString());
site.add(elem);
return CONTINUE;
}

// If there is some error accessing
// the file, let the user know.
// If you don't override this method
// and an error occurs, an IOException
// is thrown.
@Override
public FileVisitResult visitFileFailed(Path file,
IOException exc) {
FElem elem = new FElem("error",cns)
.add("name", file.toString());
vb.add(elem);
return CONTINUE;
}
// Print each directory visited.
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {
stack.push(site);
site = new FElem("directory", cns)
.add("name",dir.getFileName().toString())
.add("xml:base",dir.toUri().toString());
return CONTINUE;
}

// Print each directory visited.
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc)
throws IOException {
site = stack.pop().add(site);
return CONTINUE;
}

// If there is some error accessing
// the file, let the user know.
// If you don't override this method
// and an error occurs, an IOException
// is thrown.
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
FElem elem = new FElem("error", cns).add("name", file.toString());
site.add(elem);
return CONTINUE;
}
}
2 changes: 1 addition & 1 deletion src/main/basex.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<package xmlns="http://www.basex.org/modules/pkg">
<jar>quodatum-files-0.1.4.jar</jar>
<jar>quodatum-files-0.1.7.jar</jar>
<class>com.quodatum.file.Runner</class>
</package>
23 changes: 15 additions & 8 deletions src/main/content/file-walker.xqm
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,8 @@ declare variable $xpf:default-options:=map{
declare function xpf:directory-list($path as xs:string,$options as map(*)) as element(c:directory)
{
let $options:=xpf:defaults($options)
return <c:directory name="{file:name($path)}" xml:base="{file:path-to-uri($path)}">{
Q{java:com.quodatum.file.Runner}filewalk($path)
}</c:directory>
return Q{java:com.quodatum.file.Runner}filewalk($path,$options)

};


Expand All @@ -34,18 +33,26 @@ declare function xpf:directory-list($path as xs:string) as element(c:directory)
declare function xpf:directory-list-xq($path as xs:string,$options as map(*)) as element(c:directory)
{
let $options:=xpf:defaults($options)
let $files:=file:list($path,-1=$options?depth)
return xpf:directory-list-xq2($path ,$options,$options?depth)
};

(:~
: list contents using xquery
:)
declare function xpf:directory-list-xq2($path as xs:string,$options as map(*),$depth as xs:integer) as element(c:directory)
{
let $files:=file:children($path)
return
<c:directory name="{file:name($path)}" xml:base="{file:path-to-uri($path)}">
{for $f in $files
let $full:=file:resolve-path($f,$path)
let $name:=file:name($full)
return if(file:is-dir($full)) then <c:directory name="{$name}"/> else <c:file name="{$name}"/>
return if(file:is-file($f))
then <c:file name="{file:name($f)}"/>
else if($depth eq 0) then ()
else xpf:directory-list-xq2($f,$options, $depth -1)
}
</c:directory>
};


declare function xpf:directory-list-xq($path as xs:string) as element(c:directory)
{
xpf:directory-list-xq($path,map{})
Expand Down
Binary file removed src/main/content/quodatum-files-0.1.4.jar
Binary file not shown.
Binary file added src/main/content/quodatum-files-0.1.7.jar
Binary file not shown.
2 changes: 1 addition & 1 deletion src/main/expath-pkg.xml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<package xmlns="http://expath.org/ns/pkg"
name="https://github.com/Quodatum/file-walker"
abbrev="quodatum-files"
version="0.1.4"
version="0.1.8"
spec="1.0">

<title>File list and search in the XProc style</title>
Expand Down
9 changes: 6 additions & 3 deletions src/test/smoke-test.xq
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
import module namespace fw="quodatum.file.walker";
declare namespace c="http://www.w3.org/ns/xproc-step";
(: fw:web-resolve("")=> fw:directory-list-xq() :)
let $r:=fw:web-resolve("")=> fw:directory-list(map{"depth":-1})
return $r
declare variable $large:="Z:\pictures\Pictures";
declare variable $small:="Z:\recordings\radio";
declare variable $local:="C:\Users\andy\Desktop\radio";

let $r:= fw:directory-list($small,map{"depth":-1})
return $r



25 changes: 25 additions & 0 deletions src/test/test.xqm
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
module namespace test = 'http://basex.org/modules/xqunit-tests';
(:~
: unit tests for filewalker module
:)
import module namespace fw="quodatum.file.walker";
declare namespace c="http://www.w3.org/ns/xproc-step";
declare variable $test:dir:="\\ODROID-JESSIE\sda1\pictures\Pictures";


(:~ directory-list :)
declare
%unit:test
function test:directory-list() {
let $r:=fw:directory-list($test:dir,map{"depth":-1})
let $_:=trace($r//c:file=>count(),"files: ")
return unit:assert($r)
};

declare
%unit:test
function test:directory-list-xq() {
let $r:=fw:directory-list-xq($test:dir,map{"depth":-1})
let $_:=trace($r//c:file=>count(),"files: ")
return unit:assert($r)
};

0 comments on commit f44a814

Please sign in to comment.