1
2
3
4
5
6
7
8
9
10
11 package org.mule.module.pgp;
12
13 import java.io.PipedOutputStream;
14 import java.util.concurrent.Semaphore;
15
16
17
18
19
20 public class TransformPerRequestInChunksPolicy extends AbstractTransformPolicy
21 {
22
23 private Semaphore writeSemaphore;
24 private long chunkSize;
25 private long bytesActuallyRequested;
26
27 public TransformPerRequestInChunksPolicy(long chunkSize)
28 {
29 this.writeSemaphore = new Semaphore(1);
30 this.chunkSize = chunkSize;
31 this.bytesActuallyRequested = 0;
32 }
33
34
35
36
37 @Override
38 public void readRequest(long length)
39 {
40 this.bytesActuallyRequested = this.bytesActuallyRequested + length;
41 super.readRequest(length);
42 this.writeSemaphore.release();
43 }
44
45
46
47
48 @Override
49 public void release()
50 {
51 this.writeSemaphore.release();
52 super.release();
53 }
54
55
56
57
58 @Override
59 protected Thread getCopyingThread()
60 {
61 return new PerRequestWork();
62 }
63
64 private class PerRequestWork extends TransformerWork
65 {
66 @Override
67 protected void execute() throws Exception
68 {
69 getTransformer().initialize(getInputStream().getOut());
70
71 boolean finishWriting = false;
72 while (!finishWriting && !isClosed)
73 {
74 writeSemaphore.acquire();
75
76
77
78
79
80
81 long requested = bytesActuallyRequested;
82 long updatedRequest = (long) (Math.ceil((double)requested / (double)chunkSize) * chunkSize);
83 getBytesRequested().set(updatedRequest);
84
85 finishWriting = getTransformer().write(getInputStream().getOut(), getBytesRequested());
86 }
87 }
88 }
89 }