Guava has a method to join a sequence of input streams into one input
stream that might be useful here:

http://docs.guava-libraries.googlecode.com/git-history/v12.0/javadoc/com/google/common/io/ByteStreams.html#join(java.lang.Iterable)

It actually works in terms of an Iterable (or array) of
InputSupplier<InputStream>. There is also a method to turn a URL into an
input stream supplier:

http://docs.guava-libraries.googlecode.com/git-history/v12.0/javadoc/com/google/common/io/Resources.html#newInputStreamSupplier(java.net.URL)

--tim

On Wed, Apr 18, 2012 at 12:07 PM, Thierry Boileau <
[email protected]> wrote:

> Hello Bjorn,
>
>
> >By messing with the code you sent, this seems to be a function of setting
> the representation size. If I set the size, it's fine, if not, it sends the
> whole thing regardless of content-range, which seems like a bug.
> Thanks for discovering a bug inside the RangeFilter class.
>
> Then, I've found that the problem is due to the usage of the
> OutputRepresentation in order to gather the several instances of
> InputStream. I propose you to use an InputRepresentation instead.
> First, I've set up a InputStream class that composes the several
> InputStream (this implementation is only a "quick" code):
>
>     private static class CompositeInputStream extends InputStream {
>         private Iterator<URL> urlIt = null;
>         private InputStream is = null;
>
>         public CompositeInputStream(Vector<URL> urls) throws IOException {
>             urlIt = urls.iterator();
>             if (urlIt.hasNext()) {
>                 is = urlIt.next().openStream();
>             }
>         }
>
>         @Override
>         public int read() throws IOException {
>             // read each input stream until exhaustion
>             int r = is.read();
>
>             boolean goOn = (r == -1);
>             while (goOn) {
>                 // choose the next one until exhaustion
>                 if (urlIt.hasNext()) {
>                     is = urlIt.next().openStream();
>                     r = is.read();
>                     goOn = (r == -1);
>                 } else {
>                     goOn = false;
>                 }
>             }
>
>             return r;
>         }
>     }
>
> Then, I simple return the InputRepresentation:
> return new InputRepresentation(new CompositeInputStream(urls));
>
> I hope this will help you.
>
> Best regards,
> Thierry Boileau
>
>
>
>
>> On Apr 11, 2012, at 2:14 PM, Bjorn Roche wrote:
>>
>>
>> On Apr 11, 2012, at 1:50 PM, Thierry Boileau wrote:
>>
>> Hi Bjorn,
>>
>> that's right, I primarily use the restlet 2.1 version, which does not
>> support this constructor I think. I'm not sure this has an impact.
>>
>>
>> Well when I use the setter I get the same thing (throws exception) as
>> when I pass that value to the constructor.
>>
>> Also, it looks like the range is being ignored -- I am getting the full
>> document back rather than part.
>>
>>
>> By messing with the code you sent, this seems to be a function of setting
>> the representation size. If I set the size, it's fine, if not, it sends the
>> whole thing regardless of content-range, which seems like a bug.
>>
>> Can you send me build instructions (pom or ant file?) for your code if
>> you have it? I am testing with curl, maybe there is an issue with one of
>> our tests?
>>
>>
>> I've figured out how to build (I am an idiot with building)... and I
>> can't reproduce the exception.
>>
>>  bjorn
>>
>>
>> Finally, is it possible to avoid the range processing on just some calls
>> for greater efficiency?
>>
>> bjorn
>>
>> Best regards,
>> Thierry Boileau
>>
>> Thierry,
>>>
>>> The first thing I noticed in your code is that you are using the
>>> OutputRepresentation constructor that does not take an expectedSize
>>> argument, so I took that out and the exception goes away. At the moment my
>>> tests are still failing, so I'll look into that some more.
>>>
>>> bjorn
>>>
>>> On Apr 11, 2012, at 12:39 PM, Thierry Boileau wrote:
>>>
>>> Hi Bjorn,
>>>
>>> I send you a sample test code (server + client) based on your code that
>>> works for me. But I notice that my app sends only 15000 bytes... Can you
>>> tell us the metrics of your tests?
>>>
>>> Not 100% sure of the question.. do you mean container? I am not using
>>>> jetting. My initialization code looks like this:
>>>>                        Component component = new Component();
>>>>                        component.getServers().add(Protocol.HTTP, PORT);
>>>>                        component.getDefaultHost().attach(new
>>>> com.xonami.rest.server.ApiApplication());
>>>>                        component.start();
>>>>
>>>> Is that what you wanted?
>>>>
>>> I wanted to know if the application is served using some "server"
>>> extensions such as jetty (org.restlet.ext.jetty.jar) or simple
>>> (org.restlet.ext.simple.jar), or inside a servlet container.
>>>
>>>
>>> also, in the code I sent it looks like it was not "hanging" but rather
>>>> pausing for a moment and then throwing this exception:
>>>>
>>>> java.io.IOException: Timeout while writing to the queue-based output
>>>> stream
>>>>        at org.restlet.engine.io.PipeStream$2.write(PipeStream.java:106)
>>>>        at java.io.OutputStream.write(OutputStream.java:99)
>>>>        at
>>>> com.xonami.rest.server.media.RawMediaStateWithIdResource$1.write(RawMediaStateWithIdResource.java:158)
>>>>        at org.restlet.engine.io.BioUtils$2.run(BioUtils.java:394)
>>>>        at org.restlet.service.TaskService$1$1.run(TaskService.java:130)
>>>>        at
>>>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>>>>        at
>>>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>>>>        at java.lang.Thread.run(Thread.java:680)
>>>>
>>>
>>> thanks, I try to reproduce this error. Or, if may ask you, can you
>>> provide a reproductible sample test code?
>>>
>>> Best regards,
>>> Thierry Boileau
>>>
>>>
>>>> -----------------------------
>>>> Bjorn Roche
>>>> http://www.xonami.com
>>>> Audio Collaboration
>>>> http://blog.bjornroche.com
>>>>
>>>> ------------------------------------------------------
>>>>
>>>> http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2947368
>>>>
>>>
>>> <testRange.zip>
>>>
>>>
>>>   -----------------------------
>>> Bjorn Roche
>>> http://www.xonami.com
>>> Audio Collaboration
>>> http://blog.bjornroche.com
>>>
>>>
>>>
>>>
>>>
>>
>>   -----------------------------
>> Bjorn Roche
>> http://www.xonami.com
>> Audio Collaboration
>> http://blog.bjornroche.com
>>
>>
>>
>>
>>
>>   -----------------------------
>> Bjorn Roche
>> http://www.xonami.com
>> Audio Collaboration
>> http://blog.bjornroche.com
>>
>>
>>
>>
>>
>

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2949515

Reply via email to