com.github.rwitzel.streamflyer.support.ProcessEndOfStreamTest.java Source code

Java tutorial

Introduction

Here is the source code for com.github.rwitzel.streamflyer.support.ProcessEndOfStreamTest.java

Source

/**
 * Copyright (C) 2011 rwoo@gmx.de
 *
 * 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 com.github.rwitzel.streamflyer.support;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.StringReader;
import java.io.Writer;
import java.nio.charset.Charset;
import java.util.regex.Pattern;

import org.apache.commons.io.IOUtils;
import org.apache.commons.io.input.ReaderInputStream;
import org.junit.Test;

import com.github.rwitzel.streamflyer.core.ModifyingReader;
import com.github.rwitzel.streamflyer.regex.RegexModifier;
import com.github.rwitzel.streamflyer.util.StringUtils;

public class ProcessEndOfStreamTest {

    @Test
    public void test2013_14_03_ProcessEndOfStream_beAwareOfFlush() throws Exception {
        assertTrue(rewriteContent(true, "http://mydomain/"));
        assertFalse(rewriteContent(false, "http://mydomain/"));
    }

    /**
     * @param flush
     * @return Returns true if the actual output is equals to the expected
     *         output.
     * @throws Exception
     */
    private boolean rewriteContent(boolean flush, String domainPrefix) throws Exception {
        String contentPart = StringUtils.repeat("text", 2);
        String oldUrl = domainPrefix + "something";
        String expectedNewUrl = domainPrefix + "anything";
        String oldHtml = "<html><body>" + contentPart + oldUrl + contentPart + "</body></html>";
        String expectedNewHtml = "<html><body>" + contentPart + expectedNewUrl + contentPart + "</body></html>";
        String encoding = "UTF-8";

        ByteArrayOutputStream os = new ByteArrayOutputStream();
        long written = rewriteContent(new ReaderInputStream(new StringReader(oldHtml)), os, encoding, flush);
        System.out.println("written: " + written);
        System.out.println("oldHtml.length(): " + oldHtml.length());
        System.out.println("expectedNewHtml.length(): " + expectedNewHtml.length());
        System.out.println("expectedNewHtml: \n" + expectedNewHtml);
        os.flush();
        String newHtml = new String(os.toByteArray(), encoding);
        System.out.println(newHtml);
        return expectedNewHtml.equals(newHtml);
    }

    protected long rewriteContent(InputStream input, OutputStream output, String encoding, boolean flush)
            throws IOException {

        Charset charset = Charset.forName(encoding);
        String oldPath = "something";
        String newPath = "anything";
        String regex = "((https?://)([^/]+/))?(" + oldPath + ")";
        String replacement = "$1" + newPath;
        //        FastRegexModifier modifier = new FastRegexModifier(regex, Pattern.CASE_INSENSITIVE | Pattern.CANON_EQ,
        //                replacement);
        RegexModifier modifier = new RegexModifier(regex, Pattern.CASE_INSENSITIVE | Pattern.CANON_EQ, replacement);

        Reader reader = new ModifyingReader(new InputStreamReader(input, charset), modifier);
        Writer writer = new OutputStreamWriter(output, charset);

        int copied = IOUtils.copy(reader, writer);

        if (flush) {
            writer.flush();
        }

        return copied;
    }
}