/** * Copyright (C) 2009 STMicroelectronics * * This file is part of "Mind Compiler" is free software: you can redistribute * it and/or modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Contact: mind@ow2.org * * Authors: Matthieu Leclercq * Contributors: */ package org.ow2.mind; import java.util.regex.Pattern; /** * Utility class to manipulate fully-qualified names. */ public final class NameHelper { private NameHelper() { } /** The regular expression of a name. */ public static final String NAME_REQEXP = "([a-zA-Z_]\\w*(\\$\\d*)?)|([a-zA-Z_]\\w*(\\.[a-zA-Z_]\\w*(\\$\\d*)?)+)"; private static final Pattern NAME_PATTERN = Pattern.compile(NAME_REQEXP); /** * Checks if the given string matches the {@link #NAME_REQEXP} regular * expression. * * @param name the string to check * @return <code>true</code> if and only if the given string matches the * {@link #NAME_REQEXP} regular expression. */ public static final boolean isValid(final String name) { return NAME_PATTERN.matcher(name).matches(); } /** * Returns the package name part of the given fully-qualified name. If the * given fully-qualified name does not contain a package name, this method * returns <code>null</code>. * * @param name a valid fully-qualified name (see {@link #isValid(String)}). * @return the package name part of the given fully-qualified name. */ public static final String getPackageName(final String name) { if (!isValid(name)) throw new IllegalArgumentException("Name \"" + name + "\" is not a valid name."); final int i = name.lastIndexOf('.'); return i == -1 ? null : name.substring(0, i); } /** * Split the given fully-qualified name in an array of the identifiers that it * is made of. * * @param name a valid fully-qualified name (see {@link #isValid(String)}). * @return an array of the identifiers that compose the given fully qualified * name. */ public static final String[] splitName(final String name) { if (!isValid(name)) throw new IllegalArgumentException("Name \"" + name + "\" is not a valid name."); return name.split("\\."); } public static final String toValidName(String name) { int i = name.indexOf('<'); if (i >= 0) { // name contains template parameter final String tmplValues = name.substring(i); final String defName = name.substring(0, i); if (!isValid(defName)) throw new IllegalArgumentException("Name \"" + defName + "\" is not a valid name."); name = defName + "_tmpl_" + Integer.toHexString(tmplValues.hashCode()); } i = name.indexOf('$'); if (i >= 0) { // name references an anonymous definition name = name.replace("$", "_anon_"); } if (!isValid(name)) throw new IllegalArgumentException("Name \"" + name + "\" is not a valid name."); return name; } }