⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 multilanguagefilter.java

📁 OBPM是一个开源
💻 JAVA
字号:
package cn.myapps.base.web.filter;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Writer;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;

import cn.myapps.constans.Web;
import cn.myapps.core.multilanguage.ejb.LanguageType;
import cn.myapps.core.multilanguage.ejb.MultiLanguage;
import cn.myapps.core.multilanguage.ejb.MultiLanguageProcess;
import cn.myapps.core.user.action.WebUser;
import cn.myapps.util.ProcessFactory;

public final class MultiLanguageFilter implements Filter {
	static MultiLanguageProcess mp;

	public void doFilter(ServletRequest rq, ServletResponse rs,
			FilterChain chain) throws IOException, ServletException {

		HttpServletRequest hreq = (HttpServletRequest) rq;

		String uri = hreq.getRequestURI();
		String contextPath = hreq.getContextPath();

		if (uri.indexOf(".action") < 0 && uri.indexOf(".jsp") < 0
				&& uri.indexOf(".htm") < 0 && !uri.equals(contextPath)
				&& !uri.equals(contextPath+"/")) {
			chain.doFilter(rq, rs);
			return;
		}

		HttpServletResponse response = (HttpServletResponse) rs;

		ReplaceTextWrapper myResponse = new ReplaceTextWrapper(hreq, response);

		chain.doFilter(rq, myResponse);
		myResponse.setContentLength(myResponse.getSize());
		myResponse.flushBuffer();
	}

	public void destroy() {
	}

