/** * Copyright (c) 2010 Kenn Hussey and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Common Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/cpl-v10.html * * Contributors: * Kenn Hussey - Initial API and implementation */ package org.eclipse.emf.oda.ecore.util; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.util.FeatureMap; /** * A utility for working with strings and text. */ public class StringUtil { protected static List<String> parseName(String sourceName, char sourceSeparator) { List<String> result = new ArrayList<String>(); StringBuffer currentWord = new StringBuffer(); int length = sourceName.length(); boolean lastIsLower = false; for (int index = 0; index < length; index++) { char curChar = sourceName.charAt(index); if (Character.isUpperCase(curChar) || (!lastIsLower && Character.isDigit(curChar)) || curChar == sourceSeparator) { if (lastIsLower || curChar == sourceSeparator) { result.add(currentWord.toString()); currentWord = new StringBuffer(); } lastIsLower = false; } else { if (!lastIsLower) { int currentWordLength = currentWord.length(); if (currentWordLength > 1) { char lastChar = currentWord.charAt(--currentWordLength); currentWord.setLength(currentWordLength); result.add(currentWord.toString()); currentWord = new StringBuffer(); currentWord.append(lastChar); } } lastIsLower = true; } if (curChar != sourceSeparator) { currentWord.append(curChar); } } result.add(currentWord.toString()); return result; } protected static String format(String name, char separator) { StringBuffer result = new StringBuffer(); for (Iterator<String> i = parseName(name, '_').iterator(); i.hasNext();) { String component = i.next(); result.append(component); if (i.hasNext() && component.length() > 1) { result.append(separator); } } return result.toString(); } protected static String capName(String name) { return name.length() == 0 ? name : name.substring(0, 1).toUpperCase() + name.substring(1); } protected static EStructuralFeature getLabelFeature(org.eclipse.emf.ecore.EClass eClass) { EAttribute result = null; for (EAttribute eAttribute : eClass.getEAllAttributes()) { if (!eAttribute.isMany() && eAttribute.getEType().getInstanceClass() != FeatureMap.Entry.class) { if ("name".equalsIgnoreCase(eAttribute.getName())) //$NON-NLS-1$ { result = eAttribute; break; } else if (result == null) { result = eAttribute; } else if (eAttribute.getEAttributeType().getInstanceClass() == String.class && result.getEAttributeType().getInstanceClass() != String.class) { result = eAttribute; } } } return result; } public static String getText(Object object) { if (object instanceof Collection< ? >) { StringBuilder sb = new StringBuilder("["); //$NON-NLS-1$ for (Iterator< ? > i = ((Collection< ? >)object).iterator(); i.hasNext();) { sb.append(getText(i.next())); if (i.hasNext()) { sb.append(", "); //$NON-NLS-1$ } } sb.append(']'); return sb.toString(); } else if (object instanceof EObject) { EObject eObject = (EObject)object; EClass eClass = eObject.eClass(); String label = format(capName(eClass.getName()), ' '); EStructuralFeature feature = getLabelFeature(eClass); if (feature != null) { Object value = eObject.eGet(feature); if (value != null) { return label + " " + value.toString(); } } return label; } else { return String.valueOf(object); } } /** * Returns formatted text for the specified feature * @param feature the feature * @return formatted text */ public static String getFeatureText(EStructuralFeature feature) { return format(capName(feature.getName()), ' '); } /** * Returns formatted text for the specified type * @param classifier the type * @return formatted text */ public static String getTypeText(EClassifier classifier) { return classifier.getEPackage().getName() + '.' + classifier.getName(); } /** * Indicates whether the specified text is null or has a length of zero. * @param text the text * @return whether the text is null or empty */ public static boolean isEmpty(String text) { return text == null || text.trim().length() < 1; } }