blob: 6eb1c0ac6caf017c04c404561b346f21aff819b6 [file] [log] [blame]
/**
* <copyright>
*
* Copyright (c) 2009-2010 Thales Corporate Services S.A.S.
* 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:
* Thales Corporate Services S.A.S - initial API and implementation
*
* </copyright>
*/
package org.eclipse.egf.emf.pattern.codegen;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Path;
import org.eclipse.egf.emf.pattern.codegen.model.JetPatternInfo;
import org.eclipse.egf.emf.pattern.codegen.model.JetSubPatternInfo;
import org.eclipse.egf.emf.pattern.codegen.model.PatternInfo;
/**
* @author Matthieu Helleboid
*
*/
public class CodegenPatternNameResolver {
private static final String ORG_ECLIPSE_EGF_EMF_PATTERN = "org.eclipse.egf.emf.pattern."; //$NON-NLS-1$
protected CodegenPatternHelper codegenPatternHelper;
public CodegenPatternNameResolver(CodegenPatternHelper codegenPatternHelper) {
super();
this.codegenPatternHelper = codegenPatternHelper;
}
public void computePatternName(Collection<PatternInfo> patternInfos) {
// try to use JetClassName for Name
findUniqueNameInLibrary(patternInfos, new JetClassNameResolver());
// else try to use methodName
findUniqueNameInLibrary(patternInfos, new MethodNameResolver());
// else try to use GIF for parameter
findUniqueNameInLibrary(patternInfos, new MethodNameForParameterTypeNameResolver());
// else try to use fileAttribute
findUniqueNameInLibrary(patternInfos, new FileAttributeNameResolver());
for (PatternInfo patternInfo : patternInfos) {
if (patternInfo.getName() == null || patternInfo.getLibraryName() == null) {
throw new IllegalStateException("The name wasn't resolved for " + patternInfo); //$NON-NLS-1$
}
}
}
protected void findUniqueNameInLibrary(Collection<PatternInfo> patternInfos, NameResolver nameResolver) {
Map<String, List<PatternInfo>> map = new HashMap<String, List<PatternInfo>>();
for (PatternInfo patternInfo : patternInfos) {
if ((patternInfo.getName() == null || patternInfo.getLibraryName() == null) && nameResolver.canResolve(patternInfo)) {
String tempName = nameResolver.getName(patternInfo);
String tempLibraryName = nameResolver.getLibraryName(patternInfo);
if (tempName != null && tempLibraryName != null) {
String key = tempLibraryName + "." + tempName; //$NON-NLS-1$
List<PatternInfo> list = map.get(key);
if (list == null) {
list = new ArrayList<PatternInfo>();
map.put(key, list);
}
list.add(patternInfo);
}
}
}
for (String key : map.keySet()) {
List<PatternInfo> list = map.get(key);
if (list.size() == 1)
nameResolver.assignNames(list.get(0));
}
}
protected abstract class NameResolver {
public abstract boolean canResolve(PatternInfo patternInfo);
public abstract String getName(PatternInfo patternInfo);
public String getLibraryName(PatternInfo patternInfo) {
return ORG_ECLIPSE_EGF_EMF_PATTERN + patternInfo.getPartType().toString().toLowerCase();
}
public void assignNames(PatternInfo patternInfo) {
patternInfo.setName(getName(patternInfo));
patternInfo.setLibraryName(getLibraryName(patternInfo));
}
}
protected class JetClassNameResolver extends NameResolver {
@Override
public boolean canResolve(PatternInfo patternInfo) {
if (patternInfo instanceof JetPatternInfo) {
JetPatternInfo jetPatternInfo = (JetPatternInfo) patternInfo;
return jetPatternInfo.getJetClassName() != null;
}
return false;
}
@Override
public String getName(PatternInfo patternInfo) {
JetPatternInfo jetPatternInfo = (JetPatternInfo) patternInfo;
return jetPatternInfo.getJetClassName().substring(jetPatternInfo.getJetClassName().lastIndexOf(".") + 1); //$NON-NLS-1$
}
}
protected class MethodNameForParameterTypeNameResolver extends NameResolver {
@Override
public boolean canResolve(PatternInfo patternInfo) {
return patternInfo.getMethodName() != null && patternInfo.getParameterType() != null;
}
@Override
public String getName(PatternInfo patternInfo) {
return patternInfo.getMethodName() + "For" + patternInfo.getParameterType(); //$NON-NLS-1$
}
}
protected class MethodNameResolver extends NameResolver {
@Override
public boolean canResolve(PatternInfo patternInfo) {
return patternInfo.getMethodName() != null;
}
@Override
public String getName(PatternInfo patternInfo) {
return patternInfo.getMethodName();
}
}
protected class FileAttributeNameResolver extends NameResolver {
@Override
public boolean canResolve(PatternInfo patternInfo) {
if (patternInfo instanceof JetSubPatternInfo) {
JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo;
if (jetSubPatternInfo.getSection() == null)
return false;
String fileAttribute = jetSubPatternInfo.getSection().getFileAttribute();
if (fileAttribute == null)
return false;
return new Path(fileAttribute).segmentCount() == 2;
}
return false;
}
@Override
public String getName(PatternInfo patternInfo) {
JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo;
Path path = new Path(jetSubPatternInfo.getSection().getFileAttribute());
return path.segment(0) + "." + path.removeFileExtension().segment(1); //$NON-NLS-1$
}
@Override
public String getLibraryName(PatternInfo patternInfo) {
JetSubPatternInfo jetSubPatternInfo = (JetSubPatternInfo) patternInfo;
Path path = new Path(jetSubPatternInfo.getSection().getFileAttribute());
return super.getLibraryName(jetSubPatternInfo) + ".call." + path.segment(0); //$NON-NLS-1$
}
}
}