package com.sap.ide.refactoring.core.textual;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.ltk.core.refactoring.RefactoringStatus;
import tcs.ConcreteSyntax;
import tcs.Template;
import textblocks.DocumentNode;
import textblocks.DocumentNodeReferencedElement;
import textblocks.DocumentNodeReferencesCorrespondingModelElement;
import textblocks.TextBlock;
import textblocks.TextblocksPackage;
import com.sap.mi.textual.parsing.textblocks.TbNavigationUtil;
import com.sap.tc.moin.repository.Connection;
import com.sap.tc.moin.repository.mmi.reflect.RefObject;
public class TextBlockRefactoringUtil {
public static Collection<DocumentNode> findCorrespondingTextBlocks(RefObject modelElement) {
Connection co = modelElement.get___Connection();
DocumentNodeReferencesCorrespondingModelElement assoc = co.getPackage(TextblocksPackage.PACKAGE_DESCRIPTOR).getDocumentNodeReferencesCorrespondingModelElement();
return assoc.getDocumentNode(modelElement);
}
public static Collection<DocumentNode> findCorrespondingTextBlocks(RefObject modelElement, String syntaxName) {
return filterForSyntaxName(findCorrespondingTextBlocks(modelElement), syntaxName);
}
/**
* TODO: can we do better than that?
*/
private static Collection<DocumentNode> filterForSyntaxName(Collection<DocumentNode> nodes, String syntaxName) {
nodes = new ArrayList<DocumentNode>(nodes);
Iterator<DocumentNode> iter = nodes.iterator();
while (iter.hasNext()) {
boolean valid = true;
DocumentNode node = iter.next();
if (node instanceof TextBlock) {
TextBlock block = (TextBlock) node;
if (block.getType() == null) {
valid = false;
} else {
Template template = ((TextBlock) node).getType().getParseRule();
ConcreteSyntax syntax = template.getConcretesyntax();
if (!syntax.getName().equals(syntaxName)) {
valid = false;
}
}
} else {
valid = false;
}
if (!valid) {
iter.remove();
}
}
return nodes;
}
public static Collection<DocumentNode> findReferencedTextBlocks(RefObject modelElement) {
Connection co = modelElement.get___Connection();
DocumentNodeReferencedElement assoc = co.getPackage(TextblocksPackage.PACKAGE_DESCRIPTOR).getDocumentNodeReferencedElement();
return assoc.getDocumentNode(modelElement);
}
public static Collection<RootElementTextBlockTuple> findTextBlockRootDomainRootObjectTuples(DocumentNode documentNode) {
Connection co = documentNode.get___Connection();
DocumentNodeReferencesCorrespondingModelElement assoc = co.getPackage(TextblocksPackage.PACKAGE_DESCRIPTOR)
.getDocumentNodeReferencesCorrespondingModelElement();
Set<RootElementTextBlockTuple> roots = new HashSet<RootElementTextBlockTuple>();
TextBlock tbRootNode = TbNavigationUtil.getUltraRoot(documentNode);
for (RefObject rootObject : assoc.getCorrespondingModelElements(tbRootNode)) {
roots.add(new RootElementTextBlockTuple(rootObject, tbRootNode));
}
return roots;
}
public static Collection<RootElementTextBlockTuple> findTextBlockRootDomainRootObjectTuplesForModelElement(RefObject modelElement) {
Set<RootElementTextBlockTuple> rootTuples = new HashSet<RootElementTextBlockTuple>();
for (DocumentNode documentNode : TextBlockRefactoringUtil.findCorrespondingTextBlocks(modelElement)) {
rootTuples.addAll(TextBlockRefactoringUtil.findTextBlockRootDomainRootObjectTuples(documentNode));
}
return rootTuples;
}
public static RefactoringStatus isValidIdentifier(String name, RefactoringEditorFacade facade) {
RefactoringStatus status = new RefactoringStatus();
if (name == null || name.isEmpty()) {
status.merge(RefactoringStatus.createFatalErrorStatus("Name is empty."));
}
if (name.contains(" ") || name.contains("\t") || name.contains("\n") || name.contains("\r")) {
status.merge(RefactoringStatus.createWarningStatus("Name contains special characters."));
}
if (facade.getTokenNames().contains(name)) {
status.merge(RefactoringStatus.createWarningStatus("Name is an identifier. Usage discouraged."));
}
return status;
}
}