Mercurial > hg4j
comparison src/org/tmatesoft/hg/internal/FilterByteChannel.java @ 355:f2c11fe7f3e9
Newline filter shall respect whole stream when deciding whether to process line terminators, hence added stream preview functionality
author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
---|---|
date | Tue, 06 Dec 2011 12:57:21 +0100 |
parents | d5268ca7715b |
children | 91d75e1bac9f |
comparison
equal
deleted
inserted
replaced
354:5f9073eabf06 | 355:f2c11fe7f3e9 |
---|---|
16 */ | 16 */ |
17 package org.tmatesoft.hg.internal; | 17 package org.tmatesoft.hg.internal; |
18 | 18 |
19 import java.io.IOException; | 19 import java.io.IOException; |
20 import java.nio.ByteBuffer; | 20 import java.nio.ByteBuffer; |
21 import java.util.ArrayList; | |
21 import java.util.Collection; | 22 import java.util.Collection; |
23 import java.util.List; | |
22 | 24 |
23 import org.tmatesoft.hg.util.Adaptable; | 25 import org.tmatesoft.hg.util.Adaptable; |
24 import org.tmatesoft.hg.util.ByteChannel; | 26 import org.tmatesoft.hg.util.ByteChannel; |
25 import org.tmatesoft.hg.util.CancelledException; | 27 import org.tmatesoft.hg.util.CancelledException; |
26 | 28 |
53 return buffer.position() - srcPos; // consumed as much from original buffer | 55 return buffer.position() - srcPos; // consumed as much from original buffer |
54 } | 56 } |
55 | 57 |
56 // adapters or implemented interfaces of the original class shall not be obfuscated by filter | 58 // adapters or implemented interfaces of the original class shall not be obfuscated by filter |
57 public <T> T getAdapter(Class<T> adapterClass) { | 59 public <T> T getAdapter(Class<T> adapterClass) { |
60 if (adapterClass == Preview.class) { | |
61 ArrayList<Preview> previewers = new ArrayList<Preview>(filters.length); | |
62 for (Filter f : filters) { | |
63 if (f instanceof Preview /*FIXME or getAdapter != null*/) { | |
64 previewers.add((Preview) f); | |
65 } | |
66 } | |
67 if (!previewers.isEmpty()) { | |
68 @SuppressWarnings("unchecked") | |
69 T rv = (T) new PreviewSupport(previewers); | |
70 return rv; | |
71 } | |
72 // fall through to let delegate answer | |
73 } | |
58 if (delegate instanceof Adaptable) { | 74 if (delegate instanceof Adaptable) { |
59 return ((Adaptable) delegate).getAdapter(adapterClass); | 75 return ((Adaptable) delegate).getAdapter(adapterClass); |
60 } | 76 } |
61 if (adapterClass != null && adapterClass.isInstance(delegate)) { | 77 if (adapterClass != null && adapterClass.isInstance(delegate)) { |
62 return adapterClass.cast(delegate); | 78 return adapterClass.cast(delegate); |
63 } | 79 } |
64 return null; | 80 return null; |
65 } | 81 } |
82 | |
83 private static class PreviewSupport implements Preview { | |
84 private final Preview[] participants; | |
85 | |
86 public PreviewSupport(List<Preview> previewers) { | |
87 participants = new Preview[previewers.size()]; | |
88 previewers.toArray(participants); | |
89 } | |
90 | |
91 public void preview(ByteBuffer src) { | |
92 final int originalPos = src.position(); | |
93 for (Preview p : participants) { | |
94 p.preview(src); | |
95 // reset to initial state | |
96 src.position(originalPos); | |
97 } | |
98 } | |
99 } | |
66 } | 100 } |