code: public boolean addEdge(StateVertex sourceVertex, StateVertex targetVertex, Eventable clickable) {
  		clickable.setSource(sourceVertex);
  		clickable.setTarget(targetVertex);
  		writeLock.lock();
  		try {
  			boolean added = sfg.addEdge(sourceVertex, targetVertex, clickable);
  			if (!added) {
  				Set<Eventable> allEdges = sfg.getAllEdges(sourceVertex, targetVertex);
  				for (Eventable edge : allEdges) {
  					if (edge.equals(clickable)) {
  						/*
  						 * Setting the clickable provided to the clone edge so that crawlpath is in
  						 * sync with SFG
  						 */
  						clickable.setId(-1);
  					}
  				}
  			}
  			return added;
  		} finally {
  			writeLock.unlock();
  		}
  	}
docs: Adds the specified edge to this graph, going from the source vertex to the target vertex.
  More formally, adds the specified edge, e, to this graph if this graph contains no edge e2
  such that e2.equals(e). If this graph already contains such an edge, the call leaves this
  graph unchanged and returns false. Some graphs do not allow edge-multiplicity. In such cases,
  if the graph already contains an edge from the specified source to the specified target, than
  this method does not change the graph and returns false. If the edge was added to the graph,
  returns true. The source and target vertices must already be contained in this graph. If they
  are not found in graph IllegalArgumentException is thrown.
  
  @param sourceVertex source vertex of the edge.
  @param targetVertex target vertex of the edge.
  @param clickable  the clickable edge to be added to this graph.
  @return true if this graph did not already contain the specified edge.
  @see org.jgrapht.Graph#addEdge(Object, Object, Object)