connection.java

来自「plugin for eclipse」· Java 代码 · 共 317 行

JAVA
317
字号
/*
 * Created on May 9, 2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package isis.anp.nesc.ot;

import isis.anp.common.CodeLocation;
import isis.anp.common.ObjectTreeBuilderContext;
import isis.anp.common.ParserMessage;
import isis.anp.common.TNode;

import java.util.Iterator;
import java.util.List;


/**
 * @author sallai
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class Connection {
	ObjectTreeBuilderContext ctx;

	ConfigurationImplementation configurationImplementation;

	/**
	 * @param ctx
	 */
	public Connection(ObjectTreeBuilderContext ctx) {
		this.ctx = ctx;
	}

	public class Direction {
		public final static int EQUATE = 0;

		public final static int FROM1TO2 = 1;

		public final static int FROM2TO1 = 2;
	}

	Port endPoint1;

	List parameterList1;

	Port endPoint2;

	List parameterList2;

	int direction;

	/**
	 * @return Returns the direction.
	 */
	public int getDirection() {
		return direction;
	}

	/**
	 * @param direction
	 *            The direction to set.
	 */
	public void setDirection(int direction) {
		this.direction = direction;
	}

	public void setEndPoints(List idList1, List argExprList1, List idList2,
			List argExprList2) {
		Configuration config = configurationImplementation.getConfiguration();

		parameterList1 = argExprList1;
		parameterList2 = argExprList2;

		// endPoint1 -> endPoint2
		if (direction == Connection.Direction.FROM1TO2) {
			endPoint1 = config
					.getPortByPath(idList1, Port.Direction.USES, null);
			endPoint2 = config.getPortByPath(idList2, Port.Direction.PROVIDES,
					null);

			// resolve implicit wiring
			if (endPoint1 == null && endPoint2 != null) {
				if (endPoint2.getTypeString() != null) {
					endPoint1 = config.getPortByPath(idList1,
							Port.Direction.USES, endPoint2.getTypeString());
				}
			}

			// resolve implicit wiring
			if (endPoint2 == null && endPoint1 != null) {
				if (endPoint1.getTypeString() != null) {
					endPoint2 = config.getPortByPath(idList2,
							Port.Direction.PROVIDES, endPoint1.getTypeString());
				}
			}
		}

		// endPoint1 <- endPoint2
		if (direction == Connection.Direction.FROM2TO1) {
			endPoint1 = config.getPortByPath(idList1, Port.Direction.PROVIDES,
					null);
			endPoint2 = config
					.getPortByPath(idList2, Port.Direction.USES, null);

			// resolve implicit wiring
			if (endPoint1 == null && endPoint2 != null) {
				if (endPoint2.getTypeString() != null) {
					endPoint1 = config.getPortByPath(idList1,
							Port.Direction.PROVIDES, endPoint2.getTypeString());
				}
			}

			// resolve implicit wiring
			if (endPoint2 == null && endPoint1 != null) {
				if (endPoint1.getTypeString() != null) {
					endPoint2 = config.getPortByPath(idList2,
							Port.Direction.USES, endPoint1.getTypeString());
				}
			}
		}

		// endPoint1 == endPoint2
		if (direction == Connection.Direction.EQUATE) {

			// try PROVIDES
			Port tmp1EndPoint1 = config.getPortByPath(idList1,
					Port.Direction.PROVIDES, null);
			Port tmp1EndPoint2 = config.getPortByPath(idList2,
					Port.Direction.PROVIDES, null);

			// resolve implicit wiring
			if (tmp1EndPoint1 == null && tmp1EndPoint2 != null) {
				if (tmp1EndPoint2.getTypeString() != null) {
					tmp1EndPoint1 = config.getPortByPath(idList1,
							Port.Direction.PROVIDES, tmp1EndPoint2
									.getTypeString());
				}
			}

			// resolve implicit wiring
			if (tmp1EndPoint2 == null && tmp1EndPoint1 != null) {
				if (tmp1EndPoint1.getTypeString() != null) {
					tmp1EndPoint2 = config.getPortByPath(idList2,
							Port.Direction.PROVIDES, tmp1EndPoint1
									.getTypeString());
				}
			}

			// try USES
			Port tmp2EndPoint1 = config.getPortByPath(idList1,
					Port.Direction.USES, null);
			Port tmp2EndPoint2 = config.getPortByPath(idList2,
					Port.Direction.USES, null);

			// resolve implicit wiring
			if (tmp2EndPoint1 == null && tmp2EndPoint2 != null) {
				if (tmp2EndPoint2.getTypeString() != null) {
					tmp2EndPoint1 = config.getPortByPath(idList1,
							Port.Direction.USES, tmp2EndPoint2.getTypeString());
				}
			}

			// resolve implicit wiring
			if (tmp2EndPoint2 == null && tmp2EndPoint1 != null) {
				if (tmp2EndPoint1.getTypeString() != null) {
					tmp2EndPoint2 = config.getPortByPath(idList2,
							Port.Direction.USES, tmp2EndPoint1.getTypeString());
				}
			}

			if (tmp1EndPoint1 != null && tmp1EndPoint2 != null
					&& tmp2EndPoint1 != null && tmp2EndPoint2 != null) {
				String err = "Ambiguous wiring: " + idListToString(idList1)
						+ " " + directionToString(direction) + " "
						+ idListToString(idList2) + " matches both "
						+ tmp1EndPoint1.getComponent().getName() + "."
						+ tmp1EndPoint1.getName() + " "
						+ directionToString(direction) + " "
						+ tmp1EndPoint2.getComponent().getName() + "."
						+ tmp1EndPoint2.getName() + " and "
						+ tmp2EndPoint1.getComponent().getName() + "."
						+ tmp2EndPoint1.getName() + " "
						+ directionToString(direction) + " "
						+ tmp2EndPoint2.getComponent().getName() + "."
						+ tmp2EndPoint2.getName();
				// ctx.addMsg(new ParserMessage(null,err,new
				// CodeLocation((TNode)idList1.get(0))));
				ctx.addMsg(new ParserMessage(ParserMessage.ERROR, err,
						new CodeLocation((TNode) idList1.get(0)), null));
				// System.out.println(err);
			} else if (tmp1EndPoint1 != null && tmp1EndPoint2 != null) {
				endPoint1 = tmp1EndPoint1;
				endPoint2 = tmp1EndPoint2;
			} else if (tmp2EndPoint1 != null && tmp2EndPoint2 != null) {
				endPoint1 = tmp2EndPoint1;
				endPoint2 = tmp2EndPoint2;
			}
		}

		// FIXME: check port compatibilities

		// link connection to ports
		if (endPoint1 != null && endPoint2 != null) {
			endPoint1.addConnection(this);
			endPoint2.addConnection(this);
		} else {
			if (endPoint1 == null) {
				String err = "Cannot find endpoint: " + idListToString(idList1);
				// ctx.addMsg(new ParserMessage(null,err,new
				// CodeLocation((TNode)idList1.get(0))));
				ctx.addMsg(new ParserMessage(ParserMessage.ERROR, err,
						new CodeLocation((TNode) idList1.get(0)), null));
			}

			if (endPoint2 == null) {
				String err = "Cannot find endpoint: " + idListToString(idList2);
				// ctx.addMsg(new ParserMessage(null,err,new
				// CodeLocation((TNode)idList2.get(0))));
				ctx.addMsg(new ParserMessage(ParserMessage.ERROR, err,
						new CodeLocation((TNode) idList2.get(0)), null));
			}

		}
	}

	String idListToString(List idList) {
		StringBuffer sb = new StringBuffer();

		for (Iterator i = idList.iterator(); i.hasNext();) {
			TNode n = (TNode) i.next();
			sb.append(n.getText());
			if (i.hasNext())
				sb.append(".");
		}

		return sb.toString();
	}

	String directionToString(int direction) {
		switch (direction) {
		case Direction.FROM1TO2:
			return "->";
		case Direction.FROM2TO1:
			return "<-";
		case Direction.EQUATE:
			return "=";
		default:
			return "<null>";
		}
	}

	/**
	 * @param o
	 */
	public void outline(Outline o) {
		if (endPoint1 != null) {
			o.append(endPoint1.getComponent().getName());
			o.append(".");
			o.append(endPoint1.getName());
		} else {
			o.append("<null>");
		}

		if (direction == Connection.Direction.FROM1TO2) {
			o.append(" -> ");
		} else if (direction == Connection.Direction.FROM2TO1) {
			o.append(" <- ");
		} else {
			o.append(" = ");
		}

		if (endPoint2 != null) {
			o.append(endPoint2.getComponent().getName());
			o.append(".");
			o.append(endPoint2.getName());
		} else {
			o.append("<null>");
		}
	}

	/**
	 * @return Returns the configurationImplementation.
	 */
	public ConfigurationImplementation getConfigurationImplementation() {
		return configurationImplementation;
	}

	/**
	 * @param configurationImplementation
	 *            The configurationImplementation to set.
	 */
	public void setConfigurationImplementation(
			ConfigurationImplementation configurationImplementation) {
		this.configurationImplementation = configurationImplementation;
	}

	public ConfigurationImplementation getParent() {
		return getConfigurationImplementation();
	}

	public Port getSrc() {
		if (direction == Connection.Direction.FROM1TO2)
			return endPoint1;
		else
			return endPoint2;
	}

	public Port getDst() {
		if (direction == Connection.Direction.FROM1TO2)
			return endPoint2;
		else
			return endPoint1;
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?