X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.core%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fcore%2Fexecution%2FSedFilteredResource.java;h=676918e981f5902e24d3c0d2bf2958f8f7ad291c;hb=8c588d3128b3885ac4fe0a0d2fbd358640d336a5;hp=676c025804f5dc3ed193da0810ac3ddabe38fe5e;hpb=82da8aeebe37e93f26158678590f94341f8ea325;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/SedFilteredResource.java b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/SedFilteredResource.java index 676c02580..676918e98 100644 --- a/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/SedFilteredResource.java +++ b/runtime/org.argeo.slc.core/src/main/java/org/argeo/slc/core/execution/SedFilteredResource.java @@ -1,18 +1,28 @@ +/* + * Copyright (C) 2007-2012 Argeo GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.argeo.slc.core.execution; -import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.CharBuffer; -import java.nio.channels.Channels; import java.nio.channels.FileChannel; -import java.nio.channels.ReadableByteChannel; -import java.nio.channels.WritableByteChannel; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; -import java.nio.charset.CharsetEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -21,12 +31,14 @@ import java.util.StringTokenizer; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apache.commons.io.IOUtils; import org.argeo.slc.SlcException; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.Resource; +/** Experimental and suboptimal */ public class SedFilteredResource implements FactoryBean, InitializingBean { private Resource source; @@ -36,42 +48,53 @@ public class SedFilteredResource implements FactoryBean, InitializingBean { private String charset = "UTF-8"; private Charset cs; private CharsetDecoder decoder; - private CharsetEncoder encoder; + + // private CharsetEncoder encoder; public Object getObject() throws Exception { if (filters.size() == 0) return source; - int capacity = 100 * 1024;// 100 KB + // int capacity = 100 * 1024;// 100 KB ByteBuffer bb; if (source instanceof ByteArrayResource) { bb = ByteBuffer.wrap(((ByteArrayResource) source).getByteArray()); } else { + FileInputStream fis = null; try { File file = source.getFile(); - FileInputStream fis = new FileInputStream(file); + fis = new FileInputStream(file); FileChannel fc = fis.getChannel(); // Get the file's size and then map it into memory int sz = (int) fc.size(); bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz); } catch (IOException e) { - ReadableByteChannel channel = Channels.newChannel(source - .getInputStream()); - bb = ByteBuffer.allocateDirect(capacity); - channel.read(bb); + // ReadableByteChannel channel = Channels.newChannel(source + // .getInputStream()); + // bb = ByteBuffer.allocateDirect(capacity); + // int read = 0; + // do { + // read = channel.read(bb); + // } while (read > 0); + // FIXME : use nio to parse the stream as it goes + bb = ByteBuffer.wrap(IOUtils.toByteArray(source + .getInputStream())); + } finally { + IOUtils.closeQuietly(fis); } } CharBuffer cb = decoder.decode(bb); for (Pattern pattern : patterns.keySet()) { Matcher matcher = pattern.matcher(cb); - matcher.replaceAll(patterns.get(pattern)); + String output = matcher.replaceAll(patterns.get(pattern)); + cb = CharBuffer.wrap(output); } - ByteBuffer bbout = encoder.encode(cb); - ByteArrayOutputStream out = new ByteArrayOutputStream(capacity); - WritableByteChannel wchannel = Channels.newChannel(out); - wchannel.write(bbout); - ByteArrayResource res = new ByteArrayResource(out.toByteArray()); + // ByteBuffer bbout = encoder.encode(cb); + // ByteArrayOutputStream out = new ByteArrayOutputStream(capacity); + // WritableByteChannel wchannel = Channels.newChannel(out); + // wchannel.write(bbout); + ByteArrayResource res = new ByteArrayResource(cb.toString().getBytes()); return res; } @@ -86,7 +109,7 @@ public class SedFilteredResource implements FactoryBean, InitializingBean { public void afterPropertiesSet() throws Exception { cs = Charset.forName(charset); decoder = cs.newDecoder(); - encoder = cs.newEncoder(); + // encoder = cs.newEncoder(); for (String sedStr : filters) { sedStr = sedStr.trim();