	public void init(FilterConfig filterConfig) {
		try {
			mp = (MultiLanguageProcess) ProcessFactory
					.createProcess(MultiLanguageProcess.class);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}

	public static String replaceText(String text, int languageType) {

		try {

			String rtext = text.replaceAll("[\t\n\'\"\f\r]", "");

			MultiLanguage language = mp.doView(languageType, rtext);
			String newText = "";
			if (language != null) {
				newText = language.getText();

				return newText;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return text;
	}
}

class ReplaceTextWrapper extends HttpServletResponseWrapper {
	private ServletResponse inResp;

	private ServletRequest inRequ;

	private ReplaceTextStream outStream;

	private MyPrintWriter outWriter;

	public ReplaceTextWrapper(ServletRequest inRequ, ServletResponse inResp)
			throws java.io.IOException {
		super((HttpServletResponse) inResp);
		this.inResp = inResp;
		this.inRequ = inRequ;
	}

	public ServletOutputStream getOutputStream() throws java.io.IOException {
		outStream = new ReplaceTextStream(inRequ, inResp);
		return outStream;
	}

	public PrintWriter getWriter() throws java.io.IOException {
		outWriter = new MyPrintWriter(inRequ, inResp);
		return outWriter;
	}

	public int getSize() {
		int count = 0;
		if (outStream != null) {
			count += outStream.getSize();
		}

		if (outWriter != null) {
			count += outWriter.getSize();
		}

		// System.out.println("size->"+count);
		return count;
	}
}

class ReplaceTextStream extends ServletOutputStream {
	int flag;

	int count;

	int[] buf;

	int languageType;

	int size;

	OutputStream outStream;

	public ReplaceTextStream(ServletRequest inRequ, ServletResponse inResp)
			throws IOException {
		HttpSession session = ((HttpServletRequest) inRequ).getSession();
		WebUser webUser = (WebUser) session
				.getAttribute(Web.SESSION_ATTRIBUTE_USER);

		if (webUser != null) {
			languageType = webUser.getLanguageType();
		} else {
			languageType = LanguageType.LANGUAGE_TYPE_ENGLISH;
		}
//		inResp.setBufferSize(50 * 1024);
		this.outStream = inResp.getOutputStream();
		buf = new int[512];
	}

	private void writeToBuf(int b) {
		int newcount = count + 1;
		if (newcount > buf.length) {
			int newbuf[] = new int[Math.max(buf.length << 1, newcount)];
			System.arraycopy(buf, 0, newbuf, 0, count);
			buf = newbuf;
		}
		buf[count] = b;
		count = newcount;

	}

	private void clearBuf() throws IOException {
		for (int i = 0; i < count; i++) {
			outStream.write(buf[i]);
			size++;
		}
		count = 0;
		flag = 0;
	}

	public void write(int i) throws java.io.IOException {
		switch (i) {
		case '{':
			if (flag == 0) {
				flag = 1;
				writeToBuf(i);
			} else {
				clearBuf();
				outStream.write(i);
				size++;
			}

			break;
		case '*':
			if (flag == 1) {
				flag = 2;
				writeToBuf(i);
			} else if (flag == 4) {
				flag = 5;
				writeToBuf(i);
			} else {
				clearBuf();
				outStream.write(i);
				size++;
			}

			break;
		case '[':
			if (flag == 2) {
				flag = 3;
				writeToBuf(i);
			} else {
				clearBuf();
				outStream.write(i);
				size++;
			}

			break;
		case ']':
			if (flag == 3) {
				flag = 4;
				writeToBuf(i);
			} else {
				clearBuf();
				outStream.write(i);
				size++;
			}

			break;
		case '}':
			if (flag == 5) {
				writeToBuf(i);
				// start to replace
				String origText = new String(buf, 3, count - 6);
				String newText = MultiLanguageFilter.replaceText(origText,
						languageType);
				outStream.write(newText.getBytes());
				size += newText.getBytes().length;
				count = 0;
				flag = 0;
			} else {
				clearBuf();
				outStream.write(i);
				size++;
			}

			break;

		default:
			if (flag == 3) {
				writeToBuf(i);
			} else {
				if (count > 0)
					clearBuf();
				outStream.write(i);
				size++;
			}

			break;

		}
	}

	public void close() throws java.io.IOException {
		if (count > 0)
			clearBuf();
		outStream.close();

	}

	public void flush() throws java.io.IOException {
		if (count > 0)
			clearBuf();
		outStream.flush();
	}

	public int getSize() {
		return size;
	}

}

class MyPrintWriter extends PrintWriter {
	int flag;

	int count;

	int[] buf;

	int languageType;

	int size;

	public MyPrintWriter(ServletRequest inRequ, ServletResponse inResp)
			throws IOException {
		this(inResp.getWriter(), false);
		this.out = inResp.getWriter();

		HttpSession session = ((HttpServletRequest) inRequ).getSession();
		WebUser webUser = (WebUser) session
				.getAttribute(Web.SESSION_ATTRIBUTE_USER);
		if (webUser != null) {
			this.languageType = webUser.getLanguageType();
		} else {
			languageType = LanguageType.LANGUAGE_TYPE_ENGLISH;
		}
	}

	public MyPrintWriter(Writer out, boolean autoFlush) {
		super(out);
		buf = new int[512];
	}

	public void flush() {
		if (count > 0)
			clearBuf();
		super.flush();
	}

	public void close() {
		if (count > 0)
			clearBuf();
		super.close();
	}

	public void write(char buf2[], int off, int len) {
		for (int i = off; i < Math.min(off + len, buf2.length); i++) {
			this.write((int) buf2[i]);
		}
	}

	public void write(String s, int off, int len) {
		super.write(s.toCharArray(), off, len);
	}

	private void writeToBuf(int b) {
		int newcount = count + 1;
		if (newcount > buf.length) {
			int newbuf[] = new int[Math.max(buf.length << 1, newcount)];
			System.arraycopy(buf, 0, newbuf, 0, count);
			buf = newbuf;
		}
		buf[count] = b;
		count = newcount;
	}

	public void write(int c) {
		switch (c) {
		case '{':
			if (flag == 0) {
				flag = 1;
				writeToBuf(c);
			} else {
				clearBuf();
				super.write(c);
				size++;
			}

			break;
		case '*':
			if (flag == 1) {
				flag = 2;
				writeToBuf(c);
			} else if (flag == 4) {
				flag = 5;
				writeToBuf(c);
			} else {
				clearBuf();
				super.write(c);
				size++;
			}

			break;
		case '[':
			if (flag == 2) {
				flag = 3;
				writeToBuf(c);
			} else {
				clearBuf();
				super.write(c);
				size++;
			}

			break;
		case ']':
			if (flag == 3) {
				flag = 4;
				writeToBuf(c);
			} else {
				clearBuf();
				super.write(c);
				size++;
			}

			break;
		case '}':
			if (flag == 5) {
				writeToBuf(c);
				// start to replace
				String origText = new String(buf, 3, count - 6);
				String newText = MultiLanguageFilter.replaceText(origText,
						languageType);
				super.write(newText);
				size += newText.getBytes().length;
				count = 0;
				flag = 0;
			} else {
				clearBuf();
				super.write(c);
				size++;
			}

			break;

		default:
			if (flag == 3) {
				writeToBuf(c);
			} else {
				if (count > 0)
					clearBuf();
				super.write(c);
				size++;
			}

			break;
		}
	}

	private void clearBuf() {
		for (int i = 0; i < count; i++) {
			super.write(buf[i]);
			size++;
		}
		count = 0;
		flag = 0;
	}

	public int getSize() {
		return size;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -