/******************************************************************************* * Copyright (c) 2012 Google, Inc. * 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: * Google, Inc. - initial API and implementation *******************************************************************************/ package com.windowtester.swt.gef.codegen; import java.util.HashMap; import java.util.Map; import com.windowtester.codegen.assembly.unit.ClassUnit; import com.windowtester.internal.runtime.util.StringUtils; import com.windowtester.runtime.gef.locator.FigureClassLocator; /** * A service for managing mappings of locators to inner classes. * */ public class InnerLocatorMap { private static final String NEW_LINE = StringUtils.NEW_LINE; private final Map classUnitMap = new HashMap(); private final Map classNameMap = new HashMap(); { classNameMap.put("Tree", "TreeFigureLocator"); classNameMap.put("MenuItem", "MenuItemFigureLocator"); classNameMap.put("TreeItem", "TreeItemFigureLocator"); classNameMap.put("Figure", "MyFigureLocator"); classNameMap.put("Palette", "MyPaletteLocator"); classNameMap.put("PaletteItem", "MyPaletteItemLocator"); // etc.... } public ClassUnit get(FigureClassLocator locator) { ClassUnit unit = (ClassUnit) classUnitMap.get(getClassName(locator)); if (unit == null) { unit = createUnit(locator); } return unit; } private ClassUnit createUnit(FigureClassLocator locator) { String fqName = locator.getClassName(); String shortName = deriveClassName(locator); String contents = serializationId() + constructorBody(fqName, shortName); ClassUnit unit = new ClassUnit(shortName, ClassUnit.PRIVATE, ClassUnit.STATIC, contents); unit.setExtends("FigureClassLocator"); return unit; } private String serializationId() { return NEW_LINE + "private static final long serialVersionUID = 1L;" + NEW_LINE; } private String constructorBody(String fqName, String shortName) { return NEW_LINE + "public " + shortName + "(){" + NEW_LINE + "super(\"" + fqName + "\");" + NEW_LINE + "}"; } private String deriveClassName(FigureClassLocator locator) { String className = getClassName(locator); String derivedName = checkForDefaultMapping(className); if (derivedName == null) { derivedName = createClassName(className); } return derivedName; } private String getClassName(FigureClassLocator locator) { String name = locator.getClassName(); int lastDot = name.lastIndexOf('.'); if (lastDot == -1) return name; return name.substring(lastDot+1); } private String createClassName(String className) { return className + "Locator"; } private String checkForDefaultMapping(String className) { return (String) classNameMap.get(className); } }