propane 0.9.0-java → 2.0.0.pre-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -6,21 +6,21 @@ require 'propane/version'
6
6
  Gem::Specification.new do |gem|
7
7
  gem.name = 'propane'
8
8
  gem.version = Propane::VERSION
9
- gem.authors = ['filib', 'monkstone']
9
+ gem.authors = ['monkstone']
10
10
  gem.email = ['mamba2928@yahoo.co.uk']
11
11
  gem.license = 'MIT'
12
12
  gem.description = %q{A Standalone Ruby Processing implementation}
13
- gem.summary = %q{A really slim layer between Ruby and Processing-2.2.1.}
14
- gem.homepage = 'https://github.com/monkstone/propane'
13
+ gem.summary = %q{A really slim layer between Ruby and Processing-3.1.1.}
14
+ gem.homepage = 'https://ruby-processing.github.io/propane/'
15
15
  gem.files = `git ls-files`.split($/)
16
16
  gem.files << 'lib/propane.jar'
17
- gem.files << 'lib/core-2.2.1.jar'
18
- gem.files << 'lib/gluegen-rt-2.1.5-01.jar'
19
- gem.files << 'lib/jogl-all-2.1.5-01.jar'
20
- gem.files << 'lib/gluegen-rt-2.1.5-01-natives-linux-amd64.jar'
21
- gem.files << 'lib/gluegen-rt-2.1.5-01-natives-macosx-universal.jar'
22
- gem.files << 'lib/jogl-all-2.1.5-01-natives-linux-amd64.jar'
23
- gem.files << 'lib/jogl-all-2.1.5-01-natives-macosx-universal.jar'
17
+ gem.files << 'lib/core-3.1.1.jar'
18
+ gem.files << 'lib/gluegen-rt-2.3.2.jar'
19
+ gem.files << 'lib/jogl-all-2.3.2.jar'
20
+ gem.files << 'lib/gluegen-rt-2.3.2-natives-linux-amd64.jar'
21
+ gem.files << 'lib/gluegen-rt-2.3.2-natives-macosx-universal.jar'
22
+ gem.files << 'lib/jogl-all-2.3.2-natives-linux-amd64.jar'
23
+ gem.files << 'lib/jogl-all-2.3.2-natives-macosx-universal.jar'
24
24
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
25
25
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
26
26
  gem.add_runtime_dependency 'arcball', '~> 0.0.3'
