/******************************************************************************* * Copyright (c) 2008, 2009 Innoopract Informationssysteme GmbH. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Innoopract Informationssysteme GmbH - initial API and implementation * EclipseSource - ongoing development ******************************************************************************/ package org.eclipse.rwt.internal.service; import java.util.*; import org.eclipse.rwt.internal.util.ParamCheck; public final class StartupPageTemplateHolder { private static final int[] EMPTY_INDICES = new int[ 0 ]; private final static String TOKEN_BACKGROUND_IMAGE = "backgroundImage"; private final static String TOKEN_LIBRARIES = "libraries"; private final static String TOKEN_APPSCRIPT = "appScript"; private final static String TOKEN_SERVLET = "servlet"; private final static String TOKEN_ENTRY_POINT = "entrypoint"; private final static String TOKEN_BODY = "body"; private final static String TOKEN_TITLE = "title"; private final static String TOKEN_HEADERS = "headers"; private final static String TOKEN_STARTUP = "startup"; private final static String TOKEN_NO_SCRIPT_MESSAGE = "noScriptMessage"; public final static Variable VAR_BACKGROUND_IMAGE = new Variable( TOKEN_BACKGROUND_IMAGE ); public final static Variable VAR_LIBRARIES = new Variable( TOKEN_LIBRARIES ); public final static Variable VAR_APPSCRIPT = new Variable( TOKEN_APPSCRIPT ); public final static Variable VAR_SERVLET = new Variable( TOKEN_SERVLET ); public final static Variable VAR_ENTRY_POINT = new Variable( TOKEN_ENTRY_POINT ); public final static Variable VAR_BODY = new Variable( TOKEN_BODY ); public final static Variable VAR_TITLE = new Variable( TOKEN_TITLE ); public final static Variable VAR_HEADERS = new Variable( TOKEN_HEADERS ); public final static Variable VAR_STARTUP = new Variable( TOKEN_STARTUP ); public final static Variable VAR_NO_SCRIPT_MESSAGE = new Variable( TOKEN_NO_SCRIPT_MESSAGE ); public static final class Variable { private final static Map NAMES = new HashMap(); private final String name; private Variable( final String varName ) { this.name = varName; NAMES.put( varName, this ); } private static Variable lookup( final String name ) { return ( Variable )NAMES.get( name ); } public String toString() { return "${" + name + "}"; } } private final String[] tokens; private final Map replacementIndices; public StartupPageTemplateHolder( final String template ) { ParamCheck.notNull( template, "template" ); replacementIndices = new HashMap(); StringTokenizer tokenizer = new StringTokenizer( template, "${}", true ); int countTokens = tokenizer.countTokens(); tokens = new String[ countTokens ]; boolean ignoreNextToken = false; for( int i = 0; i < tokens.length; i++ ) { String nextToken = tokenizer.nextToken(); if( ignoreNextToken ) { ignoreNextToken = false; } else if( !isVariableToken( nextToken ) ) { tokens[ i ] = nextToken; } else { Variable variable = Variable.lookup( nextToken ); addReplacementIndex( variable, i ); tokens[ i - 1 ] = ""; tokens[ i - 2 ] = ""; tokens[ i + 1 ] = ""; ignoreNextToken = true; } } } private boolean isVariableToken( final String nextToken ) { return nextToken.equals( TOKEN_BACKGROUND_IMAGE.toString() ) || nextToken.equals( TOKEN_LIBRARIES.toString() ) || nextToken.equals( TOKEN_APPSCRIPT.toString() ) || nextToken.equals( TOKEN_SERVLET.toString() ) || nextToken.equals( TOKEN_ENTRY_POINT.toString() ) || nextToken.equals( TOKEN_BODY.toString() ) || nextToken.equals( TOKEN_TITLE.toString() ) || nextToken.equals( TOKEN_HEADERS.toString() ) || nextToken.equals( TOKEN_STARTUP.toString() ) || nextToken.equals( TOKEN_NO_SCRIPT_MESSAGE.toString() ); } private void addReplacementIndex( final Variable variable, final int index ) { List indices = ( List )replacementIndices.get( variable ); if( indices == null ) { indices = new ArrayList(); replacementIndices.put( variable, indices ); } indices.add( new Integer( index ) ); } private int[] getReplacementIndices( final Variable variable ) { List indices = ( List )replacementIndices.get( variable ); int[] result = null; if( indices == null ) { result = EMPTY_INDICES; } else { Object[] buffer = indices.toArray(); result = new int[ buffer.length ]; for( int i = 0; i < result.length; i++ ) { result[ i ] = ( ( Integer )buffer[ i ] ).intValue(); } } return result; } public String[] getTokens() { // no secure copy due to performance reasons... return tokens; } public void replace( final Variable toReplace, final String replacement ) { int[] indices = getReplacementIndices( toReplace ); for( int i = 0; i < indices.length; i++ ) { tokens[ indices[ i ] ] = replacement; } } public void reset() { Iterator iterator = Variable.NAMES.values().iterator(); while( iterator.hasNext() ) { Variable variable = ( Variable )iterator.next(); int[] indices = getReplacementIndices( variable ); for( int i = 0; i < indices.length; i++ ) { tokens[ indices[ i ] ] = null; } } } }