001// Copyright 2004, 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry.wml;
016
017import org.apache.tapestry.util.text.AsciiCharacterMatcher;
018import org.apache.tapestry.util.text.AsciiCharacterTranslator;
019import org.apache.tapestry.util.text.ICharacterMatcher;
020import org.apache.tapestry.util.text.ICharacterTranslator;
021import org.apache.tapestry.util.text.ICharacterTranslatorSource;
022import org.apache.tapestry.util.text.MarkupCharacterTranslator;
023
024/**
025 * The WML implementation of a character translator source.
026 * Returns a WML translator that encodes everything that is non-safe.
027 * 
028 * Some code borrowed from WMLWriter (by David Solis)
029 * 
030 * @author mb
031 * @since 4.0
032 */
033public class WMLCharacterTranslatorSource implements ICharacterTranslatorSource
034{
035    private static final String SAFE_CHARACTERS =
036        "01234567890"
037            + "abcdefghijklmnopqrstuvwxyz"
038            + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
039            + "\t\n\r !\"#%'()*+,-./:;=?@[\\]^_`{|}~";
040
041    private static final String[][] ENTITIES = {
042                { "\"", """ }, 
043                { "<", "&lt;" },
044                { ">", "&gt;" },
045                { "&", "&amp;" },
046                { "$", "$$" }
047        };
048
049    private static final ICharacterMatcher SAFE_MATCHER = new AsciiCharacterMatcher(SAFE_CHARACTERS);
050    private static final ICharacterTranslator ENTITY_TRANSLATOR = new AsciiCharacterTranslator(ENTITIES);
051
052    private static final ICharacterTranslator WML_TRANSLATOR = new MarkupCharacterTranslator(true, SAFE_MATCHER, ENTITY_TRANSLATOR);
053
054        /**
055         * @see org.apache.tapestry.util.text.ICharacterTranslatorSource#getDefaultTranslator()
056         */
057        public ICharacterTranslator getDefaultTranslator() {
058                return WML_TRANSLATOR;
059        }
060
061        /**
062         * @see org.apache.tapestry.util.text.ICharacterTranslatorSource#getTranslator(java.lang.String)
063         */
064        public ICharacterTranslator getTranslator(String encoding) {
065                return getDefaultTranslator();
066        }
067}