@@ -0,0 +1,42 @@
1
+ /*
2
+ * Copyright (c) 2015-16 Martin Prout
3
+ *
4
+ * This library is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU Lesser General Public
6
+ * License as published by the Free Software Foundation; either
7
+ * version 2.1 of the License, or (at your option) any later version.
8
+ *
9
+ * http://creativecommons.org/licenses/LGPL/2.1/
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+ package monkstone.videoevent;
22
+ import processing.video.Movie;
23
+ import processing.video.Capture;
24
+ /**
25
+ * This interface makes it easier/possible to use the reflection methods
26
+ * from Movie and Capture classes in Propane::App in propane
27
+ * @author Martin Prout
28
+ */
29
+ public interface VideoInterface {
30
+ /**
31
+ * Used to implement reflection method in PApplet
32
+ * @see processing.video.Movie
33
+ * @param movie Movie
34
+ */
35
+ public void movieEvent(Movie movie);
36
+ /**
37
+ * Used to implement reflection method in PApplet
38
+ * @see processing.video.Capture
39
+ * @param capture Capture
40
+ */
41
+ public void captureEvent(Capture capture);
42
+ }
@@ -0,0 +1,20 @@
1
+ /*
2
+ * Copyright (c) 2015-16 Martin Prout
3
+ *
4
+ * This library is free software; you can redistribute it and/or
5
+ * modify it under the terms of the GNU Lesser General Public
6
+ * License as published by the Free Software Foundation; either
7
+ * version 2.1 of the License, or (at your option) any later version.
8
+ *
9
+ * http://creativecommons.org/licenses/LGPL/2.1/
10
+ *
11
+ * This library is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with this library; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+ package monkstone.videoevent;
@@ -10,25 +10,32 @@ CLASS_SKETCH = <<~CODE
10
10
  require 'propane'
11
11
 
12
12
  class FredSketch < Propane::App
13
- def setup
13
+ def settings
14
14
  size 200, 200, P2D
15
15
  end
16
16
 
17
+ def setup
18
+ sketch_title 'Fred Sketch'
19
+ end
20
+
17
21
  def draw
18
22
 
19
23
  end
20
24
  end
21
25
 
26
+ FredSketch.new
27
+
22
28
  CODE
23
29
 
24
30
  class SketchWriterTest < Minitest::Test
25
- ParamMethods = Struct.new(:name, :class_name, :sketch_size)
31
+ ParamMethods = Struct.new(:name, :class_name, :sketch_size, :sketch_title)
26
32
 
27
33
  def setup
28
34
  @param = ParamMethods.new(
29
35
  'fred_sketch',
30
36
  'FredSketch',
31
- 'size 200, 200, P2D'
37
+ 'size 200, 200, P2D',
38
+ "sketch_title 'Fred Sketch'"
32
39
  )
33
40
  end
34
41
 
@@ -156,6 +156,7 @@ METHODS = %i(
156
156
  shear_x
157
157
  shear_y
158
158
  shininess
159
+ sketch_title
159
160
  size
160
161
  smooth
161
162
  specular
@@ -186,6 +187,14 @@ METHODS = %i(
186
187
  )
187
188
 
188
189
  class TestSketch < Propane::App
190
+ def settings
191
+ size 100, 100
192
+ end
193
+
194
+ def setup
195
+ sketch_title 'Sketch Test'
196
+ end
197
+
189
198
  def draw
190
199
  exit if frame_count > 30
191
200
  end
@@ -193,7 +202,7 @@ end
193
202
 
194
203
  class SpecTest < Minitest::Test
195
204
  def setup
196
- @processing_sketch = TestSketch.new title: 'sketch'
205
+ @processing_sketch = TestSketch.new
197
206
  end
198
207
 
199
208
  def test_respond
@@ -1,78 +1,86 @@
1
- # encoding: utf-8
2
- # frozen_string_literal: false
1
+ # frozen_string_literal: true
3
2
  require 'rake/clean'
4
3
 
5
4
  WARNING = <<-EOS
6
5
  WARNING: you may not have wget installed, you could just download
7
- the correct version of jruby-complete to the vendors folder, and
8
- re-run
6
+ the correct version of propane-examples (see EXAMPLES vendors directory)
9
7
  EOS
10
-
11
- EXAMPLES = '0.1'.freeze
12
- JRUBYC_VERSION = '9.1.2.0'.freeze
8
+ SOUND = 'sound.zip'.freeze
9
+ SOUND_VERSION = 'v1.3.2' # version 1.3.2
10
+ VIDEO = 'video-2.zip'
11
+ VIDEO_VERSION = '2' # version 1.0.1
12
+ EXAMPLES = '0.2'.freeze
13
13
  HOME_DIR = ENV['HOME']
14
- MAC_OR_LINUX = /linux|mac|darwin/ =~ RbConfig::CONFIG['host_os']
15
-
16
- CLOBBER.include("jruby-complete-#{JRUBYC_VERSION}.jar")
17
-
18
- desc 'download, and copy to propane'
19
- task default: [:download, :copy_ruby, :download_examples, :copy_examples]
14
+ MAC_OR_LINUX = /linux|mac|darwin/ =~ RbConfig::CONFIG['host_os']
20
15
 
21
- desc 'download JRuby upstream sources'
22
- task download: ["jruby-complete-#{JRUBYC_VERSION}.jar"]
23
-
24
- file "jruby-complete-#{JRUBYC_VERSION}.jar" do
16
+ desc 'download, and copy propane examples'
17
+ task default: [:download_examples, :copy_examples]
18
+ desc 'download and copy examples to user home'
19
+ task :download_examples
20
+ file_name = MAC_OR_LINUX.nil? ? "#{EXAMPLES}.zip" : "#{EXAMPLES}.tar.gz"
21
+ wget_base = 'wget https://github.com/ruby-processing/propane-examples'
22
+ wget_string = [wget_base, 'archive', file_name].join('/')
23
+ file file_name do
25
24
  begin
26
- sh "wget https://s3.amazonaws.com/jruby.org/downloads/#{JRUBYC_VERSION}/jruby-complete-#{JRUBYC_VERSION}.jar"
25
+ sh wget_string
27
26
  rescue
28
27
  warn(WARNING)
29
28
  end
30
- check_sha256("jruby-complete-#{JRUBYC_VERSION}.jar", "b9a6838ff7bbb0b3eda4eeba26017329572bc2fa014008a069b3848482275283")
31
29
  end
32
30
 
33
- directory '../lib/ruby'
31
+ desc 'download and copy sound library to ~/.propane'
32
+ task download_and_copy_sound: [:download_sound, :copy_sound]
34
33
 
35
- desc 'copy jruby-complete'
36
- task copy_ruby: ["../lib/ruby"] do
37
- sh "cp -v jruby-complete-#{JRUBYC_VERSION}.jar ../lib/ruby/jruby-complete.jar"
38
- end
34
+ desc 'download and copy video library to ~/.propane'
35
+ task download_and_copy_video: [:download_video, :copy_video]
39
36
 
40
- def check_sha256(filename, expected_hash)
41
- require 'digest'
42
- sha256 = Digest::SHA256.new
43
- File.open(filename, 'r') do |f|
44
- while buf = f.read(4096)
45
- sha256.update(buf)
46
- end
47
- end
48
- if sha256.hexdigest != expected_hash
49
- raise "bad sha256 checksum for #{filename} (expected #{expected_hash} got #{sha256.hexdigest})"
37
+
38
+ desc 'download sound library'
39
+ task :download_sound do
40
+ wget_base = 'wget https://github.com/processing/processing-sound'
41
+ wget_string = [wget_base, 'releases/download', SOUND_VERSION, SOUND].join('/')
42
+ begin
43
+ sh wget_string
44
+ rescue
45
+ warn(WARNING)
50
46
  end
51
47
  end
52
48
 
53
- desc 'download and copy examples to user home'
54
- task :download_examples
55
- file_name = (MAC_OR_LINUX.nil?) ? "#{EXAMPLES}.zip" : "#{EXAMPLES}.tar.gz"
56
- file file_name do
49
+ desc 'download video library'
50
+ task :download_video do
51
+ wget_base = 'wget https://github.com/processing/processing-video'
52
+ wget_string = [wget_base, 'releases/download', VIDEO_VERSION, VIDEO].join('/')
57
53
  begin
58
- if MAC_OR_LINUX.nil?
59
- sh "wget https://github.com/ruby-processing/propane-examples/archive/#{EXAMPLES}.zip"
60
- else
61
- sh "wget https://github.com/ruby-processing/propane-examples/archive/#{EXAMPLES}.tar.gz"
62
- end
54
+ sh wget_string
63
55
  rescue
64
56
  warn(WARNING)
65
57
  end
66
58
  end
67
59
 
68
- desc "copy examples"
60
+ desc 'copy examples'
69
61
  task :copy_examples => file_name do
70
62
  if MAC_OR_LINUX.nil?
71
- sh "unzip #{EXAMPLES},zip"
63
+ sh "unzip #{EXAMPLES}.zip"
72
64
  else
73
- sh "tar xzvf #{EXAMPLES}.tar.gz"
65
+ sh "tar xzvf #{EXAMPLES}.tar.gz"
74
66
  end
75
- sh "rm -r #{HOME_DIR}/k9_samples" if File.exist? "#{HOME_DIR}/propane_samples"
76
- sh "cp -r propane-examples-#{EXAMPLES} #{HOME_DIR}/propane_samples"
67
+ sh "rm -r #{HOME_DIR}/propane_samples" if File.exist? "#{HOME_DIR}/propane_samples"
68
+ sh "cp -r propane-examples-#{EXAMPLES} #{HOME_DIR}/propane_samples"
77
69
  sh "rm -r propane-examples-#{EXAMPLES}"
78
70
  end
71
+
72
+ desc 'copy sound library'
73
+ task :copy_sound => SOUND do
74
+ sh "unzip #{SOUND}"
75
+ sh "rm -r #{HOME_DIR}/.propane/libraries/sound" if File.exist? "#{HOME_DIR}/.propane/libraries/sound"
76
+ sh "cp -r sound #{HOME_DIR}/.propane/libraries/sound"
77
+ sh 'rm -r sound'
78
+ end
79
+
80
+ desc 'copy video library'
81
+ task :copy_video => VIDEO do
82
+ sh "unzip #{VIDEO}"
83
+ sh "rm -r #{HOME_DIR}/.propane/libraries/video" if File.exist? "#{HOME_DIR}/.propane/libraries/video"
84
+ sh "cp -r video #{HOME_DIR}/.propane/libraries/video"
85
+ sh 'rm -r video'
86
+ end
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: propane
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0
4
+ version: 2.0.0.pre
5
5
  platform: java
6
6
  authors:
7
- - filib
8
7
  - monkstone
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2016-08-04 00:00:00.000000000 Z
11
+ date: 2016-08-11 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: arcball
@@ -41,19 +40,19 @@ files:
41
40
  - ".travis.yml"
42
41
  - CHANGELOG.md
43
42
  - Gemfile
44
- - LICENSE.txt
43
+ - LICENSE
45
44
  - README.md
46
45
  - Rakefile
47
46
  - bin/propane
48
47
  - lib/PROCESSING_LICENSE.txt
49
- - lib/core-2.2.1.jar
48
+ - lib/core-3.1.1.jar
50
49
  - lib/export.txt
51
- - lib/gluegen-rt-2.1.5-01-natives-linux-amd64.jar
52
- - lib/gluegen-rt-2.1.5-01-natives-macosx-universal.jar
53
- - lib/gluegen-rt-2.1.5-01.jar
54
- - lib/jogl-all-2.1.5-01-natives-linux-amd64.jar
55
- - lib/jogl-all-2.1.5-01-natives-macosx-universal.jar
56
- - lib/jogl-all-2.1.5-01.jar
50
+ - lib/gluegen-rt-2.3.2-natives-linux-amd64.jar
51
+ - lib/gluegen-rt-2.3.2-natives-macosx-universal.jar
52
+ - lib/gluegen-rt-2.3.2.jar
53
+ - lib/jogl-all-2.3.2-natives-linux-amd64.jar
54
+ - lib/jogl-all-2.3.2-natives-macosx-universal.jar
55
+ - lib/jogl-all-2.3.2.jar
57
56
  - lib/propane.jar
58
57
  - lib/propane.rb
59
58
  - lib/propane/app.rb
@@ -68,14 +67,13 @@ files:
68
67
  - library/file_chooser/chooser.rb
69
68
  - library/file_chooser/file_chooser.rb
70
69
  - library/slider/slider.rb
70
+ - library/video_event/video_event.rb
71
71
  - pom.rb
72
72
  - pom.xml
73
73
  - propane.gemspec
74
- - src/monkstone/CodeListener.java
75
74
  - src/monkstone/ColorUtil.java
76
75
  - src/monkstone/MathToolModule.java
77
76
  - src/monkstone/PropaneLibrary.java
78
- - src/monkstone/WatchSketchDir.java
79
77
  - src/monkstone/core/AbstractLibrary.java
80
78
  - src/monkstone/fastmath/Deglut.java
81
79
  - src/monkstone/fastmath/package-info.java
@@ -97,10 +95,12 @@ files:
97
95
  - src/monkstone/vecmath/vec2/package-info.java
98
96
  - src/monkstone/vecmath/vec3/Vec3.java
99
97
  - src/monkstone/vecmath/vec3/package-info.java
98
+ - src/monkstone/videoevent/VideoInterface.java
99
+ - src/monkstone/videoevent/package-info.java
100
100
  - test/create_test.rb
101
101
  - test/respond_to_test.rb
102
102
  - vendors/Rakefile
103
- homepage: https://github.com/monkstone/propane
103
+ homepage: https://ruby-processing.github.io/propane/
104
104
  licenses:
105
105
  - MIT
106
106
  metadata: {}
@@ -115,15 +115,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
115
115
  version: '0'
116
116
  required_rubygems_version: !ruby/object:Gem::Requirement
117
117
  requirements:
118
- - - ">="
118
+ - - ">"
119
119
  - !ruby/object:Gem::Version
120
- version: '0'
120
+ version: 1.3.1
121
121
  requirements: []
122
122
  rubyforge_project:
123
123
  rubygems_version: 2.6.3
124
124
  signing_key:
125
125
  specification_version: 4
126
- summary: A really slim layer between Ruby and Processing-2.2.1.
126
+ summary: A really slim layer between Ruby and Processing-3.1.1.
127
127
  test_files:
128
128
  - test/create_test.rb
129
129
  - test/respond_to_test.rb
@@ -1,22 +0,0 @@
1
- Copyright (c) 2013 Philip Cunningham
2
-
3
- MIT License
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining
6
- a copy of this software and associated documentation files (the
7
- "Software"), to deal in the Software without restriction, including
8
- without limitation the rights to use, copy, modify, merge, publish,
9
- distribute, sublicense, and/or sell copies of the Software, and to
10
- permit persons to whom the Software is furnished to do so, subject to
11
- the following conditions:
12
-
13
- The above copyright notice and this permission notice shall be
14
- included in all copies or substantial portions of the Software.
15
-
16
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,7 +0,0 @@
1
- package monkstone;
2
-
3
- import java.nio.file.WatchEvent;
4
-
5
- public interface CodeListener {
6
- public void code_event(WatchEvent<?> event);
7
- }
@@ -1,190 +0,0 @@
1
- /**
2
- * This class allows JRubyArt to watch for changes to sketch files
3
- * specifically those with a 'rb' or 'glsl' extension requires user to supply
4
- * a path String and code listener to constructor. The code listener should
5
- * accept a filesystem WatchEvent
6
- */
7
-
8
- /*
9
- * This code is a modified version of WatchDir.java
10
- * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
11
- *
12
- * Redistribution and use in source and binary forms, with or without
13
- * modification, are permitted provided that the following conditions
14
- * are met:
15
- *
16
- * - Redistributions of source code must retain the above copyright
17
- * notice, this list of conditions and the following disclaimer.
18
- *
19
- * - Redistributions in binary form must reproduce the above copyright
20
- * notice, this list of conditions and the following disclaimer in the
21
- * documentation and/or other materials provided with the distribution.
22
- *
23
- * - Neither the name of Oracle nor the names of its
24
- * contributors may be used to endorse or promote products derived
25
- * from this software without specific prior written permission.
26
- *
27
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
28
- * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
29
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
31
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
32
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
33
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
34
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
35
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
36
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
37
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38
- */
39
- package monkstone;
40
-
41
- import java.io.IOException;
42
- import java.nio.file.FileSystems;
43
- import java.nio.file.FileVisitResult;
44
- import java.nio.file.Files;
45
- import java.nio.file.Path;
46
- import java.nio.file.Paths;
47
- import java.nio.file.SimpleFileVisitor;
48
- import static java.nio.file.StandardWatchEventKinds.*;
49
- import java.nio.file.WatchEvent;
50
- import java.nio.file.WatchKey;
51
- import java.nio.file.WatchService;
52
- import java.nio.file.attribute.BasicFileAttributes;
53
- import java.util.HashMap;
54
- import java.util.Map;
55
-
56
- /**
57
- * Example to watch a directory (or tree) for changes to files.
58
- */
59
- public class WatchSketchDir {
60
-
61
- private final WatchService watcher;
62
- private final Map<WatchKey, Path> keys;
63
- private boolean trace = false;
64
-
65
- @SuppressWarnings("unchecked")
66
- static <T> WatchEvent<T> cast(WatchEvent<?> event) {
67
- return (WatchEvent<T>) event;
68
- }
69
-
70
-
71
- /**
72
- * Register the given directory with the WatchService
73
- */
74
- private void register(Path dir) throws IOException {
75
- WatchKey key = dir.register(watcher, ENTRY_MODIFY);
76
- if (trace) {
77
- Path prev = keys.get(key);
78
- if (prev == null) {
79
- System.out.format("register: %s\n", dir);
80
- } else if (!dir.equals(prev)) {
81
- System.out.format("update: %s -> %s\n", prev, dir);
82
- }
83
- }
84
- keys.put(key, dir);
85
- }
86
-
87
- /**
88
- * Register the given directory, and all its sub-directories, with the
89
- * WatchService.
90
- */
91
- private void registerAll(final Path start) throws IOException {
92
- // register directory and sub-directories
93
- Files.walkFileTree(start, new SimpleFileVisitor<Path>() {
94
- @Override
95
- public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
96
- throws IOException {
97
- register(dir);
98
- return FileVisitResult.CONTINUE;
99
- }
100
- });
101
- }
102
-
103
- static final WatchSketchDir watch(String dir) throws IOException{
104
- return new WatchSketchDir(dir);
105
- }
106
-
107
- /**
108
- * Creates a WatchService and registers the given directory
109
- * @param dir String
110
- * @param obj CodeListener
111
- * @throws IOException
112
- */
113
- private WatchSketchDir(String dir) throws IOException {
114
- this(Paths.get(dir));
115
- }
116
-
117
- /**
118
- * Creates a WatchService and registers the given directory
119
- *
120
- * @param dir Path
121
- * @param obj CodeListener
122
- * @throws java.io.IOException
123
- */
124
- private WatchSketchDir(Path dir) throws IOException {
125
- this.watcher = FileSystems.getDefault().newWatchService();
126
- this.keys = new HashMap<>();
127
-
128
- System.out.format("Scanning Codebase\n", dir);
129
- registerAll(dir);
130
- System.out.format("Watching %s\n", dir);
131
-
132
- // enable trace after initial registration
133
- this.trace = true;
134
- }
135
-
136
- /**
137
- * Process all events for keys queued to the watcher
138
- */
139
- public void addListener(CodeListener obj) {
140
- for (;;) {
141
-
142
- // wait for key to be signalled
143
- WatchKey key;
144
- try {
145
- key = watcher.take();
146
- } catch (InterruptedException x) {
147
- return;
148
- }
149
-
150
- Path dir = keys.get(key);
151
- if (dir == null) {
152
- System.err.println("WatchKey not recognized!!");
153
- continue;
154
- }
155
-
156
- key.pollEvents().stream().forEach((WatchEvent<?> event) -> {
157
- WatchEvent.Kind kind = event.kind();
158
- // TBD - provide example of how OVERFLOW event is handled
159
- if (!(kind == OVERFLOW)) {
160
- // Context for directory entry event is the file name of entry
161
- WatchEvent<Path> ev = cast(event);
162
- Path name = ev.context();
163
- Path child = dir.resolve(name);
164
- if (kind == ENTRY_MODIFY){
165
- if (child.toFile().getAbsolutePath().endsWith(".rb")
166
- || child.toFile().getAbsolutePath().endsWith(".glsl")) {
167
-
168
- obj.code_event(event);
169
- key.reset();
170
- }
171
- }
172
- // if directory is created, and watching recursively, then
173
- // register it and its sub-directories
174
- }
175
- });
176
-
177
- // reset key and remove from set if directory no longer accessible
178
- boolean valid = key.reset();
179
- if (!valid) {
180
- keys.remove(key);
181
-
182
- // all directories are inaccessible
183
- if (keys.isEmpty()) {
184
- break;
185
- }
186
- }
187
- }
188
- }
189
-
190
- }