/*******************************************************************************
* Copyright (c) 2016 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.windup.model.util;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.jboss.tools.windup.windup.NamedElement;
import org.jboss.tools.windup.windup.WindupModel;
import org.jboss.tools.windup.windup.WindupPackage;
import com.google.common.collect.Lists;
/**
* Utility for {@link NamedElement}s.
*/
public class NameUtil {
public static final String CONFIGURATION_ELEMENT_PREFIX = "Run_configuration";
private static Pattern namePattern = Pattern.compile("([a-zA-Z_]*)([0-9]+)");
/**
* @return a unique configuration name.
*/
public static String generateUniqueConfigurationElementName(WindupModel model) {
return getUniqueNameForEObject(model, CONFIGURATION_ELEMENT_PREFIX,
WindupPackage.eINSTANCE.getWindupModel_ConfigurationElements());
}
/**
* @return a unique name for the type on the specified object.
*/
public static String getUniqueNameForEObject(EObject model, String prefix, EReference ref) {
Set<String> existinNames = getAllExistingNames(model, ref);
String nextName = generateName(prefix, existinNames);
return nextName;
}
/**
* @return the set of names contained in the reference of the specified object.
*/
private static Set<String> getAllExistingNames(EObject model, EReference ref) {
List<NamedElement> candidates = getAllNamedObjects(model, ref);
Set<String> nameSet = candidates.stream().map(e -> e.getName()).collect(Collectors.toSet());
return nameSet;
}
/**
* @return the actual list of named elements the object references.
*/
@SuppressWarnings("unchecked")
private static List<NamedElement> getAllNamedObjects(EObject model, EReference ref) {
Object obj = model.eGet(ref);
return obj instanceof List ? Lists.newArrayList((List<NamedElement>)obj) : Lists.newArrayList();
}
public static String generateName(String candidate, Set<String> names) {
Matcher matcher = namePattern.matcher(candidate);
int index = 0;
if (matcher.matches()) {
candidate = matcher.group(1);
index = Integer.parseInt(matcher.group(2)) + 1;
}
return getNextUniqueName(names, index, candidate);
}
private static String getNextUniqueName(Set<String> names, int index, String prefixStr) {
String newName = "";
boolean done = false;
while (!done) {
newName = String.format("%s%d", prefixStr, index++);
if (!names.contains(newName)) {
done = true;
}
}
return newName;
}
}