I have used this class istead of CachedOutputStream https://www.whitebyte.info/programming/java/convert-a-bytearrayoutputstream-into-a-bytearrayinputstream and also rewirte interceptor to WriterInterceptor interface, now my ReplaceOutInterceptor is working fine Thanks!
2016-10-08 1:14 GMT+04:00 Vjacheslav V. Borisov <slav...@gmail.com>: > Hi! > > I see WriterInterceptorContext could be used, but it also requires > CachedOutputStream to intercept OutputStream, I see this in > JweJsonWriterInterceptor... > So CachedOutputStream bug will be repeated in WriterInterceptorContext > > > > > 2016-09-20 13:13 GMT+04:00 Sergey Beryozkin <sberyoz...@gmail.com>: > >> Hi, >> JAX-RS ContainerRequestContext and ContainerResponseContext, as well as >> WriterInterceptorContext and ReaderInterceptorContext filter contexts all >> allow resetting the entity streams or on the way out - entity objects - >> perhaps that can offer a simpler option for replacing the content... >> >> Cheers, Sergey >> >> On 19/09/16 11:30, Vjacheslav V. Borisov wrote: >> >>> During message.getInterceptorChain().doIntercept(message); I see call to >>> maybeDeleteTempFile() which resets inmem = true; >>> and later csnew.getInputStream() execution leads to if (inmem) { } >>> >>> 2016-09-19 13:05 GMT+04:00 Vjacheslav V. Borisov <slav...@gmail.com>: >>> >>> Hi! >>>> >>>> I have following code (this is interceptror which does regular >>>> expression >>>> replacements) >>>> >>>> >>>> https://github.com/ilb/common/blob/master/common-jaxrs/src/ >>>> main/java/ru/ilb/common/jaxrs/interceptors/ReplaceOutInterceptor.java >>>> >>>> private void replaceContents(Message message) { >>>> OutputStream os = message.getContent(OutputStream.class); >>>> CachedStream cs = new CachedStream(); >>>> message.setContent(OutputStream.class, cs); >>>> >>>> message.getInterceptorChain().doIntercept(message); >>>> >>>> try { >>>> cs.flush(); >>>> CachedOutputStream csnew = (CachedOutputStream) >>>> message.getContent(OutputStream.class); >>>> >>>> String contents = IOUtils.toString(csnew.getInputStream()); >>>> for (Map.Entry<String, String> keyValue : >>>> replacements.entrySet()) { >>>> contents = contents.replaceAll(keyValue.getKey(), >>>> keyValue.getValue()); >>>> } >>>> //String replaced=contents.replaceAll(regex, replacement); >>>> os.write(contents.getBytes(Charset.forName(encoding))); >>>> os.flush(); >>>> >>>> message.setContent(OutputStream.class, os); >>>> >>>> } catch (IOException ioe) { >>>> throw new RuntimeException(ioe); >>>> } >>>> } >>>> >>>> >>>> >>>> Howewer, when response contents length of if less than threshold (128 * >>>> 1024 bytes) >>>> i can get csnew.getInputStream() and get its contents, but when content >>>> is >>>> more than treshold, >>>> i see that in enforceLimits() -> createFileOutputStream() temp file is >>>> created, >>>> but using csnew.getInputStream() I am getting empty stream. >>>> >>>> >>> >> >> -- >> Sergey Beryozkin >> >> Talend Community Coders >> http://coders.talend.com/ >> > >