use of org.talend.designer.xmlmap.ui.expressionutil.TableEntryLocation in project tdi-studio-se by Talend.
the class XmlMapConnectionBuilder method hasMaptchedLocation.
private boolean hasMaptchedLocation(XmlMapExpressionManager expressionManager, TableEntryLocation sourceLocation, EObject targetNodeOrTree, ExpressionType type) {
String targetExpression = null;
AbstractNode targetNode = null;
AbstractInOutTree targetTree = null;
switch(type) {
case EXPRESSION:
targetNode = (AbstractNode) targetNodeOrTree;
targetExpression = targetNode.getExpression();
break;
case EXPRESSION_FILTER:
targetTree = (AbstractInOutTree) targetNodeOrTree;
targetExpression = targetTree.getExpressionFilter();
default:
break;
}
if (!"".equals(targetExpression) && targetExpression != null) {
List<TableEntryLocation> targetLocations = expressionManager.parseTableEntryLocation(targetExpression);
for (TableEntryLocation target : targetLocations) {
if (sourceLocation.equals(target)) {
return true;
} else if (checkRootNodePrefix && !cancelForAll) {
StringBuffer bf = new StringBuffer();
String prefix = null;
String nodeName = null;
final String[] split = sourceLocation.toString().split("/");
if (split.length > 2) {
for (int i = 0; i < split.length; i++) {
String value = split[i];
if (i == 1) {
int indexOf = split[1].indexOf(":");
if (indexOf != -1) {
prefix = split[1].substring(0, indexOf);
nodeName = split[1].substring(indexOf + 1, split[1].length());
value = nodeName;
} else {
break;
}
}
bf.append(value);
if (i < split.length - 1) {
bf.append("/");
}
}
}
if (bf.toString().equals(targetExpression)) {
if (applyForAll) {
// reset the target expression with prefix
if (targetNode != null) {
targetNode.setExpression(expressionManager.replaceExpression(targetExpression, target, sourceLocation));
}
if (targetTree != null) {
targetTree.setExpressionFilter(expressionManager.replaceExpression(targetExpression, target, sourceLocation));
}
return true;
} else {
PrefixChangeDialog dialog = new PrefixChangeDialog(new Shell());
dialog.setPrefix(prefix);
dialog.setRootNodeName(nodeName);
dialog.setSourceExpression(sourceLocation.toString());
dialog.setTargetExpression(target.toString());
if (dialog.open() == Window.OK) {
applyForAll = dialog.isApplyAll();
cancelForAll = dialog.isCancelAll();
if (cancelForAll) {
return false;
}
// reset the target expression with prefix
if (targetNode != null) {
targetNode.setExpression(expressionManager.replaceExpression(targetExpression, target, sourceLocation));
}
if (targetTree != null) {
targetTree.setExpressionFilter(expressionManager.replaceExpression(targetExpression, target, sourceLocation));
}
return true;
}
}
}
}
}
}
return false;
}
use of org.talend.designer.xmlmap.ui.expressionutil.TableEntryLocation in project tdi-studio-se by Talend.
the class XmlMapConnectionBuilder method rebuildLink.
private void rebuildLink(int inputTreeIndex, List<TreeNode> children, XmlMapData mapData) {
for (TreeNode treeNode : children) {
if (XmlMapUtil.isDragable(treeNode)) {
String expression = XmlMapUtil.convertToExpression(treeNode.getXpath());
XmlMapExpressionManager expressionManager = new XmlMapExpressionManager();
TableEntryLocation sourceLocation = expressionManager.parseTableEntryLocation(expression).get(0);
// LOOKUP ,FILTER
for (int i = inputTreeIndex; i < mapData.getInputTrees().size(); i++) {
InputXmlTree treeTarget = mapData.getInputTrees().get(i);
if (hasMaptchedLocation(expressionManager, sourceLocation, treeTarget, ExpressionType.EXPRESSION_FILTER)) {
createFilterConnection(treeNode, treeTarget, mapData);
}
checkTargetChildren(expressionManager, treeTarget.getNodes(), treeNode, sourceLocation, mapData);
}
// VAR
for (VarNode varNode : mapData.getVarTables().get(0).getNodes()) {
if (hasMaptchedLocation(expressionManager, sourceLocation, varNode, ExpressionType.EXPRESSION)) {
createConnection(treeNode, varNode, mapData);
}
}
// OUTPUT,FILTER
for (int i = 0; i < mapData.getOutputTrees().size(); i++) {
OutputXmlTree outputTree = mapData.getOutputTrees().get(i);
if (hasMaptchedLocation(expressionManager, sourceLocation, outputTree, ExpressionType.EXPRESSION_FILTER)) {
createFilterConnection(treeNode, outputTree, mapData);
}
checkTargetChildren(expressionManager, outputTree.getNodes(), treeNode, sourceLocation, mapData);
}
}
if (!treeNode.getChildren().isEmpty()) {
rebuildLink(inputTreeIndex, treeNode.getChildren(), mapData);
}
}
}
use of org.talend.designer.xmlmap.ui.expressionutil.TableEntryLocation in project tdi-studio-se by Talend.
the class XmlMapUtil method updateTargetExpression.
public static void updateTargetExpression(AbstractNode renamedNode, String oldExpression, String newExpression, XmlMapExpressionManager expressionManager) {
TableEntryLocation previousLocation = expressionManager.parseTableEntryLocation(oldExpression).get(0);
TableEntryLocation newLocation = expressionManager.parseTableEntryLocation(newExpression).get(0);
List<INodeConnection> connections = new ArrayList<INodeConnection>();
connections.addAll(renamedNode.getOutgoingConnections());
if (renamedNode instanceof TreeNode) {
connections.addAll(((TreeNode) renamedNode).getLookupOutgoingConnections());
}
for (INodeConnection connection : connections) {
AbstractNode target = connection.getTarget();
List<TableEntryLocation> targetLocaitons = expressionManager.parseTableEntryLocation(target.getExpression());
for (TableEntryLocation current : targetLocaitons) {
if (current.equals(previousLocation)) {
String replaced = expressionManager.replaceExpression(target.getExpression(), current, newLocation);
target.setExpression(replaced);
}
}
}
for (FilterConnection connection : renamedNode.getFilterOutGoingConnections()) {
AbstractInOutTree target = connection.getTarget();
List<TableEntryLocation> targetLocaitons = expressionManager.parseTableEntryLocation(target.getExpressionFilter());
for (TableEntryLocation current : targetLocaitons) {
if (current.equals(previousLocation)) {
String replaced = expressionManager.replaceExpression(target.getExpressionFilter(), current, newLocation);
target.setExpressionFilter(replaced);
}
}
}
}
use of org.talend.designer.xmlmap.ui.expressionutil.TableEntryLocation in project tdi-studio-se by Talend.
the class DirectEditCommand method execute.
@Override
public void execute() {
try {
if (model != null) {
if (DirectEditType.EXPRESSION.equals(type)) {
List<TableEntryLocation> matchedLocations = expressionManager.parseTableEntryLocation((String) newValue);
EList<? extends INodeConnection> connections = null;
if (model instanceof OutputTreeNode || model instanceof VarNode) {
connections = model.getIncomingConnections();
} else if (model instanceof TreeNode) {
connections = ((TreeNode) model).getLookupIncomingConnections();
}
List usefullConnections = new ArrayList();
mapperData = XmlMapUtil.getXmlMapData(model);
if (!matchedLocations.isEmpty()) {
for (int i = 0; i < matchedLocations.size(); i++) {
TableEntryLocation currentLocation = matchedLocations.get(i);
boolean found = false;
for (INodeConnection conn : connections) {
TableEntryLocation sourceLocation = null;
if (conn.getSource() instanceof TreeNode) {
sourceLocation = expressionManager.parseTableEntryLocation(XmlMapUtil.convertToExpression(((TreeNode) conn.getSource()).getXpath())).get(0);
} else if (conn.getSource() instanceof VarNode) {
VarNode varNode = (VarNode) conn.getSource();
sourceLocation = new TableEntryLocation(((VarTable) varNode.eContainer()).getName(), varNode.getName());
}
if (currentLocation.equals(sourceLocation)) {
found = true;
usefullConnections.add(conn);
break;
}
}
if (!found) {
if (mapperData != null) {
String convertToXpath = XmlMapUtil.convertToXpath(currentLocation.toString());
boolean findFromVar = false;
if (model instanceof OutputTreeNode) {
findFromVar = true;
}
AbstractNode sourceNode = findConnectionSource(mapperData, currentLocation, XmlMapUtil.getXPathLength(convertToXpath), findFromVar);
if (sourceNode != null) {
INodeConnection connection = null;
if (model instanceof OutputTreeNode || model instanceof VarNode) {
connection = XmlmapFactory.eINSTANCE.createConnection();
sourceNode.getOutgoingConnections().add((Connection) connection);
model.getIncomingConnections().add((Connection) connection);
} else if (model instanceof TreeNode && sourceNode instanceof TreeNode) {
TreeNode source = (TreeNode) sourceNode;
connection = XmlmapFactory.eINSTANCE.createLookupConnection();
source.getLookupOutgoingConnections().add((LookupConnection) connection);
((TreeNode) model).getLookupIncomingConnections().add((LookupConnection) connection);
}
//
// if (model instanceof OutputTreeNode && sourceNode instanceof TreeNode) {
// createInputLoopTable((TreeNode) sourceNode, (OutputTreeNode) model);
// }
connection.setSource(sourceNode);
connection.setTarget(model);
mapperData.getConnections().add(connection);
usefullConnections.add(connection);
}
}
}
}
} else {
if (!connections.isEmpty()) {
if (model instanceof OutputTreeNode || model instanceof VarNode) {
XmlMapUtil.detachConnectionsSouce(model, mapperData, false);
model.getIncomingConnections().clear();
} else if (model instanceof TreeNode) {
XmlMapUtil.detachLookupSource((TreeNode) model, mapperData);
((TreeNode) model).getLookupIncomingConnections().clear();
}
}
}
List<INodeConnection> copyOfConnections = new ArrayList<INodeConnection>(connections);
copyOfConnections.removeAll(usefullConnections);
if (model instanceof OutputTreeNode || model instanceof VarNode) {
for (INodeConnection connection : copyOfConnections) {
if (connection.getSource() != null) {
if (connection.getSource().getOutgoingConnections().contains(connection)) {
connection.getSource().getOutgoingConnections().remove(connection);
mapperData.getConnections().remove(connection);
}
}
}
model.getIncomingConnections().removeAll(copyOfConnections);
} else if (model instanceof TreeNode) {
for (INodeConnection connection : copyOfConnections) {
if (connection.getSource() != null) {
if (((TreeNode) connection.getSource()).getLookupOutgoingConnections().contains(connection)) {
((TreeNode) connection.getSource()).getLookupOutgoingConnections().remove(connection);
mapperData.getConnections().remove(connection);
}
}
}
((TreeNode) model).getLookupIncomingConnections().removeAll(copyOfConnections);
}
if (model instanceof OutputTreeNode) {
OutputTreeNode outModel = (OutputTreeNode) model;
if (NodeType.NAME_SPACE.equals(outModel.getNodeType()) && outModel.getExpression() != null && !"".equals(model.getExpression())) {
outModel.setDefaultValue("");
}
}
model.setExpression((String) newValue);
} else if (DirectEditType.VAR_NODE_TYPE.equals(type)) {
VarNode varModel = (VarNode) model;
JavaType javaTypeFromLabel = JavaTypesManager.getJavaTypeFromLabel((String) newValue);
if (javaTypeFromLabel == null) {
javaTypeFromLabel = JavaTypesManager.getDefaultJavaType();
}
varModel.setType(javaTypeFromLabel.getId());
} else if (DirectEditType.NODE_NAME.equals(type)) {
if (model instanceof VarNode) {
List<VarNode> children = new ArrayList<VarNode>();
children.addAll(((VarTable) model.eContainer()).getNodes());
children.remove(model);
String message = XmlMapUtil.isValidColumnName(children, (String) newValue);
if (message != null) {
MessageDialog.openError(null, "Error", message);
return;
}
String oldName = model.getName();
String oldExpression = XmlMapUtil.VAR_TABLE_NAME + XmlMapUtil.EXPRESSION_SEPARATOR + oldName;
model.setName((String) newValue);
String newExpression = XmlMapUtil.VAR_TABLE_NAME + XmlMapUtil.EXPRESSION_SEPARATOR + model.getName();
XmlMapUtil.updateTargetExpression(model, oldExpression, newExpression, expressionManager);
} else if (model instanceof GlobalMapNode) {
model.setName((String) newValue);
}
}
}
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
}
}
use of org.talend.designer.xmlmap.ui.expressionutil.TableEntryLocation in project tdi-studio-se by Talend.
the class TreeSettingDirectEditCommand method calculateFilterConnections.
private void calculateFilterConnections(AbstractInOutTree abstractTree, String newValue) {
XmlMapData mapperData = (XmlMapData) abstractTree.eContainer();
List<TableEntryLocation> matchedLocations = expressionManager.parseTableEntryLocation((String) newValue);
EList<FilterConnection> connections = abstractTree.getFilterIncomingConnections();
List usefullConnections = new ArrayList();
if (!matchedLocations.isEmpty()) {
for (int i = 0; i < matchedLocations.size(); i++) {
TableEntryLocation currentLocation = matchedLocations.get(i);
boolean found = false;
for (FilterConnection conn : connections) {
TableEntryLocation sourceLocation = null;
if (conn.getSource() instanceof TreeNode) {
sourceLocation = expressionManager.parseTableEntryLocation(XmlMapUtil.convertToExpression(((TreeNode) conn.getSource()).getXpath())).get(0);
} else if (conn.getSource() instanceof VarNode) {
VarNode varNode = (VarNode) conn.getSource();
sourceLocation = new TableEntryLocation(((VarTable) varNode.eContainer()).getName(), varNode.getName());
}
if (currentLocation.equals(sourceLocation)) {
found = true;
usefullConnections.add(conn);
break;
}
}
if (!found) {
if (mapperData != null) {
String convertToXpath = XmlMapUtil.convertToXpath(currentLocation.toString());
boolean findFromVar = false;
if (abstractTree instanceof OutputXmlTree) {
findFromVar = true;
}
AbstractNode sourceNode = findConnectionSource(mapperData, currentLocation, XmlMapUtil.getXPathLength(convertToXpath), findFromVar);
if (sourceNode != null) {
FilterConnection connection = null;
connection = XmlmapFactory.eINSTANCE.createFilterConnection();
sourceNode.getFilterOutGoingConnections().add(connection);
abstractTree.getFilterIncomingConnections().add(connection);
connection.setSource(sourceNode);
connection.setTarget(abstractTree);
mapperData.getConnections().add(connection);
usefullConnections.add(connection);
}
}
}
}
List<FilterConnection> copyOfConnections = new ArrayList<FilterConnection>(connections);
copyOfConnections.removeAll(usefullConnections);
for (FilterConnection connection : copyOfConnections) {
if (connection.getSource() != null) {
if (connection.getSource().getFilterOutGoingConnections().contains(connection)) {
connection.getSource().getFilterOutGoingConnections().remove(connection);
mapperData.getConnections().remove(connection);
}
}
}
abstractTree.getFilterIncomingConnections().removeAll(copyOfConnections);
} else if (!connections.isEmpty()) {
for (FilterConnection connection : connections) {
if (connection.getSource() != null) {
if (connection.getSource().getFilterOutGoingConnections().contains(connection)) {
connection.getSource().getFilterOutGoingConnections().remove(connection);
mapperData.getConnections().remove(connection);
}
}
}
abstractTree.getFilterIncomingConnections().removeAll(connections);
}
}
Aggregations