You can subscribe to this list here.
2008 |
Jan
|
Feb
|
Mar
(44) |
Apr
(40) |
May
(98) |
Jun
(60) |
Jul
(48) |
Aug
(32) |
Sep
(27) |
Oct
(29) |
Nov
(24) |
Dec
(56) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2009 |
Jan
(43) |
Feb
(48) |
Mar
(152) |
Apr
(158) |
May
(64) |
Jun
(87) |
Jul
(43) |
Aug
(2) |
Sep
(1) |
Oct
(1) |
Nov
(13) |
Dec
(21) |
2010 |
Jan
(11) |
Feb
(4) |
Mar
(2) |
Apr
(22) |
May
(21) |
Jun
(2) |
Jul
(4) |
Aug
(41) |
Sep
(62) |
Oct
(26) |
Nov
(18) |
Dec
(20) |
2011 |
Jan
(22) |
Feb
(18) |
Mar
(15) |
Apr
(85) |
May
(17) |
Jun
(15) |
Jul
(45) |
Aug
(28) |
Sep
(11) |
Oct
(9) |
Nov
|
Dec
(5) |
2012 |
Jan
(138) |
Feb
(104) |
Mar
(16) |
Apr
(7) |
May
|
Jun
(2) |
Jul
(7) |
Aug
(1) |
Sep
(6) |
Oct
(7) |
Nov
(13) |
Dec
(19) |
2013 |
Jan
(12) |
Feb
(17) |
Mar
(3) |
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2015 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(8) |
Sep
|
Oct
|
Nov
|
Dec
(1) |
2016 |
Jan
(5) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <ran...@us...> - 2016-01-16 11:34:38
|
Revision: 4607 http://sourceforge.net/p/wala/code/4607 Author: ranettinger Date: 2016-01-16 11:34:35 +0000 (Sat, 16 Jan 2016) Log Message: ----------- Moshe Zemah's standalone tool to review statement sliding and tucking's results, including a PDG viewer Added Paths: ----------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/AbugraphPanel.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Edge.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Node.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/MainDesktop.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/CallBackObject.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/ComponentsConstants.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/EqualSizesLayout.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/FrameStamp.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/JCalendarButton.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/JCalendarPopup.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/JXTaskBar.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyComboBox.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyDialog.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyInternalFrame.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyLabel.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenu.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenuBar.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenuItem.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyPanel.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyRealInternalFrame.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyScrollPane.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyTableTextField.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyTextField.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/BlocksGraphScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/BlocksScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/CellDataScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/GraphScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/MainScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/OriginalMethodScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/PDGNodesGraphScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/PDGScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/ScreensConstants.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/SliceAndCosliceScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/SymbolsMapExternalScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/TabsFrameWithTables.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/IndexToDataTable.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/MyTable.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/SourceCodeTable.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/model/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/model/AbstractColumn.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/model/MyTableModel.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/renderers/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/renderers/MyCheckboxTableCellRenderer.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/renderers/MyDefaultTableCellRenderer.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/renderers/SourceCodeTableRenderer.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/rowObjects/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/rowObjects/ExtraColumnData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/rowObjects/IndexWithData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/rowObjects/SourceLine.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/BlockData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/FileUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/GeneralGuiServices.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/IconicManager.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/MyDate.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/MyException.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/Pair.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/SlidingUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/UIDecorations.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/Utils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/multiMap/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/multiMap/AbstractMultiMap.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/multiMap/HashSetMultiMap.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/multiMap/MultiMap.java Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/AbugraphPanel.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/AbugraphPanel.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/AbugraphPanel.java 2016-01-16 11:34:35 UTC (rev 4607) @@ -0,0 +1,887 @@ +/* + * AbugraphPanel.java + * + * Copyright (c) 2004 Sun Microsystems, Inc. + * All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * -Redistribution of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * -Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") + * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE + * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed, licensed or intended + * for use in the design, construction, operation or maintenance of any + * nuclear facility. + */ + +package com.ibm.wala.refactoring.pdgSliding.tools.graph; + +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Point; +import java.awt.RenderingHints; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.util.ConcurrentModificationException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.CallBackObject; + + +/** + * AbuGraph panel class + */ +public class AbugraphPanel extends JPanel +implements Runnable, MouseListener, MouseMotionListener +{ + //~Constants ---------------------------------------------------------------- + private static final float MIN_ZOOM_LEVEL = 1f; + private static final int DEF_ZOOM_LEVEL = 1; + private static final float ZOOM_STEP = 0.25f; + + //~Variables ---------------------------------------------------------------- + private CallBackObject callBack; + private Map<String, Integer> node_labels; + private Map<Integer, Node> nodes; + private Set<Edge> edges; + private Thread thread; + private boolean showEdgeLabels; + private boolean pause; + private int numMouseButtonsDown; + private Node selected; + private boolean pickfixed; + private Image offscreen; + private Dimension offscreensize; + private Graphics offgraphics; + private Set<Integer> releasedNodeIndexes; + private float zoomLevel; + private Point clickedPoint; + + private Point minXY = new Point(0,0); + private Point maxXY = new Point(800,800); + + private boolean roundNodes = true; + //~Methods ------------------------------------------------------------------ + + /** + * Abugraph constructor (to be replaced when menu works) + */ + public AbugraphPanel(CallBackObject callBack) + { + this.callBack = callBack; + this.node_labels = new HashMap<String, Integer>(); + this.edges = new HashSet<Edge>(); + this.releasedNodeIndexes = new HashSet<Integer>(); + this.nodes = new HashMap<Integer, Node>(); + this.zoomLevel = DEF_ZOOM_LEVEL; + addMouseListener(this); + addMouseWheelListener(new MouseWheelListener() { + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + if (e.getWheelRotation() < 0){ + zoomIn(); + }else{ + zoomOut(); + } + AbugraphPanel.this.repaint(); + + } + }); + + } + + public void setRoundNodes(boolean roundNodes) { + this.roundNodes = roundNodes; + } + + /** + * Method to clear the panel + */ + public void clear() + { + this.edges.clear(); + this.nodes.clear(); + this.node_labels.clear(); + this.releasedNodeIndexes.clear(); + } + + /** + * This method is called after loading a file. It is used to recover the + * zoom level used by that file graph. + */ + public void defineZoomLevel() + { + if( !this.edges.isEmpty() ) + { + int sum_lengths = 0; + for(Edge e: this.edges) sum_lengths += e.getLength(); + this.zoomLevel = sum_lengths/this.edges.size(); + } + else this.zoomLevel = DEF_ZOOM_LEVEL; + } + + /** + * Method to zoomIn + */ + public void zoomIn() + { + this.zoomLevel += ZOOM_STEP; + getParent().doLayout(); +// for(Edge e: this.edges){ +// e.setLength(this.zoomLevel); +// e.changeFontSize(true, false); +// } +// for(Node n : this.nodes.values()){ +// n.changeFontSize(true, false); +// } + } + + /** + * Method to zoomOut + */ + public void zoomOut() + { + this.zoomLevel -= ZOOM_STEP; + if(this.zoomLevel < MIN_ZOOM_LEVEL) this.zoomLevel = MIN_ZOOM_LEVEL; + getParent().doLayout(); +// for(Edge e: this.edges){ +// e.setLength(this.zoomLevel); +// e.changeFontSize(false, false); +// } +// for(Node n : this.nodes.values()){ +// n.changeFontSize(false, false); +// } + } + + /** + * Method to define de 'showEdgeLabels' attribute + */ + public void setLabels(boolean arg) + { + this.showEdgeLabels = arg; + } + + /** + * Method to define de 'pause' attribute + */ + public void setPause(boolean arg) + { + this.pause = arg; + } + + /** + * Method to get the nodes collection + */ + public Map<Integer, Node> getNodes() + { + return this.nodes; + } + + public Set<Edge> getEdges() { + return edges; + } + + /** + * Method to get a new node index. It tries to re-use a discarded index, but + * if it is not possible, it generates a new one + */ + private int getNextNodeIndex() + { + int rv; + if(this.releasedNodeIndexes.isEmpty()) + { + rv = this.nodes.size(); + } + else + { + rv = this.releasedNodeIndexes.iterator().next(); + this.releasedNodeIndexes.remove(rv); + } + return rv; + } + + /** + * Method to add a new node + * @param ar_label Node label + * + * @return The node index + */ + public int addNode(String ar_label, boolean round) + { + int nodeIdx = this.getNextNodeIndex(); + Node n = new Node(ar_label, round); +// if(nodeIdx == 0) n.setFixed(true); + n.setX(10 + 380 * Math.random()); + n.setY(10 + 380 * Math.random()); + this.nodes.put(nodeIdx,n); + this.node_labels.put(ar_label,nodeIdx); + return nodeIdx; + } + + /** + * Method to update the edges label + * + * @param ar_orig The edge originator node + * @param ar_dest The edge destination node + * @param ar_newLabel The new label + */ + public void updateEdge(String ar_orig, String ar_dest, String ar_newLabel) + { + Integer origIndex = this.node_labels.get(ar_orig); + if(origIndex == null) return; + + Integer destIndex = this.node_labels.get(ar_dest); + if(destIndex == null) return; + + Edge e = new Edge(origIndex, destIndex, 50); + if(this.edges.remove(e) == true) + { + e.setLabel(ar_newLabel); + this.edges.add(e); + } + } + + /** + * Method to update the node label + * + * @param ar_label Current label (the one to be replaced) + * @param ar_newLabel The new label + */ + public void updateNode(String ar_label, String ar_newLabel) + { + Integer nodeToUpdate = this.node_labels.get(ar_label); + if(nodeToUpdate != null) + { + Node node2update = nodes.get(nodeToUpdate); + node2update.setLabel(ar_newLabel); + + Integer nodeExist = this.node_labels.get(ar_newLabel); + if(nodeExist != null) + { + Node existingNode = this.nodes.get(nodeExist); + + Set<Integer> existingFromNodes = existingNode.getFromNodes(); + for(Integer from2remove : existingFromNodes) + { + Edge e2remove = new Edge(from2remove,nodeExist,50); + this.edges.remove(e2remove); + Edge e2add = new Edge(from2remove,nodeToUpdate,50); + this.edges.add(e2add); + node2update.addFrom(from2remove); + } + + Set<Integer> existingToNodes = existingNode.getToNodes(); + for(Integer to2remove : existingToNodes) + { + Edge e2remove = new Edge(nodeExist,to2remove,50); + this.edges.remove(e2remove); + Edge e2add = new Edge(nodeToUpdate,to2remove,50); + this.edges.add(e2add); + node2update.addTo(to2remove); + } + + this.removeNode(nodeExist); + } + + this.node_labels.remove(ar_label); + this.node_labels.put(ar_newLabel,nodeToUpdate); + } + } + + /** + * Method to remove an edge + * + * @param ar_from Originating node + * @param ar_to Destination node + */ + public void removeEdge(String ar_from,String ar_to) + { + Integer from = this.node_labels.get(ar_from); + if(from == null) return; + + Integer to = this.node_labels.get(ar_to); + if(to == null) return; + + Edge e = new Edge(from,to,50); + + if( this.edges.remove(e) == true) + { + Node nodeFrom = nodes.get(e.getFrom()); + if(nodeFrom != null) + { + nodeFrom.decNeighbours(); + if( !nodeFrom.hasNeighbours() ) removeNode(e.getFrom()); + else nodeFrom.removeTo(to); + } + + Node nodeTo = nodes.get(e.getTo()); + if(nodeTo != null) + { + nodeTo.decNeighbours(); + if(!nodeTo.hasNeighbours()) removeNode(e.getTo()); + else nodeTo.removeFrom(from); + } + } + } + + /** + * Method to remove a node from the graph + * + * @param ar_nodeIdx Node index + */ + public void removeNode(int ar_nodeIdx) + { + Node node2del = this.nodes.get(ar_nodeIdx); + this.node_labels.remove(node2del.getLabel()); + this.nodes.remove(new Integer(ar_nodeIdx)); + this.releasedNodeIndexes.add(ar_nodeIdx); + } + + /** + * Method to add a new edge + * + * @param ar_from Originating node + * @param ar_to Destination node + * @param ar_label The edge label + * + * @return The just created edge + */ + public Edge addEdge(String ar_from, String ar_to, String ar_label) + { + //System.out.println("+++ Adding edge from ["+from+"] to ["+to+']') + + Integer from = this.node_labels.get(ar_from); + if(from == null) from = this.addNode(ar_from, roundNodes); + + Integer to = this.node_labels.get(ar_to); + if(to == null) to = this.addNode(ar_to, roundNodes); + + Edge e = new Edge(from,to,50,ar_label); + + if( edges.add(e) == true ) + { + Node fromNode = this.nodes.get(from); + fromNode.incNeighbours(); + + Node toNode = this.nodes.get(to); + toNode.incNeighbours(); + + fromNode.addTo(to); + toNode.addFrom(from); + } + + return e; + } + + /** + * Thread 'run' method. Basically checks the pause flag and calls the + * 'relax()' method periodically. + */ + public void run() + { + Thread me = Thread.currentThread(); + while (thread == me) + { + while(this.pause == true) + { + try { Thread.sleep(1000); } + catch (InterruptedException e) {break;} + } + + relax(); + + try { Thread.sleep(10); } + catch (InterruptedException e) {break;} + } + } + + /** + * "Relaxing" method. Used to periodically update the graph. + */ + private synchronized void relax() + { + try{ + for(Edge e : this.edges) + { + Node nodeTo = this.nodes.get(e.getTo()); + Node nodeFrom = this.nodes.get(e.getFrom()); + + if(nodeTo == null || nodeFrom == null) continue; + + double vx = nodeTo.getX() - nodeFrom.getX(); + double vy = nodeTo.getY() - nodeFrom.getY(); + double len = Math.sqrt(vx*vx + vy*vy); + len = (len == 0) ? .0001 : len; + double f = (e.getLength() - len) / (len * 3); + double dx = f * vx; + double dy = f * vy; + nodeTo.setDx(dx + nodeTo.getDx()); + nodeTo.setDy(dy + nodeTo.getDy()); + nodeFrom.setDx(nodeFrom.getDx() - dx); + nodeFrom.setDy(nodeFrom.getDy() - dy); + } + + Set<Entry<Integer, Node>> entrySet = nodes.entrySet(); + for( Map.Entry me : entrySet ) + { + Node n1 = (Node)me.getValue(); + double dx = 0; + double dy = 0; + for( Map.Entry mf : entrySet ) + { + Node n2 = (Node)mf.getValue(); + if (n1.equals(n2)) continue; + + double vx = n1.getX() - n2.getX(); + double vy = n1.getY() - n2.getY(); + double len = vx * vx + vy * vy; + if (len == 0) + { + dx += Math.random(); + dy += Math.random(); + } + else if (len < 100 * 100) + { + dx += vx / len; + dy += vy / len; + } + } + double dlen = dx * dx + dy * dy; + if (dlen > 0) + { + dlen = Math.sqrt(dlen) / 2; + n1.setDx(n1.getDx()+(dx/dlen)); + n1.setDy(n1.getDy()+(dy/dlen)); + } + } + + Dimension d = getSize(); + for( Map.Entry me : entrySet ) + { + Node n = (Node)me.getValue(); + if ( !n.isFixed() ) + { + n.addToX(Math.max(-5, Math.min(5, n.getDx()))); + n.addToY(Math.max(-5, Math.min(5, n.getDy()))); + } + + if (n.getX() < 0) + { + n.setX(0); + } + else if (n.getX() > d.width) + { + n.setX(d.width); + } + + if (n.getY() < 0) + { + n.setY(0); + } + else if (n.getY() > d.height) + { + n.setY(d.height); + } + + n.setDx(n.getDx() / 2.0); + n.setDy(n.getDy() / 2.0); + } + repaint(); + + }catch (ConcurrentModificationException ex){ + // do nothing + } + } + + /** + * Thread start method + */ + public void start() + { + thread = new Thread(this); + thread.start(); + } + + /** + * Thread stop method + */ + public void stop() + { + thread = null; + } + + @Override + protected void paintComponent(Graphics ar_g) { + Dimension d = getSize(); + + Graphics2D g2 = (Graphics2D) ar_g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias! + RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, // Anti-alias! + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, // Anti-alias! + RenderingHints.VALUE_RENDER_QUALITY); + + int w = d.width;// real width of canvas + int h = d.height;// real height of canvas + // Translate used to make sure scale is centered +// g2.translate(w/2, h/2); + g2.scale(zoomLevel, zoomLevel); +// g2.translate(-w/2, -h/2); + + super.paintComponent(ar_g); + if ((offscreen == null) || (d.width != offscreensize.width) + || (d.height != offscreensize.height)) + { + offscreen = createImage(d.width, d.height); + offscreensize = d; + if (offgraphics != null) + { + offgraphics.dispose(); + } + offgraphics = offscreen.getGraphics(); + //offgraphics.setFont(NODE_LABEL_FONT); + } + offgraphics.setColor(getBackground()); + offgraphics.fillRect(0, 0, d.width, d.height); + + //Draw all edges and nodes + for(Edge e : edges) e.draw(offgraphics, this.nodes, this.showEdgeLabels); + FontMetrics fm = null; + resetMinMaxPoints(); + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + if (fm == null){ + offgraphics.setFont(n.getFont()); + fm = offgraphics.getFontMetrics(); + } + n.draw(offgraphics, fm, selected); + + handleMinMaxPoints(n); + } + handleMinXYNegative(); + ar_g.drawImage(offscreen, 0, 0, null); + } + + private void handleMinXYNegative() { + if (minXY.x < 0 || minXY.y < 0){ + int dx = minXY.x >= 0 ? 0 : 0-minXY.x; + int dy = minXY.y >= 0 ? 0 : 0-minXY.y; + + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + n.addToX(dx); + n.addToY(dy); + } + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + repaint(); + } + }); + + } + + + + } + + private void resetMinMaxPoints() { + minXY.x = 0; + minXY.y = 0; + maxXY.x = 500; + maxXY.y = 500; + + } + + private void handleMinMaxPoints(Node n) { + minXY.x = (int) Math.min(minXY.x, n.getX()); + minXY.y = (int) Math.min(minXY.y, n.getY()); + maxXY.x = (int) Math.max(maxXY.x, n.getX()); + maxXY.y = (int) Math.max(maxXY.y, n.getY()); + + + } + + /** + * Update method + * + * @param ar_g Graphics object reference + */ +// public synchronized void update(Graphics ar_g) +// { +// Dimension d = getSize(); +// if ((offscreen == null) || (d.width != offscreensize.width) +// || (d.height != offscreensize.height)) +// { +// offscreen = createImage(d.width, d.height); +// offscreensize = d; +// if (offgraphics != null) +// { +// offgraphics.dispose(); +// } +// offgraphics = offscreen.getGraphics(); +// //offgraphics.setFont(NODE_LABEL_FONT); +// } +// offgraphics.setColor(getBackground()); +// offgraphics.fillRect(0, 0, d.width, d.height); +// +// //Draw all edges and nodes +// for(Edge e : edges) e.draw(offgraphics, this.nodes, this.showEdgeLabels); +// FontMetrics fm = null; +// for( Map.Entry me : nodes.entrySet() ) +// { +// Node n = (Node)me.getValue(); +// if (fm == null){ +// offgraphics.setFont(n.getFont()); +// fm = offgraphics.getFontMetrics(); +// } +// n.draw(offgraphics, fm, selected); +// } +// ar_g.drawImage(offscreen, 0, 0, null); +// } + + /** + * Method to get the current graph state, that is, the data structures + * which allows re-build the graph after deserialization from a file. + * + * + * @return Array of Objects containig: + * <ul> + * <li> The nodes map as first element + * <li> The edges set as second element + * <li> The releases node indexes set as third element + * <li> The node showEdgeLabels map as fourth element + * </ul> + */ + public Object[] getGraphState() + { + Object[] rv = null; + if( !this.edges.isEmpty() ) + { + rv = new Object[4]; + rv[0] = this.nodes; + rv[1] = this.edges; + rv[2] = this.releasedNodeIndexes; + rv[3] = this.node_labels; + } + + return rv; + } + + /** + * Method to set the graph state (this is the complementary method of + * 'getGraphState()' + * + * + * @param Array of Objects containig: + * <ul> + * <li> The nodes map as first element + * <li> The edges set as second element + * <li> The releases node indexes set as third element + * <li> The node showEdgeLabels map as fourth element + * </ul> + */ + public void setGraphState(Object[] ar_state) + { + this.nodes = (Map<Integer,Node>)ar_state[0]; + this.edges = (Set<Edge>)ar_state[1]; + this.releasedNodeIndexes = (Set<Integer>)ar_state[2]; + this.node_labels = (Map<String,Integer>)ar_state[3]; + } + + // + // Event handling methods + // + + /** + * Invoked when the mouse button has been clicked (pressed + * and released) on a component. + */ + public void mouseClicked(MouseEvent e) {} + + /** + * Invoked when a mouse button has been pressed on a component. + */ + public void mousePressed(MouseEvent e) + { + clickedPoint = e.getPoint(); + numMouseButtonsDown++; + addMouseMotionListener(this); + double bestdist = Double.MAX_VALUE; + int x = e.getX(); + int y = e.getY(); + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + double dist = (n.getX()-x) * (n.getX()-x) + (n.getY()-y) * (n.getY()-y); + if (dist < bestdist && dist < 90) + { + selected = n; + bestdist = dist; + } + } + if(selected != null) + { + pickfixed = selected.isFixed(); + selected.setFixed(true); + selected.setX(x); + selected.setY(y); + } + repaint(); + getParent().doLayout(); + e.consume(); + } + + /** + * Invoked when a mouse button has been released on a component. + */ + public void mouseReleased(MouseEvent e) + { + numMouseButtonsDown--; + removeMouseMotionListener(this); + Node selectedNode = null; + if(selected != null) + { + selectedNode = selected; + selected.setFixed(pickfixed); + selected.setX( e.getX() ); + selected.setY( e.getY() ); + if (numMouseButtonsDown == 0) selected = null; + } + repaint(); + getParent().doLayout(); + + callBack.doAction(selectedNode); + + e.consume(); + } + + /** + * Invoked when the mouse enters a component. + */ + public void mouseEntered(MouseEvent e) {} + + /** + * Invoked when the mouse exits a component. + */ + public void mouseExited(MouseEvent e) {} + + /** + * Invoked when a mouse button is pressed on a component and then + * dragged. <code>MOUSE_DRAGGED</code> events will continue to be + * delivered to the component where the drag originated until the + * mouse button is released (regardless of whether the mouse position + * is within the bounds of the component). + * <p> + * Due to platform-dependent Drag&Drop implementations, + * <code>MOUSE_DRAGGED</code> events may not be delivered during a native + * Drag&Drop operation. + */ + public void mouseDragged(MouseEvent e) + { + if (selected != null){ + double oldX = selected.getX(); + double oldY = selected.getY(); + selected.setX( e.getX() ); + selected.setY( e.getY() ); + if (e.isShiftDown()){ // moving all the other nodes together when shift is pressed + double dx = selected.getX() - oldX; + double dy = selected.getY() - oldY; + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + if (selected != n){ + n.setX(n.getX() + dx); + n.setY(n.getY() + dy); + } + + } + } + }else if (clickedPoint != null){ // not dragging any node - move all nodes + double dx = e.getX() - clickedPoint.getX(); + double dy = e.getY() - clickedPoint.getY(); + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + n.setX(n.getX() + dx); + n.setY(n.getY() + dy); + + } + clickedPoint = e.getPoint(); + + + } + repaint(); + getParent().doLayout(); + e.consume(); + } + + /** + * Invoked when the mouse cursor has been moved onto a component + * but no buttons have been pushed. + */ + public void mouseMoved(MouseEvent e) {} + + public float getZoomLevel() { + return zoomLevel; + } + + public void revertToOriginal() { + this.zoomLevel = DEF_ZOOM_LEVEL; +// for(Edge e: this.edges){ +// e.setLength(this.zoomLevel); +// e.changeFontSize(true, true); +// } +// for(Node n : this.nodes.values()){ +// n.changeFontSize(true, true); +// } + + } + + @Override + public Dimension getPreferredSize() { +// Dimension size = getParent().getSize(); + int width = maxXY.x - minXY.x; + int height = maxXY.y - minXY.y; + return new Dimension((int)(width * zoomLevel), (int)(height * zoomLevel)); +// return super.getPreferredSize(); + } +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Edge.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Edge.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Edge.java 2016-01-16 11:34:35 UTC (rev 4607) @@ -0,0 +1,265 @@ +/* + * Edge.java + * + * Copyright (c) 2007 Ignacio Labrador Pavon + * 28814 Daganzo, Madrid. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of copyright holders nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +package com.ibm.wala.refactoring.pdgSliding.tools.graph; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Polygon; +import java.io.Serializable; +import java.util.Map; + +/** + * Edge class. + * + * @author ilp + * @since June-2007 + */ +public class Edge implements Serializable +{ + //~Constants ---------------------------------------------------------------- + private static final long serialVersionUID = -3721211867649111L; + private static final Color EDGE_LABEL_COLOR = Color.blue; + private static final Color ARC_COLOR_1 = Color.black; + private static final Color ARC_COLOR_2 = Color.lightGray; + private static final Color ARC_COLOR_3 = Color.red; + private static final Font EDGE_LABEL_FONT = new Font("default",Font.ITALIC,12); + private static final int ARROW_SIZE = 8; + private static final double ARROW_HOOK = 0.8; + + //~Variables ---------------------------------------------------------------- + private Integer from = null; + private Integer to = null; + private String label = null; + private int hash = 0; + private int length = 0; + private Font font = EDGE_LABEL_FONT; + + //~Methods ------------------------------------------------------------------ + + /** + * Constructor (without label) + * + * @param from Originating node + * @param to Destination node + */ + public Edge(int from, int to, int length) + { + this.from = from; + this.to = to; + this.label = null; + this.length = length; + } + + /** + * Constructor + * + * @param from Originating node + * @param to Destination node + * @param label Edge label + */ + public Edge(int from, int to, int length, String label) + { + this.from = from; + this.to = to; + this.label = label; + this.length = length; + } + + /** + * Overrides the Object.hashcode method. Just the members 'from' and 'to' are + * used to calculate the hash code. + */ + public int hashCode() + { + if(hash == 0) + { + StringBuilder sb = new StringBuilder(); + sb.append(from); + sb.append('-'); + sb.append(to); + hash = sb.toString().hashCode(); + } + return hash; + } + + /** + * Overrides the Object.equals method + */ + public boolean equals(Object other) + { + if(other instanceof Edge) return (this.hash == other.hashCode()); + else throw new ClassCastException(); + } + + /** + * Method to return the edge associated value + */ + public String getLabel() + { + return this.label; + } + + /** + * Method to define the edge associated value + */ + public void setLabel(String lbl) + { + this.label = lbl; + } + + /** + * Method to return the 'from' + */ + public Integer getFrom() + { + return this.from; + } + + /** + * Method to return the 'to' + */ + public Integer getTo() + { + return this.to; + } + + /** + * Method to return the 'to' + */ + public int getLength() + { + return this.length; + } + + /** + * Method to return the 'to' + */ + public void setLength(int ar_length) + { + this.length = ar_length; + } + + /** + * Method to draw an edge consisting on a line with an arrow, and a label. + * + * @param g Graphics object where the edge is painted + * @param nodes Nodes map (relates node with node index) + * @param showLabels Flag to request edge labels drawing + */ + public void draw(Graphics g, Map<Integer, Node> nodes, boolean showLabels) + { + Node nodeFrom = nodes.get(this.from); + Node nodeTo = nodes.get(this.to); + + if(nodeFrom == null || nodeTo == null) return; + + int x0 = (int) nodeFrom.getX(); + int y0 = (int) nodeFrom.getY(); + int x1 = (int) nodeTo.getX(); + int y1 = (int) nodeTo.getY(); + int len = (int)Math.abs(Math.sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1))-this.length); + + Color c = (len < 10) ? ARC_COLOR_1 + : len < 20 ? ARC_COLOR_2 + : ARC_COLOR_3; + g.setColor(c); + + int dx = x1 - x0; + int dy = y1 - y0; + double d = Math.sqrt((dx*dx)+(dy*dy)); + + if(d != 0) + { + //The line + g.drawLine(x0, y0, x1, y1); + + //The edge labels (if requested) + int midX0 = (x1+x0)/2; + int midY0 = (y1+y0)/2; + if (showLabels && this.label != null) + { + Font prevFont = g.getFont(); + Color prevColor = g.getColor(); + g.setFont(font); + g.setColor(EDGE_LABEL_COLOR); + int font_height = g.getFontMetrics().getHeight(); + int font_width = g.getFontMetrics().charWidth('x'); + int x_label = ((x1+midX0)/2) + font_width; + int y_label = (y1+midY0)/2; + if(y1 > y0 && x1 < x0) y_label += font_height; + else if(y1 < y0 && x1 > x0) y_label += font_height; + g.drawString(this.label,x_label,y_label); + g.setFont(prevFont); + g.setColor(prevColor); + } + + // The arrow + Polygon p = new Polygon(); + dx = (int)(dx / d * ARROW_SIZE); + dy = (int)(dy / d * ARROW_SIZE); + x1 = (x1+midX0) / 2; + y1 = (y1+midY0) / 2; + p.addPoint(x1,y1); + p.addPoint(x1-(int)(dx-(dy/2.0)), y1-(int)((dx/2.0)+dy)); + p.addPoint(x1-(int)((dx*ARROW_HOOK)), y1-(int)((dy*ARROW_HOOK))); + p.addPoint(x1-(int)((dy/2.0)+dx), y1-(int)(dy-(dx/2.0))); + g.fillPolygon(p); + g.drawPolygon(p); + } + } + + /** + * Returns a string containig the edge information + */ + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append(from); + sb.append(" -> "); + sb.append(to); + sb.append(" ["); + sb.append(this.label); + sb.append(']'); + return sb.toString(); + } + + public void changeFontSize(boolean increase, boolean reset){ + if (reset){ + font = EDGE_LABEL_FONT; + return; + } + float size = font.getSize() + (increase ? 1 : -1); + font = font.deriveFont(Math.min(size, 16)); + } +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Node.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Node.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Node.java 2016-01-16 11:34:35 UTC (rev 4607) @@ -0,0 +1,431 @@ +/* + * Node.java + * + * Copyright (c) 2007 Ignacio Labrador Pavon + * 28814 Daganzo, Madrid. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of copyright holders nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +package com.ibm.wala.refactoring.pdgSliding.tools.graph; + +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Node class + * + * @author ilp + * @since July-2007 + */ +public class Node implements Comparable, Serializable +{ + //~Constants ---------------------------------------------------------------- + private static final long serialVersionUID = 1429861986214L; + private static final Color FIXED_NODE_COLOR = Color.orange; + private static final Color DEF_NODE_COLOR = Color.yellow; + private static final Color SELECT_NODE_COLOR = Color.pink; + private static final Font NODE_LABEL_FONT = new Font("default",Font.BOLD,12); + + //~Variables ---------------------------------------------------------------- + private int hash = 0; + private double x; + private double y; + private double dx; + private double dy; + private boolean fixed; + private String label; + private int neighbours; + private Set<Integer> from; + private Set<Integer> to; + private Integer level = null; // distance from root + private Font font = NODE_LABEL_FONT; + + private boolean round = true; // if !round - draw a square + + + //~Methods ------------------------------------------------------------------ + + /** + * Void constructor + */ + public Node() + { + this.neighbours = 0; + this.fixed = false; + this.from = new HashSet<Integer>(); + this.to = new HashSet<Integer>(); + } + + /** + * Constructor with a label as argument + */ + public Node(String ar_label, boolean round) + { + this.neighbours = 0; + this.fixed = false; + this.label = ar_label; + this.from = new HashSet<Integer>(); + this.to = new HashSet<Integer>(); + this.round = round; + } + + /** + * Method to add to the 'x' member the specified value + */ + public void addToX(double arg) + { + this.x += arg; + } + + /** + * Method to add to the 'y' member the specified value + */ + public void addToY(double arg) + { + this.y += arg; + } + + /** + * Method to define the 'x' member + */ + public void setX(double arg) + { + this.x = arg; + } + + /** + * Method to define the 'y' member + */ + public void setY(double arg) + { + this.y = arg; + } + + /** + * Method to get the 'x' member + */ + public double getX() + { + return this.x; + } + + /** + * Method to get the 'y' member + */ + public double getY() + { + return this.y; + } + + /** + * Method to get the 'label' member + */ + public String getLabel() + { + return this.label; + } + + /** + * Method to define the 'label' member + */ + public void setLabel(String arg) + { + this.label = arg; + } + + /** + * Method to fix a position for the node + */ + public void setFixed(boolean arg) + { + this.fixed = arg; + } + + /** + * Method to check if a node has a fixed position + */ + public boolean isFixed() + { + return this.fixed; + } + + /** + * Method to increase the number of node neighbours + */ + public void incNeighbours() + { + if(this.neighbours < Integer.MAX_VALUE) this.neighbours++; + } + + /** + * Method to check if a node has neighbour nodes + */ + public boolean hasNeighbours() + { + return (this.neighbours > 0); + } + + /** + * Method to decrease the number of node neighbours + */ + public void decNeighbours() + { + if(this.neighbours > 0) this.neighbours--; + } + + /** + * Method to get the 'dx' member + */ + public double getDx() + { + return this.dx; + } + + /** + * Method to get the 'dy' member + */ + public double getDy() + { + return this.dy; + } + + /** + * Method to define the 'dx' member + */ + public void setDx(double arg) + { + this.dx = arg; + } + + /** + * Method to define the 'dy' member + */ + public void setDy(double arg) + { + this.dy = arg; + } + + /** + * Overrides the Object.hashcode() method + */ + public int hashCode() + { + if(this.hash == 0) + { + StringBuffer sb = new StringBuffer(); + sb.append(label);; + this.hash = sb.toString().hashCode(); + } + return hash; + } + + /** + * Overrides the Object.equals() method + */ + public boolean equals(Object other) + { + if(other instanceof Node) return (this.hash == other.hashCode()); + else throw new ClassCastException(); + } + + /** + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + public int compareTo(Object other) + { + if(other instanceof Node) + { + Node o = (Node)other; + return this.label.compareTo(o.label); + } + else throw new ClassCastException(); + } + + /** + * Method to add a new pointed node. + * + * @return 'true' if the argumet is actually a new pointed node, 'false' + * otherwise. + */ + public boolean addTo(int ar_to) + { + return this.to.add(ar_to); + } + + /** + * Method to add a new pointing node. + * + * @return 'true' if the argumet is actually a new pointed node, 'false' + * otherwise. + */ + public boolean addFrom(int ar_from) + { + return this.from.add(ar_from); + } + + /** + * Method to remove a pointing node. + */ + public void removeFrom(int ar_from) + { + this.from.remove(ar_from); + } + + /** + * Method to remove a pointed node. + */ + public void removeTo(int ar_to) + { + this.to.remove(ar_to); + } + + /** + * Method to retreive the from nodes set + */ + public Set<Integer> getFromNodes() + { + return this.from; + } + + /** + * Method to retreive the to nodes set + */ + public Set<Integer> getToNodes() + { + return this.to; + } + + /** + * Method to paint the node + * + * @param ar_g Graphics object where the node is painted + * @param ar_fm Font metrics + * @param ar_selected Selected node (if this node is the ar_selected one, it is + * painted in a different way) + */ + public void draw(Graphics ar_g, FontMetrics ar_fm, Node ar_selected) + { + int x = (int)this.x; + int y = (int)this.y; + int w = ar_fm.stringWidth(this.label) + 10; + int h = ar_fm.getHeight() + 4; + + ar_g.setFont(font); + + Color c = (this == ar_selected) ? SELECT_NODE_COLOR + : this.isFixed() ? FIXED_NODE_COLOR + : DEF_NODE_COLOR; + ar_g.setColor(c); + if (round){ + ar_g.fillOval(x-w/2, y-h/2, w, h); + ar_g.setColor(Color.black); + ar_g.drawOval(x - w / 2, y - h / 2, w - 1, h - 1); + }else{ + ar_g.fillRect(x-w/2, y-h/2, w, h); + ar_g.setColor(Color.black); + ar_g.drawRect(x - w / 2, y - h / 2, w - 1, h - 1); + } + ar_g.drawString(this.label,x-(w-10)/2,(y-(h-4)/2)+ar_fm.getAscent()); + } + + /** + * Returns a string with the node data + */ + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append(label); + sb.append(" -Neigbours:"); + sb.append(this.neighbours); + return sb.toString(); + } + + // Getting the distance from root + public int getLevel(Map<Integer, Node> nodesMap) { + if (level == null){ + Set<Integer> fromNodes = getFromNodes(); + level = 0; + for (Integer from : fromNodes) { + level = Math.max(nodesMap.get(from).getLevel(nodesMap)+1, level); + } + } + return level; + } + + public void changeFontSize(boolean increase, boolean reset){ + if (reset){ + font = NODE_LABEL_FONT; + return; + } + float size = font.getSize() + (increase ? 1 : -1); + font = font.deriveFont(size); + } + + public Font getFont() { + return font; + } + + // Getting all pred nodes + public Set<Node> getPredNodes(Map<Integer, Node> nodesMap, Set<Node> visitedNodes, boolean reursive) { + Set<Node> predNodes = new HashSet<Node>(); + Set<Integer> fromNodes = getFromNodes(); + for (Integer fromNode : fromNodes) { + Node node = nodesMap.get(fromNode); + predNodes.add(node); + if (reursive && !visitedNodes.contains(node)){ + visitedNodes.add(node); + predNodes.addAll(node.getPredNodes(nodesMap, visitedNodes, reursive)); + } + } + + return predNodes; + + } + + // Getting all Succ nodes + public Set<Node> getSuccNodes(Map<Integer, Node> nodesMap, Set<Node> visitedNodes, boolean reursive) { + Set<Node> predNodes = new HashSet<Node>(); + Set<Integer> toNodes = getToNodes(); + for (Integer fromNode : toNodes) { + Node node = nodesMap.get(fromNode); + predNodes.add(node); + if (reursive && !visitedNodes.contains(node)){ + visitedNodes.add(node); + predNodes.addAll(node.getSuccNodes(nodesMap, visitedNodes, reursive)); + } + } + + return predNodes; + + } +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/MainDesktop.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/MainDesktop.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/MainDesktop.java 2016-01-16 11:34:35 UTC (rev 4607) @@ -0,0 +1,493 @@ +package com.ibm.wala.refactoring.pdgSliding.tools.gui; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.Window; +import java.io.File; +import java.lang.reflect.Constructor; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; + +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.UIManager; + +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.FrameStamp; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.JXTaskBar; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.MyInternalFrame; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.MyMenuBar; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.screen.OriginalMethodScr; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.screen.ScreensConstants; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.screen.ScreensConstants.ScreenTypes; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.GeneralGuiServices; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.MyException; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.SlidingUtils; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.Utils; + + +@SuppressWarnings("serial") +public class MainDesktop extends JFrame +{ + private static final String VERSION = "1.0.0"; + + // the desktop containing all the internal frames + private JDesktopPane desktop; + private File loadDataFile = null; + + private static MainDesktop mainDesktop_Instance; + + private OriginalMethodScr floatingMethodScr = null; + + public static final MainDesktop getInstance() + { + if (mainDesktop_Instance == null){ + mainDesktop_Instance = new MainDesktop(); + } + return mainDesktop_Instance; + } + + // list of internal frames + FramesList framesList = new FramesList(); + + // Is the current frame that was created is modal. + private ScreenTypes currCreatedFrameType; + + // The frameStamp of the current frame. + private FrameStamp currCreatedFrameStamp; + + // Indicates if the current time, is a creation time for the frame. + private boolean frameCreationTime = false; + + // Constructs a new instance. + public MainDesktop() + { + super("Sliding Analyzer V" + VERSION); + try + { + jbInit(); + initialize(); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + private void initialize() + { + initMenuBar(); + } + + /** + * Method: jbInit <br> + * General: Creates the main frame and initializes all its components + * + * @throws any exception not handled by the internal frames + */ + private void jbInit() throws Exception + { + //make sure application closes when the frame is closed + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + //initialize a specialized layered pane for displaying internal frames + desktop = new JDesktopPane(); + desktop.setLayout(null); + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(desktop, BorderLayout.CENTER); + + + // adding a task bar + JXTaskBar taskBar = new JXTaskBar(desktop); + this.getContentPane().add(taskBar, BorderLayout.SOUTH); + + //Set up the GUI. This part has been generated by JDeveloper + this.setSize(new Dimension(1028, 730)); +// this.setSize(1024, 768); + + this.setVisible(true); + this.setResizable(true); + } + + public void initMenuBar() + { + setJMenuBar(new MyMenuBar(this)); + } + + /** + * Method: addInternalFrame <br> + * General: adds a new internal frame to the desktop in the center of the screen + * + * @param the frame to be added + * @throws any excpetion that didn't allow the frame to be drawn and get + * selected on the screen + */ + protected void addInternalFrame(MyInternalFrame frame) throws Exception + { + // we centralize the frame on the screen + frame.setLocation(desktop.getWidth() / 2 - frame.getFrameContainer().getWidth() / 2, + desktop.getHeight() / 2 - frame.getFrameContainer().getHeight() / 2); + + // Add the frame to the JDesktopPane only if the frame is a JInternalFrame. + if (ScreenTypes.INTERNAL.equals(currCreatedFrameType)) + { + desktop.add(frame.getFrameContainer()); +// frame.setMaximum(true); + + } + } + + /** + * Method: createFrame <br> + * General: Creates the requested frame + * + */ + @SuppressWarnings("unchecked") + protected MyInternalFrame createFrame(String frameClassName, FrameStamp frameStamp, + Object[] param, ScreenTypes screenType) + { + MyInternalFrame frame = null; + currCreatedFrameType = screenType; + currCreatedFrameStamp = frameStamp; + + try + { + + //first retrieve the class reference + Class c = Class.forName(frameClassName); + + //the new frame to be created + if (param == null) + { + //create frame object + frameCreationTime = true; + frame = (MyInternalFrame) c.newInstance(); + frameCreationTime = false; + } + else + { + // Create an array of all the classes of the params. + Class[] vecClasses = {Object[].class}; + + // Get the specific consturctor according to the classes that builds it. + Constructor constructor = c.getConstructor(vecClasses); + + // These are the initial arguments of the constructor. + Object[] initArgs = {param}; + + // Create a new instance of the frame, with the chosen constructor. + frameCreationTime = true; + frame = (MyInternalFrame) constructor.newInstance(initArgs); + frameCreationTime = false; + } + + framesList.addFrame(frame, frameStamp); //and add it to the list + addInternalFrame(frame); //add the frame + } + catch (Exception e) + { + e.printStackTrace(); + GeneralGuiServices.showExceptionMessage(e, this); + return null; + } + if (ScreensConstants.ORIGINAL_METHOD_SCR.equals(frameClassName)){ + floatingMethodScr = (OriginalMethodScr) frame; + } + return frame; + } + + + /** + * Method: isCurrCreatedFrameModal <br> + * General: Returning if the current frame is modal frame or not. + * + */ + public ScreenTypes getCurrentFrameType() throws MyException + { + // Check if the time this method called is the creation time (Constructor) + // of the current frame. + // Allowed this invokation just at the creation of the frame. + if (!frameCreationTime) + { + throw new MyException("Exception creating frame"); + } + + return currCreatedFrameType; + } + + public FrameStamp getCurrFrameStamp() throws MyException + { + if (!frameCreationTime) + { + throw new MyException("Exception creating frame"); + } + + return currCreatedFrameStamp; + } + + /** + * Method: findFrame <br> + * General: Looks for the specified frame in the list frame. + * + * @author Maayan Goldstein + */ + protected MyInternalFrame findFrame(FrameStamp frameStamp) + { + //we first look for it in the list + MyInternalFrame frame = null; + try + { + frame = framesList.retrieveFrame(frameStamp); + } + catch (NullPointerException e) + { + //ShavitLogger.error(e); + return frame; + } + + return frame; + } + + /** + * Method: isCurrCreatedFrameModal <br> + * General: Delete the current frame from the list of frames. + * + * @author Shay Molho + */ + public boolean closeFrame(FrameStamp closeFrameStamp) + { + MyInternalFrame frame = framesList.getFrame(closeFrameStamp); + if (floatingMethodScr == frame){ + floatingMethodScr = null; + } + boolean displayLastFrame = ScreenTypes.INTERNAL.equals(frame.getFrameType()); + boolean deleteFrame = framesList.deleteFrame(closeFrameStamp); + // showing another frame if exist + MyInternalFrame lastFrame = framesList.getLastFrame(); + if (lastFrame != null && displayLastFrame){ + displayFrame(lastFrame.getClass().getName(), ScreenTypes.INTERNAL); + } + return deleteFrame; + } + + public MyInternalFrame displayFrame(String frameClassName, ScreenTypes screenType) + { + return displayFrame(fram... [truncated message content] |
From: <ran...@us...> - 2016-01-16 11:32:34
|
Revision: 4606 http://sourceforge.net/p/wala/code/4606 Author: ranettinger Date: 2016-01-16 11:32:31 +0000 (Sat, 16 Jan 2016) Log Message: ----------- Include the computation of smallest non-promoting subset in the experiment, by default Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/AbstractTestExample.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/AbstractTestExample.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/AbstractTestExample.java 2016-01-16 11:31:23 UTC (rev 4605) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/AbstractTestExample.java 2016-01-16 11:32:31 UTC (rev 4606) @@ -150,8 +150,8 @@ System.out.println("Arbitrary = "+ragavan.getArbitraryBucket()); System.out.println("Predicates = " + controlDependentLines.invert().keySet()); -// if (ragavan.getMarkedLines().size() - markedLines.size()!= 0) -// findK(); + if (ragavan.getMarkedLines().size() - markedLines.size()!= 0) + findK(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ran...@us...> - 2016-01-16 11:31:25
|
Revision: 4605 http://sourceforge.net/p/wala/code/4605 Author: ranettinger Date: 2016-01-16 11:31:23 +0000 (Sat, 16 Jan 2016) Log Message: ----------- Include the "inline method" step, by default, in the RTwQ refactoring Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/rtwq/ReplaceTempWithQueryRefactoring.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/rtwq/ReplaceTempWithQueryRefactoring.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/rtwq/ReplaceTempWithQueryRefactoring.java 2016-01-16 11:09:25 UTC (rev 4604) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/rtwq/ReplaceTempWithQueryRefactoring.java 2016-01-16 11:31:23 UTC (rev 4605) @@ -147,7 +147,7 @@ //TODO make optional - //inlineTemp(); + inlineTemp(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ran...@us...> - 2016-01-16 11:09:27
|
Revision: 4604 http://sourceforge.net/p/wala/code/4604 Author: ranettinger Date: 2016-01-16 11:09:25 +0000 (Sat, 16 Jan 2016) Log Message: ----------- Revising the bucketing experiment report (on the Tiarks benchmark): added Mk info (the largest non-promoting subset of M) in all cases with promotion, and prepared a short name version of the report, for reference from our IWSC 2016 paper. Modified Paths: -------------- incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.docx Added Paths: ----------- incubator/com.ibm.wala.refactoring/BETB.pdf Added: incubator/com.ibm.wala.refactoring/BETB.pdf =================================================================== (Binary files differ) Index: incubator/com.ibm.wala.refactoring/BETB.pdf =================================================================== --- incubator/com.ibm.wala.refactoring/BETB.pdf 2015-08-10 16:57:28 UTC (rev 4603) +++ incubator/com.ibm.wala.refactoring/BETB.pdf 2016-01-16 11:09:25 UTC (rev 4604) Property changes on: incubator/com.ibm.wala.refactoring/BETB.pdf ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Modified: incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.docx =================================================================== (Binary files differ) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Haftom M. <mr....@gm...> - 2016-01-16 10:50:09
|
I am working with WALA for the first time and am having some issues setting it up. I have followed all of the instructions from the wala.sf.net wiki on getting started and I have already obtained dx.jar and placed it into the correct directory. However, when i run the maven build command i get the following errors: > ubuntu:~/git/WALA$ mvn clean verify -DskipTests=true -q [INFO] Building jar: /home/git/WALA/com.ibm.wala.util/walaUtil.jar javac: invalid target release: 1.8 Usage: javac <options> <source files> use -help for a list of possible options [ERROR] Failed to execute goal org.apache.maven.plugins:maven-antrun-plugin:1.7:run (default) on project com.ibm.wala.core.testdata: An Ant BuildException has occured: The following error occurred while executing this line: [ERROR] /home/git/WALA/com.ibm.wala.core.testdata/build.xml:118: The following error occurred while executing this line: [ERROR] /home/git/WALA/com.ibm.wala.core.testdata/build.xml:159: The following error occurred while executing this line: [ERROR] /home/git/WALA/com.ibm.wala.core.testdata/build.xml:138: Compile failed; see the compiler error output for details. [ERROR] around Ant part ...<ant antfile="/home/git/WALA com.ibm.wala.core.testdata/build.xml" target="build.update.jar"/>... @ 5:104 in /home/git/WALA/com.ibm.wala.core.testdata/target/antrun/build-main.xml [ERROR] -> [Help 1] [ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. [ERROR] Re-run Maven using the -X switch to enable full debug logging. [ERROR] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException [ERROR] [ERROR] After correcting the problems, you can resume the build with the command [ERROR] mvn <goals> -rf:com.ibm.wala.core.testdata Can someone help me? |
From: Shanshan Li <ss...@ta...> - 2015-12-23 17:48:08
|
Start --- Main Method --- Main Method --- Main Method --- Main Method--- Main Method --- Main Method add instruction conditional branch(eq) 15,4 : 0 add instruction arraystore 15[26] = 17 : 0 add instruction 5 = arrayload 1[13] : 0 add instruction 27 = phi 27,25 : 0 add instruction 27 = phi 25,19,19 : 1 add instruction goto (from iindex= 92 to iindex = 54) : 0 add instruction 29 = binaryop(add) 34 , 16 : 0 add instruction 14 = getstatic < Application, Ljava/lang/System, out, <Application,Ljava/io/PrintStream> > : 0 add instruction 30 = arraylength 2 : 0 add instruction conditional branch(lt) 13,4 : 0 add instruction 19 = binaryop(add) 20 , 6 : 0 add instruction 10 = arraylength 2 : 0 add instruction putfield 1.< Primordial, Ljava/security/AccessControlContext$1, val$pd, <Primordial,Ljava/security/ProtectionDomain> > = 4 : 0 add instruction 20 = phi 19,5 : 0 add instruction 20 = phi 18,4 : 0 add instruction conditional branch(eq) 12,3 : 0 add instruction invokestatic < Primordial, Ljava/lang/System, arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V > 15,5,31,5,24 @195 exception:32 : 0 add instruction conditional branch(ne) 27,4 : 0 add instruction 13 = phi 3,11 : 0 add instruction 13 = phi 5,12 : 0 add instruction invokestatic < Primordial, Ljava/lang/System, arraycopy(Ljava/lang/Object;ILjava/lang/Object;II)V > 2,5,15,5,13 @77 exception:16 : 1 add instruction putfield 1.< Primordial, Ljava/security/AccessControlContext, isAuthorized, <Primordial,Z> > = 8 : 0 add instruction 22 = phi 24,26,21 : 0 add instruction goto (from iindex= 70 to iindex = 72) : 0 add instruction 17 = arrayload 1[25] : 0 add instruction conditional branch(eq) 11,7 : 0 add instruction 31 = phi 29,4 : 0 add instruction putfield 1.< Primordial, Ljava/security/AccessControlContext, isPrivileged, <Primordial,Z> > = 3 : 0 add instruction putfield 1.< Primordial, Ljava/security/AccessControlContext$1, val$db, <Primordial,Lsun/security/util/Debug> > = 3 : 0 add instruction 23 = binaryop(add) 28 , 6 : 0 add instruction goto (from iindex= 74 to iindex = 88) : 0 add instruction 21 = arraylength 2 : 0 add instruction conditional branch(ge) 26,21 : 0 add instruction conditional branch(ne) 25,4 : 0 add instruction invokespecial < Primordial, Ljava/lang/Object, <init>()V > 1 @1 exception:5 : 0 add instruction 11 = binaryop(add) 13 , 9 : 0 add instruction goto (from iindex= 11 to iindex = 13) : 0 add instruction 9 = arraylength 1 : 0 add instruction conditional branch(gt) 10,11 : 1 add instruction 4 = arraylength 1 : 0 add instruction conditional branch(ge) 25,10 : 0 add instruction 21 = binaryop(add) 26 , 6 : 0 add instruction 24 = phi 22,13 : 0 add instruction 33 = phi 15,31 : 0 add instruction 33 = phi 33,31 : 0 add instruction conditional branch(ne) 24,10 : 0 add instruction putfield 1.< Primordial, Ljava/security/AccessControlContext, combiner, <Primordial,Ljava/security/DomainCombiner> > = 7 : 0 add instruction 24 = binaryop(add) 26 , 16 : 0 add instruction 9 = invokevirtual < Primordial, Ljava/lang/Object, getClass()Ljava/lang/Class; > 6 @60 exception:8 : 0 add instruction conditional branch(ne) 9,13 : 0 add instruction 15 = new <Primordial,[Ljava/security/ProtectionDomain>@6114 : 0 add instruction 8 = phi 6,5 : 0 add instruction conditional branch(eq) 8,3 : 0 add instruction conditional branch(eq) 8,5 : 0 add instruction conditional branch(eq) 8,5 : 0 add instruction conditional branch(ne) 8,5 : 0 add instruction conditional branch(ne) 8,5 : 0 add instruction conditional branch(eq) 8,5 : 0 add instruction 17 = phi 16,4 : 0 add instruction return 33 : 0 add instruction 29 = arraylength 15 : 0 add instruction conditional branch(ne) 24,30 : 0 add instruction 26 = phi 26,24 : 0 add instruction 26 = phi 24,4 : 0 add instruction conditional branch(eq) 24,29 : 0 add instruction 14 = binaryop(add) 10 , 13 : 0 add instruction 6 = arrayload 1[31] : 0 add instruction 13 = invokevirtual < Primordial, Ljava/lang/Object, getClass()Ljava/lang/Class; > 11 @94 exception:12 : 0 add instruction conditional branch(eq) 7,5 : 0 add instruction 12 = arraylength 2 : 0 add instruction goto (from iindex= 77 to iindex = 46) : 0 add instruction conditional branch(ne) 22,7 : 0 add instruction 5 = arraylength 1 : 0 add instruction return 4 : 0 add instruction 10 = phi 12,9 : 0 add instruction 10 = phi 5,9 : 0 add instruction putfield 1.< Primordial, Ljava/security/AccessControlContext, context, <Primordial,[Ljava/security/ProtectionDomain> > = 2 : 1 add instruction putfield 1.< Primordial, Ljava/security/AccessControlContext$1, this$0, <Primordial,Ljava/security/AccessControlContext> > = 2 : 0 add instruction 19 = phi 17,4 : 0 add instruction 15 = invokevirtual < Primordial, Ljava/lang/Object, equals(Ljava/lang/Object;)Z > 6,11 @103 exception:14 : 0 add instruction conditional branch(ne) 6,7 : 0 add instruction 28 = phi 25,27,27 : 0 add instruction goto (from iindex= 40 to iindex = 78) : 0 add instruction invokespecial < Primordial, Ljava/lang/Object, <init>()V > 1 @16 exception:6 : 0 add instruction invokevirtual < Application, Ljava/io/PrintStream, println(Ljava/lang/String;)V > 14,6 @38 exception:15 : 1 add instruction goto (from iindex= 4 to iindex = 18) : 0 add instruction conditional branch(ge) 20,10 : 0 add instruction 12 = phi 3,10 : 0 add instruction 11 = arrayload 2[20] : 0 add instruction putfield 1.< Primordial, Ljava/security/AccessControlContext, isAuthorized, <Primordial,Z> > = 6 : 0 add instruction 18 = arrayload 15[20] : 0 add instruction 30 = phi 27,4 : 0 add instruction goto (from iindex= 32 to iindex = 34) : 0 add instruction conditional branch(ne) 19,4 : 0 add instruction conditional branch(ge) 20,26 : 0 add instruction goto (from iindex= 39 to iindex = 19) : 0 add instruction goto (from iindex= 87 to iindex = 4) : 0 add instruction return 2 : 0 add instruction return 30 : 0 add instruction 23 = phi 16,4 : 0 add instruction conditional branch(ne) 2,4 : 0 add instruction conditional branch(eq) 17,4 : 0 add instruction goto (from iindex= 79 to iindex = 66) : 0 add instruction 32 = phi 32,31 : 0 add instruction return : 0 add instruction return : 0 add instruction 31 = new <Primordial,[Ljava/security/ProtectionDomain>@18224 : 0 add instruction return : 0 add instruction return 1 : 0 add instruction return 1 : 0 add instruction goto (from iindex= 18 to iindex = 21) : 0 add instruction goto (from iindex= 4 to iindex = 6) : 0 add instruction 7 = phi 6,5 : 0 add instruction 8 = invokevirtual < Application, Ljava/lang/String, equals(Ljava/lang/Object;)Z > 5,6 @12 exception:7 : 0 add instruction conditional branch(ne) 17,18 : 0 add instruction conditional branch(ne) 1,4 : 0 add instruction 18 = binaryop(add) 20 , 16 : 0 add instruction 25 = phi 23,5 : 0 add instruction conditional branch(ge) 31,5 : 0 add instruction 25 = phi 23,4 : 0 add instruction goto (from iindex= 34 to iindex = 37) : 0 add instruction 22 = arrayload 2[26] : 0 add instruction 34 = phi 33,32,32 : 0 total time-- days: 0.0 hours: 0.0 mins: 0.0 secs: 6.161 |
From: <ran...@us...> - 2015-08-10 16:57:32
|
Revision: 4603 http://sourceforge.net/p/wala/code/4603 Author: ranettinger Date: 2015-08-10 16:57:28 +0000 (Mon, 10 Aug 2015) Log Message: ----------- Chen Cozocaru's implementation of slideDG-based refactoring Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/Buckets.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/BucketsAlgoAction.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/DependenceMap.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/ExperimentWriter.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SearchBFSAlgo.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SingleBucketsAlgoAction.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/RaghavanTest.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestSearchBFSAlgo.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestSlidingRaghavan.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/AntiDependenceAnalysis.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/DependenceMap.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/DependencesUtil.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSliding.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSlidingAlgo.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/StatementsDefsAndUses.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/Utils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/FileUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ssa/SSADependencesUtil.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAction.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/MarkedVariables.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGLiveAnalysis.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PhiVariable.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/wala/MyWALAWrapper.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/sliding/ShowSlice.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/sliding/ShowSliceFromReturn.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/sliding/methodSliders/GeneralSliding.java Added Paths: ----------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/PartitionDependenceMap.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SlidesDirection.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/AbstractTestExample.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151DemoExam.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151Exam1.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151Exam2.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample105Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample10Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample11Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample12Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample13Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample14Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample15Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample16Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample17Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample18Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample19Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample20Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample21Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample23Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample25Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample28Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample29Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample29LeftAA.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample30Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample31Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample32Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample32LeftAA.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample33Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample36eft.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample37eft.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample38Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample38LeftA.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample38LeftArticleExampleC2.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample39Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample40Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample41Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample42Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample43Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample44Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample45Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample46Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample47Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample48Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample49Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample50Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample51Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample52Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample53Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample54Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample55Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample56Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample57Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample58Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample59Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample60Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample62Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample63Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample65Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample69Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample70Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample74Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample83Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample85Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample86Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample8Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample90Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample93Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample97Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample99ALeft.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample99BLeft.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample9Left.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExpmle1.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/DependenceAnalysis.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/EmptyAnalyzerLogger.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/ISliceNodesAndLines.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/AddedReuseVariablesData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/GlobalDefsInSliceAndCosliceData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/LiveAnalysisResult.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/LiveVariablesData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGBackwardLiveAnalysis.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/wala/MySlidingInformation.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/Buckets.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/Buckets.java 2015-08-10 13:09:52 UTC (rev 4602) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/Buckets.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -3,8 +3,8 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; +import java.util.TreeMap; +import java.util.TreeSet; import java.util.Iterator; import java.util.LinkedList; import java.util.List; @@ -78,7 +78,7 @@ private String compUnitName; //private int selectionLine = -1; private Collection<Statement> statements = null; - //private HashSet<Integer> lines = null; + //private TreeSet<Integer> lines = null; //private LinkedList<JdtPosition> positions = null; Map<Integer,ASTNode> nodeIndexMap = null; //private String msg = new String(); @@ -96,7 +96,7 @@ private int hammockEndLine; private int startLine; private int firstLineOffset; - private Set <Integer>markableLine = new HashSet<Integer>(); + private Set <Integer>markableLine = new TreeSet<Integer>(); private CompilationUnit cu; //private JDTJavaSourceAnalysisEngine engine; @@ -143,7 +143,7 @@ project = WALAUtils.getNamedProject(projectName); - nodeIndexMap = new HashMap<Integer,ASTNode>(); + nodeIndexMap = new TreeMap<Integer,ASTNode>(); this.numberOfLines = setNodemap(0,new ArrayList<ASTNode>(methodBody.statements())); //TODO: Currently the hammock is all the method. In the next version it should be just the relevant lines. hammockStartLine = 0; @@ -224,7 +224,7 @@ calculateControlDependence(javaMethod, pdg); // calculateSlides(javaMethod, pdg); - checkPredicateSideEffects(); + // checkPredicateSideEffects(); return true; @@ -246,7 +246,7 @@ private Map<Integer,Integer> mapLineToNormalInstractions(ConcreteJavaMethod javaMethod, PDG pdg ){ - Map<Integer,Integer> linesToInstractions = new HashMap<Integer, Integer>(); + Map<Integer,Integer> linesToInstractions = new TreeMap<Integer, Integer>(); for(int j=0;j<pdg.getNumberOfNodes();j++){ Statement statement=pdg.getNode(j); if (statement!=null){ @@ -300,9 +300,9 @@ int predStatementLine = javaMethod.getLineNumber(normalPredStatement.getInstructionIndex()); if(predStatementLine!=-1 && predStatementLine!= statementLine){ //add the control flow dependences - HashSet<Integer> value = controlDependentLines.get(statementLine); + TreeSet<Integer> value = controlDependentLines.get(statementLine); if (value==null){ - value = new HashSet<Integer>(); + value = new TreeSet<Integer>(); } slidesDG.addControl(statementLine, predStatementLine); @@ -421,9 +421,9 @@ // javaMethod.getSourcePosition(predNormalStatement.getInstructionIndex()). if(predStatementLine!=-1 && predStatementLine!= statementLine){ //add the data flow dependences - HashSet<Integer> value = dataDependentLines.get(predStatementLine); + TreeSet<Integer> value = dataDependentLines.get(predStatementLine); if (value==null){ - value = new HashSet<Integer>(); + value = new TreeSet<Integer>(); } value.add(statementLine); dataDependentLines.put(predStatementLine,value); @@ -478,8 +478,8 @@ private Set<NormalStatement> getNormalStatementPred(Statement statement, NumberedGraph<Statement> pdg, InstructionStatmentMap instructionMap) { Queue <Statement> worklist = new LinkedList<Statement>(); - Set<Statement> visitedPhiStatements = new HashSet<Statement>(); - Set<NormalStatement> result = new HashSet<NormalStatement>(); + Set<Statement> visitedPhiStatements = new TreeSet<Statement>(); + Set<NormalStatement> result = new TreeSet<NormalStatement>(); worklist = addAllpredNodesToQueue(statement, pdg, worklist); //worklist.add(statement); @@ -557,7 +557,7 @@ * @return collection of statements corresponding to the lines */ private Collection<Statement> getStatements(CGNode n,Collection<Integer> lines) { - Collection<Statement> retVal = new HashSet<Statement>(); + Collection<Statement> retVal = new TreeSet<Statement>(); AstIR ir = (AstIR) n.getIR(); ConcreteJavaMethod m = ((ConcreteJavaMethod) n.getMethod()); SSAInstruction[] insts = ir.getInstructions(); @@ -634,8 +634,8 @@ * this function uses WALA to calculate all variable names defined in this slice * @return variable names defined in this slice */ - public HashSet<String> getDefs() { - HashSet<String> retVal = new HashSet<String>(); + public TreeSet<String> getDefs() { + TreeSet<String> retVal = new TreeSet<String>(); for(Statement s:statements){ if (s.getKind() == Statement.Kind.NORMAL) { int instructionIndex = ((NormalStatement) s).getInstructionIndex(); @@ -724,10 +724,10 @@ retLine= setNodemap(line, tempList); lNodes.remove(0); return setNodemap(retLine,lNodes); - case ASTNode.SWITCH_CASE : - throw new UnhandeledStatementException(); - case ASTNode.SWITCH_STATEMENT: - throw new UnhandeledStatementException(); +// case ASTNode.SWITCH_CASE : +// throw new UnhandeledStatementException(); +// case ASTNode.SWITCH_STATEMENT: +// throw new UnhandeledStatementException(); default: nodeIndexMap.put(line, firstNode); markableLine.add(line); @@ -755,9 +755,9 @@ invertedExtendedControlDependentLines = extendedControlDependentLines.invert(); } - private HashSet<Integer> getAllAncestors(Integer nodeNum) { - HashSet<Integer> ctrlVisited = new HashSet<Integer>(); - // HashSet<Integer> ancestors = new HashSet<Integer>(); + private TreeSet<Integer> getAllAncestors(Integer nodeNum) { + TreeSet<Integer> ctrlVisited = new TreeSet<Integer>(); + // TreeSet<Integer> ancestors = new TreeSet<Integer>(); Queue<Integer> worklist = new LinkedList<Integer>(); worklist.add(nodeNum); while(!worklist.isEmpty()){ @@ -779,6 +779,14 @@ return ctrlVisited; } + public DependenceMap getExtendedOrderingConstraints() { + return extendedOrderingConstraints; + } + + public DependenceMap getInvertedExtendedOrderingConstraints() { + return invertedExtendedOrderingConstraints; + } + DependenceMap extendedOrderingConstraints; DependenceMap invertedExtendedOrderingConstraints; public void generateExtendedOrderingConstraints(){ @@ -809,10 +817,10 @@ extendedOrderingConstraints.dependenceAdd(m, n); invertedExtendedOrderingConstraints.dependenceAdd(n, m); - HashSet<Integer> descs = invertedExtendedControlDependentLines.get(m); + TreeSet<Integer> descs = invertedExtendedControlDependentLines.get(m); if (descs!=null){ - descs = new HashSet<Integer>(descs); + descs = new TreeSet<Integer>(descs); for (Integer cd:descs){ // cd=>m && m<=n |- cd<=n if (!hasExtendedOrderingConstraint(cd,n)) @@ -822,7 +830,7 @@ descs = invertedExtendedControlDependentLines.get(n); if (descs!=null){ - descs = new HashSet<Integer>(descs); + descs = new TreeSet<Integer>(descs); for (Integer cd:descs){ // cd=>n && m<=n |- m<=cd if (!hasExtendedOrderingConstraint(m,cd)) @@ -830,18 +838,18 @@ } } - HashSet<Integer> preds = invertedExtendedOrderingConstraints.get(m); + TreeSet<Integer> preds = invertedExtendedOrderingConstraints.get(m); if (preds!=null){ - preds = new HashSet<Integer>(preds); + preds = new TreeSet<Integer>(preds); for (Integer pred:preds){ // pred<=m && m<=n |- pred<=n if (!hasExtendedOrderingConstraint(pred,n)) generateExtendedOrderingConstraints(pred, n); } } - HashSet<Integer> succs = extendedOrderingConstraints.get(n); + TreeSet<Integer> succs = extendedOrderingConstraints.get(n); if (succs!=null){ - succs = new HashSet<Integer>(succs); + succs = new TreeSet<Integer>(succs); for (Integer succ:succs){ // m<=n && n<=succ |- m<=succ if (!hasExtendedOrderingConstraint(m,succ)) @@ -852,7 +860,7 @@ } private boolean hasExtendedOrderingConstraint(Integer m, Integer n){ - HashSet<Integer> values = extendedOrderingConstraints.get(m); + TreeSet<Integer> values = extendedOrderingConstraints.get(m); return values!=null && values.contains(n); } @@ -871,10 +879,10 @@ // // while(hasChanged==true){ // hasChanged=false; - // HashSet<Integer> cloneDataDependcies = new HashSet<Integer>(nodeBuketingDataDependentLines.keySet()); + // TreeSet<Integer> cloneDataDependcies = new TreeSet<Integer>(nodeBuketingDataDependentLines.keySet()); // for(Integer a:cloneDataDependcies){ // for (Integer b:nodeBuketingDataDependentLines.keySet()){ - // HashSet<Integer> c = (HashSet<Integer>)nodeBuketingDataDependentLines.get(b)/*.clone()*/; + // TreeSet<Integer> c = (TreeSet<Integer>)nodeBuketingDataDependentLines.get(b)/*.clone()*/; // //genarate the first extended constraint: a <= b, b <= c | a <= c. // if(nodeBuketingDataDependentLines.get(a).contains(b)){ // // String msg= a+"<="+b+", "+b+"<="+c+" | "+a+"<="+c; @@ -885,7 +893,7 @@ // } // //todo: check if there are duplicated key,value sets. // for(Integer c:controlDependentLines.keySet()){ - // HashSet<Integer> b = nodeBuketingDataDependentLines.get(a); + // TreeSet<Integer> b = nodeBuketingDataDependentLines.get(a); // //generate the second extended constraints: a <= b, c => a | c <= b // if (controlDependentLines.get(c).contains(a)){ // String msg= a+"<="+b+", "+c+"->"+a+" | "+c+"<="+b; @@ -894,11 +902,11 @@ // //if (hasChanged) // // System.out.println(msg); // } - // HashSet<Integer> cloneB = (HashSet<Integer>)b.clone(); + // TreeSet<Integer> cloneB = (TreeSet<Integer>)b.clone(); // //generate the second extended constraints: a <= b, c => b | a <= c // for(Integer b1:cloneB){ // if (controlDependentLines.get(c).contains(b1)){ - // HashSet<Integer> tmp = new HashSet<Integer>(); + // TreeSet<Integer> tmp = new TreeSet<Integer>(); // tmp.add(new Integer(c)); // String msg= a+"<="+b+", "+c+"->"+b+" | "+a+"<="+c; // // hasChanged=dependencyAdd(nodeSlidingdataDependentLines,a,tmp); @@ -923,7 +931,7 @@ hasChanged=false; for(int i:hammockLinesNums){ - Set<Integer> cloneMarkedLines = new HashSet<Integer>(markedLines); + Set<Integer> cloneMarkedLines = new TreeSet<Integer>(markedLines); if(!markedLines.contains(i)){ for (Integer a:cloneMarkedLines){ //check if a<=i @@ -931,7 +939,7 @@ if(nodeBuketingDataDependentLines.get(a).contains(Integer.valueOf(i))){ Set<Integer> keySet =nodeBuketingDataDependentLines.keySet(); if(keySet.contains(Integer.valueOf(i))){ - HashSet<Integer> c = nodeBuketingDataDependentLines.get(Integer.valueOf(i)); + TreeSet<Integer> c = nodeBuketingDataDependentLines.get(Integer.valueOf(i)); for(Integer d:c){ if(markedLines.contains(d)&&(!markedLines.contains(Integer.valueOf(i)))){ //promote i @@ -951,7 +959,7 @@ } } else{ //i is marked. - HashSet<Integer> values = controlDependentLines.get(i); + TreeSet<Integer> values = controlDependentLines.get(i); //promote every v such that i->v. if (values!= null){ for (Integer v:values){ @@ -992,7 +1000,7 @@ for (Integer a:nodeBuketingDataDependentLines.keySet()){ - HashSet<Integer> b = nodeBuketingDataDependentLines.get(a); + TreeSet<Integer> b = nodeBuketingDataDependentLines.get(a); //check if i is in the before bucket if(b!=null){ @@ -1102,7 +1110,7 @@ public List<Integer> getPrintableBucket(List<Integer> bucket){ IControlGraph controlGraph = new ControlGraphImpl(this.controlDependentLines); - Set<Integer> bucketWithControl = new HashSet<Integer>(); + Set<Integer> bucketWithControl = new TreeSet<Integer>(); bucketWithControl.addAll(bucket); for(Integer node:bucket){ bucketWithControl.addAll(controlGraph.getAllPred(node)); @@ -1128,7 +1136,7 @@ } - public Map<Integer, HashSet<Integer>> getNodeBucktingDataDependentLines() { + public Map<Integer, TreeSet<Integer>> getNodeBucktingDataDependentLines() { return nodeBuketingDataDependentLines; } @@ -1137,7 +1145,7 @@ this.nodeBuketingDataDependentLines = dataDependentLines; } - public Map<Integer, HashSet<Integer>> getControlDependentLines() { + public Map<Integer, TreeSet<Integer>> getControlDependentLines() { return controlDependentLines; } @@ -1193,28 +1201,29 @@ public SearchBFSAlgo getSearchBFSAlgo(){ IControlGraph controlGraph = new ControlGraphImpl(this.controlDependentLines); - return new SearchBFSAlgo(controlGraph, dataDependentLines, nodeIndexMap, new HashSet<Integer>(hammockLinesNums)); + return new SearchBFSAlgo(controlGraph, nodeBuketingDataDependentLines/*dataDependentLines*/, nodeIndexMap, new TreeSet<Integer>(hammockLinesNums)); } public int getDataDependencesNum(){ return dataDependentLines.getNumOfDependences(); } public int getNodeBasedDataDependencesNum(){ - return nodeBuketingDataDependentLines.getNumOfDependences(); + return extendedOrderingConstraints.getNumOfDependences(); } public int getControlDependencesNum(){ return controlDependentLines.getNumOfDependences(); } public List<Integer> randomlySelectLines(){ - int NUM_OF_LINES = (markableLine.size()*40)/100 ; - Set<Integer>tmpLines = new HashSet<Integer>(markableLine); + int NUM_OF_LINES = (markableLine.size()*80)/100 ; + Set<Integer>tmpLines = new TreeSet<Integer>(markableLine); markedLines = new ArrayList<Integer>(); Random rand = new Random(); for(int i=0;i< NUM_OF_LINES;i++){ boolean lineSelected=false; while (!lineSelected){ - int randLine = rand.nextInt(numberOfLines); + Integer randLine = (Integer) markableLine.toArray()[rand.nextInt(markableLine.size())]; + if (tmpLines.contains(randLine)){ markedLines.add(randLine+firstLineOffset); tmpLines.remove(randLine); @@ -1262,5 +1271,18 @@ public int getNumOfPDGNodes(){ return this.numOfPDGNodes; } + + public void clearData(){ + this.beforeBucket= new ArrayList<Integer>(); + this.afterBucket = new ArrayList<Integer>(); + this.arbitraryBucket = new ArrayList<Integer>(); + this.extendedControlDependentLines = new DependenceMap(); + this.invertedExtendedControlDependentLines = new DependenceMap(); + this.invertedNodeBuketingDataDependentLines = new DependenceMap(); + this.nodeBuketingDataDependentLines = dataDependentLines.deepClone(); + + // this.nodeBuketingDataDependentLines = new DependenceMap(); + } + } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/BucketsAlgoAction.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/BucketsAlgoAction.java 2015-08-10 13:09:52 UTC (rev 4602) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/BucketsAlgoAction.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -164,19 +164,24 @@ System.out.println("the pacckage is: "+ cu.getJavaElement().getPath()); System.out.println("the metod name is:" + methodName); - // for(int i=0;i<10;i++){ + //for(int i=0;i<10;i++){ try{ long startTime = System.nanoTime(); Buckets r = new Buckets(1,null,fileName,projName,methodName,methodBody,cg,pa,cu); long endTime =System.nanoTime(); - this.walaComputationTime = (int) (endTime-startTime); + this.walaComputationTime = (int) (endTime-startTime); if (r.getNumberOfLines()<MIN_LEN_OF_METHOD){ continue; } + for (int i=0;i<100;i++){ markedLines = r.randomlySelectLines(); + doRefactoring(r); + r.clearData(); + + } }catch (UnhandeledStatementException e){ continue; @@ -188,8 +193,8 @@ catch (Throwable e){ e.printStackTrace(); continue; - } - // } + // } + } } }catch (UnhandeledStatementException e){ @@ -237,6 +242,8 @@ private void doRefactoring(Buckets b) { // ExperimentWriter exp = new ExperimentWriter(); + + b.setMarkedLines( new ArrayList<Integer>(markedLines)); long raghavanStart=System.nanoTime(); b.generateOrderingConstraints(); long generateEnd=System.nanoTime(); Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/DependenceMap.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/DependenceMap.java 2015-08-10 13:09:52 UTC (rev 4602) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/DependenceMap.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -1,11 +1,11 @@ package com.ibm.wala.refactoring.buckets; import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; -public class DependenceMap extends HashMap<Integer,HashSet<Integer>> { +public class DependenceMap extends TreeMap<Integer,TreeSet<Integer>> { /** * @@ -19,9 +19,9 @@ public boolean dependenceAdd( Integer key, Collection<Integer>values) { if (values==null) return false; - HashSet<Integer> c = this.get(key); + Set<Integer> c = this.get(key); if (c==null){ - HashSet<Integer> hs = new HashSet<Integer>(values); + TreeSet<Integer> hs = new TreeSet<Integer>(values); this.put(key, hs); return true; @@ -53,9 +53,9 @@ public boolean dependenceAdd( Integer key, Integer value){ - HashSet<Integer> values = this.get(key); + TreeSet<Integer> values = this.get(key); if (values == null){ - values = new HashSet<Integer>(); + values = new TreeSet<Integer>(); values.add(value); this.put(key, values); return true; @@ -83,6 +83,26 @@ } + public String toString(){ + StringBuffer result = new StringBuffer("["); + String sep = ""; + for (Integer line: this.keySet() ){ + result.append(sep + line +":{"); + sep = ","; + if (this.get(line)!=null) + { + String sep2 = ""; + for (int i:this.get(line) ){ + result.append(sep2 + i); + sep2 = ","; + } + } + result.append("}"); + } + result.append("]"); + return result.toString(); + } + public DependenceMap invert(){ DependenceMap dependencesMap = new DependenceMap(); for(Integer from:this.keySet()){ @@ -106,8 +126,8 @@ public DependenceMap deepClone(){ DependenceMap map = new DependenceMap(); for(Integer key : keySet()){ - HashSet<Integer> vals = this.get(key); - map.put(key, (HashSet<Integer>) vals.clone()); + TreeSet<Integer> vals = this.get(key); + map.put(key, (TreeSet<Integer>) vals.clone()); } return map; } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/ExperimentWriter.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/ExperimentWriter.java 2015-08-10 13:09:52 UTC (rev 4602) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/ExperimentWriter.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -22,7 +22,7 @@ String now = now(); - private static final int SIZE_OF_CHUNK = 500; + private static final int SIZE_OF_CHUNK = 5000; private int chunks = 1 ; private int numOfRows = 0; Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/PartitionDependenceMap.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/PartitionDependenceMap.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/PartitionDependenceMap.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -0,0 +1,36 @@ +package com.ibm.wala.refactoring.buckets; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Set; + +public class PartitionDependenceMap extends HashMap<Integer,LinkedList<Integer>>{ + + public PartitionDependenceMap(DependenceMap dependenceMap) { + populate(dependenceMap); + } + + private void populate(DependenceMap dependenceMap) { + for(Integer key: dependenceMap.keySet()){ + Set<Integer> valueSet = dependenceMap.get(key); + if (valueSet!=null){ + LinkedList<Integer> dependenceList = new LinkedList<Integer>(); + for(Integer value:valueSet){ + dependenceList.add(value); + } + this.put(key, dependenceList); + } + } + } + + public Integer poll(Integer key){ + LinkedList<Integer> valueList = this.get(key); + if (valueList==null || valueList.isEmpty()){ + return null; + } + return valueList.poll(); + } + + + +} Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SearchBFSAlgo.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SearchBFSAlgo.java 2015-08-10 13:09:52 UTC (rev 4602) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SearchBFSAlgo.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -21,6 +21,7 @@ private Map<Integer,ASTNode> nodeIndexMap; private Set<Integer> afterNodes; private Set<Integer> beforeNodes; + private Set<Integer> arbitraryNodes; Set<Integer> visitedUp; Set<Integer> visitedDown; @@ -49,24 +50,32 @@ // Set<Integer> succMarked = this.search(markedLines, controlGraph, dataDependences); // Set<Integer> predMarked = this.search(markedLines, controlGraph/*.invert()*/, dataDependences.invert()); - Set<Integer> succMarked = this.slidesFirstSearch(markedLines, dataDependences); - Set<Integer> predMarked = this.slidesFirstSearch(markedLines, invDataDependences); + Set<Integer> reachable = this.slidesFirstSearch(markedLines, dataDependences); + Set<Integer> reaching = this.slidesFirstSearch(markedLines, invDataDependences); //promote the proper bucket - markedNodes=new HashSet<Integer>(succMarked); - markedNodes.retainAll(predMarked); + markedNodes=new HashSet<Integer>(reachable); + markedNodes.retainAll(reaching); //calculate the before bucket - beforeNodes = new HashSet<Integer>(predMarked); - beforeNodes.removeAll(succMarked); + beforeNodes = new HashSet<Integer>(reaching); + beforeNodes.removeAll(reachable); + + afterNodes = new HashSet<Integer>(reachable); + afterNodes.removeAll(markedNodes); //calculate the after slides - afterNodes= this.getLines(); - afterNodes.removeAll(controlGraph.getControlLines()); - afterNodes.removeAll(markedNodes); - afterNodes.removeAll(beforeNodes); + arbitraryNodes= new HashSet<Integer>(getLines()); + arbitraryNodes.removeAll(controlGraph.getControlLines()); + arbitraryNodes.removeAll(markedNodes); + arbitraryNodes.removeAll(beforeNodes); + arbitraryNodes.removeAll(afterNodes); + //move all arbitrary the the after + afterNodes.addAll(arbitraryNodes); + + //TODO: compare arbitrary buckets } @@ -347,8 +356,10 @@ return; //do nothing - - } + + public Set<Integer> getArbitraryNodes(){ + return arbitraryNodes; + } } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SingleBucketsAlgoAction.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SingleBucketsAlgoAction.java 2015-08-10 13:09:52 UTC (rev 4602) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SingleBucketsAlgoAction.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -84,7 +84,7 @@ */ public void run(IAction action) { - + markedLines =getMarkedLines(); List <Integer> clonedMarkedLines = new LinkedList<Integer>(); clonedMarkedLines.addAll(markedLines); @@ -227,36 +227,43 @@ // slidingRaghavan.seperateSlidesIntoBuckets(new HashSet<Integer>(markedLines)); // slidingRaghavan.printProgram(r.getFirstLineOffset()); // duplicateFunctionCode(); - + SearchBFSAlgo searchBFSAlgo = b.getSearchBFSAlgo(); long newStart=System.nanoTime(); searchBFSAlgo.seperateNodesIntoBuckets(new HashSet<Integer>(markedLines)); long newEnd=System.nanoTime(); - searchBFSAlgo.printProgram(b.getFirstLineOffset()); + searchBFSAlgo.printProgram(b.getFirstLineOffset()); Boolean identical = true; if (b.getPrintableBucket((b.getBeforeBucket())).equals(searchBFSAlgo.getPrintableBucket(searchBFSAlgo.getBeforeNodes()))) - System.out.println("Identical before backets"); - + System.out.println("Identical before backets"); + else{ - System.out.println("Eror!!! non Identical before backets"); + System.out.println("Eror!!! non Identical before backets"); identical=false; } if (b.getPrintableBucket((b.getMarkedLines())).equals(searchBFSAlgo.getPrintableBucket(searchBFSAlgo.getMarkedNodes()))) - System.out.println("Identical marked backets"); - + System.out.println("Identical marked backets"); + else{ - System.out.println("Eror!!! non Identical marked backets"); + System.out.println("Eror!!! non Identical marked backets"); identical=false; } if (b.getPrintableBucket((b.getAfterBucket())).equals(searchBFSAlgo.getPrintableBucket(searchBFSAlgo.getAfterNodes()))) - System.out.println("Identical after backets"); - + System.out.println("Identical after backets"); + else{ - System.out.println("Eror!!! non Identical after backets"); + System.out.println("Eror!!! non Identical after backets"); identical=false; } - System.out.println("Raghavan's Runtime:"+(raghavanEnd-raghavanStart)); - System.out.println("New algorithm's Runtime:" + (newEnd-newStart)); + if (b.getPrintableBucket((b.getArbitraryBucket())).equals(searchBFSAlgo.getPrintableBucket(searchBFSAlgo.getArbitraryNodes()))) + System.out.println("Identical arbitrary backets"); + + else{ + System.out.println("Eror!!! non Identical arbitrary backets"); + identical=false; + } + System.out.println("Raghavan's Runtime:"+(raghavanEnd-raghavanStart)); + System.out.println("New algorithm's Runtime:" + (newEnd-newStart)); int promoted = b.getMarkedLines().size()-this.markedLines.size(); exp.addGeneralData(fileName+"."+methodName,b.getNumberOfLines(), markedLines, identical,walaComputationTime, b.getDataDependencesNum(), b.getControlDependencesNum(), promoted,b.getBeforeBucket(),b.getMarkedLines(),b.getAfterBucket(),b.getArbitraryBucket()); @@ -266,7 +273,7 @@ exp.addSizeData(b.getNumOfLocalVars(), b.getNumOfHeapInput(), b.getNumOfHeapOutput(), b.getNumOfInstructions(),b.getNumOfPDGNodes()); exp.writeExperiment(); - exp.endExperiment(); + exp.endExperiment(); } Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SlidesDirection.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SlidesDirection.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/SlidesDirection.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -0,0 +1,8 @@ +package com.ibm.wala.refactoring.buckets; + +public enum SlidesDirection { + + BACKWORD, + FORWARD; + +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/AbstractTestExample.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/AbstractTestExample.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/AbstractTestExample.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -0,0 +1,187 @@ +package com.ibm.wala.refactoring.buckets.tests; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +import junit.framework.TestCase; + + +import com.ibm.wala.refactoring.buckets.DependenceMap; +import com.ibm.wala.refactoring.buckets.Buckets; +import com.ibm.wala.refactoring.buckets.SearchBFSAlgo; + + +public abstract class AbstractTestExample extends TestCase { + private SearchBFSAlgo searchBFSAlgo ; + protected int n = 0; + protected List<Integer> markedLines; + protected DependenceMap controlDependentLines; + protected DependenceMap dataDependentLines; + protected List<Integer> hammockLinesNums; + protected int hammockStartLine=606; + protected int hammockEndLine=618; + protected Buckets ragavan; + protected long runningTime = 0; + //TODO: change this to setUp. + protected void init(){ + ragavan = new Buckets(); + setHammockLinesNums(); + buildMarkedNodes(); + buildDataDependences(); + // ragavan.setHammockLinesNums(hammockLinesNums); + // ragavan.setMarkedLines(markedLines); + // ragavan.setHammockStartLine(hammockStartLine); + // ragavan.setHammockEndLine(hammockEndLine); + // ragavan.setControlDependentLines(controlDependentLines); + // ragavan.setNodeBucketingDataDependentLines(dataDependentLines); + + + } + protected List<Integer> runSubgroup(int k,List<Integer>subM){ + if(k==0){ + if (runRaghavan(subM)) +// if (runSlideBased(subM)) + return subM; + else + return null; + } + for(Integer i:subM){ + List<Integer> m = new ArrayList<Integer>(subM); + m.remove(i); + List<Integer> newM= runSubgroup(k-1, m); + if (newM!=null) + return newM; + } + return null; + } + protected boolean runRaghavan(List<Integer> subM) { + System.out.println(n++); + ragavan.clearData(); + // setHammockLinesNums(); + buildDataDependences(); + ragavan.setHammockLinesNums(hammockLinesNums); + ragavan.setMarkedLines(new ArrayList<Integer>(subM)); + ragavan.setHammockStartLine(hammockStartLine); + ragavan.setHammockEndLine(hammockEndLine); + ragavan.setControlDependentLines(controlDependentLines); + ragavan.setNodeBucketingDataDependentLines(dataDependentLines); + runningTime-= System.nanoTime(); + ragavan.generateOrderingConstraints(); + ragavan.promoteUnmovableUnmarkedNodes(); + ragavan.partitionIntoBuckets(); + runningTime+= System.nanoTime(); + if (subM.size() == ragavan.getMarkedLines().size()) + return true; + return false; + } + + + protected boolean runSlideBased(List<Integer> subM) { + System.out.println(n++); + ragavan.clearData(); + // setHammockLinesNums(); + buildDataDependences(); + ragavan.setHammockLinesNums(hammockLinesNums); + // ragavan.setMarkedLines(new ArrayList<Integer>(subM)); + ragavan.setHammockStartLine(hammockStartLine); + ragavan.setHammockEndLine(hammockEndLine); + ragavan.setControlDependentLines(controlDependentLines); + ragavan.setNodeBucketingDataDependentLines(dataDependentLines); + + searchBFSAlgo = ragavan.getSearchBFSAlgo(); + runningTime-= System.nanoTime(); + searchBFSAlgo.seperateNodesIntoBuckets(new HashSet<Integer>(new ArrayList<Integer>(subM))); + runningTime+= System.nanoTime(); + +// System.out.println("before = " + searchBFSAlgo.getBeforeNodes()); +// System.out.println("Mk is "+searchBFSAlgo.getMarkedNodes()); +// System.out.println("after = " + searchBFSAlgo.getAfterNodes()); + + if (subM.size() == searchBFSAlgo.getPrintableBucket(searchBFSAlgo.getMarkedNodes()).size()){ + return true; + } + + return false; + } + protected void setHammock(List<Integer> subM){ + // int min = findMinLine(List<Integer> subM); + // int max = findMaxLine(List<Integer> subM); + + + } + protected void addNodeDependencies(DependenceMap dependencies, int nodeNum,int [] dependentLines ){ + TreeSet<Integer> tempList = new TreeSet<Integer>();; + for (int i=0;i<dependentLines.length;i++){ + tempList.add(dependentLines[i]); + } + dependencies.put(nodeNum,tempList); + + } + protected abstract void buildDataDependences(); + protected abstract void buildMarkedNodes(); + protected abstract void setHammockLinesNums(); + + public void testRaghavan(){ + + init(); + runRaghavan(markedLines); + List<Integer> promotedLines = new ArrayList<Integer>(ragavan.getMarkedLines()); + promotedLines.removeAll(markedLines); + System.out.println("|Nodes| = " + hammockLinesNums.size()); + System.out.println("Nodes = " + hammockLinesNums); + System.out.println("Data-dependence successors = " + dataDependentLines); + System.out.println("Control-dependence predecessors = " + controlDependentLines); + System.out.println("|M| = "+markedLines.size()); + System.out.println("M = "+markedLines); + System.out.println("|PDG data-dependence edges| = " + dataDependentLines.getNumOfDependences()); + System.out.println("|PDG control-dependence edges| = " + controlDependentLines.getNumOfDependences()); + System.out.println("|Extended constraints| = " + ragavan.getNodeBasedDataDependencesNum()); + System.out.println("Extended constraints = " + ragavan.getExtendedOrderingConstraints()); + System.out.println("Inverted extended constraints = " + ragavan.getInvertedExtendedOrderingConstraints()); + System.out.println("|Promoted| = " + Integer.toString(ragavan.getMarkedLines().size() - markedLines.size())); + System.out.println("Promoted = "+promotedLines); + System.out.println("Before = " + ragavan.getPrintableBucket(ragavan.getBeforeBucket())); + System.out.println("Marked = "+ragavan.getPrintableBucket(ragavan.getMarkedLines())); + System.out.println("After = " + ragavan.getPrintableBucket(ragavan.getAfterBucket())); + System.out.println("Arbitrary = "+ragavan.getArbitraryBucket()); + System.out.println("Predicates = " + controlDependentLines.invert().keySet()); + +// if (ragavan.getMarkedLines().size() - markedLines.size()!= 0) +// findK(); + + } + + + public void findK(){ + init(); + List<Integer> mK=null; + int k=0; + while (mK==null & k< markedLines.size()){ + mK = runSubgroup(k,markedLines); + k++; + + } + if (mK!=null){ + System.out.println("K = " + new Integer(markedLines.size()-k+1)); + System.out.println("|M| = "+ markedLines.size()); + System.out.println("Mk is "+mK); + System.out.println("before = " + ragavan.getBeforeBucket()); + System.out.println("after = " + ragavan.getAfterBucket()); + + +// System.out.println("before = " + searchBFSAlgo.getBeforeNodes()); +// System.out.println("after = " + searchBFSAlgo.getAfterNodes()); + + // System.out.println("running time = " + runningTime); + } + else + System.out.println("no such K"); + } +} + + + Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/RaghavanTest.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/RaghavanTest.java 2015-08-10 13:09:52 UTC (rev 4602) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/RaghavanTest.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -2,7 +2,7 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; +import java.util.TreeSet; import java.util.List; import junit.framework.TestCase; @@ -40,43 +40,43 @@ } private void buildDataDependences() { - HashSet<Integer> tempList; + TreeSet<Integer> tempList; dataDependentLines = new DependenceMap(); controlDependentLines = new DependenceMap(); //adding data dependencies for key node 1: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(6); tempList.add(11); dataDependentLines.put(1,tempList); //adding data dependencies for key node 4: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(10); dataDependentLines.put(4,tempList); //adding data dependencies for key node 5: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(10); dataDependentLines.put(5,tempList); //adding data dependencies for key node 6: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(11); dataDependentLines.put(6,tempList); //adding data dependencies for key node 7: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(11); tempList.add(12); dataDependentLines.put(7,tempList); //adding data dependencies for key node 8: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(10); dataDependentLines.put(8,tempList); //adding data dependencies for key node 10: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(4); tempList.add(5); tempList.add(7); @@ -84,72 +84,72 @@ dataDependentLines.put(10,tempList); //adding data dependencies for key node 11: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(13); dataDependentLines.put(11,tempList); //adding control dependencies for key node 1: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(0); controlDependentLines.put(1,tempList); //adding control dependencies for key node 2: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(0); controlDependentLines.put(2,tempList); //adding control dependencies for key node 4: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(0); controlDependentLines.put(4,tempList); //adding control dependencies for key node 3: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(2); controlDependentLines.put(3,tempList); //adding control dependencies for key node 5: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(4); controlDependentLines.put(5,tempList); //adding control dependencies for key node 6: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(5); controlDependentLines.put(6,tempList); //adding control dependencies for key node 7: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(5); controlDependentLines.put(7,tempList); //adding control dependencies for key node 8: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(4); controlDependentLines.put(8,tempList); //adding control dependencies for key node 9: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(8); controlDependentLines.put(9,tempList); //adding control dependencies for key node 10: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(4); controlDependentLines.put(10,tempList); //adding control dependencies for key node 11: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(0); controlDependentLines.put(11,tempList); //adding control dependencies for key node 12: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(0); controlDependentLines.put(12,tempList); //adding control dependencies for key node 13: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(0); controlDependentLines.put(13,tempList); } @@ -168,7 +168,7 @@ public void setResultDataDependences(){ dataDependentLines=(DependenceMap)dataDependentLines.clone(); - HashSet<Integer> tempList; + TreeSet<Integer> tempList; //adding data dependencies for key node 1: Integer[]x = new Integer[]{6,11}; @@ -206,13 +206,13 @@ dataDependentLines.put(10,tempList); //adding data dependencies for key node 11: - tempList= new HashSet<Integer>(); + tempList= new TreeSet<Integer>(); tempList.add(13); dataDependentLines.put(11,tempList); } - private HashSet<Integer> arrayAsSet(Integer[] arr){ - HashSet<Integer> set = new HashSet<Integer>(); + private TreeSet<Integer> arrayAsSet(Integer[] arr){ + TreeSet<Integer> set = new TreeSet<Integer>(); for(Integer i:arr){ set.add(i); } Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151DemoExam.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151DemoExam.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151DemoExam.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -0,0 +1,61 @@ +package com.ibm.wala.refactoring.buckets.tests; + +import java.util.ArrayList; +import java.util.Arrays; + +import com.ibm.wala.refactoring.buckets.DependenceMap; + +public class TestACR151DemoExam extends AbstractTestExample { +// 0: int x = bounds.x, width = bounds.width, slop, align; +// 1: if (hspan < width) { +// 2: slop = width - 1 - hspan; +// 3: align = computeAlignment(c); +// 4: x += incrementX(slop,align); +// 5: width += incrementWidth(slop,align); +// } else { +// 6: width = hspan; +// 7: x -= vis.getValue(); +// } +// 8: bounds.x = x; +// 9: bounds.width = width; +// 10: return bounds; + @Override + protected void buildDataDependences() { + + dataDependentLines = new DependenceMap(); + controlDependentLines = new DependenceMap(); + + addNodeDependencies(dataDependentLines,1,new int[]{5,6}); + addNodeDependencies(dataDependentLines,2,new int[]{4,5}); + addNodeDependencies(dataDependentLines,3,new int[]{4,5}); + + + addNodeDependencies(controlDependentLines,1,new int[]{2,3,4,5,6,7}); + + controlDependentLines = controlDependentLines.invert(); + } + + @Override + protected void buildMarkedNodes() { + markedLines = new ArrayList<Integer>(); + +//Q18 +// markedLines.add(4); +// markedLines.add(7); + +//Q19 +// markedLines.add(5); +// markedLines.add(6); + +//Q20 + markedLines.add(3); + markedLines.add(5); + } + + @Override + protected void setHammockLinesNums() { + hammockLinesNums= Arrays.asList(1,2,3,4,5,6,7); + + } + +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151Exam1.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151Exam1.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151Exam1.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -0,0 +1,52 @@ +package com.ibm.wala.refactoring.buckets.tests; + +import java.util.ArrayList; +import java.util.Arrays; + +import com.ibm.wala.refactoring.buckets.DependenceMap; + +public class TestACR151Exam1 extends AbstractTestExample { +// 4: if (digit != '\'') { +// 5: number = (number * 8) + ScannerHelper.getNumericValue(digit); +// 6: digit = this.source[4]; +// 7: if (digit != '\'') +// 8: number = (number * 8) + ScannerHelper.getNumericValue(digit); +// 9: this.value = (char) number; +// } else { +// 10: this.value = (char) number; +// 11: this.constant = CharConstant.fromValue(this.value); +// } + @Override + protected void buildDataDependences() { + + dataDependentLines = new DependenceMap(); + controlDependentLines = new DependenceMap(); + + addNodeDependencies(dataDependentLines,4,new int[]{6}); + addNodeDependencies(dataDependentLines,5,new int[]{6,8,9}); + addNodeDependencies(dataDependentLines,6,new int[]{7,8}); + addNodeDependencies(dataDependentLines,8,new int[]{9}); + addNodeDependencies(dataDependentLines,10,new int[]{11}); + + + addNodeDependencies(controlDependentLines,4,new int[]{5,6,7,9,10,11}); + addNodeDependencies(controlDependentLines,7,new int[]{8}); + + controlDependentLines = controlDependentLines.invert(); + } + + @Override + protected void buildMarkedNodes() { + markedLines = new ArrayList<Integer>(); + +//Q?? + markedLines.add(11); + } + + @Override + protected void setHammockLinesNums() { + hammockLinesNums= Arrays.asList(4,5,6,7,8,9,10,11); + + } + +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151Exam2.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151Exam2.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestACR151Exam2.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -0,0 +1,56 @@ +package com.ibm.wala.refactoring.buckets.tests; + +import java.util.ArrayList; +import java.util.Arrays; + +import com.ibm.wala.refactoring.buckets.DependenceMap; + +public class TestACR151Exam2 extends AbstractTestExample { + //1: /*++*/ int nl = 0; + //2: int nc = 0; + //3: int nw = 0; + //4: boolean inword = false; + //18: int nc2 = nc; + //5: while (nc2 < input.length) { + //6: int c = input[nc2]; + //7: nc2++; + //8: if (c == '\n') + //9: /*++*/ nl++; + // } + @Override + protected void buildDataDependences() { + + dataDependentLines = new DependenceMap(); + controlDependentLines = new DependenceMap(); + + addNodeDependencies(dataDependentLines,1,new int[]{9}); + addNodeDependencies(dataDependentLines,2,new int[]{18}); + addNodeDependencies(dataDependentLines,18,new int[]{5,6,7}); + addNodeDependencies(dataDependentLines,5,new int[]{7}); + addNodeDependencies(dataDependentLines,6,new int[]{6,7,8}); + addNodeDependencies(dataDependentLines,7,new int[]{5,6,7}); + addNodeDependencies(dataDependentLines,8,new int[]{6}); + addNodeDependencies(dataDependentLines,9,new int[]{9}); + + addNodeDependencies(controlDependentLines,5,new int[]{6,7,8}); + addNodeDependencies(controlDependentLines,8,new int[]{9}); + + controlDependentLines = controlDependentLines.invert(); + } + + @Override + protected void buildMarkedNodes() { + markedLines = new ArrayList<Integer>(); + +//Q?? + markedLines.add(1); + markedLines.add(9); + } + + @Override + protected void setHammockLinesNums() { + hammockLinesNums= Arrays.asList(1,2,3,4,18,5,6,7,8,9); + + } + +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample105Left.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample105Left.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample105Left.java 2015-08-10 16:57:28 UTC (rev 4603) @@ -0,0 +1,35 @@ +package com.ibm.wala.refactoring.buckets.tests; + +import java.util.ArrayList; +import java.util.Arrays; + +import com.ibm.wala.refactoring.buckets.DependenceMap; + +public class TestExample105Left extends AbstractTestExample { + // line 361 is considered separately from the try + + @Override + protected void buildDataDependences() { + dataDependentLines = new DependenceMap(); + controlDependentLines = new DependenceMap(); + addNodeDependencies(dataDependentLines,358,new int[]{359}); + addNodeDependencies(controlDependentLines,358,new int[]{359}); + controlDependentLines = controlDependentLines.invert(); + + + } + + @Override + protected void buildMarkedNodes() { + markedLines = new ArrayList<Integer>(); + markedLines.add(356); + markedLines.add(361); + } + + @Override + protected void setHammockLinesNums() { + hammockLinesNums= Arrays.asList(356,357,358,359,361); + + } + +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample10Left.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample10Left.java ... [truncated message content] |
From: <ran...@us...> - 2015-08-10 13:09:54
|
Revision: 4602 http://sourceforge.net/p/wala/code/4602 Author: ranettinger Date: 2015-08-10 13:09:52 +0000 (Mon, 10 Aug 2015) Log Message: ----------- Documentation of the results of applying bucketing to the 110 Java cases in the Tiarks Type-3 Clone Benchmark (only unique cases are documented -- there are many repetitions). Added Paths: ----------- incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.docx Added: incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.docx =================================================================== (Binary files differ) Index: incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.docx =================================================================== --- incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.docx 2015-08-10 13:06:41 UTC (rev 4601) +++ incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.docx 2015-08-10 13:09:52 UTC (rev 4602) Property changes on: incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.docx ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ran...@us...> - 2015-08-10 13:06:45
|
Revision: 4601 http://sourceforge.net/p/wala/code/4601 Author: ranettinger Date: 2015-08-10 13:06:41 +0000 (Mon, 10 Aug 2015) Log Message: ----------- Documentation of the results of applying bucketing to the 110 Java cases in the Tiarks Type-3 Clone Benchmark (only unique cases are documented -- there are many repetitions). Added Paths: ----------- incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.pdf Added: incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.pdf =================================================================== --- incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.pdf (rev 0) +++ incubator/com.ibm.wala.refactoring/Bucketing examples - Tiarks Benchmark.pdf 2015-08-10 13:06:41 UTC (rev 4601) @@ -0,0 +1,7883 @@ +%PDF-1.5 +%\xB5\xB5\xB5\xB5 +1 0 obj +<</Type/Catalog/Pages 2 0 R/Lang(en-US) /StructTreeRoot 151 0 R/MarkInfo<</Marked true>>>> +endobj +2 0 obj +<</Type/Pages/Count 29/Kids[ 3 0 R 19 0 R 28 0 R 30 0 R 31 0 R 33 0 R 35 0 R 37 0 R 39 0 R 41 0 R 43 0 R 44 0 R 45 0 R 47 0 R 48 0 R 50 0 R 52 0 R 54 0 R 56 0 R 58 0 R 60 0 R 62 0 R 64 0 R 66 0 R 68 0 R 70 0 R 71 0 R 73 0 R 75 0 R] >> +endobj +3 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F4 14 0 R/F5 16 0 R/F6 20 0 R/F7 25 0 R/F8 76 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 18 0 R 27 0 R 29 0 R 32 0 R 34 0 R 36 0 R 38 0 R 40 0 R 42 0 R 46 0 R 49 0 R 51 0 R 53 0 R 55 0 R 57 0 R 59 0 R 61 0 R 63 0 R 65 0 R 67 0 R 69 0 R 72 0 R 74 0 R] /MediaBox[ 0 0 595.32 841.92] /Contents 4 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 0>> +endobj +4 0 obj +<</Filter/FlateDecode/Length 2792>> +stream +x\x9C\xB5\x9B]o۸\x86\xEF\xE4?\xE8R\xBE-~\x89Ph\xD2\xF6l +\xDAs\xEAm\xF7Bu\xDDԭ\xE3\xE4\xD8J\xD1\xFD\xF7ˡ,\x85\xE3%)\xD2آh\xA2\xC8g(=\xCE;\xA4\xE7\xCFv\xDD\xFAs\xBB\xEC\x8A'O\xE6Ϻ\xAE]~Y}*\xDE\xCF/\xEF\xBA\xEE\xEE\xF6\xCF\xF9\xE2\xAF\xFB\xD5\xFCm{\xB3\xDD\xFAn;\xF7\xF0\xB1\x83S/\xEF\xEE\xBA\xD5\xEE\xE9\xD3\xE2\xF2\xF9U1_\xB47\xEF\xF6\xF7\xAB\xBE\xE7\xAF\xF9\x9Bݧ\xD5n\xBD\xBD)\x9E>\x85\x96\x97\x8B\xF3\xB3\xF9KZPJ*Q,>\x9F\x9FѢ2\xFFh\xC1%\x94T\x93\x9A\x99On\xCFϪ\xE2~\xFC\xE7\xFC\xEC\xFD\x93\xAA\xA2\xE2\xE9\x9F\xC5\xE2\xD7\xF3\xB3\xA6\x8B\xE2\xC5\xF5\xD0\xF3\xF5U"Q_\xEF\xCBb\xF6x\xF9\xFF\xCF\xCF\xFE{~\xD7W\x88F\x93F\x924U\xF8k\xB5\x98\xBF\x851^_\xBDz^T\x87\xF1\xF7\x9E\x83\xE2\xD8\xC1H]\xA8\xBA!\x9C\xF5c"\x8C\xB2\xA2"\q\xF3S\xD6M\xB1\xBB\xF1\x9D\xFD\x8C\xBA\xBC|X~[u\xEBY]nof\xA2,V?\xDA\xDB\xFB\xCDL\x97\xAB}1\xBB\xE0\xE5\xE7ݬ)\xEF\xE0\xE8\xB6\xE8f\xB2\xFC\xB2*L\xDB\xC5δ\xE6\xEFݷ=\x9C\xB8\m\x97_ngʜ\xBB`\xE6daz\xB0W}\x86#\xF3\x84M\x9B\x953Ztc*A\xB8t\x87\xF0\xBE\xBC\xB6mH\xC5q[^\mi,Ъ\xDCώ\xA2{;\xE9\xFCukH1øx\xF5z\x86\xEE\xAD\xF0\xDDۚ\x93\xAA\xC6\xE6\x8AX\xFF,\xF1q\xB1\x9A\xF0\x81\x82\x85\xB9g\xA2\xFC\xB81w\xB6nڕ\xBD\xB2\xDCv\xF0\x99W\x8FNz\\xA1R+I\xAA&\xEC\xA1\xCFD=\xF9x9\xAF\x89:\xEA\x95ŠTy^s\xC3\x8F\xDCW\xDB\xFF!Xb\xDFu\x9A\xB5nH3\xF4<+\x8A=\xA8\xADF\x9F\x96S\xB0l\xC1eL\xAA\xB0{^Ɋ\xEBh$1O\x93\q\xBF\xFD&j.\xA9Q^\xD9Qb\xF0\xD6|`\xDB{\x83ك\xF9\xBF\xAF\xCD\xC9>[\x80A\x8625\xE4\xBA\xE9)\xAE\xA6ȷ\x9Cp\xDC\xCE\xF1\xC0b)\xAE\x91\\xA8\xAD~T\xFD8 +\xFF\xBE2\xA9Qf\xBC̝\x82\xA9\x86\xA9$\xE8\xBB\xCFOd\xA8\xDB&Z\xAE:M\x90\xC5\xFD\xF6r\xCA\x994\xAA\x80{9\xE5G\x9C.V\xE6\x93\x9C}\xB97:xBˏ(5G\xEE\xD3+\xC2b긖\x83ie1u\xC7\xCE\xCC\xE4}Ԗ\x95\x81\xB4 +\xCFUa\xD2\xE6A\xF7\xBC6\x92U\x98\xD3ma\x84\x8C`ʪZE\xA1\xCCd\x8A4۲f\xC9LTeR\xD8!yȬ\xB5T\x80n, \xECk\xA9u֭\xA5\xC2S\x93\xFB\xF8\xE4\xEB1]H\x9D\xE1L\xBC\xAE\xC3\xBC23X\x89G\x9E\xE1%Hx\xD4v\xF4Z\x8F^OC\x9B\xAD\xBC*\xFB\x9E\x84|\xF4\xDAHV^N\xB7\xDAhi\x8Bg\x8B\xB0Z\xD7V\xB4"Q\x89IXY\xF0B\xAB\xB4\xAC!N\x87\xD6q8Zw\xB4SкmG\xAF\xF5\x98MB+2\xE7\xCEڐ\x8F^\xC9\xC9\xE9A-}\x89l\xB9\xD4C\xEB\xDAʁ6Q3\xC9J\x92\xC6m\xF3oeksT +Z<k}\xC0u.{}C5aXk\xBB0\x8B\xDA\xEA!\xE4Os\x9A\xAB\x9D\x94+\xEA\xF9h\\xE1z\xB73\xADۖ\xC5_\x992\xB7\xEBl\xDD\xC4a\x87n\xD0;\xAF\x8Dd\xDD\xE4t\x8B\xC0\x8C.K\xE9\xD3t\xB2\x95f\xA2n\xE2\x95\xDD'\xEF\xB39ӮE\xD9h\xF9u\xB5\x9C\xE9\xB2K(;\x8DٛΩ8q\xF8\x8A\x8E\xEBXF\xC5Ik\xA2\xF0ő\x8A%7\x91\xB4o\xAC\xE8\\xE1dN\xC1\x8B\xF2\xCEk#Y89\xDD",\xA3\xC5}}\x9ApB\xB6r\xB0LNLSH\xD00\x96\xB4O9\xA4X\x8E\xAA\xE76\xF4\x88+Eý\xC1οu_8\xDD\xED\xE7p5S\xD7\xDFlʺ\x872@\xD9e\x95\xFBUf\xD7 ]r\xCA+\xBA\xE7\xFD\x8EW\xB2\x80r\xBAE4G\xCB\xF9\xCDi +\xD9ʠ\xB9IP\x90\x95\xC9㥪\x91fQnq*i\xE74&ԬU'\xBBs\xDAu1{\xE74\xDF\xC4\xCEiԖ?~\xC56\x85\xD0&WG\xF5;\xA7\x83\xEEym$\xEB(\xA7[Dh\xB4\xB6ߜ\xA6\xA3\x90\xAD8\xA1\x8E\xADD\xB7\xA9\x8A\xF2\x9C\xEAQ\x87\xBE\x88~\xF8 +\xF4\xC4\xFC\xABkR\xB3p[k\xFDo\xDCߠ +endstream +endobj +5 0 obj +<</Type/Font/Subtype/Type0/BaseFont/Arial/Encoding/Identity-H/DescendantFonts 6 0 R/ToUnicode 1173 0 R>> +endobj +6 0 obj +[ 7 0 R] +endobj +7 0 obj +<</BaseFont/Arial/Subtype/CIDFontType2/Type/Font/CIDToGIDMap/Identity/DW 1000/CIDSystemInfo 8 0 R/FontDescriptor 9 0 R/W 1175 0 R>> +endobj +8 0 obj +<</Ordering(Identity) /Registry(Adobe) /Supplement 0>> +endobj +9 0 obj +<</Type/FontDescriptor/FontName/Arial/Flags 32/ItalicAngle 0/Ascent 905/Descent -210/CapHeight 728/AvgWidth 441/MaxWidth 2665/FontWeight 400/XHeight 250/Leading 33/StemV 44/FontBBox[ -665 -210 2000 728] /FontFile2 1174 0 R>> +endobj +10 0 obj +<</Type/Font/Subtype/TrueType/Name/F2/BaseFont/ABCDEE+Calibri/Encoding/WinAnsiEncoding/FontDescriptor 11 0 R/FirstChar 32/LastChar 121/Widths 1180 0 R>> +endobj +11 0 obj +<</Type/FontDescriptor/FontName/ABCDEE+Calibri/Flags 32/ItalicAngle 0/Ascent 750/Descent -250/CapHeight 750/AvgWidth 521/MaxWidth 1743/FontWeight 400/XHeight 250/StemV 52/FontBBox[ -503 -250 1240 750] /FontFile2 1178 0 R>> +endobj +12 0 obj +<</Type/Font/Subtype/TrueType/Name/F3/BaseFont/ABCDEE+Cambria,Bold/Encoding/WinAnsiEncoding/FontDescriptor 13 0 R/FirstChar 32/LastChar 121/Widths 1184 0 R>> +endobj +13 0 obj +<</Type/FontDescriptor/FontName/ABCDEE+Cambria,Bold/Flags 32/ItalicAngle 0/Ascent 950/Descent -222/CapHeight 778/AvgWidth 600/MaxWidth 2482/FontWeight 700/XHeight 250/StemV 60/FontBBox[ -1110 -222 1373 778] /FontFile2 1182 0 R>> +endobj +14 0 obj +<</Type/Font/Subtype/TrueType/Name/F4/BaseFont/Times#20New#20Roman,Bold/Encoding/WinAnsiEncoding/FontDescriptor 15 0 R/FirstChar 32/LastChar 32/Widths 1185 0 R>> +endobj +15 0 obj +<</Type/FontDescriptor/FontName/Times#20New#20Roman,Bold/Flags 32/ItalicAngle 0/Ascent 891/Descent -216/CapHeight 677/AvgWidth 427/MaxWidth 2558/FontWeight 700/XHeight 250/Leading 42/StemV 42/FontBBox[ -558 -216 2000 677] >> +endobj +16 0 obj +<</Type/Font/Subtype/TrueType/Name/F5/BaseFont/Times#20New#20Roman,Bold/Encoding/WinAnsiEncoding/FontDescriptor 17 0 R/FirstChar 32/LastChar 32/Widths 1186 0 R>> +endobj +17 0 obj +<</Type/FontDescriptor/FontName/Times#20New#20Roman,Bold/Flags 32/ItalicAngle 0/Ascent 891/Descent -216/CapHeight 677/AvgWidth 427/MaxWidth 2558/FontWeight 700/XHeight 250/Leading 42/StemV 42/FontBBox[ -558 -216 2000 677] >> +endobj +18 0 obj +<</Subtype/Link/Rect[ 40.3 700.28 344.53 720.72] /BS<</W 0>>/F 4/Dest[ 19 0 R/XYZ 40 806 0] /StructParent 1>> +endobj +19 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R/F11 86 0 R/F12 91 0 R/F8 76 0 R>>/XObject<</Image93 93 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 78 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 24>> +endobj +20 0 obj +<</Type/Font/Subtype/Type0/BaseFont/ABCDEE+Calibri/Encoding/Identity-H/DescendantFonts 21 0 R/ToUnicode 1177 0 R>> +endobj +21 0 obj +[ 22 0 R] +endobj +22 0 obj +<</BaseFont/ABCDEE+Calibri/Subtype/CIDFontType2/Type/Font/CIDToGIDMap/Identity/DW 1000/CIDSystemInfo 23 0 R/FontDescriptor 24 0 R/W 1179 0 R>> +endobj +23 0 obj +<</Ordering(Identity) /Registry(Adobe) /Supplement 0>> +endobj +24 0 obj +<</Type/FontDescriptor/FontName/ABCDEE+Calibri/Flags 32/ItalicAngle 0/Ascent 750/Descent -250/CapHeight 750/AvgWidth 521/MaxWidth 1743/FontWeight 400/XHeight 250/StemV 52/FontBBox[ -503 -250 1240 750] /FontFile2 1178 0 R>> +endobj +25 0 obj +<</Type/Font/Subtype/TrueType/Name/F7/BaseFont/Arial/Encoding/WinAnsiEncoding/FontDescriptor 26 0 R/FirstChar 32/LastChar 32/Widths 1176 0 R>> +endobj +26 0 obj +<</Type/FontDescriptor/FontName/Arial/Flags 32/ItalicAngle 0/Ascent 905/Descent -210/CapHeight 728/AvgWidth 441/MaxWidth 2665/FontWeight 400/XHeight 250/Leading 33/StemV 44/FontBBox[ -665 -210 2000 728] >> +endobj +27 0 obj +<</Subtype/Link/Rect[ 40.3 679.84 344.53 700.28] /BS<</W 0>>/F 4/Dest[ 28 0 R/XYZ 40 806 0] /StructParent 2>> +endobj +28 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 94 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 25>> +endobj +29 0 obj +<</Subtype/Link/Rect[ 40.3 659.39 344.53 679.84] /BS<</W 0>>/F 4/Dest[ 31 0 R/XYZ 40 806 0] /StructParent 3>> +endobj +30 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F10 84 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 95 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 26>> +endobj +31 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/XObject<</Image97 97 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 96 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 27>> +endobj +32 0 obj +<</Subtype/Link/Rect[ 40.3 638.95 344.53 659.39] /BS<</W 0>>/F 4/Dest[ 33 0 R/XYZ 40 806 0] /StructParent 4>> +endobj +33 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image101 101 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 98 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 28>> +endobj +34 0 obj +<</Subtype/Link/Rect[ 40.3 618.51 344.53 638.95] /BS<</W 0>>/F 4/Dest[ 35 0 R/XYZ 40 806 0] /StructParent 5>> +endobj +35 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image103 103 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 102 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 29>> +endobj +36 0 obj +<</Subtype/Link/Rect[ 40.3 598.07 344.53 618.51] /BS<</W 0>>/F 4/Dest[ 37 0 R/XYZ 40 806 0] /StructParent 6>> +endobj +37 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image105 105 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 104 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 30>> +endobj +38 0 obj +<</Subtype/Link/Rect[ 40.3 577.63 344.53 598.07] /BS<</W 0>>/F 4/Dest[ 39 0 R/XYZ 40 806 0] /StructParent 7>> +endobj +39 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image107 107 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 106 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 31>> +endobj +40 0 obj +<</Subtype/Link/Rect[ 40.3 557.18 350.1 577.63] /BS<</W 0>>/F 4/Dest[ 41 0 R/XYZ 40 806 0] /StructParent 8>> +endobj +41 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R/F13 109 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 108 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 32>> +endobj +42 0 obj +<</Subtype/Link/Rect[ 40.3 536.74 350.1 557.18] /BS<</W 0>>/F 4/Dest[ 45 0 R/XYZ 40 806 0] /StructParent 9>> +endobj +43 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F10 84 0 R/F13 109 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 111 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 33>> +endobj +44 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 112 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 34>> +endobj +45 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R/F11 86 0 R/F12 91 0 R/F14 114 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image116 116 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 113 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 35>> +endobj +46 0 obj +<</Subtype/Link/Rect[ 40.3 516.3 350.1 536.74] /BS<</W 0>>/F 4/Dest[ 48 0 R/XYZ 40 806 0] /StructParent 10>> +endobj +47 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 117 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 36>> +endobj +48 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image119 119 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 118 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 37>> +endobj +49 0 obj +<</Subtype/Link/Rect[ 40.3 495.86 350.1 516.3] /BS<</W 0>>/F 4/Dest[ 50 0 R/XYZ 40 806 0] /StructParent 11>> +endobj +50 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image121 121 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 120 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 38>> +endobj +51 0 obj +<</Subtype/Link/Rect[ 40.3 475.42 350.1 495.86] /BS<</W 0>>/F 4/Dest[ 52 0 R/XYZ 40 806 0] /StructParent 12>> +endobj +52 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R/F11 86 0 R/F12 91 0 R>>/XObject<</Image123 123 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 122 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 39>> +endobj +53 0 obj +<</Subtype/Link/Rect[ 40.3 454.98 350.1 475.42] /BS<</W 0>>/F 4/Dest[ 54 0 R/XYZ 40 806 0] /StructParent 13>> +endobj +54 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R/F11 86 0 R/F12 91 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image125 125 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 124 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 40>> +endobj +55 0 obj +<</Subtype/Link/Rect[ 40.3 434.53 350.1 454.98] /BS<</W 0>>/F 4/Dest[ 56 0 R/XYZ 40 806 0] /StructParent 14>> +endobj +56 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image127 127 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 126 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 41>> +endobj +57 0 obj +<</Subtype/Link/Rect[ 40.3 414.09 350.1 434.53] /BS<</W 0>>/F 4/Dest[ 58 0 R/XYZ 40 806 0] /StructParent 15>> +endobj +58 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image129 129 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 128 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 42>> +endobj +59 0 obj +<</Subtype/Link/Rect[ 40.3 393.65 350.1 414.09] /BS<</W 0>>/F 4/Dest[ 60 0 R/XYZ 40 806 0] /StructParent 16>> +endobj +60 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image131 131 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 130 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 43>> +endobj +61 0 obj +<</Subtype/Link/Rect[ 40.3 373.21 350.1 393.65] /BS<</W 0>>/F 4/Dest[ 62 0 R/XYZ 40 806 0] /StructParent 17>> +endobj +62 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 132 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 44>> +endobj +63 0 obj +<</Subtype/Link/Rect[ 40.3 352.77 350.1 373.21] /BS<</W 0>>/F 4/Dest[ 64 0 R/XYZ 40 806 0] /StructParent 18>> +endobj +64 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image134 134 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 133 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 45>> +endobj +65 0 obj +<</Subtype/Link/Rect[ 40.3 332.32 350.1 352.77] /BS<</W 0>>/F 4/Dest[ 66 0 R/XYZ 40 806 0] /StructParent 19>> +endobj +66 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image136 136 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 135 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 46>> +endobj +67 0 obj +<</Subtype/Link/Rect[ 40.3 311.88 350.1 332.32] /BS<</W 0>>/F 4/Dest[ 68 0 R/XYZ 40 806 0] /StructParent 20>> +endobj +68 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 137 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 47>> +endobj +69 0 obj +<</Subtype/Link/Rect[ 40.3 291.44 350.1 311.88] /BS<</W 0>>/F 4/Dest[ 71 0 R/XYZ 40 806 0] /StructParent 21>> +endobj +70 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 138 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 48>> +endobj +71 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R/F15 140 0 R/F13 109 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image145 145 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 139 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 49>> +endobj +72 0 obj +<</Subtype/Link/Rect[ 40.3 271 350.1 291.44] /BS<</W 0>>/F 4/Dest[ 73 0 R/XYZ 40 806 0] /StructParent 22>> +endobj +73 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image147 147 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 146 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 50>> +endobj +74 0 obj +<</Subtype/Link/Rect[ 40.3 250.56 350.1 271] /BS<</W 0>>/F 4/Dest[ 75 0 R/XYZ 40 806 0] /StructParent 23>> +endobj +75 0 obj +<</Type/Page/Parent 2 0 R/Resources<</Font<</F1 5 0 R/F2 10 0 R/F3 12 0 R/F9 79 0 R/F10 84 0 R>>/ExtGState<</GS99 99 0 R/GS100 100 0 R>>/XObject<</Image149 149 0 R>>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/MediaBox[ 0 0 595.32 841.92] /Contents 148 0 R/Group<</Type/Group/S/Transparency/CS/DeviceRGB>>/Tabs/S/StructParents 51>> +endobj +76 0 obj +<</Type/Font/Subtype/TrueType/Name/F8/BaseFont/ABCDEE+Calibri,Bold/Encoding/WinAnsiEncoding/FontDescriptor 77 0 R/FirstChar 32/LastChar 32/Widths 1187 0 R>> +endobj +77 0 obj +<</Type/FontDescriptor/FontName/ABCDEE+Calibri,Bold/Flags 32/ItalicAngle 0/Ascent 750/Descent -250/CapHeight 750/AvgWidth 536/MaxWidth 1759/FontWeight 700/XHeight 250/StemV 53/FontBBox[ -519 -250 1240 750] /FontFile2 1188 0 R>> +endobj +78 0 obj +<</Filter/FlateDecode/Length 2097>> +stream +x\x9C\xA5Y[o\xDB8~\xE0\xFF@̓\xBCph\x92\xE2M\xDD&@\x9A\xB4\x83.\x90\x9D\xEC4\xC0>\xB8}\xF0\xD8r\xEA݉\x94\x91\xD5\xCEM\xFE\xFBR\x94DZ\xA6\xEC\xD9E+l\xDA@\xA8\xBC@\xD0\xCEq\xDBI\xD9'\xD0\xDEW\xABe\xB1۔\x95\xB1ӣi^\xAD\xE9p\xCC+^y +b\xAA^\xB4\x95$\xC3\xE6K;\xFD\xCB]\xB3eW\xFAh\xBCM\x94VD\x99\xF4\xB4\xA7k\xC3Wߝ\xD5\xF4\x8B5\x8C\xB1\xE6\xAB\xEFnf\xFE\xA9L\xF4̭\xCA\xDCD\x90\x97\xF6\x912\xFF\x80\xCD\xC1U3gu\xFAb]e\xED\x8E\xE6e3\xA1\xB0\xF5z\x91ILZ\xB5\x82\xDF\xB3\x99\xE3s!J\xB4)\xE9).\x94\xC5\H@\xEF\xCF +\xBC.\x8B\xBA*c'8m\xC0\xB94$\xF5"(\xA82$\xBD\xC8\xF7ߋ\xDA\xDA:\x9A:]\xEF0?\xD0j\xE4\xB7x\xDB)eȨ/'\xCE?\xF5_rO\xA1`\xE8\xA2qE\xE7R\xA2sO\xB8'<7\x9E\xF7\xCA̿\xB7I\xC9>˜_:\xFAX\xAE!\xF6"\x80`\xB71\xB0mq\xA5f\x90f izr\xBE{/u0(u\xF3\x9C6\x94: \x84a\x8F2\xE6\xD2z\\xA2|\xA4ǎj$\xEA\xCE\xD0\xE8\xEBtPjn\x9F!\xBB\xF3#\xEE\xEC\x93\x8F(J\xA3x\x86i\xB6\x8F\xE1,Z\xD3\xFEoՃB\xCCK\xF2?(\x8BM\xE6Ce\xDD\xDD\xFC\x88\xD6\xCD\xE9/VG2f\xCFD\x83\xD1\x90)[x<\x82\xD3ꈫ\xFE\x99\xC5\xC5\xF3\x83WB`xޏJ\xDD\xF8!\x8B6\x9C\xF6\xB2%+\xE0\xA4\xBAu\xADU\x930u\x8F[\xE0\xADr\xFA\xF6\xA9_eDr\xB3\xAE\x90\xEAho\x95\xB2\x93,\x84q\x82\xAFD>\*s[\xB1'\xCF\xFB\xE2k^\xD5\xCEWrpw\xFF\xB6m\xBE\xF3\xEC\xDC\xF1hTkB`\xAE<\xC7\xE9\x8D-;\xC7\xD1aoa|Bv}\xEE\xAC\xF7\x8D\xB6,\xB5*\xF5\xB4ܾ\xEB\xB4,\xBBƥ\xD32鷎\xFB\x92\xCDSs\xC9Ҁ\xB6\_\xF3\xD2\xEDh;o\xCB\xCC\xEAV\x99E\xC4.\x8Fْqh\x90\x85\xBF\xCFI\xB6\x8C\x9Ey\xCAL\x932\xC8\xF2U\xF9X6&\?\xBB#$\x89\xA6\xEE\xCC4\x98\xA7 E\x8F\x9C\x9C\xD2}H\xD1\xDA%\xC6E\xB4\x9Bh +I\xC0\xE44ѓ\x87J6,\x83o\xF2MY\xE5.\xFD-ƻ\x83\x80C\xFA^+\xE9z\xCD\xFEV(|)\xBD\x97z\xBFUc\x{D9EB}\xDE\xEE\xC7n\xF3\xA3\xEDg +Z6\xB0\xC8\xED\xB2\xFA/D\xB7Ӂ\xDF\xDA\xF4\x80]\xB4\xB5\xDD`\xB4\x84ӸIQ\xC1FǭƢ\xCDj +\x87\x9Ea9\xBB\xDA\xD4yu\xF0BD\x9BYT\x93\x82x\x9E+endstream +endobj +79 0 obj +<</Type/Font/Subtype/Type0/BaseFont/ABCDEE+Cambria,Bold/Encoding/Identity-H/DescendantFonts 80 0 R/ToUnicode 1181 0 R>> +endobj +80 0 obj +[ 81 0 R] +endobj +81 0 obj +<</BaseFont/ABCDEE+Cambria,Bold/Subtype/CIDFontType2/Type/Font/CIDToGIDMap/Identity/DW 1000/CIDSystemInfo 82 0 R/FontDescriptor 83 0 R/W 1183 0 R>> +endobj +82 0 obj +<</Ordering(Identity) /Registry(Adobe) /Supplement 0>> +endobj +83 0 obj +<</Type/FontDescriptor/FontName/ABCDEE+Cambria,Bold/Flags 32/ItalicAngle 0/Ascent 950/Descent -222/CapHeight 778/AvgWidth 600/MaxWidth 2482/FontWeight 700/XHeight 250/StemV 60/FontBBox[ -1110 -222 1373 778] /FontFile2 1182 0 R>> +endobj +84 0 obj +<</Type/Font/Subtype/TrueType/Name/F10/BaseFont/ABCDEE+Consolas/Encoding/WinAnsiEncoding/FontDescriptor 85 0 R/FirstChar 32/LastChar 125/Widths 1192 0 R>> +endobj +85 0 obj +<</Type/FontDescriptor/FontName/ABCDEE+Consolas/Flags 32/ItalicAngle 0/Ascent 743/Descent -257/CapHeight 743/AvgWidth 550/MaxWidth 1109/FontWeight 400/XHeight 250/StemV 55/FontBBox[ -432 -257 677 743] /FontFile2 1190 0 R>> +endobj +86 0 obj +<</Type/Font/Subtype/Type0/BaseFont/Symbol/Encoding/Identity-H/DescendantFonts 87 0 R/ToUnicode 1193 0 R>> +endobj +87 0 obj +[ 88 0 R] +endobj +88 0 obj +<</BaseFont/Symbol/Subtype/CIDFontType2/Type/Font/CIDToGIDMap/Identity/DW 1000/CIDSystemInfo 89 0 R/FontDescriptor 90 0 R/W 1195 0 R>> +endobj +89 0 obj +<</Ordering(Identity) /Registry(Adobe) /Supplement 0>> +endobj +90 0 obj +<</Type/FontDescriptor/FontName/Symbol/Flags 32/ItalicAngle 0/Ascent 1005/Descent -216/CapHeight 693/AvgWidth 600/MaxWidth 1113/FontWeight 400/XHeight 250/StemV 60/FontBBox[ 0 -216 1113 693] /FontFile2 1194 0 R>> +endobj +91 0 obj +<</Type/Font/Subtype/TrueType/Name/F12/BaseFont/Arial/Encoding/WinAnsiEncoding/FontDescriptor 92 0 R/FirstChar 32/LastChar 32/Widths 1196 0 R>> +endobj +92 0 obj +<</Type/FontDescriptor/FontName/Arial/Flags 32/ItalicAngle 0/Ascent 905/Descent -210/CapHeight 728/AvgWidth 441/MaxWidth 2665/FontWeight 400/XHeight 250/Leading 33/StemV 44/FontBBox[ -665 -210 2000 728] >> +endobj +93 0 obj +<</Type/XObject/Subtype/Image/Width 1130/Height 158/ColorSpace/DeviceRGB/BitsPerComponent 8/Interpolate false/Filter/FlateDecode/Length 13925>> +stream +x\x9C\xED\x9D9\x92\xE46\xB7F{]\xB9m!W \xA3=m!eh!C^\x99!\xF7\xB7+\xE4\xB4-\xA7\xB4\x81\xE7\xD5+Ib\xB88d2\xB3\xCE E\xA8\x8B \x81\x8B\x8B\x81\xF8+\xBANT\xD2\xFDZ\xF4\xBE\xD8\xCA\xCFW\xAF%GY\x95\xFE\xEAu\xE0\x890\xDB\xF60\xE6z\x88>jb\x9B\xAFny\xA8\xAC\xEF\xC7\xFB\xEB\xE5{Ǐ73\xB8\xE3\xF2\xFA.\xDC\xF1\xF6\xE3{\xC1\xF5\xDAw\xE7ٔ\xC7UO\xFF]~d\xD1\x97\xA5\xF0\:\xB5\xAA\xA7\xBE֫\x95\xD5\xBD\xD7\xB6j81\x8F\xA0\xC6f/\xB1\xF7\x80%\xEFB\xBF\xAD\xEB8eL\xB8[H\xA1յ\xB1\xCC\xEF9 L\xC8 +l\xA8\xF12T\xE7n\xEAi\xAC\xB0iԛ\xA62\xE69\xDA~\x93\x9Dz\xB8fo\x96\xC6)A9^\xD7W\xD5 +\x{DF51}\x9C\xB2P\xC5\xFA\xB4\x94,w.\xB2\xCAm\xA1\xA2G\xFA\xD4=_Er䔠\xE0'\x9F`\xFB\x95<\xB9\xC2\xAD\xE6\xE5O\xD96/\xF7\x86YFBn'T \xE77\x87\xBD\xA1\xF5\x9F\xFD\xF5\xA3\xBDϵ:\x99/\xB7\x{1DAF483}\xD3k\x9C\xCB\xEB[/\x90\xF54h EVe\xF7H\xEA\xC9\xD7K9\x8F\xAB\x9E쵧\xAB\xB62V\xA6\xAC\xA8N;\xF5m\xEC|ޞͱȝ\xE3\xF2\xBBI\xBA\xA8'5\xB4\xB8v\x88\xE5\xD4\xF1E\x94\x94X\xB32\xB8\x9Bz\xAA\xAC\xBE\x95/\x9F\xB0\xEDX-z(\x89\xC4/\xE7\\xE7L\xE6\xB5\xDD+A!\xDE\xDA\xD9W\xF9\xF8\xBFy\x82B\xCFQL=)uc\xB9Un\x95$\\x85\xE8+/G^ V6+n\xAC\xFD\x8A\x9E\xDC\xC6\xAEuu \xDA6\xAF\xF1ƄTFUu\xBC^\xEF+\xFCV&\xF6\x86\xDE\xADG\xAA\xFB\x89h\xCF\x8F\xFF@ٽ'ݢ\xD2 x\xDEe\xF5Q@\xBDv\xFA\xF16\xFE\xAF\xEDْVO&\xFF\x9C\x97\xEC\xD6i\x88ޝ\xBE\x8B}YmۡFP\xA8\xA7V\xAA\xA7\x83L\xEA\xF5\xF5\xF8|\x9E-\xF9\xBCp:\x9F[F wRO\xA7Sj\xE4-;\x89gl\xFBz\x8B\xB6< d\xA4\x9C\xABWK08\xAFQO\x8D +\xCD\xCAQH=iuc\xB9Un\xDDK=\xF9%(\x86\xB3\xE4\xB6_ٓ\xDBx\xC33N(A\xDB\xE65ޘ\x90\xEBs\x910 +Q/\xCEe\xFAw\x9Dz:\xD67\xA6>\xA5\xB9IK\x9AH\xAE\x8B\xAD\xF2[\xE8N\xEA)P\x82RGɕ\xDB~UOn\xE4 +\xDB4\xB1m\x9B\xD7x#Bmisg_\xA9\xF0\xBD\xD5\xD3a\xE4S\xE1\xA1\xEE\xCFA\xD0 +^[h3\xEAI\xC2PO\xE9\x99\xF9\x99`\xD5Sӑ\xAA\x9EF\xFE\xFD\xFB\xB4\x83z\xB2\xB8Z\xBD\x81\xCC\xE6\x926\x8A\xA4_\x9B\xBB\x9A$\xA1*"\xE3%)v\xB2\xAAUU'AUc\xA2\xFC\xAE*\xDD,\xD8͑\x97\xEE\xC2\xF9\xE9N\xB9*G\xCF6꺇\xDB]\x962\xA9zU\xC6|\xB5\=\x9D\x95\xE7L?[\xBBhb9\x92c\x9E\x9E\xED_D/\xE3`\xA4\xCD\x8EzRڍ\xBD/ȮWӍ\x86\x9D\x8A\x81\xB4\xFD"G\xFEh\xC1R\xE7\x97KQ\xF9%8IB\xDD:C=\xB5\xF4\xB1e) uc\xB1Un\xFB\xC2U\xAE\xE4(R\x825&+}ɓyôL.A\xDB\xE65ޘЛ\xE2\xB5f\xD6wȭ\xBB\x98\x93 +x\xC31V\x9BA12\xA26\x95\xE5\xEF\xEE\xAC\xEBwس;\xED2h\xED\xDA\xE5s"\xA9\xA7Q\xFE̲'?A\xA2\x90K\x95z\xAA\xA3\xF7v>\x9Fz\xBA\xB2|\xE7\xDE\xD2Y\x8F*ď\xA8\xEC\x82\xC5q\xA4O=J*\xA6vu\xBDP 뉢\xE0J\xEA\x8B\xC1F=\xA5 儍\x91۲\x85\xD2M^\xE17\xE9\xB4dUQ\x8F\xEB,\x9B'\xBB\xDBՓ\x9AS\xCB\xCF\x{1923D3}#+\xE6\xE9\xD4\xFD\xAB\xDBտ\xC0\xF1չp\x8E\xC2\xF5jjfi\xD0\xF6\x9D\x99#\xCC]ՓS\x82f\x93qמ\xE7\x91#\xEA)\xADW\x94\xB4\xBA\xB1\xD8*\xAF\x85\xEE\xB5\xF6t\x{16457E}\xEAɍ\xBCa\xA6\x94\xA0m\xF3\xCE\xEA)mu[.\xBB\x82r\x9A%bC@=@Sd\xB53-\x99\xD0\xEB\xA7)HQՓv\xA9\xDA\xD6g\xAA'\xF5X\x8A\xD4S\xC9n꩞\xE3hAS#ek\xB5gz\xCBT-\xA2#\xA8z]\x9B\xE6\xFE(\xEE\xF0rd\xA6\xBB"G\xC1t\xC7\xDBn\xD4g\xA5/\xBF\xFE{\xE3i\xAC*\xFD\xDC\xEAv\xF5t~\xA9^q\xCA\xA5F\x96\xF9҉\x9C#+feؑ\x8Fro,WOj\x8E"\xF5*\x8F\xA7H\x8B\xB6\xDF\xD2\xF6Sof\xC1\xA26\xF5\x94~\xBB뤂\xB3=\x99w\x9AC+ՓY7[\xE5\xB5\xD0۪'i\xCA&lSOr\xE9\xEB\x9E\xDC\xC8\x86]Z \xDA6\xAFl\x9C9\xBD 5ߧTO\x97D:\xB5\xBC~lO\xB6/V} \x82\xDF=M\x97\xB2\xED|%\xA2F\x8FF\xB7\xB7J\xEC\xAE\x87\xDA\xEA\xA9\xEA\xBBV\xCD?W\xE9\xD6ԝlm\xD5\xCAT1`\xB6W\xF0\x9D\xF9g\x89}ԓ\x97n\xFF@jRCW\xB7b\xF5\xBFO\xF0\xDC}t\xBE~\xFEPW=\x8Ch\x96\xA9'\xF9\xCD\xEAj +{\xA5F\xCFQP=\x95\xB6hkO{\xAD=\xEB\xD5pI.\xD1\xF6\xDB\xDB\xFE\x9C\xB8X1\xD5\xE2\xD5Ful\x94\xA0bYh\xB6'O\xB9i\xA1\xC7̑\xA7\x9E캱\xD8*\xAF\x85\xDA\xE77v\x9Du\xE9\x9E\xDC\xC8\x86YZ \xDA6\xAF\xF1Ƅ]+\x82ogᡍ\xD4S\xEB"\xAE@\xF2\xF2\xD3Bfz\xBD\xDF"\x9BSӑP%\xC13\xF7\x8C\x93 "kO\xEE\xB7O\xA8\xA7\x8A\xF6a\xA8\x90^\xA8߶\xF1\x94\xDD\xEC\xA4\xC0b\xD8g[\x95V6\x8C\xA0\xAE\xB1\xC9C\xB1z>Y\x9B̓Y\xA0\x9E\x9C\xB9\xE9\xCE\xE5$O\xAD\xED\xC10\xFA|\xE9\xA5\xC6\xF0Wz\x88S\xB8\xD3]\xA3\x9E>\x84\xFC6\xF9\xF9\xA3\xAA\xD0N\x8E\xDAՓyC\xCA"\xF5ȑ^\xAF\xF2\x88\xFBܟ\xE6\xF6N\xDB_\xD0\xF6\x8D\xF4\xD5\xCC\xD9u\xA1$\xD9%2+\xA6\x9E\x96\xC8\xC7x\x8E\x9C\x8A\x93\xB8\xD8*\xB7\x85%\x98\xC5װ\xD6b\x97\xBE\xE5ɍ\xBC\xA1Z\xA5\x97`\xA3\xCD\xED+OGVO\xEDJp/*G\xC7LJ1\x90O\xF2ƺ\xE2\xAA)\x90\xAC\xC0!\x9E\xC0\xB9\x8F\xA8\x9EFeT\xFE\xF7\xFB?\xF5=Kԓ\xDDѨ\xA1\xE6X%\x9FF\xBC\xCEvGP\x96Er\x9B\xD4:\xD9\xF2\x81\xB4i\xF6p\xB7\xE6\xD22\x82\x9A'n\xAC\x91y=\x8B\xEA\xCC\xA8'/G-e{3\xFD4\xCE1\xA6\xB5!\xF5V\xF0ŷR=\x89JS\xF7sQ\xA2\x85\x8Dv\x8E\xDA\xD5S\xD2\xDE\xD0nY\x93#\xB3^\x89\x8E\x9C/\xD1\xF6\xDA\xFE˹\xD2t\xC2$\xBAiQ\x98\xFCZ\xAEP\xBEZe/rV\xFE4n\x93Ҭ\x8C\xA5?L\x8C\x99Zë\x8B\xAD +\xB6\xD0ԓ_\x82e?ߴƧ\x95\xBE\xE9\xC9\xCB6\xDE\x95\xA7\xFBӭ\xB1˽Q\xA7\xD5z\xF5\xB4b=os\x841\x83h\xD9R\x9BQO \xCA<\xED\xE8<K\xFF\x94\xEA)?r/xt9\xEAI`\xD1ć36\xBB\x8E(\xAFC\xA7a~>6\x82*\x9FG_\x9A\xA5Z'[?1\xC7\xDB]L\xAC"\x93\xBB\xED\xD2\xD9\xDC\xD8-e\x80\xBA&GJ\xBABF\xC6;\xF7\x97\x9B\xE4Qݝ\xA2\xB3\xF2q\xBD*\xAF\x84V.\xEA\xC83s\xED\xE91k5\xADh~\xE5\x9A\xA9mkr\xF4a\xD5+-\x9ERM^\x8D\xA5\xED[\xB7\xE4eW?\xEC,^\xE5Qcq)\xC8+\xC1\xDC&k\xED\xCBWO\xCD\xEB+꩙\x9F\xFD\xF1\xED\x97߾\xFD\xFA7\xEF\xA5\xE2\x9C\xE1\xEC\xC8\xEBW\xC3\x94\x95\x88͛%\xB4y\xB6o{\xEB&\xE5kD\xB2I\xDDx\x88\x96\xB7dY\xBD\x8F\xEA\xA2.\xC0\xF3\xF0\xFEz\xF9\xDE\xF1\xE3\xCD\xBEw\xBC\xFD\xF8\xAED\xE0?\x9B\x82zj\xE5\xBF˯\xBFu\xEA\xE9\x97?.\xFF\xB6>\xFBϹ{\xF0\xCF\x99h\xCF6]\xFA.~\xA81\xA1u\xE6\xB21\x92\xB9\xEBO\xF9I6\xBDU\x87\xED, \x96\xEF5T\xF5\xC2\xE6\xEAi\xF4Cj\xEA\x81~\xE0f\xC2=c\xBFV\xB6K\xCC[\xB4\xC1\xE5}\xCE#\xFEB+\xDBT\x84 +L\xBB"\x8F7ԍJ\xB9\xFB\xBF)w\xE9~\xBE\xFE yO}\x83\xA9gs\xF2\xFC\xC1JP"\xA2\xA5I֪\V\x96\xFB*\xB0MUO\xEE\xB3v+\xD3\xFC<z\xB9$\xF2\xA9\xB4}Ƕ\x9FF\x9D\x86F>VS\xA8ur\xBA\xA1V\xA6\x97\xBE\x91n\xAC\xFDj\xDE\xB2\xAC +\xAE\xECs\x92H\xC4\xE2\xDAee+D\xB1U/\xFF\xD3yV\xF5Ԏ\xA5\x9E\xE6\x8B\xC3B\xD5f\xEA)<bLߔ\xE2`i\xBE(\xC4#\xBDf\x8D\xF7\xBEf\x95<}_\x8D \xADt\x8D\x9D=\xBB\xB3\xB1z\xF2\xF2\xABH #\xF9\xED\xD4ӝJP\xB1vc\xF5\xB4\xC4W\x9B\xAB'\xDBWQ?OuĴ}ö?\x96\x9E\x90[[=Iu-\xBD\xE6\xAF:\xCB!q%c\xEB\xFD\xF5\xE4[岠 +Z\xF7l\x8E<+\xF8y\xB8\xF1ZI\x8A\xF6l\xFBʗ>\xF5TZrQQ1j\xE9\xB9\xB3r\xE9\xAFSO\xAEU.\xA8'++\xAD\xAF\xBB\xBD\x98\xDFi\xE2\xEBԜ\xE1 +\xF6%\xB2z\xDE_/\xDF;~\xBC\x99\xC1\x97\xD7wᎷ\xDF\xF3\xAE*\x94$FPO\xAD\xFCw\xF9\xF5\xB7N=\xFD\xF2\xC7\xE5\xDF\xD6g\xFF9w\xFE\xB9\xA4#\xF6~\xF6p\xB2a\xE2ڟ\xDDy\xA81\xA1\xF5\xBE4\xDEw(\xA3\xC9棗\xA0객%\xE1\xC2\xF2\xFD\xF0~]ts\xF54\xFA!5\xF5@c\xB9\x9B \xF7\x8C\xFDZٮ\xED\xF7\xEA\xACc]\x8F\x9B\xDF\xC6\xC0\xE3`3\xE7 >Q\xEA\xF3\xEE-\xEE\xF1ڑk\xF1]\xD4\xD3\xDD\xFC\xE6\xF4\xAD\xE8e\xCE\xE5\xF5\xADH\x82\xB4d\x90\xADyf\xA9d\xDD\xD7\xDFeG\x84zjg\xF9\xDA\xD3\xFF\xFE\xFC\xF6H\xEAiӤ\x9FF=N=]9f *V\xE5\xCBQ\xCE\xCF\xE9.c\xF1x\xE8\xD2EPOi\xFE\xA2\x9E\xCB;^\xCE72\xEA1\xD5S\xE7\xAF\xF3\xA5K\xE0\xFEew\xE5\xFD\xD5\xCFc\xB9`¨ϻ\xB6\xB8\xC7kG\x82\xC5y\xB1?\xFA l\xBAE\xA5Aϼ\xCB\xEA\xA9S<\xF2jS~\xCF瓎8\xEA\xF0\xA2B=\xDD\xD4Ӄ\xF4.\xA8'%\x81-3',l\xE5\xDB~\xF4\xB2J=\xED]\xC0\x95z:\x9D\xD2\xE7!\xD4\xD3=\x8DxH\xF5ԋ\xA7\x97c\xDE\xEA\xE9\x8AY.;\xDA㵣\xDBn\xB5n\xE3\xB0\xEF_\xD8Q=\xF5\x9DբI4\xD9\xEAi\\xE2r\xC4ꩅ\x97߇={\xD2ν\xFF> +R\xC3?\xFA\xFFN\xFDׇM\x9B\xFD\xAA\xFF~\xFF\xC7KS\xDC\xE90-\x98\xCB}YҐ\xAFC\xB1d\xA9]\xBC\xFB[5\xC7]\x98P\x854\xC6\Ǯ\xA5+,\xFA\x98vE\xEE \xD5\xED +vI\x8F\xE7\x9E\xE8\x9E\xEF\xAE$\xF1\xD47ȑz6'\xCF\xACe!"ZZ\xD4g{#\xDBr_6Ш\xEA)\xB8\x95E\xF2b\xF5\xF8\xB7B=\xE5K\xA5\xEDZ~\xC7J5;^ڠo[\x95F\x9D\x86FFP\xAAC\xB5NN7\xD4\xCA\xF4\xD27ҍ\xB5_\xCDF\xF1\xA4\xD4<;f;tI\xAF\xC8oS}n)_[=\xD9=\xA1\xDBOf[\xCF:\xF5\xF9Zf\xF3\xA3e1}Ίt\xED\xED؎V\xD9\xEC\xD5)\xF9\xE8XE\xF1\xB3\x9B#\xE7\xAD\xD1V\xAF\xCCMݢcv\xD9?\xF1\xA5\x91\xD4S@<%\x92\xC9TO\x91]{\xA8\xA7|\xF5T\xFE7ܳF=]\xD1\xE6U\xEA-\xB7Y\xFF65\xFB\xF4om\x90\xB5\x95J{=T\xD9\xCB\xE3N3ݢ\xB7\xA9\xB6 +\xEC\x8E=\x8F\xA4\x86s_\x81\xFC\xCE7\xE1\xD9\xCE\xD5\xCB\xD4\xD3\xDDJP1W]\x91y\xEAi\xBD\xAF\xA4\xD0R\xDC\xE8/RC\x97پ\x92\xFD|}0\xB9\x96\xA7\xA0\xE7\xB7\x9C\xBA㠆O\xA7r\xED\xC3n\xFBEO\xF1\xF3rN*\xA4\xDD\xF3Gź\xA0\x8Fl\x8CtKӄ\xF5\xD2\xF7\xD2\xF5bv\xAC2)\x8A\xAF\xB0j́Ѕ\xBD\x8A\x9D_1٨\xB6\xF2\xF5Փn\xB3jZe>\xEB\xD4g\xBF\xC6}Ίt\xEF֎L?\x8F\xE9\xBAZ\xC0\xEB\xC9\xEB"Z\xE5g3G\xF5d\xB4\x94\xC8I\xCDq=\xF2i3\xF5\x94\x9E\x91ߑi"C \xC5v\xEDu\xA0\x9E\xDA\x85\x92\xA6\x9E\x86\x8Dy\xA3b\xBA.?\xF5\xEC\xB2s\xAF\xD4C\xC2+\xA5\x9A\x9C-gy\xA8\xD9\xE5\xE5\xE9V\xDDu:2\xAB \xB9Uf\xBAS\xAE\xDA\xE6m\xD4Y\xA86\x{DD75}zr\xF2[\xCD\xE7Y\xC3SF/PO\xF7)Ae%\xCFl&W=\xF5\xC9\xF7\xE2\xF25֞\xACgm_\x99~\x9E\x9D/F˹tZ9I9R'\xE5\xAC:\xD3\xCFiZv\xAD\x8C\xE8c~\xE9F'];\xE6p\x9A"U\xCBQ\xBB\xEB\xA6tW\xF7*\xCB\xD4\xD3\xE5[Pj\xCDf+Ա\xCAz\xD6[Ns-\xB2\xE5\xE9ޯy5'\x99L\xD2S\x88\xF4\x84\xE5L\x90\xDBBm\xF3ש'%\xBF\xB11\xD2\xAB\x94<kO[#\xA9\xA7\xF10\x88Y\xF6\xE4'HrIWOх\xA7\xD4\xD3,\xF54_\xAA\xF6WO\xD2\xFC\>\x91\xADN\xFA\xBD\x93\xD4co\xADG\x92\x93UE\x9B\x94n\xD2E\xB7I\x9F +\xD8X=y\xF9\xB5\xE7c\xA5ضSOw*A\xC5ڍ\xD5\xD3_m\xAE\x9El_E\xFD<\xD5\xD3\xF6\xE4YQ(\xCD\xDD\xD4\xE7\x98\xEDQ\x9FT\xD7\xCC\xD1Hq\xC1\x9Dێ+[\xA7\xF0\x8C\xBBk\x86\xF8\xA7\xB3\xBA\xBEWY\xA4\x9EV\x96o`\xEDiI\xA8g\x95\x{3B27796}\xF69\x8Bӽc;\x8A\xBD\x8F\x9C\xF4B\xF5\xB4\xA6o_\xA5\x9E\x94t\x82c\xA4\x80\xBD\xB0\xAAz\xD2.U\xDB\xFA4\x8D_x\xFA@=-\xE1`꩞q\xF6'X\x93Q\x95@\xD1,{\xD7C\xE9b\xF1\xDFKw\xBC\xED\xDD\xD1\xEA\xC9ȯ\xF7\xB6\xAA\xE7ko\xA3\x9Ev,\xC1v\x{164B3C}\x94V\xFBj\xF5\xA4\xFA*\xE0\xE7\xE1\xC6k%)RP\xF3QON \xA6q\x97\xCB%\xF6\xA8\xAF\xB4\xE4\xA2\xD2E\xA9\xA5\xE7.\xCCʥ\xBFN=\xB9V\xE9\x94%\\xA7ȯ\xBA\xB6WY\xA3\x9E\x96\x97\xEF\x9E\xEAɰjW\xF5d\xF59\xEB\xD4\xD3}\xDAQ\xCBlޘF\x8F؋\x9AK\x89\xAB\xFB\xF6\xDDԓ\xD1\xCA\xDC,\xC3\xBF{\x9A.e\xDB\xF9\xAC\xDFt +1\x82zj\xE7h\xEA)\xE9T\xBB\xBB\xAAm@\xF5\xD4v5\xAAZ\x90\xF4ڱ\xB7\x97n\xFF\xC0\xF9l\xBF\xD8DS\xA3\x9D\x9D\x9D\xF6\xD6\xEA\xC9SG\xE6[\xB4ćPOkJP\xCBr\xB14\xE3\xAAU\xD9\xEC\xC2\xBE\xDAG=5̠\xAA~.\xC9%+\xBF\xEDkO*\xD7V\x95\xA2\xBAa휹\x91\xAE\x9E@r\xBBV\xFA\xABՓm\x95\x8A2\xFC\xD23`\xB6\x8BRXګ\xCCw\xB0\xF6d\xD7\xE7\x95}\xCE\xE2t\xEF\xF7B("P4\xA7l\xDA\xC8D\xB8\xE8\xDBo\xB4\xF6\xA4\xE2\xBE`#\x82g\xEE'\x98\x8BkO\xCAA\xE8*\xA8\xA7v֪\xA7?\xB3\xEB\xBD\xE9\xC66.\xC5\xEA\xF9\xE4|<\xE65\xF7c\xEF\xB2?\xBA\xBEl$c\xA6;w\x95C{\xE3 \x9D\x8DՓ\x97_\xAB\xF7\xAE\xDFM\xB7QO{\x97\xA0fn=\xA2\xC8< \xAE\xAD\xAAb\xE2\xEA\xC9~\xC8\xF6s\xFD\x96\xEF\x8F//\x99\xF9u\xD4S\xE3\xAB>\xAFA欹P\x9BM\xE1m\x86Ps\xB5V\xE6\x94\xFEf\xEAI\xBBQ\x9E\x85\x97\xDC\xDCG\xE0\x85\xAE\xE8U"\x89MiH\xA3\xEE\xC5廓z\xF2\xACj\x9C\xA1\xCA\xF0\xFBI\xA3\xCFY\x9E\xEE\xBD\xDA\xD1"\xF5Z{r\xE2]\xE5g3G\xE6[ñ+\xDEO\xDA\xE3\x84Ն\xC82\xA7\xB8\xDA|\xAC^\xDB\xC2\xD3ꩅ\xCEƹy\xF5T\x9F\xCB?s/\xB2\xCE/\x8CR\x8B]\x8EM\xBDM\xF3Mmc\xEF\xEC\x99~\xD0A\xEF\x94\xE0K\xE5\xFAi\xE9\xE8Z\xCDւMYj\xF9f\x87[\xA8\xA7\xBDKP>\xBF\xDB\xDA\xDEQU\xFA-|\xB5\xBDz +\x924?ѕ\xB6\xF2\xEB\xA9'\xC8Xj\xBAj\xFBY\xB1\x91l\xBA?\xEFe\x8At\x9CQ\x9F\x93\xAEe\xB8]\xFA\x91ѦꒀUӴ\xBA\xB3\xF6_D`\xC7l\x87\xAE\xE8U"\xA8\xF6\xAF)߽ԓc\x95\xE7 +\xAB>\xDB9r\xFA\x9C\xE9ޫ9k1\x82b\x89\xF6\xB1\x8D\xFDn\x8B\x9F\xED\x99o\x8DH\xAD\x8C?\xF4X\xA6\xAEᦃ\x98'DـWm\xBD\xB1\x84P\xAD\x9EZ\x9E>PO-\xACVO\x95\x80jPOI\xBB\x9A\xE2&\xBE\xE8\xB4nN\xBA\xA5h\x8D̏w\xFB\x81a\xBD,V\xC7,dd\xBCs\xF7\xBEG\xCCp>\x92\xD5\xFD1\xA2\x97\x91^\x919\xB9\xF9\xA1ܓ\xA6U\x87.AG\xA4D<|~)}\xB7\xDCW\xA1\xF2\xD5ԓ\xFF\xAC\xD5u?\xCBET\x8E\xA1\xC4\xFC\xBA\xEAɳ*\xAF\xC9n\xC7Qϒ\xCBAn\xADsӭ\xEE x#<W\xAF\xB5_\xDF*i\x86Y\xAB\xE3\xA5d\xD6c\xF6\xD2]ܫ\x98\xF9u\xEB\xF3\xE2\xF2\xCD\xD3+#X\xA3\x9EL\xAB"\xDE\xD0\xEA\xB3Ws\xCC>gE\xBAv\x8EvlG5\xA1\xC5\xEC\xD4!8\xAAm?\xDB9\xB2\xDF~E\x87Q\xD6\x99 +\xEA\xE9IPfH\xEC\xD9\x80\xFB\xA1o\xE9\x89o\x99+C5+\xA0\x9E+\xD1W^\x8E\xBC\xACl +V\xDCX\xFB=\xB9\x8D7\\xEB\xEA\xB4m^\xE3\x8D \xA9\x8C\xAA\xEAx\xBD6\xDEW\xF8\xADL8\xEC +\xD4S+}\xFB\xB2\xBA\xD39\xD4\xEAK\xB5\xFDլTO\xD6O\xA2ߐ\xBE\x9Fϳ%\x9FN\xE7s\xCB\xE4N\xEA\xE9tJ\x8D\xBC\xE5\xDB\xFF۾\x81ޢ-)\xE7\xEA\xD5\xCE+D\xD4ScC\xB3rROZ\xDDXn\x95\xDBB\xF7RO~ +\x81\xE1,\xB9\xEDW\xF6\xE46\xDE\xF0\x8CJжy\x8D7&\xE4\xFA\F$LCԋs\x99\xFEE=m\xEAIFTO\xC5\xF2\x91\xC8$\x9A\xF5\x94=\x8Bzژk%KVM\x8B֟/[\xE7\x93\xFE\x9FO\xCEk\xF1\xE3\x8D\xC2~\x80j\xBE) 7?\xF8VU˼\x91\x94<\x9E\xBA\xEF`\xBAb\xEB\xD4{\xEFU9\xB2\xF7~HN߱7\x87\xFA\xF3u\xD7W\xEBԓT\x9C\xAD~\x96'\x88\xA5Y1y\xAA\xCE\xDD\xDF㆑z·\xF0\x86\xBE礘\xAC\x9Fo\x94\x87Zv\xD5z5D\x9CM\x97\xFE\xA6\xED\xAB\xE9*\x8B8f~\xA5\xFAejq\xD86\xDBl\x97\xE0\xBDԓ\x9DnD=\xA9uc\xA5z\xB2Z\xE8N\xEA)P\x82\xD2:I$O\x81\xF6\xAByro8\xB6I%hۼ\xC6JO.ȥ\xE2EU\xA9\xCE|\xE3A\xD5S\xD6E\x97\x8E.W\xFD\xA6c\x9E>]HK=t\x8AM +2zQ\xF7M\x97e\xE9x#([\x8FY\xA1\xCA\xD6\xD1I=\xC4S\xA2\x91 +\xB94D8\xAB%v\xEEm\xCDT\xA5\x8A\xB1\xDA^-\xA5'\xEC\xE9\x93\xCBϡ\xB6\x9FN\xE5\S\xF6\x872\x97,\x9D\xFB\xAB\xCA\xF7\xB3Xs\xF57]v1\x8BKLW\xDBau\xD3\xFAxEB\x9E\xDC\xC8\x86]Z \xDA6\xAFl\x9C9\xBD 5\xDFC\xAA\xA7\xC67\xE7\xA6\xEAI\xEF 羽vAi\x8F\x91ۡ\x8D\xBF{\x9A.e\xDB\xF9J>o\xA8ψPN\xF5\xCBA=űk{\xD5w\xC9\xAC:\x82\xD2;\xA5\xDE՝lm\xD5\xCAT1`\xCE0\xB4\xE1\xB3\xCC>m\xDFK\xB7\xA0?5\xA9\xA1\xF7^\xB3s\xA0K\xF0\xDC}t\xBE~\xFEPW=\x8Ch\x96\xA9'\xF9\xCD\xEAj +{\xA5F\xCFQP=\x95\xB6hkO{\xAD=\xEB\xD5pI.\xD1\xF6\xDB\xDB\xFE\x9C\xB8X1\xD5\xE2\xD5ul\x94\xA0bYh\xB6'O\xB9i\xA1\xC7̑\xA7\x9E캱\xD8*\xAF\x85\xDA\xE77v\x9Du\xE9\x9E\xDC\xC8\x86YZ \xDA6\xAF\xF1Ƅ]+\x82og\xE1\xA1\xD4Ӛ\xF7\xEF\x81֞\xD2\xF5 +Wo\xB8\xF7jI\xBDj"x\xE6\x9Eq\x82y\xBE\xF6T\x81z\xDA\xB3N\xD6o\xDB\xF8J.\x94\xF1L\xC3>۪$p\xB0\xB2au\x8DMnrY\xBA洨̂\xB6\xEF\xE4\xC8Mw.'yjm\x86\xD1\xE7K/5\x86\xBF\xD2C\x9C\x82\xBEZ\xA7\x9E>\x84\xFC6\xF9\xF9\xA3\xAA\xD0N\x8E\xDAՓyC\xCA"\xF5ȑ^\xAF\xEA\xF7i\x94p*\xCCh\xFBmm\xDFH_\x8D\xC0\x9C]@\x91]\x82!\xB3b\xEAi\x89|\x8C\xE7ȩ8\x89\x81\x8B\xADr[\xE8^\xEA)P\x82Y| +k-v\xE9[\x9E\xDC\xC8\xAAUz 6\xDAܾ\xF2\xF4P\xEAifbbK\xD9B=9=\xE1\x9D\xD4\xD3 +FP+\xD4Ө\x92\x9D\xF7\x87\xACm\x8A\xAB\xE2\xA7Mr\xE0\xF0\x8DԤ\x9F\x82[\xF7POq\xECڞM#^gJ\x82#(\xAB\xEB\x93\xBE\xD6ɖ\xA45\xB5\x83\x96\xD4<\xE9c\x8D\xCC\xEBY\xD4Pg\xBE\xA0\xED{9\xB2\xD3\xCDCo\xA6\x9F\xC69ƴ6\xA4\xDE +\xBE\xF8V\xAA'\xB1\x9F4z\xEF\xBCD\xED\xB5\xAB\xA7\xA41\xBC\xA1ݲ&Gf\xBD9_\xA2\xED7\xB4\xFD\x97s\xF5\xEE&\xD1M\x8B\xD2\xC0\xE4\xD7r\x85\xF2\xD5*{\x91\xB3\xF2\xA7q\x9B\x94f5\x80*\xFDab\xE4\xC8\xD4^\xDDXlU\xB0\x85\xFC,\xFB\xF9\xA65>\xAD\xF4MO^\xB6\xF1F\xC0\xA8<ݟn\x8D]\xEE\x8D:\xAD\x86ЇTO\xE2\xDCa\xDEod\xBD\xF1F\xEA\xA9qrDk\x9E\xBB7\x82Z\xA1\x9EƁ\x85l\x80\xB2\xAF\xFA|i\xC4:5\xAF\x96V铱#\xF7PO +x\xB5}*\xF8\xA1#\xE6\xE7c#\xA8\xF2\xF1y\xF4\xA5u2Z'[?1\xC7\xDB]L\xAC"\x93\xFB\x93\xD2\xD9\xDC\xD8-e\x80\xBA&GJ\xBABF\xC6;\xF7\xEEċ\x97\x9B\xE4Qݝ\xA2\xB3\xF2q\xBD*\xAF\x84V.\xEA\xC8\xEBI15Gz\xCCZM+\x83_\xB9\xA6\xB7\jۚ}X\xF5J\x8B\xA7T\x93Wci\xFB\xD6-y\xD9\xD5;ӟy\xD4\xD2hC\xF2J0\xB7\xC9Z\xFB\xF2\xD5S\xF3:\x80\x92#Kk\xB8uc\xA9U\x81Z\xFAJ(\x87\x85ꩌ\m\xBAM\xEE\xB5K\xDF\xF4\xA4VZ\xBD\xB1)\x8Dz\\xF5\xD2k\xECoTI\xB5\x84F\xD4S\xC47VO\x95iBӸ^ϫ\xE4\xF5\xD4a\x8F\x82\xF5\xA4\x99}\xEC\xD4 +\xF54e\xF7\xA6Uc!\xA8'pP^\xBA\xB7\xEF\xFD+\xE8\x9DD2\xD5kO\xC5JSd\xF1 \xF5D\x91\xC5:O:\xAEU\x86\xCA\xEA \xD7X\x98Ȟ\xC9\xEF[\xAF\x9E4\x83\xAEד\xF2[_\xCE妾4\xEB\xA7Sw\xDC`\xEC\xE9T\xAE"9*\xB3U\xE4p\x92(\xE3Ӆ\xF9e>\xE3kO\xF5\xC7CY\b\xBAڮF\xA5,\xB5"\xD6=Y>d !\xAD \xAF\xF9+3\x9Ec\xF09~\xBF\xE7OC\xC8\xB6\xB7Y{*Bw7'sI.U\xAEZ{\xAA\xAE\xBF\xBD\xFA\xD8T=%\xB7\xA7%[\xBB\xA3\xBC\xD4-r\xBA\x96'w؎c+++\xFE\xE5qX\x9E\x94M\xE3<䓕)4ėY\xB5\x8A\xF1\x97\x93r\x96\x9A\xB0\xA1z\x9Al\xDB\xC9}\xDCO'_+\xC7,\x81z:\xBB\xA8\xA7\Ii\xEBKF\xD2wPO\x9B&\xBD\xB1z\xDA\xD5!\x85\xEC+\xF5\xB4\xA3 +\xC9\x89п\xFC1c1\xCEtP?X\x8A\x9DA^\xDE+\xEC\x8E\xDD.\xBCR\xE4R<b\xC2s\xD6\xF5T\xED&\xECW\x91\xE68"\x99I%^\xEBr]y `#\xA8'+endstream +endobj +94 0 obj +<</Filter/FlateDecode/Length 2406>> +stream +x\x9C\xDDZ[o\xE36~\x90\xFF\xC0}\xC8@L\x93ԍBS\x93t\xB2\xD8v\xA6\x99\x9Dd\xFB\xE2\x85\xE2(\x8Evۑ\xE5`\xA6\xC5\xFC\xF7\xE5\xA1D\x8A\xB4MI\xE3\xBAX`[\x80\xA1)\x9DO\xE7\xCEs\xC8\xBD-\xCA\xFC1\x9D\x96\xE8\xFC|\xF4\xB6,\xD3\xE9S\xF6\x80&\xA3\x8BeY.\x9F\xDD~Ye\xA3\x8F\xE9,_\xA4e\xBE\\x8Cn6\xF7%,]-\x97eV\x8C\xC7\xE8\xE2\x87K4\xBAMg7\x9B\xF5*\xAB`\x8C_\xA3\xEB\xE2!+\xF2\xC5\x8D\xC7\xF0\xE6\xC5\xED\xE9\xC9\xE8\x8A"J1 \xD0\xED\xE3\xE9 ED\xFCO\x8B)\xA6>\xA2GL<y>=!h\xC3\xDFOO&\xE7\x84\xD0h\xFC+\xBA\xFD\xF1\xF4䝀@\xEF>(,\xB6+ +phaM<4h\xC8_NO\xFEyz\xF4\x8A"H8Nℸ \xE4W\xD1\xE8#\xC8\xF8\xE1\xF2? R\xCB_q">ls0\xA18\xF1\xB1\xCF*\x990\xA3\xECǾ\xC3(A\xC5l\xDF\xEA'\x90ڻLC歳Alqc2\x87\x98\x81\xF9 4$\x98\xF84F\xB7Ӊ\xC7|]BqLv\xE9\xA8\xE0+\x98ȥ\x86g\xB0\x93Dk\xF1Z\xAE\xBF\x94\xEB\xF5\x85X\xFFΙC\x88\xCC +\xDBJ\xF3\x9DJ\xA3\x90DS\x9AI*\xC9.\xCB5\xEFR0%T\xBA\xAB̩%\xE7L.\xAB%\xBEM\xEDR\x82J\xD7 +J\J\x88\x92+\x84{\xAE\xF0\xF6#\xE1\xA0\xD4TR\x87\x89B\xA7\x89\xA0$s\x99H\xA6\xA76cQ\xB1} j\xA46\x962ǎ\xB5\xA6\x963ChoY\xA0\xF1P3!\xF0ʀ;v\xE6\x96\xCBK\xC4Ƽ|\xCBv\xA9v\xE77혪\xD4cm\xFD\xBFى\xEAg`\x92\xE4m\xEF\x8AX\xB5Vڐ\xCED0\xB1\xA1\xE1KGNK\xB1(\x95\xBB-\xDDer\x91\xE3\xC0F\xDB\x9F\xFB-\xB3\xA3xnD\xAC\xA6\xC1\xB5\xFD\xA2l$nT\xB0\x9Avj\xBC\xA61\x91\xFCD!^\xDChL\xE3eg\x98\x85\xA6Ԕ\xB5C\xF9\xB1S\xF9,\xC0\xEC\x94\xAFf.#D>lP\xEA\xC4\x8D\xD0\xF9z\xF9,\xAB\x86\xF2I\xB4c"{\xD9\xE4\xB2vJ\xABzbQ\xA2r\x89JYAl\xB21z#\xDF\xFA\xEC\xCC31\x94\xF7ݕwj\x81] t\xE2ͳ\xC7Ϫ\xB2*D)\xF2\xF5 +\xAAC\x98\x89 +\xFE\@q\x95.\x84ψS\xA8+\xCD@()\xCF䗷K\xBA\xB6B0\xE4\xB1ضj.JQ\xED\xBDoj\xB9Ǫ~[Ú\x84\x9F\x9FI\xC1d\xDDw7p\xD6"Dx]h"\xF7\xD1}\xE2\xD2}(\xB4\xC5\xFDc+\xDF@\xE0݉H\xBCϝ1\xCCB\x9B\xC9$굎\xC6fo\xBDV\xB9X\xFB#\xFE덳\x89\xE6Oj}\xD1y!\xAFb^\xBD!\xB3\xCF\xF1\x9ALв\x92\xFC\xC9\xDEm\xB7\xD2:\xE9\xB9\xC3&LmM\xB47F\xC4i#Q~\xFA\xF4xB8 +\xFEDia\xB0٥Ig\xCAH\x80\xF9\x9FѤ[\x95$_b\x8F@\xB2\x91\xD2@\xAE\x83q\xA5\xF4\xD4d\x93MQ\xA5p\xF3nB\xBF*\x958\xD3o\xC9\xF7\x9Ft\xC4/U^m\xBA^\xA4\xC2\xFBIۧ\xB9}\x92\x99\xF7_\xE2\xE1;\xBD>U߭[W\x95@\xA1\xE30\xEE2\x8A\xB3\xB9\xA2\x9Cb\xBF\xC7uӡF\xB1\xF0\xCD\xCC\xC9\xFB\xD6K͡\x81\xBEёy\xF77wt(\xDC:<\xB8Fn媇\xFA\xBB3\xFD\xD0a\xFF\xAEÔ\xAF\xCB\xCE揊7\xF9\xB47\xB8Z\xADq\xDE\xEB\xCC\xC2Ҹ\xB6D\xB3\xD3j\xBB\xFB\xA8\x97\x9A\xEB\xD8\xFA\x98\x86o]%]ѡ\xF0+\xAB\xAD4\xB8\xAE\xA5\x9Bx\xCA+\xFA\xD6[ C\xD0I\xC5\xF3Z\xA7\xA9\xE9\xA7;\xFFT!\xD5\xCFԕ\xDFн\xD1\xD6\xFFn\xC3\xFAV\xBB\x99\x9D\xBD-\xF5\xED\xBE\xCFB\xABO\xDDjI\xCBJ\xF5\xB9ڢo\xD8q`\xFB\xB1\x98\xEC\xD4\xD9ERJp\x8F<\xDFz\x83mb\xFCeح\xE7\x94\xFBo\xB1\xCD\xF3H]\xC4u\xDDb\xF3\x9DkfU\xE2qW=\x84[\xECZ\xAC\xFA\xBBE,\x9E\xF7\xD9\xD6\xE1\\x8E\x98\x96\xEA2\xB6\xB3\xE41\xC9ђ\x97\x85\xF6~\x8Bm\xC8ڥ}\xF7\xAE\x8F~\xC8\xF6\xDD~\x83۠\xCAs\xC3\xCF\xE8 +:J8?\x946p~\x88\xE4Q\xC4\xCBF\x9B\x89\xFE<\x83\xB3C\x98\xC3uvլ\x8F;\xAE\xB1M\xEE\xF7w\xE6\xFF\xB8'?\xCD +endstream +endobj +95 0 obj +<</Filter/FlateDecode/Length 2810>> +stream +x\x9C\xC5Zmo\xDB8\xFE \xFFA\xFBe\x91+\x9E\xAC5c\x88\xC6\xFC\xDA\xD3g~\xB6\xD0\xF4\xA1_\x85\xA4\xE70\xCCa\xB8\xD2\x91t\xB9\xE3H\xBC3Lnh\xA5!\xFF\x99[\x86\xEC\xB7~Ł;\xF6Q \xDB=<3\xEC*\x908ԟnF=\xFCm\xE8z\xC0\xEDݙ\xB5j\xEF\x9Dg\xFA\xE4\xE9\x93H\xBE\xE9r\xC6%\xA0,s\x8E\xB6\xD6B\xB9ᨋ\xE4Q\x979aۻ\xCF\xC63\xB6N\xD0J\xBD\xD8{\xC8\xEA\xE9\xB2\xCER\xA6[䒈2Vd\xB3\xED\xB2\xE4\x86 +\xB1\xE6\xD9n(\xFC1l\xF7\x8D\xB7;0\xA8 Ln\x9CE|\x89-\xE2ě\xE2\xDC[U\xED$\xCEB\xABG\xB3R}V\xF6\xADs\x9A\xD6v\xD7[\xBD2ܡգ\xBA\xCAq\xAE\x87Μ +\xD5v\xB1z(\xCD\xE2\xAE\xFEm\xF8\xA1\xE8\xA7I\xE8s\x86\xA19\x90\x80\xDCc\xE7x\x88\xC4\xD2k\xF5\x9BW\xED\x83\xDB\xD9\xD4lO\xF5y\xA6\xDE9HC\xCFlw\xACb\xCFt`=\xA4\xECZ\xE8\x8D\xD3@\xEF +\xCDS-\x94\xBE\xF8\xBE'\xF7\xBAh \xF5bo1\xB9\xFEؐk<\x89Y\xBD\xE25U\xBF\xB9m&70\x9B|\xC1'W'\xF3\xF9\xB4\xCE`~\xB97\xBA[,p٬9\xCDav[\xE0\xABG\xF3\xAB\xFA\xAC1\x877Ƀ5\x9B\x93\x82\x94.R\xAC\xC4x\x88\x93%\xD0P\xD8\xD4\xC85\xEDr?m@ $oP\xCA$\xFC%#y\xB1=\xFC)\xD89%\x92\xC7\xD2P҃\xB3Kk\xAA*\xB0e\xA4\xA7'U%l0\x90\xB8a\x8B"\xB9Ţҹܣ[X+\xF5bo0\xC8\xFE\xA7Ӟ\xA7\x98\xFF\xCCoj\xB4\xB0\x8F\x90\xBA\xE2i\xEB\xBC\xFE\xFC=\x9Cjs\xCA\xF0\xE1\xCE\x97\xD7ǩ\xACG\xA4,c\xF57\x9F\xB4LB/T_\xF5\xBC\xBC\xB7\x8E^\x86\xBB\xFFR_\xC1\xEBe:\x9A\xEB\xE0e\xC6-\xC1\xCBn\x91\xF3+\xF9\xE8\xF0\xB7Rm +\xA4\xFCw\xF9N\x97:\x88\xFA"\xB5A\xAE\xFDFƊ\xA1R\xAB92\xA4\xE9\xC9\xDCR'ȺT\x8D\xF4\xE8/\x89\xF2$B\xB9"\xB2\x93\xC2<R^ 7\xA3O)\xB36\xB5ӣ\xD2Y\x8D\xCBK\x9F\xF8+\xBC\xC3\xC97\xA7v\xEB\x85\xFB\x96L\xEBO\xC7O\xFC[\xE6>\xCE-\x9C\xA7\xC4}ء\xD6l\xBE<9cx|-X\x9B\x8E/Y/2\xCE \xFF\x86\xBCc\xC3\xF1\x85\xD2P\x92?\x89\xC6 `[z3\xB3\xBDu\xA6\x9B\xAA +\xF8\xF2'x\xC1\xA6-'\xCB4\xA6P\xDE\xD9\xF2\xFD\xEF\xBAZ\xDE\xE3N\x8F2V&;y +7\xCA\xD8\xE2[\x8Ad\xD1\xC2r]\xDDU\xABʠ.\xD9*s\xA187\xE5\x94\xE2\xA5)\x9B\xF0\xE7@S\xA4`Ε\x9BTzR\xDA\xC5e\x8FRi\x98.\xC1\xAAXԠ\x84\xC3`m_T +\x86\xD2\xEB\xE9*r\xE5\x96V\x86\xAD0\xE4\xC1\xD0i\x82^\xF4\x9ER\xB5\xA8\xB0\xAE\\xC1T \xAEq9!\xDDDYt\xF1 \xA0's\x8B\x9CtJfѕ\xEE(\xA4\x80\x85H\xD2|\x96ÄZ\xA9\xC8\xC0+f9\x94cU\xA2\xBF\xD2.tN\xAC*k\xE3J\xC1\xC1\xAAʊ\xADr\x98\xBCO'\xAD\xA0\x91\xD8\xC68\x8Bd\xBDXHN\x8A\x90/\x86\xCD0\xA1\x80\xE0D\xE6<\xE6C\x9E\xC3\x83̉ΊC\x86\x8B\xE0j\xF5m\xFDYp\xE0G\xDB\xFCos\x92\xA5\xB0\xA3\xE8\xE1\xD2\xF5"\xDBK`陎6\x9B\x92(\xEF\xB8'\xB8䓯\xCE\xCBT\x89\xA7}\xA0M\xEA 4\xB0\xA5r3WՃ\x99p\xA99\xAD\xA3"A\xE8'\xAAD\xBB\x99\xCC\xC8*K#K\xC8K`\xFA)\x9A\xA8\x84\xF50)\x91ҧ}\x99Cc`E6\xF5\xE4+\xBE4\xC1U\xE9 \xABx\xC8\x86\x83֏\x95F=R\xFA\xE8}\xD0u\xF9'0|MxpK.j\xB4\xA4Pl\x87݊]\xA3\x86Z+:\\x8F4\xB5Vm\xB1\xA2\xB6\xA3K\x91T\xB4ފ\xE0\xA9\xF5k\x92\x81B*\xB1\xBE\xEF,Y\xFD\x8A%( \xF6\x84\xA6vdPР\x8C) +k\x95:\xA0\xA2_ϭQ\x8A\xB2\x96hb\xCEC*\xD6@\xF2\xA1s\x90H\xAD-bM\xB2R\x92\xB0NE\xFB|>k\xF3iBEI!x\xCC\xDAn\x94\xD0\xF11b\x88\xC3M`\xC2psȢx\x93ʁ$t"\xE1\xB7>\xEAԑ\xC8Q\xD7!\x92Q\xFB\xA02\xF5mq\x8C\x96p\xCFw\xE3X\xC7@\xA3\xCF' +("\xB0^E\xB98D\x9F\xC0DS\D+k1@A\x8CU8)\x82Xe?\xB8\x80\x89\xF6=eի}\xCEH\xE5\xE00l\xFD\xD7I\xBB>l\xDAġ+\xEF\xC6\xEE\xA3ܚ\xD8@!-_\xBB\x83\x95\xEAƞ5\xB1\xC4\xD1y76\xF8\xF7\xAE[/ +\xF1D\xF0\x94\x89 +\xABD\xF0Tk\x82w\xB7\x9E\xBC\xEFX\xA9\xBEn\xBA\xB9\xAF\xBE4\x85\xB2\x86$swY"50J !M\xE6\xD6(%\xB3F)\xA95Jɭ\x89I\xE68\x84\x95\x85\x93\xBAY\xA3.}S;:u\xED\xD3^\xBBj\xD9\xDA$\xCA0Y\x9F{u\x96\xB9+"\xC6-"P\xB2eFiN:\x89\xEA\xE9_\xD9d\xA9c^V\xDC\xF5bd\xA7ռ\xA8\xFA\x8A\xF8\x822t\xDC\xE0-[h\x9B\xECvUڀy\xAF\x93z<_\xD4\xD9v$.\x92\xFD\xF3\xB3\xB5H\xC4\xBA$\x9B]:\xFD\x96\xAA\xA3\xCB\xE9p\xF1W}\xE5t\xB1\xA50+7\xE1\xF6\xC1\x92$w\xED(\xE1&r\xC3/\xD3a\xCA\xC5-\xC5\xCBj\xB6o,\xDF +\xB5d1WB7\xB8\x8B\xDA\xE2äY\xF1\xF7&\x9F\xE1\xC66x\xE4\xCE[\x92깟b\x84R;\xEAE\x97\xFC\xB2\x84\x86k\xB6\xF2\x81yߠ +endstream +endobj +96 0 obj +<</Filter/FlateDecode/Length 1704>> +stream +x\x9C\x9DY\xEBo\xDB6\xFFn\xC0\xFF?\xCACB\x8B\x89d\x90ȫEd\xCB\xD6+\xA8\x8FN\xC6\x8E\xB3\xF5X\xECn\xF9\x8F\x99 .\x91\xFA>\x93\xC1g\xD8:O\xB7\xDB١ֳ8\xC8`ن\xFE\x9D|K<\xD29\x9Eظ\xD2}\x9ApQ\xCDܵ\xEF\x83{\xD8ԁ +\xD3\x83-5\xA4\x84}\x87\xA1+k\xFE\xDA\xC0.8\xA3J9\x92\x8FC\xF2\x93.\xF3\x90\xCD\xD7T\xAB\xFD\x8E \xA3\xC69.9i(\x98"7\xCB\xE8\xAD\xCC\xFB\x99\x8FW\x85TEoh\xB9ڛ\xF5|\x8E9>\xC7Bb\xA8\x89|Ni*{q4.\x9A\xB7D\xD7¢0#1\xE3T\xC6`\xF4\x84\x88!V\xA38\x94\xE1\xD9!}""\xC3h\xA4+\xA8\xC0l\xDC\xC2\xF5\xF4[\xB6J\xB7Od\xC6x\xF0\x8A\xC4\xB4Y\xB9\xBD#\xE2e\xB4#\xAF*\xCAPͻ\xAAXM\xC8+\xAB\xCA\x8C/\x908 @Ɋ\xC2\xFF\xA4\x8A\xEC\xD2 +)K\xE8\x862|\xA3!\xAF)w\xEF\x97\xCF{\xCFc*\xE8\x9E\xE1")|\xC1 +iUA\xB08|\x96\xE7З\x9D \xB3q\x87a\xACf\x87B\x86\xCF3]v\xF3\x98_6\xB68|\xC5a\xE9|\xDC\xC2_\xF6[\x86C\xDE,\xB5L\xAFj\xCB$vP8\x8E`\xFE\xB1\x99\xDF}\xB4\xD4A\x87I\xCF\xE5\xB7>\x93\x93\xA8a~\x88ɔ"u0`s\xE6B8jn\xE55wSa\xBA\xE6>\xCF6E\x9E\xDD{v\xC2e겎Z\\xC74v\\x8B\xB7mܶ\xB8\xB5\xEC\xCE\xE4\xBA\\x9A\x97S\xED\xA5m\xDB\xD7Ce|\xBD\xAF\xED\xA3\xD2R0<\xF6l,\xFF\xBF\x8D%\xCC{9\xD1\xAA-\xAB\xA5w\xE6ԥ\x87\xB49+\xF6Jj\xCD\xE9\xF3i:\x8Ec\x90Q\xFF\xD1^\xFF\x91\x92Ƣ\x97}\xAF\x9E \xE1\x89\xFC\xA7\xCD\xFAr\xC62^\xC7붣\xC2(\xB0\xA8\xF2\xA9h\xB2\xA8l(\xE5Æ\xC5/GjO;\x97\xC1P\xD6^\xF9M*P\xEAǪ~\xAB\xEA\xB9\xCE,\xD6s-\x8D\xE7s\xDF:\xC4\xEB\xF6'4\xD2\x9C\xC0D\xFB\xAE\x92P\xD18\xFA\x89\x8D8\xAA\x9A\xE1\x8D\xD6[/7\xCE\xDF\xDFg\xDDO+X\xF5\x885\xCC=u\xF7\xB6\xF7\xA2y(f\xAE2\xE3(uC%\x8APㄪ\x87\xE2\xE5\xF7"ݬRDq5\x80Ѥ[\xF9a\x8BaQ&\x9E*\xA8\xABĶ\xEC\xA4I>\x9B:\x8A}H\xA9\x91%\xEA\xEC9\x8E\x94\xB7僶\x87ʞ\xBFU@\xAD)\xF4\xBBm\xE9x\xC9zc\x83\xFA'\xFB\xC5\xF6OG\x8F\xB6aAT=\x94\xBD\xEE\xF0\x8A;\xA8\xFB\xA6\xE7\xE6\xDB\xD1cE\xE9z\x95y\xF6VHP\x9C\xC0Ie\xF7\xE8ý]\xAA\x8Ca\xEC\xF9\xC7\xDBͷ4/\xAAS\xA7+Cy?\xE0\xAE\xF3\xEC!+q\=UMw\xE8\xCDE\xCB$G\xD2*y[g\xC9\xD5@-\iT\xDAjRo\xDDYeƶ\x90=\xB4\xF1vv\x92E\xF8b\xD5\xD1\xE6,\xBD\xCD\xF2\xB4\x8E&\xAF.廈#b]\xBC]\x82\xE1l\xACW\xA2\x97\xF5\xCB.\xB2\x9BZݛ\x86\xA4\xB2\xB5ŕEm\xAB\xFE\xEBuvj\xACb\x86a+\xD4\xF9\xD2)\xBD\x8D\x88\x80T.{\x88\x9F\xDEi\xDEz\xFE\xA9} \x9D\xE7\xDD<\xFF\xF8\x9Fz\x98Ƨg\x9F\x97\xCD½œ\x80\xC6B\xF5\xCCr\x9A\C\xCA\xC9Q\x95\xE8\xB1H\xF8\xBD\xD6Ɛ#i\x95\xBCՈ\x80f + +\x9B^\xA5\xAB\xF5\xB2\xAC眷\xB4\xF2h^˼Z\x82z!w\x85\xEF\xA1%w\x9EU\x87~T(u\x8E Z\x86|\xC7\xFF\x9C\xCC\xF0I\x84\xB79\xEEG\x80q\xBD\xEB\xBB\xF7V\xD7\xF8J+\xF0\x994\xC2e\xDB\xDD\xC6$O\xA7\x93\xBF~!\x9B\xE9/&\xC5K\xB5\x80\xC4J\xC4>\xCCb\x81\xA9\xC94\x9B\xBF}H\xEER\xA3\xC8EF\xEA<\xFE6\xCASC +endstream +endobj +97 0 obj +<</Type/XObject/Subtype/Image/Width 818/Height 288/ColorSpace/DeviceRGB/BitsPerComponent 8/Interpolate false/Filter/FlateDecode/Length 14977>> +stream +x\x9C\xED\x9DK\xAF%Ev\xB6\xF9]g¯`̤u~\x83\x9E\x941\xF2\xE40\xC0b\xF6 +,\xA1\x96J2\x96\xB1˲,\xAAv\xD9mWw\xC9\xC6PE\x8BPB\xA7h\xE3jnvk;\xEFqYkED\xDEvG[\xA5:\x97\x8CȈ\xCCxs\xC5ʈ\xDDn[\xFC\xF8㏇.T\xEC\x97\xDA0\xE3%\xAD8T\xAF\xCB?o\x93@+\xB9\x8D\xB2\xDAW\xA9o^ߘ\xAB\x8D\xA4\xCBU\xAEʶ\xD4\xEBJzNc붚>U*\xAF\xDB\xCA\xE6\xB5 \xC0\xE3\xE8'A\x95\xA9\xA1\xB6(k\xBD\xCD\xC6\xE6q2e\xB3\xD5r\xEA\xEBp\xFDH\xEFF\x81\xFAD\xC1\x83\xDDx\x9B|{\x9E\xBF\xF5f\xD1K\xB7m\xB5p\xAFP\xC9$\xCBl`\xA5M\x9F\xD7)m\xB9\xD3 +m$\xAB2\xB3Fͨ:\x8C\xD4E\xB6\xB2d\x99\xED\xAB\xD77\x9Dvt\xF9\x97\xAE\xE9\xFCퟑDi֞C\xF4:\xA3F\xF9=g\xD7\xF6?(Q\xAA\xE0\U|\xEFe[\x80\x88'\xB5\xC49J%\xB4Ue\xAE\xAF\xBF/\xD2ڐJ\x89\x85MU\xB69\xA6y\xFBF\xB6h\x89fO\xEA\xA7t\xE6s[#\x8AH\x8C\x8F\xC1\x80\xE8\x8Fbv\x99U\xEC\xB4\xE2y՜\xFD\xEAGi\x95\xDAI\xAA,]*/\x9FU\x96n\xA3\xECqY\xC8*60\xBF\x8D\x84<\x859\xBE\xA5f0\x97\xE8u\x89\xE5\xF6\x9C\x9D\xD0\x89R\xCD\xD8\xFA+\xA82\x804\xCA\xCArh,˜\xD50b\xE7~Tx\xCF\xE1\x8CY\x98)~G%q\xB1\xD5Q\xF6|\xA5\x80\x9D\xD6<o\xFC5\xAB\xADʔS\xF3+\xB3\xAD\x91\x91\xBDn\xE4\xACq\x81oX\xA2\xBEf\xDA)m$\xF8k \xB9\xAD\xAD\xCA\xACQ\xC1\xBC\xB9\xE8Wf\x94*\xBDK\xEA\xEEn\x95\xFC\xB8K +p"\xA9\xB2PgIng\xBD.˜\xC2D\x95\x9D\xDEgt\xBBxL\xBF\xEF\x88l&\xFBg~\xA8\xC6,V\xE7\x9C\xA72ʬb\xA6M\x8F\xCB};\xBB\x93\xA6ʼ\xC8.\xE2@i\x96ʽ\xB0\xD5\xFFo<x\xEDF\xC9©62[A\xAD\xAF\x9DvRI_,\xA6\xE74\xB39@\xAF3k\x94\xDBsv\x92\xA8N\x95J\xF8\x84\xC1\x8F\xAC\xB6\xA0\x93|\x82\xEF(\xC0)P\xA6\xCA\xFAc-\xE17\x96\xDE~KY\x9F`\xA2\xCANɩqka\xF9\xFEE\xC3\xE23J\x8A9gX\xA6\xACߥ\xA6M\x9D7X\xAA\xB23\x84\xFA\xB6\xFF \xB6\x9D\xD8\xFFǽbV\x8D\xFC\xA5\xEA\xFC\xF3\xA6\xC8i#\xA5}\xCD\xFA&\xD2&j\x94\xC0\xBB\\xD2\\xDEU\xA6\x95y\xD9^g\xD4\xC8\xEE9QLs\xBD2U9ӊ\x80\xAD`\xA0\xCA+\xFD@RY\x85\xFE\xFF\xA82+k\xB7~!U\xF1\xA2b\xFE2o\xFB\xBE\xDDI\xF2\xF6HQ\xA8\xBB\xA3\x92\x87\x93^ߏIU\xB69\xEE?h\xEE\xB5'\xEF\xDCk\xFE\xB3\xBF/ +z\xFB\xE3\xAF\xF6\x92\xEC\xF8\x85\xD9\xF2\xAA\xAC\xBD\xF1\xF8Iq\xB6\xCFߺ1.ᩑ\xDBF\xF7\xAC\xFE\xDCV\xDBUq\xA8\xFE<\xB1\x8D\x96UV\xB1\xE1\xBB{g\xD6wT\x94\xBE\xC1xjKK\xA3L\xEF\xAF\xFA\x8F\xB40C\x95m\x8D\xBD{\xB1\xD6 w+Uv]u-\xE1\xEES\xE8\xACd77?\xBF\xF37՟o\xFC\xE7(\x9B\xDBX\xFC\xC9<\xFEa\x82*k\xD9\xF0s{\xB3#\xBE\xCCAK\x85*;.DU6?\xBE\xBBmF\xF4\xE7VA)\xBB\x93ۡ\xAF\xE1EN\xA4n@\x95m\x93\xF6]\xB8\xF0u\xF8\xE1\x9DH\x835:\xEDα\xCEt\xAC\xA2\xCAƽZ\xA2\xCAZ6\xFC\xDC>\xB2U\xE6\xB2\xCD6\xDA\xA82\x9B\xE2\xFE\xDC&Q9١~\xB4\x84(K\xCA2T\xD96\xA5ʮoV\x86\xB2働\xDD\xECޝo[Z8\xB9M}\xBA\xEA\xEE\xD9\xDE{\xB5Qw\x8E\xD3Zg\x91\xB3\xD2\xD6 \xEF\xDDy<\xF1\xE9\x95Ӹ\xFBg\xC2\xF3\xC6fXzA\xD2>媬5f +\xBF\xEE\xD9\xF5\xE5\xE3_\xD4y:1\x87SDO\xB9\xBA\x90^\xA5\xDCb\xCF;\x81\xA2\xE6\\x95\xAAz\x829\x82\xEB\UJ\xBE\x98\xB9m\xA4>\xB7\xED\xFA:\xD9f_\x8Dd\xC5e\xF6\xB8d\xCFS\xAAd\xE6\x89+Y_@\xF7\xA7L`\xE9\xA5\xF2\xB1\xBD\xE9\xFE\xEC\xA6#\xDB\xE4\xFANn#\xB3\xBE\xEA=h\x8A\xC0\xF6\xF8\xC4\xD6_\xE7\xFE +.ȴ2\xD5\xDDm\xD77\xB7?8J\xD0]v\xA8o\xDA\xCD\xEA?u\xDB?&\x82*\xDB\xE3g0kiT\xC9!W#\xDDy\k\xB0^\x95E\xBF^\x98\xC5i\xA1\xB8\xDA\xE7\xF6\xE0\xA6\xA1SVz\xDA6\xA1\xF4˙W\xED\xD5i{\xDF\xD5\xF7~\xF1b\xFCĈ\xB8\xF6W0\xE8\xE8\xEFb\xFD#\xAE}|y1S\xAA\xCC\xFB\xB3\xEEs=ح\x9C\xC5\xEB\xEC\\xB1\xEBל\x9A6\x91\xFB\xD0\xDC6\x92\x9F\xDBv}\xAF\xBF\xE7o\xBDY\xA4 +l;\x8CQߌ2\x8F+\x95q\x9A\x9B\xBD\xFF\xB3\xA0\xB7\xD7}LP\x92z\xCF \xCEU\xC5\xF7\x86ׄm\xA1\xEC +{\xA3Y_\xFB\xBC\xE9>i\xD4W\xBF\xF5\xE5RG\xF4Ƙ\xD6_\xEC\xFEmj\xE4?(\xCA\xEE2\xA3\xCCGyw\xE7\xDD\xDA\xCAb\xEF/u\xDA\xD1Pe\x81 +k\xFEn\xA3V\xFF\xAF\x83\xAA\xF4\xA8\xB2cc\xAC\xB7c\x83\xBA\xF9\xF8\xFA\xA6\xA7|\xAEcU\xD6ڸZ)u\xEFηBn\xAD\x9A\xEA4\x9B#\xAE%֜%\x9D\xB6K\xB8O\xD5l/ƚ\x83\xF9\xAA̩\xFE\xA8yú\xBE\xC4f\xF8\xFC\xF4G\xB6*\x8BB\xA5\xC1bv\xCE\xD1u\x8E-x\xBE$\xC8m#\xA9\xF5\xB4G\x89?\xA8o\xEEX3\xBETBy\xDC+P\xD0ۣ2L\xBE\x92\xA9;k\x8C\xAD,Q_\xFB\xBCv\xE5\xD4W\xBC\xEB\xFF8ܱ\x8F\x85ק\xBC\xF5\x97\xBDo\x84\xF2o\x91{4w\xB7z^\xAB\x9C\x81\xD0*\xFAS\xCF\xC6Qe\xBD$ۡʎ\x9B1\x9E\xB7\xEA\xAB\xD1Zw\xAE\xE5s\xF3\xF1\xF3@\x959Z\xA8\x95I\xC6Dd\xA4\xCAdf\xA4u\xD80\xC1Z\xA8\xCA<\xCB\xF3o\x93C\xA82MH\x9B\xAAL\xD0Bʫ})\x89\x9C3\xE6U\xC3\xDC\xF4\xF1Qi#\xA1\x92\xF5m\xE7)\xC6>\xBA\xF3}\x96\x94\xFA\x80\xA5\x92\x86!S\xB1\xEB\xBD=\xCC*q%3\x8C6\xF8\x95\xA5\xEAk\x9Fwҝb܃\xC3-ߴcs\x8AlUf\xB5\xFE\x9A\xF7o\xB9\xAD,\xB7\xC7\xCBݭ\x9D\xB7\xA1\xA0?_\xA61\xD7\xDE\x87:\x84\x86\xB2>\xEDmG\x92\x89\xD1"Pe\xA7B\xAB\xBE\xEE\xB4b\xAC1\x9Du^d\x95@RUYs\xA4s\xF72U\x99\xB2Ȇ\x91vvU\xE6\xBE\xEA\xE6r\\xAA\xAC\xD4#"\x8BD\xCEI\x95{k\xCFm\xB9\x8D\xB4\xE7v\xA2\xBES<\xB8RecK%v\xA7\xF4vQ\x95\xB4\xAFR\xA3T\x99Q_\xFB\xBC\x93\xEE\xE3\xEC\x83\xF6%\xB9\xF1\xE0\xB5\xF5\xFFբ\xB5\xFE\xB2\xF7o<a\x9D\xADʌ2W\xE7ݝQ\xFE\xAC,9\xF6\xCBVR顡X\xD5V\xE3\xDC\xEF\xCD\xF9Uv*Ԛ\xE7o?T\xD9\xE3\xFE\xCCH\x95y\xCBhx +m\xA7\xCD`ʪ\xCCJ\x8B\xAD,\xA0\xD40\x89\x9Cm\x95\xD2<\xB4\xB3\xE7\x92&\xBDM\xABt\x9EB%\xDFy-\xA7\xCAF\x95j][\x99v\x85\xA3\xB7\x95ŧV\xA5J\xBBj\D\xAA\xF2\xEC\xF3\xE9\xBE\xF0(n\xFDe\xEF\xDFi\xAA\xAC#\xEA\xB1G{wk\xE7mߟ3\xBE\xB2Ck\x98\xB2\x9AF\xB1(C\x95\x9D\xADM\xEC\xA1\xE4]_\xEB\xAEP\x95\xF9\xDFB\xFA\xB3\x99\xFD\x87\x96%\xAALL;\xB7*\xF5\xDCے*\xDF4\x9B\xEF\\xFF\xAE䓤}\x82\x95\xDB\xCEټ\xCE\xCD\xFBl\xAA?\xB7N\xD9\xFCN\xB1#\xCAT\x82\x97\xD1\xC8ydѯ̸\x92\xE9\x8A\xE4\xF9\x95\x95\xF5\xBAD}\xED\xF3\xA6=0S\xA5U\xEA[\x9D\xB1\xFE\x90\xAA\xAEK\xF3\xC1\xDD\xEA\xFA\xE4( +\xF9D\xB0\xC8\xFD^I黉qe>[=o͚\xAAL_֗kY\x9AUv:\xF4\xFEc\xBD\xE5\xEAq\xEB\xF6\xDF.V&\x83\xD9I\xA3\xC4\x9A\xA6*\xB3\xD2Ϋ\xCA\xEA?\xCBE\xD4"\xAA,~\xC7\xEC0U\x99W\x98\xF0K1\xC1KY\xCB\xE1\xC5Ruj\xE6\x9C\xF1 +Bw\x95\xBA2k\xCFm\xB5\x8Dt?d\xB5"\xFB$\xCAG\x99hm4I\x95M)\x95\xF4M\xA2\xFF\xBD[^o\x8F\x87\xB0T\xCF\x9C\xE7\xFD\xC8jvJ^\xDC\xEB\xCC\xFA\xDA\xE7M\xB4\x91]ߴ\xBD\xBA\xB2\xBBI\xB4<\xF6D\xEB/v\xFF\xBA'\xAA\xFE_Ͻ\xE6\xAA2\xB3\xCC\xC7{w\xAB\xE72\xB3\x84Z\xA9*\xD3e^ +a\xD2SUv2t\x8EdZx\xAC\x9D\x82\xC8\xCEǛ{A\xBC\xF2\xFCʌ\xB4UY\xB0\x90Nٻ\x8F\xBC\xFC\x85\xE3OPe\xBB\xD0#ç%L\xD5-\xA4\xAEW\xE6=!;\xBAq\xA4x\xAED\xCD9k\xBD\x8E\xE16ֆ\xAETv\xA5[\xC1\xAA\xAF\x85Ǵ\x94\xD8F\x89\xFA\xA6\xCA<\xA9T^\xE6Қ`9\xBD]6,$z\x8E\xDC]s#\x8C\xEDuF}\xCD\xF3\xAE\xEC\xE7\xD77m\xAF\xB5\xE2|\xAD\xBF\xD4\xFD\xEB/b\xE9߃\x93\xCA|\x84wwγ=\xA3\xC3oT\xD9\xC90,\xF4*s\xF4\xBB/A\xCF\xE8\xD7@8fYU\xA0u\xD6 +\xE1\xFET\xD9\xE9\xD09t9\xBAk\xAF\xC4\xFA%\xF4Qe\xA7\xC2\xF8U\xD6\xE1T8\xC07\xC1\x9A\x9F0\xEE_0A\x95\x9D\xD2B\xFA\xA8\xB2Sb\x8E~\xE0(y\xFE֍~ +fe\x81D\xAF\x9B\xAE$\xA4A\x95\x9D\xDEj\xAE\xAE\xE7\xAA\xE0\x98q=|\xB0\xB4+A\xA8\xB2\xA3%\xD3\xDB\xFF\xFE\x83_\xBE\xF7֗\xAB+\xAA\xEC\xA8`A+Ȼ\xBAz\xF7\xC8;62\x80-\xD1\xEA)ewr;\xB4\xA3V^W\xB7\x95\x8D\xAA\xEB\xC4M\xE8?\xFD|\xFF\xC1\xA7\xEF}\xF4\xF9\xD3o\xBE\xFB\xEE\xE7?\xEF\xFF}\xEF\xA3\xCF\xF6G\xF6\xC7QeG\xC5\xAA\xEC\x98A\x95\xC6KdVN\xCEU61^\xC4A+)\xE8\xDEM'\xEDM\xB7\xCA~\xCF\xF1\x93\xDBwY\x82\xDCV-\xCBPe+[΅=Dʹ\x95˜i\x8B\xCBm\x85ѲU\xB0!<5I+;t\xC0\x9E\xBD\xEC\xFF\x9B\xC4\xF5w\xBF\xF9\xF7\xA7\xFA\x8B\xBF\xBC\xE9\xFE\xF6G\xF6\xC7Qe\xAB3\x8C\xAD\xF4j\x97ƥ*W\x95Ii\xC3S(cPB\xB39\xC7\xEF\xDD\xCC\xD2?\xAD5c\xB0c\xB4\x83i\xA3\xD3:[G7wB+\xA7\xCC]ڮe3\x98\xE6\xD8\x8D\xA7\xB1\xD2*\xF3\xF6\xEF#B+1t\xFB'\x89\xD2*e\x90\xB2\xB4k\x89\xB0\xE8\x80*5\xED^g\xB7\xEF\x94\xD6o_"&\x9Bp\xED;\xA5\xA8\xE7\xE4\xB6\xC2n\xAC\x83\xD8b3\xE0+Kܔ\xA3\xC8\xDB_\xEEuv\xFBNi\xFDě\x82\xAF\xEE\xFA-\xA2\xCA\xE6\x9D\xC0D\x96l\x97rU\xA6\xCAg\xB2<Pe\xAB\x93\xF8:\xCC\xFC\xEA\xD0N\xAB|+g\xCF\xF8\xE3\xA3\xE4\xC6S\xA0ܳ{c\xAEX\xA3h\x88\x97Ke\xCER\xA5\xD8\x99\x86\xC7v\xAC\x8F"\xD4(le\xDE\xF7|\x9DOSe\xEA\xC7\xA20k\xE4V\xBF\xFA\xFF\xC5\xE5\xE5E\x90\xB5\x96~L\x8F\xCDM\xF4X\xF3\xFBͬo\x99gQe\xFA'\x98c\xC4Pe+\x96\xDE\x80M\xC1\xDD='Ҫ+\xED\xBF\xB3$\xDDI\xE6N\xE3C\xA8\xB6\xA5R\xA3\xDD\xB3C\xDC+3Uv~tO\xB3cz\x90\x8D{n\x97\xC6SN;\xFF\x83\xB9\xB5\xDDY5\xDE%u5\x8Eo`O\xB6/ww\xE1iO\xEC\xEE֣L]c\xEFD\x96\xA4\xCA\xECP/\x96\xBE+f\x860C\x95\x9D\xD5\xCDyy5r[\xE5m\xB1\xE8s\xBByf;\xA9n]\xCEv\xC1Pe\xEB`]\x8D%\xDBw9rt&wwf\xE6\xA7ww\xDBx8شzJ\x91UvhGmӔ\x978\x80*;7\xEA\xC7\xF6\xAD\xF1/\x98[b\xC1\xE7\xF6\xB2\xD7U\xB6 \xC3\xC1\xF6\xFFD\xFBrwϚ\xF58ww'\xEBuc!z\xB9%\xEA.;ԏ\xA6\xEA\xAEZ\x95Yv\xB6Tٙ\xD1>\xB6\xD5\xFB\xB3_q\\xB4\xEA[\xA1\xEE|@\xFC\xE0pS\x85Z\xD3]\x9C\xE4\xE2G}ie\xCE\xD9G-X\xB7ǡ\xA1\xF6\xAE\x9FG\x98\x81T*a\xA2\xA7\x8Dzy+/g?!\x99\xDD7B\xAA\x98gU\xEAj$\xDA7\xEA/\xFE\x81ni\xE7,N\xA3ءz\x99w3\xF5\xEE\xEET\x99O\xF6\xEE\xCE\xD8]U\x97eg\xBEњ#\xB6\xDDe\x87\x8A\xF1b2-e\xA8\xB2sùo\xE3[8\xBA/=\xAB\xBE\xEA\xDD\xEC\xD1]\xE0\xD1\xF0\xE8\xEA2z\xF6\xA8\xA1\xE2\xDCcγI\xF3\x9C\x90EF\x99\xB3\x8D\xFB\xD8\xC1\x95K%8\xDF\xCA@\xF3J\x8Ag\xF2\xB2\xFD\x9E~\xEB\xD2k\xDA0c\xBBo,\x85W\x9Bxذ{\x9Dr,J\x93\xA1\xCA\xDC\xF6\xCFb\x87\x9Ae\x9E\xD6s\xB8\xBBգ\xE7qwg´H]\xB7=OY橩HZ١\x8A\xECr\xBE\xC0\xDB"\xBCgu\xF0\xE0\x9E\xE0\x92\xDD\xE9\x8F<ǖY\x9C\xF4\xE7v8\xB6\xC4y\xA9i\x952'^\xA6\x85\xB3\xB8\xB9 .+\xD9O\xD7ĕ\xDC9C\x86\xFCn;\xD3\xECI\x90\xCD\xF8\շ\xFCM^ +\xFF\xEF\xF4\xB5\xD2ʝ2\x96d\xA92\xADۙ\xA1v\x99\xA7\xF4\x9Cwwf\x99O\xF5\xBF\x88fP;c[Y \xB4\x8A\xFEԳ\x89i>\xC8į\\x82\xD2\xFBs\xCE\xC7vx\xA6\xF6\xFD\xD2t\xBBcz\x8F\x8Fe\xBC7g\x94\xD9~n\xA7\x8C2\x891]\xCB"Y*/\x92&m\xE6\xF2i)\xE8\xCBa\xAA\xB2\x9Ck\xB5\xA0*\xB3Gu%4Q\xE6 =g\xC7ݝ[\xE6S\xBD\xBB\xB3Le\xD9\xD1Ή+\xC34\xB9\x82i\xDA+o~2\xA9\xDC*PegD\xF8\xF0\xEEq\xFBf5C\x9D\x89j\xEDyb\x95@y f?\xB7\xB52g<\xB7\xC3\xC0`\xF2h\xCAs;q%\x87hR\xE7\xB4jeO\xF9,\x86e\x84\xCA\xEEu[Sez\x99'\xA92\xEE\xEE\xCC2\x9F\xEAݍ*\x8B\xB2\xE4X\xA5\x9Fn\xFB\xEB\x8D\xA1\xA1XK\x9B\xC1Pe\xE0\xA1<ڛ|i\x95\xEE -G7B\x97\x9BC͙\x82\xD5ަ\xE5\xC2]\^\xCAC\xCBHU\x8DTs\xD9\xCA&\xCD`F]־\xAA\xCAٵ\xEB\xACWhM[Y\xC1y\xADqw\xE7\x97\xF9D\xEF\xEE\x893\x98Б\xF1\x95e\xDA\xCCM\xA6\xBF\xAE\xCC3\xA8\xA1\xCA\xCE\xE9n47Qj\xF3u:\xFFF7Bd=\xB7\x95Rji\xF52\x9B\xEF\xD3\xC2\xE3o\xAEy\xA8\xE4\x95 +\xD6\xC3a\xC7 \xA8\xB8\xBA\xC2$\xD5\xEA\xEFa&\xA3שW\xA3\xCC^\\xEA\xF1\xAA,Q\xE6\x89#>wwf\x99O\xF4\xEE\xCEV}\xBA\xC1\xB6\xA3\xCAJe\xAC"=\xF2\xDDOs\xF8\xA3\x91>4y\xA1\xF6 \xB7O\xE9\x85O;\xD4,pL}\xEB\x9E\xE3\xF4\xEB\xE5\xE6\xD4\xD7?\x934\xB5\x96Mԓgȅ>T|r\xA7f\xE7d\xBC +u6 +\xBF\xF2V\xDFX\x88\xC40\x93QU=J\xBA}ۿzk\xDF\xAA\xCC.\xF3\xF8\x9E\xC3\xDD\xCDݝu\xEB뽳7\xB6\xAE\xFE\xF6\xB55JU\x99a(\xB5\xE1\xAA\xEC\\xD0\xB8\xE09\xE9O8ɏ:%4\x9CB\x89|\ĐT\xA8<1\xEA9c;m\xAA\xCCQ\xB00I"e\xBE\xE3\xEBS)U\x9B@\x88)>\xBA\xE5b\xAB\xB8'ݟ\xB0\xCAC\x9A\xC7)\xCDv"B\xCD\xB7\xA0]l\xA3}\x9DT\x97\xB7\x82\xB1l\x8A*3\xCB<\xBA\xE7pwK\x91\xCE\xEF\xEENZˬ\xF6\xF43\xAC\xAA+\x9BU+\xC23<\x93\xA59\xEA\xA817\xB5Z\xAB\xD3?\xAD4r\xACX/\x83\xCA\xE6\xCE`\xFA9'\xCE\xDB_j\xA7\xB4\xF7n\xFA\xA5\x8AdX\xA3;Zg\xF3\\xC8&\xB7\xA0\xA7\xC4Yf\xB7\x91\x8D\xD4~G\x99\x90\xB3q\x8E\xEEX\xB4\xB5y\x9C\x97\x9AV)s\xC2T&\x9Ce\xC8\xCDI;(,'o\xB3\xCCf\xAB\x9B\xF3\xB7\xDD +vZ\xEB\xEA\x8Cs\xCBt+\xF2U\x99r\xDEN\xB3\xC5s\x9A\xCEee՞\xD1U... [truncated message content] |
From: <ran...@us...> - 2015-08-10 13:04:33
|
Revision: 4600 http://sourceforge.net/p/wala/code/4600 Author: ranettinger Date: 2015-08-10 13:04:30 +0000 (Mon, 10 Aug 2015) Log Message: ----------- Modified Paths: -------------- incubator/com.ibm.wala.refactoring/META-INF/MANIFEST.MF Modified: incubator/com.ibm.wala.refactoring/META-INF/MANIFEST.MF =================================================================== --- incubator/com.ibm.wala.refactoring/META-INF/MANIFEST.MF 2015-08-10 13:03:01 UTC (rev 4599) +++ incubator/com.ibm.wala.refactoring/META-INF/MANIFEST.MF 2015-08-10 13:04:30 UTC (rev 4600) @@ -11,18 +11,17 @@ org.eclipse.jdt.debug, com.ibm.wala.cast.java, org.eclipse.debug.core, - com.ibm.wala.core, com.ibm.wala.ide;bundle-version="1.1.3", com.ibm.wala.cast;bundle-version="1.0.0", com.ibm.wala.cast.java.jdt;bundle-version="1.0.0", - org.eclipse.jdt.core + org.eclipse.jdt.core, + com.ibm.wala.core;bundle-version="1.1.3" Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ActivationPolicy: lazy Import-Package: com.ibm.wala.cast.java.jdt, com.ibm.wala.cast.java.translator.jdt, com.ibm.wala.ipa.callgraph, com.ibm.wala.util.debug, - com.ibm.wala.util.io, junit.framework, org.eclipse.core.filebuffers, org.eclipse.core.resources, @@ -47,6 +46,7 @@ org.eclipse.ltk.ui.refactoring, org.eclipse.ltk.ui.refactoring.history, org.eclipse.text.edits, + org.eclipse.ui.part, org.eclipse.ui.texteditor Export-Package: com.ibm.wala.refactoring, com.ibm.wala.refactoring.rtwq, This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ran...@us...> - 2015-08-10 13:03:03
|
Revision: 4599 http://sourceforge.net/p/wala/code/4599 Author: ranettinger Date: 2015-08-10 13:03:01 +0000 (Mon, 10 Aug 2015) Log Message: ----------- adding a menu item for invoking Chen's slideDG-based experiment Modified Paths: -------------- incubator/com.ibm.wala.refactoring/plugin.xml Modified: incubator/com.ibm.wala.refactoring/plugin.xml =================================================================== --- incubator/com.ibm.wala.refactoring/plugin.xml 2015-08-09 16:16:22 UTC (rev 4598) +++ incubator/com.ibm.wala.refactoring/plugin.xml 2015-08-10 13:03:01 UTC (rev 4599) @@ -328,5 +328,30 @@ tooltip="run RTwQ"> </action> </actionSet> - </extension> + </extension> + <extension + point="org.eclipse.ui.actionSets"> + <actionSet + label="SlideDG-based sliding" + visible="true" + id="slideDG.actionSet"> + <menu + label="SlideDG-based sliding" + id="slideDG"> + <separator + name="sampleGroup"> + </separator> + </menu> + <action + class="com.ibm.wala.refactoring.slideDG.ProgramSlidingOnSlideDGAction" + icon="icons/add.gif" + id="com.ibm.wala.refactoring.slideDG.ProgramSlidingOnPdgAction" + label="SlideDG-based sliding" + menubarPath="org.eclipse.jdt.ui.refactoring.menu/codingGroup" + style="push" + toolbarPath="sampleGroup" + tooltip="SlideDG-based sliding"> + </action> + </actionSet> + </extension> </plugin> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ran...@us...> - 2015-08-09 16:16:24
|
Revision: 4598 http://sourceforge.net/p/wala/code/4598 Author: ranettinger Date: 2015-08-09 16:16:22 +0000 (Sun, 09 Aug 2015) Log Message: ----------- Added Paths: ----------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestSeeTagPanel.java Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestSeeTagPanel.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestSeeTagPanel.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestSeeTagPanel.java 2015-08-09 16:16:22 UTC (rev 4598) @@ -0,0 +1,206 @@ +package com.ibm.wala.refactoring.buckets.tests; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.TreeSet; +import java.util.List; +import java.util.Set; + +import junit.framework.TestCase; + + +import com.ibm.wala.refactoring.buckets.DependenceMap; +import com.ibm.wala.refactoring.buckets.Buckets; +import com.ibm.wala.refactoring.buckets.SearchBFSAlgo; + + +public class TestSeeTagPanel extends TestCase { +private SearchBFSAlgo searchBFSAlgo ; + private int n = 0; + private List<Integer> markedLines; + private DependenceMap controlDependentLines; + private DependenceMap dataDependentLines; + private List<Integer> hammockLinesNums; + private int hammockStartLine=79; + private int hammockEndLine=123; + private Buckets ragavan; + private long runningTime = 0; + //TODO: change this to setUp. + private void init(){ + ragavan = new Buckets(); + setHammockLinesNums(); + buildMarkedNodes(); + buildDataDependences(); + // ragavan.setHammockLinesNums(hammockLinesNums); + // ragavan.setMarkedLines(markedLines); + // ragavan.setHammockStartLine(hammockStartLine); + // ragavan.setHammockEndLine(hammockEndLine); + // ragavan.setControlDependentLines(controlDependentLines); + // ragavan.setNodeBucketingDataDependentLines(dataDependentLines); + + + } + private List<Integer> runSubgroup(int k,List<Integer>subM){ + if(k==0){ +// if (runRaghavan(subM)) + if (runSlideBased(subM)) + return subM; + else + return null; + } + for(Integer i:subM){ + List<Integer> m = new ArrayList<Integer>(subM); + m.remove(i); + List<Integer> newM= runSubgroup(k-1, m); + if (newM!=null) + return newM; + } + return null; + } + private boolean runRaghavan(List<Integer> subM) { + System.out.println(n++); + ragavan.clearData(); + // setHammockLinesNums(); + buildDataDependences(); + ragavan.setHammockLinesNums(hammockLinesNums); + ragavan.setMarkedLines(new ArrayList<Integer>(subM)); + ragavan.setHammockStartLine(hammockStartLine); + ragavan.setHammockEndLine(hammockEndLine); + ragavan.setControlDependentLines(controlDependentLines); + ragavan.setNodeBucketingDataDependentLines(dataDependentLines); + runningTime-= System.nanoTime(); + ragavan.generateOrderingConstraints(); + ragavan.promoteUnmovableUnmarkedNodes(); + ragavan.partitionIntoBuckets(); + runningTime+= System.nanoTime(); + if (subM.size() == ragavan.getMarkedLines().size()) + return true; + return false; + } + + + private boolean runSlideBased(List<Integer> subM) { + System.out.println(n++); + ragavan.clearData(); + // setHammockLinesNums(); + buildDataDependences(); + ragavan.setHammockLinesNums(hammockLinesNums); + // ragavan.setMarkedLines(new ArrayList<Integer>(subM)); + ragavan.setHammockStartLine(hammockStartLine); + ragavan.setHammockEndLine(hammockEndLine); + ragavan.setControlDependentLines(controlDependentLines); + ragavan.setNodeBucketingDataDependentLines(dataDependentLines); + + searchBFSAlgo = ragavan.getSearchBFSAlgo(); + runningTime-= System.nanoTime(); + searchBFSAlgo.seperateNodesIntoBuckets(new TreeSet<Integer>(new ArrayList<Integer>(subM))); + runningTime+= System.nanoTime(); + + if (subM.size() == searchBFSAlgo.getMarkedNodes().size()){ + return true; + } + + return false; + } + private void setHammock(List<Integer> subM){ + // int min = findMinLine(List<Integer> subM); + // int max = findMaxLine(List<Integer> subM); + + + } + private void addNodeDependencies(DependenceMap dependencies, int nodeNum,int [] dependentLines ){ + TreeSet<Integer> tempList = new TreeSet<Integer>();; + for (int i=0;i<dependentLines.length;i++){ + tempList.add(dependentLines[i]); + } + dependencies.put(nodeNum,tempList); + + } + private void buildDataDependences() { + + dataDependentLines = new DependenceMap(); + controlDependentLines = new DependenceMap(); + + addNodeDependencies(dataDependentLines,82,new int[]{83, 84, 85, 94}); + addNodeDependencies(dataDependentLines,83,new int[]{94}); + addNodeDependencies(dataDependentLines,84,new int[]{94}); + addNodeDependencies(dataDependentLines,85,new int[]{94}); + addNodeDependencies(dataDependentLines,94,new int[]{95, 96, 97, 98, 99, 103}); + addNodeDependencies(dataDependentLines,95,new int[]{103}); + addNodeDependencies(dataDependentLines,96,new int[]{103}); + addNodeDependencies(dataDependentLines,97,new int[]{103}); + addNodeDependencies(dataDependentLines,98,new int[]{103}); + addNodeDependencies(dataDependentLines,99,new int[]{103}); + addNodeDependencies(dataDependentLines,103,new int[]{104, 105, 106, 116}); + addNodeDependencies(dataDependentLines,104,new int[]{116}); + addNodeDependencies(dataDependentLines,105,new int[]{116}); + addNodeDependencies(dataDependentLines,106,new int[]{116}); + addNodeDependencies(dataDependentLines,116,new int[]{117, 118, 119, 120, 121, 122, 123}); + + + } + private void buildMarkedNodes() { + markedLines = new ArrayList<Integer>(); + // markedLines.add(2); + // markedLines.add(79); + markedLines.add(82); + markedLines.add(83); + markedLines.add(84); + markedLines.add(90); + markedLines.add(91); + markedLines.add(92); + markedLines.add(94); + markedLines.add(95); + markedLines.add(96); + markedLines.add(97); + markedLines.add(98); + //markedLines.add(99); + markedLines.add(100); + markedLines.add(101); + markedLines.add(102); + markedLines.add(103); + markedLines.add(104); + markedLines.add(105); + markedLines.add(106); + markedLines.add(108); + markedLines.add(109); + markedLines.add(110); + markedLines.add(111); + markedLines.add(112); + markedLines.add(113); + markedLines.add(115); + markedLines.add(116); + markedLines.add(117); + markedLines.add(118); + markedLines.add(119); + markedLines.add(120); + markedLines.add(121); + markedLines.add(122); + markedLines.add(123); + + } + private void setHammockLinesNums() { + hammockLinesNums= Arrays.asList(82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,115,116); + } + + public void testFidK(){ + init(); + List<Integer> mK; + for (int k=0; k<markedLines.size()-1;k++){ + mK = runSubgroup(k,markedLines); + if (mK!=null){ + System.out.println("K = " + /*new Integer(markedLines.size()-k)*/k); + System.out.println("Mk is "+mK); +// System.out.println("before = " + ragavan.getBeforeBucket()); +// System.out.println("after = " + ragavan.getAfterBucket()); + System.out.println("before = " + searchBFSAlgo.getBeforeNodes()); + System.out.println("after = " + searchBFSAlgo.getAfterNodes()); + + System.out.println("running time = " + runningTime); + return; + } + } + System.out.println("no such K"); + } +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ran...@us...> - 2015-08-09 16:15:32
|
Revision: 4597 http://sourceforge.net/p/wala/code/4597 Author: ranettinger Date: 2015-08-09 16:15:29 +0000 (Sun, 09 Aug 2015) Log Message: ----------- Chen Cozocaru's implementation of slideDG-based refactoring Added Paths: ----------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/Maruyama.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/ProgramSlidingOnSlideDGAction.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/SlideDGConstructor.java Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/Maruyama.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/Maruyama.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/Maruyama.java 2015-08-09 16:15:29 UTC (rev 4597) @@ -0,0 +1,299 @@ +package com.ibm.wala.refactoring.slideDG; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; + +import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl.ConcreteJavaMethod; +import com.ibm.wala.cfg.IBasicBlock; +import com.ibm.wala.refactoring.pdgSliding.DependenceMap; +import com.ibm.wala.refactoring.pdgSliding.PDGSliding; +import com.ibm.wala.ssa.SSACFG; +import com.ibm.wala.util.intset.IntIterator; + +public class Maruyama { + private Map<Integer, BlockStatement> blocksSet; + public Map<Integer, Integer> lineToBlock; + public Set<Integer> leaders; + Set<Integer> reachSet; + SSACFG cfg_; + public Map<Integer, HashSet<Integer>> reach; + public Map<Integer, HashSet<Integer>> basicBlockToStatements; + DependenceMap MaruyamaControlDependance; + Map<Integer, HashSet<Integer>> controlDependanceSucc; + Map<Integer, HashSet<Integer>> blocks; + PDGSliding pdg; + ConcreteJavaMethod javaMethod; + + + private boolean dbgMaruyama = false; + private void log(boolean cond, String str){ + if (cond) + System.out.println(str); + } + + /*Recursively get reach*/ + private HashSet<Integer> createReach(int block){ + reach.put(block , new HashSet<Integer>()); + IntIterator it = cfg_.getSuccNodeNumbers(cfg_.getBasicBlock(block)).intIterator(); + while (it.hasNext()){ + int blockNumber = it.next(); + int x = (blocksSet.get(blockNumber)!=null)? blocksSet.get(blockNumber).line : 0; + x = (blocksSet.get(block)!=null)? blocksSet.get(block).line : 0; + if ( cfg_.getBasicBlock(blockNumber).getFirstInstructionIndex() > cfg_.getBasicBlock(block).getLastInstructionIndex() ){ + if (blocksSet.get(blockNumber) == null || blocksSet.get(block) == null || blocksSet.get(blockNumber).line >= blocksSet.get(block).line) //Extra protection of BW reaching we need to ignore + reach.get(block).addAll(createReach(blockNumber)); + } + } + if (blocksSet.get(block) != null) + reach.get(block).add(blocksSet.get(block).line); + return reach.get(block); + } + + /*Recursively get control dependence successors*/ + private HashSet<Integer> createControlDependanceSuccMap(int block){ + if (controlDependanceSucc.get(block) == null) + controlDependanceSucc.put(block, new HashSet<Integer>()); + else + return controlDependanceSucc.get(block); + + if (MaruyamaControlDependance == null || MaruyamaControlDependance.get(block) == null) + return controlDependanceSucc.get(block); + + for (Integer node: MaruyamaControlDependance.get(block)){ + controlDependanceSucc.get(block).addAll(createControlDependanceSuccMap(node)); + if (leaders.contains(node)) controlDependanceSucc.get(block).add(node); //Continue with leaders only + } + return controlDependanceSucc.get(block); + } + + private class BlockStatement{ + public int line; + public int instruction; + public int blockId; + + public BlockStatement(int line, int instruction, int blockId) { + this.line = line; + this.instruction = instruction; + this.blockId = blockId; + } + + public String toString(){ + return String.valueOf(this.line); + } + } + + private void printBlockData(IBasicBlock b){ + if (!dbgMaruyama) + return; + + if (b.getFirstInstructionIndex() < 0) + log(dbgMaruyama, String.valueOf(b.getNumber()) + ": " + String.valueOf(b.getFirstInstructionIndex())); + if (b.getLastInstructionIndex() < 0) + log(dbgMaruyama, String.valueOf(b.getNumber()) + ": " + String.valueOf(b.getLastInstructionIndex())); + if (b.getFirstInstructionIndex() > 0 && b.getLastInstructionIndex() > 0) + log(dbgMaruyama, String.valueOf(b.getNumber()) + ": " +javaMethod.getLineNumber(b.getFirstInstructionIndex()) + "..." + javaMethod.getLineNumber(b.getLastInstructionIndex())); + + } + + Maruyama(PDGSliding pdgSliding){ + javaMethod= (ConcreteJavaMethod) pdgSliding.cgMethodNode.getMethod(); + blocksSet = new HashMap<Integer, BlockStatement>(); + lineToBlock = new HashMap<Integer, Integer>(); + leaders = new HashSet<Integer>(); + reachSet = new HashSet<Integer>(); + reach = new HashMap<Integer, HashSet<Integer>>(); + basicBlockToStatements = new HashMap<Integer, HashSet<Integer>>(); + this.pdg = pdgSliding; + + SSACFG cfg = pdg.cgMethodNode.getIR().getControlFlowGraph(); + cfg_ = pdg.cgMethodNode.getIR().getControlFlowGraph(); + + log(dbgMaruyama,cfg.toString()); + log(dbgMaruyama,"**********"); + + for (int i = 0; i < cfg.getNumberOfNodes(); i++) { + log(dbgMaruyama,"** " + i + " **"); + printBlockData(cfg.getBasicBlock(i)); + log(dbgMaruyama,"**** succesors: ****"); + for (IBasicBlock b: cfg.getNormalSuccessors(cfg.getBasicBlock(i))){ + printBlockData(b); + } + } + + //Detect blocks and leader from the CFG + detectBlocks(javaMethod, cfg); + + log(dbgMaruyama,"block Set:"); + log(dbgMaruyama,blocksSet.toString()); + + //basic block to statements + mapBasicBlockToStatement(javaMethod); + + log(dbgMaruyama,"basic block Set:"); + log(dbgMaruyama,basicBlockToStatements.toString()); + + //Reach + createReach(0); + + log(dbgMaruyama,"reach:"); + if (dbgMaruyama){ + for (Integer bs: reach.keySet()){ + System.out.print("Reach(" + blocksSet.get(bs) + ")"); + for (Integer toBs : reach.get(bs)) + System.out.print(" " + toBs); + } + } + + //Dom + Map<Integer, HashSet<Integer>> dom = CreateDominators(); + log(dbgMaruyama,"Dom:"); + log(dbgMaruyama,dom.toString()); + + //Blocks + blocks = CreateBlocks(javaMethod, dom); + + log(dbgMaruyama,"Blocks"); + log(dbgMaruyama,blocks.toString()); + } + + private Map<Integer, HashSet<Integer>> CreateBlocks( + ConcreteJavaMethod javaMethod, Map<Integer, HashSet<Integer>> dom) { + Map<Integer, HashSet<Integer>> blocks = new HashMap<Integer, HashSet<Integer>>(); + + for (Integer i = javaMethod.getSourcePosition().getFirstLine()+1 ;i<javaMethod.getSourcePosition().getLastLine();i++ ){ + int leader = i; + blocks.put(i, new HashSet<Integer>()); + while (!leaders.contains(leader)){ //Get Leader of this block + leader--; + } + for (Integer b: leaders){ + if (reach.get(lineToBlock.get(b))!=null && + reach.get(lineToBlock.get(b)).contains(leader) && + dom.get(b)!=null && + dom.get(b).contains(leader)) + blocks.get(i).add(b); + } + } + return blocks; + } + + private Map<Integer, HashSet<Integer>> CreateDominators() { + controlDependanceSucc = new HashMap<Integer, HashSet<Integer>>(); + MaruyamaControlDependance = pdg.getControlDependentLines(); + Set<Integer> fromEntry = new HashSet<Integer>(); + for (Integer node: lineToBlock.keySet() ){//Add entry control dependences + if (MaruyamaControlDependance.invert().get(node) == null) + fromEntry.add(node); + else + { + boolean addControlFromEntry = true; //Has control predessesor but in its reach, should have a control dependence from entry + for (Integer controlPred : MaruyamaControlDependance.invert().get(node)) + { + if (reach.get(node)!=null && !reach.get(node).contains(controlPred)) + { + addControlFromEntry = false; + break; + } + } + if (addControlFromEntry) fromEntry.add(node); + } + } + + for (Integer node: fromEntry){ + MaruyamaControlDependance.addDependence(0, node); + } + //get all successors map + createControlDependanceSuccMap(0); + log(dbgMaruyama,"Control Succ"); + log(dbgMaruyama,controlDependanceSucc.toString()); + + //Get dom + Map<Integer, HashSet<Integer>> dom = new HashMap<Integer, HashSet<Integer>>(); + for (Integer node: leaders ){ + dom.put(node, new HashSet<Integer>()); + if (MaruyamaControlDependance.invert().get(node) == null) + { + if (controlDependanceSucc.get(node)!=null) + dom.get(node).addAll(controlDependanceSucc.get(node)); + } + else{ + for (Integer prec: MaruyamaControlDependance.invert().get(node)){ + if (controlDependanceSucc.get(prec)!=null) + dom.get(node).addAll(controlDependanceSucc.get(prec)); + } + + } + } + return dom; + } + + private void mapBasicBlockToStatement(ConcreteJavaMethod javaMethod) { + for (Integer leader : leaders){ + HashSet<Integer> basicBlockSet = new HashSet<Integer>(); + basicBlockSet.add(leader); + int i = leader+1; + while (!leaders.contains(i) && i <= javaMethod.getSourcePosition().getLastLine()){ + basicBlockSet.add(i); + i++; + } + + basicBlockToStatements.put(leader, basicBlockSet); + } + } + + private void detectBlocks(ConcreteJavaMethod javaMethod, SSACFG cfg) { + entryBlock(javaMethod); + + for (int i = 0; i < cfg.getNumberOfNodes(); i++) { + printBasicBlockData(javaMethod, cfg, i); + branchFollower(javaMethod, cfg, i); + JoinBranch(javaMethod, cfg, i); + } + } + + private void printBasicBlockData(ConcreteJavaMethod javaMethod, SSACFG cfg, + int i) { + log(dbgMaruyama,i + " " + cfg.getBasicBlock(i).toString() + + ":" + cfg.getBasicBlock(i).getFirstInstructionIndex() + + "..." + cfg.getBasicBlock(i).getLastInstructionIndex()); + + if (cfg.getBasicBlock(i).getFirstInstructionIndex() > 0) + log(dbgMaruyama,"From: " + javaMethod.getLineNumber(cfg.getBasicBlock(i).getFirstInstructionIndex())); + if (cfg.getBasicBlock(i).getLastInstructionIndex() > 0) + log(dbgMaruyama,"To: " + javaMethod.getLineNumber(cfg.getBasicBlock(i).getLastInstructionIndex())); + } + + private void JoinBranch(ConcreteJavaMethod javaMethod, SSACFG cfg, int i) { + if (cfg.getNormalPredecessors(cfg.getBasicBlock(i)).size() > 1 + && cfg.getBasicBlock(i).getFirstInstructionIndex() > 0){ + blocksSet.put(i, new BlockStatement(javaMethod.getLineNumber(cfg.getBasicBlock(i).getFirstInstructionIndex()), cfg.getBasicBlock(i).getFirstInstructionIndex(),i)); + leaders.add(javaMethod.getLineNumber(cfg.getBasicBlock(i).getFirstInstructionIndex())); + lineToBlock.put(javaMethod.getLineNumber(cfg.getBasicBlock(i).getFirstInstructionIndex()),i); + } + } + + private void branchFollower(ConcreteJavaMethod javaMethod, SSACFG cfg, int i) { + if (cfg.getNormalSuccessors(cfg.getBasicBlock(i)).size() > 1){ + Iterator succNodes = cfg.getNormalSuccessors(cfg.getBasicBlock(i)).iterator(); + while (succNodes.hasNext()) { + IBasicBlock succ = (IBasicBlock) succNodes.next(); + log(dbgMaruyama,"succ: " + succ.getNumber()); + int instructionIndex = succ.getFirstInstructionIndex(); + if ( instructionIndex >= 0){ + blocksSet.put(succ.getNumber(), new BlockStatement(javaMethod.getLineNumber(instructionIndex),instructionIndex,succ.getNumber())); + leaders.add(javaMethod.getLineNumber(instructionIndex)); + lineToBlock.put(javaMethod.getLineNumber(instructionIndex),succ.getNumber()); + } + } + } + } + + private void entryBlock(ConcreteJavaMethod javaMethod) { + blocksSet.put(0, new BlockStatement(javaMethod.getSourcePosition().getFirstLine() + 1,0,0)); + lineToBlock.put(javaMethod.getSourcePosition().getFirstLine() + 1,0); + leaders.add(javaMethod.getSourcePosition().getFirstLine() + 1); + } +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/ProgramSlidingOnSlideDGAction.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/ProgramSlidingOnSlideDGAction.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/ProgramSlidingOnSlideDGAction.java 2015-08-09 16:15:29 UTC (rev 4597) @@ -0,0 +1,970 @@ +/******************************************************************************* + * Copyright (c) 2002 - 2012 IBM Corporation. + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package com.ibm.wala.refactoring.slideDG; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Random; +import java.util.Set; + + +import com.ibm.wala.refactoring.pdgSliding.*; + +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IWorkspaceRoot; +import org.eclipse.core.resources.ResourcesPlugin; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; +import org.eclipse.jdt.core.ICompilationUnit; +import org.eclipse.jdt.core.IJavaProject; +import org.eclipse.jdt.core.IMethod; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.dom.AST; +import org.eclipse.jdt.core.dom.ASTParser; +import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.internal.core.SourceMethod; +import org.eclipse.jdt.internal.corext.dom.Selection; +import org.eclipse.jdt.internal.corext.refactoring.util.CodeAnalyzer; +import org.eclipse.jface.action.IAction; +import org.eclipse.jface.dialogs.IInputValidator; +import org.eclipse.jface.dialogs.InputDialog; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.jface.viewers.ISelection; +import org.eclipse.jface.window.Window; +import org.eclipse.ui.IEditorActionDelegate; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.IWorkbenchWindowActionDelegate; + +import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl.ConcreteJavaMethod; +import com.ibm.wala.cast.tree.CAstType.Array; +import com.ibm.wala.cfg.AbstractCFG; +import com.ibm.wala.cfg.IBasicBlock; +import com.ibm.wala.cfg.Util; +import com.ibm.wala.ipa.callgraph.CGNode; +import com.ibm.wala.refactoring.pdgSliding.output.AnalyzerLogger; +import com.ibm.wala.refactoring.pdgSliding.variables.PDGSlidingVarsUtils; +import com.ibm.wala.refactoring.pdgSliding.variables.Variable; +import com.ibm.wala.refactoring.pdgSliding.wala.MySlidingInformation; +import com.ibm.wala.refactoring.pdgSliding.wala.MyWALAWrapper; +import com.ibm.wala.refactoring.sliding.GenVars; +import com.ibm.wala.refactoring.utils.Common; +import com.ibm.wala.refactoring.utils.WALAUtils; +import com.ibm.wala.shrikeBT.IInstruction; +import com.ibm.wala.ssa.SSACFG; +import com.ibm.wala.ssa.SSACFG.BasicBlock; +import com.ibm.wala.util.graph.INodeWithNumber; +import com.ibm.wala.util.intset.IntIterator; + + +/** + * Run Program sliding on PDG + * + * @author Chen Cozocaru + */ +@SuppressWarnings("restriction") +public class ProgramSlidingOnSlideDGAction implements IWorkbenchWindowActionDelegate,IEditorActionDelegate { + + public IWorkbenchWindow workbenchWindow; + + protected static final String INVALID_NUMBER_ERROR = "Please input numbers only, seperated by space, \";\" or \",\"."; + protected static final String INVALID_VAR_ERROR = "Please input variables names, seperated by space, \";\" or \",\"."; + private final String splitTokens = "[ ,;]"; + private MySlidingInformation slidingInformation; + + private Set<Integer> markedLines; + private Set<Variable> markedVars; + + private enum ExceutionType{ + PDG, + SLIDEDG, + BOTH + }; + static private ExceutionType executionType; + static private int numOfIterations=-1; + +private class ExperimentRes{ + public ExperimentRes(){} + /*Performance*/ + public long contTime; + public long SlicingTime; + public int numOfNodesScannedSlicing; + public int numOfEdgesScannedSlicing; + public long SlidingTime; + public int numOfNodesScannedSliding; + public int numOfEdgesScannedSliding; + public long tuckingTime; + public int numOfNodesScannedTucking; + public int numOfEdgesScannedTucking; + public long maruyamaTime; + public int numOfNodesScannedMaruyama; + public int numOfEdgesScannedMaruyama; + public long TsantalisTime; + public int numOfNodesScannedTsantalis; + public int numOfEdgesScannedTsantalis; + public long BuketingTime; + public int numOfNodesScannedBuketing; + public int numOfEdgesScannedBuketing; + /*Structure*/ + public long numOfPdgNodes; + public long numOfPdgEdges; + public long numOfSlideDependences; + public long numOfSlides; + + /*temp*/ + public long getSlicePdg; + public long getSliceSlideDG; + public long slicePdg; + public long sliceSlideDG; + public long coSlicePdg; + public long coSliceSlideDG; +}; + + public void run(IAction action) { + executionType = ExceutionType.BOTH; + numOfIterations = 10; + + if (!runExperiment){ + doSingleRun(); + }else{ + doExperimentRun(); + } + } + + + private void doExperimentRun() { + // clearing experiment folder + //AnalyzerLogger.deleteOutputDirContent(); + + ExperimentRes experimentRes = new ExperimentRes(); + + //result file + /*results*/ + FileOutputStream fop = null; + File file; + Date date = new Date(); + String content = date.toString() + "\n"; + + try { + + file = new File("results.txt"); + // if file doesnt exists, then create it + if (!file.exists()) { + file.createNewFile(); + } + + fop = new FileOutputStream(file); + + + // get the content in bytes + byte[] contentInBytes = content.getBytes(); + + fop.write(contentInBytes); + + } catch (IOException e) { + e.printStackTrace(); + } + + List<MethodSlideDGInfo> methods = getExperimentMethods(); + for (MethodSlideDGInfo methodSlidingInfo : methods) { + + System.out.println("Running Sliding on method " + methodSlidingInfo.getMethodName()); + boolean success = initializeByMethod(methodSlidingInfo.getProjectName(), methodSlidingInfo.getClassFilePath(), methodSlidingInfo.getMethodName()); + if (!success){ + System.out.println("Failed for method " + methodSlidingInfo ); + return; + } + + PDGSliding pdgSliding= new PDGSliding(null, markedLines, slidingInformation.methodDeclaration, getClassFileFullPath()); + ConcreteJavaMethod javaMethod= (ConcreteJavaMethod) pdgSliding.cgMethodNode.getMethod(); + SlideDGConstructor s = new SlideDGConstructor(javaMethod,pdgSliding ); + int methodDeclarationLine = javaMethod.getSourcePosition().getFirstLine(); + + /*Lines for Buckets - select random*/ + Set<Integer> linesForBucketing = new HashSet<Integer>(); + + int size = s.slideDependence.size(); + Random random = new Random(); + for (int i=0;i<3 + 1 ;i++){ + int item = random.nextInt(size); + int count = 0; + for(Integer obj : s.slideDependence.keySet()) + { + if (count == item) + linesForBucketing.add(obj); + count = count + 1; + } + } + + + /*First iteration on blank*/ + for (int i=0;i<numOfIterations + 1 ;i++){ + + experimentRes.contTime = s.contTime; + experimentRes.numOfPdgEdges = s.pdgControlAndFlow.getNumOfDependences(); + experimentRes.numOfPdgNodes = s.pdgControlAndFlow.size(); + experimentRes.numOfSlideDependences = s.slideDependence.getNumOfDependences(); + experimentRes.numOfSlides = s.slideDependence.size(); + + long time; + + /*Maruyama*/ + Maruyama m = new Maruyama(pdgSliding); + + /*Var for Sliding*/ + Variable var = new Variable(methodSlidingInfo.varForSliding, -1); + Set<Variable> V = new HashSet<Variable>(); + V.add(var); + + if (i % 2 == 0){ + pdgTestExecution(experimentRes, fop, methodSlidingInfo, s, + methodDeclarationLine, m, V, i!=0, linesForBucketing); + slideDGTEstExec(experimentRes, fop, methodSlidingInfo, s, + methodDeclarationLine, m, V, i!=0, linesForBucketing); + } else { + slideDGTEstExec(experimentRes, fop, methodSlidingInfo, s, + methodDeclarationLine, m, V, i!=0, linesForBucketing); + pdgTestExecution(experimentRes, fop, methodSlidingInfo, s, + methodDeclarationLine, m, V, i!=0, linesForBucketing); + } + + + + System.out.println("Finished on method " + methodSlidingInfo.getMethodName()); + } + } + + // Freeing some memory for next run + try { + MyWALAWrapper.init(slidingInformation); + PDGSlidingVarsUtils.cleanUp(); + System.gc(); + } catch (JavaModelException e) { + e.printStackTrace(); + } + + try { + fop.flush(); + fop.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + System.out.println("************************* Experiment Run Ended *******************************"); + } + + + private void slideDGTEstExec(ExperimentRes experimentRes, + FileOutputStream fop, MethodSlideDGInfo methodSlidingInfo, + SlideDGConstructor s, int methodDeclarationLine, Maruyama m, + Set<Variable> V, boolean writeRes, Set<Integer> linesForBucketing) { + long time; + if (executionType == ExceutionType.BOTH || executionType == ExceutionType.SLIDEDG){ + /*Slicing*/ + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.slideDGSlicing(methodDeclarationLine + methodSlidingInfo.lineForTucking); + experimentRes.SlicingTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedSlicing = s.numOfScanNodes; + experimentRes.numOfEdgesScannedSlicing = s.numOfScanEdges; + + /*Sliding*/ + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.sliding(V); + experimentRes.SlidingTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedSliding = s.numOfScanNodes; + experimentRes.numOfEdgesScannedSliding = s.numOfScanEdges; + experimentRes.getSliceSlideDG = s.totalGetSliceSlideDG; + experimentRes.sliceSlideDG = s.totalSliceSlideDG; + experimentRes.coSliceSlideDG = s.totalcoSliceSlideDG; + + //tucking + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.tucking(methodDeclarationLine + methodSlidingInfo.lineForTucking); + experimentRes.tuckingTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedTucking = s.numOfScanNodes; + experimentRes.numOfEdgesScannedTucking = s.numOfScanEdges; + + //Maruyama + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.maruyamaSlideDG(V, methodDeclarationLine + methodSlidingInfo.lineForBlockBasedSlicing, m); + experimentRes.maruyamaTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedMaruyama = s.numOfScanNodes; + experimentRes.numOfEdgesScannedMaruyama = s.numOfScanEdges; + + //Tsantalis + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.tsantalisSlideDG(m); + experimentRes.TsantalisTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedTsantalis = s.numOfScanNodes; + experimentRes.numOfEdgesScannedTsantalis = s.numOfScanEdges; + + //Bucketing + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.slideDGBucketing(linesForBucketing); + experimentRes.BuketingTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedBuketing = s.numOfScanNodes; + experimentRes.numOfEdgesScannedBuketing = s.numOfScanEdges; + + try { + if (writeRes){ + fop.write(("SlideDG method: " + methodSlidingInfo.getMethodName() + + "\tPDG edges: \t" + experimentRes.numOfPdgEdges + + "\tPDG nodes: \t" + experimentRes.numOfPdgNodes + + "\tSlides dependence number: \t" + experimentRes.numOfSlideDependences + + "\tNumOfSlides: \t" + experimentRes.numOfSlides + + "\tMaxNesting: \t" + s.getHighestSlideSize() + + "\tConstruction: \t" + experimentRes.contTime + + "\tSlicing: \t" + experimentRes.SlicingTime + + "\tSlicing Nodes: \t" + experimentRes.numOfNodesScannedSlicing + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedSlicing + + "\tSliding: \t" + experimentRes.SlidingTime + + "\tSliding Nodes: \t" + experimentRes.numOfNodesScannedSliding + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedSliding + + "\tTucking: \t" + experimentRes.tuckingTime + + "\tTucking Nodes: \t" + experimentRes.numOfNodesScannedTucking + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedTucking + + "\tMaruyama: \t" + experimentRes.maruyamaTime + + "\tMaruyama Nodes: \t" + experimentRes.numOfNodesScannedMaruyama + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedMaruyama + + "\ttsantalis: \t" + experimentRes.TsantalisTime + + "\tTsantalis Nodes: \t" + experimentRes.numOfNodesScannedTsantalis + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedTsantalis + + "\tbucketing: \t" + experimentRes.BuketingTime + + "\tbucketing Nodes: \t" + experimentRes.numOfNodesScannedBuketing + + "\tbucketing Edges: \t" + experimentRes.numOfEdgesScannedBuketing + + + + + "\n").getBytes()); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + + private void pdgTestExecution(ExperimentRes experimentRes, + FileOutputStream fop, MethodSlideDGInfo methodSlidingInfo, + SlideDGConstructor s, int methodDeclarationLine, Maruyama m, + Set<Variable> V, boolean writeRes, Set<Integer> linesForBucketing) { + long time; + if (executionType == ExceutionType.BOTH || executionType == ExceutionType.PDG){ + /*Slicing*/ + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.pdgSlicing(methodDeclarationLine + methodSlidingInfo.lineForTucking); + experimentRes.SlicingTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedSlicing = s.numOfScanNodes; + experimentRes.numOfEdgesScannedSlicing = s.numOfScanEdges; + + /*Sliding*/ + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.pdgSliding(V); + experimentRes.SlidingTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedSliding = s.numOfScanNodes; + experimentRes.numOfEdgesScannedSliding = s.numOfScanEdges; + experimentRes.getSlicePdg = s.totalGetSlicePdg; + experimentRes.slicePdg = s.totalSlicePdg; + experimentRes.coSlicePdg = s.totalcoSlicePdg; + + //tucking + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.pdgTucking(methodDeclarationLine + methodSlidingInfo.lineForTucking); + experimentRes.tuckingTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedTucking = s.numOfScanNodes; + experimentRes.numOfEdgesScannedTucking = s.numOfScanEdges; + + //Maruyama + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.maruyamaPdg(V, methodDeclarationLine + methodSlidingInfo.lineForBlockBasedSlicing, m); + experimentRes.maruyamaTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedMaruyama = s.numOfScanNodes; + experimentRes.numOfEdgesScannedMaruyama = s.numOfScanEdges; + + //Tsantalis + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.tsantalisPDG(m); + experimentRes.TsantalisTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedTsantalis = s.numOfScanNodes; + experimentRes.numOfEdgesScannedTsantalis = s.numOfScanEdges; + + //Bucketing + System.gc(); + s.resetScanNodesCount(); + time = System.nanoTime(); + s.pdgBucketing(linesForBucketing); + experimentRes.BuketingTime = System.nanoTime()-time; + experimentRes.numOfNodesScannedBuketing = s.numOfScanNodes; + experimentRes.numOfEdgesScannedBuketing = s.numOfScanEdges; + + + try { + if (writeRes){ + fop.write(("PDG method: " + methodSlidingInfo.getMethodName() + + "\tPDG edges: \t" + experimentRes.numOfPdgEdges + + "\tPDG nodes: \t" + experimentRes.numOfPdgNodes + + "\tSlides dependence number: \t" + experimentRes.numOfSlideDependences + + "\tNumOfSlides: \t" + experimentRes.numOfSlides + + "\tMaxNesting: \t" + s.getHighestSlideSize() + + "\tConstruction: \t" + experimentRes.contTime + + "\tSlicing: \t" + experimentRes.SlicingTime + + "\tSlicing Nodes: \t" + experimentRes.numOfNodesScannedSlicing + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedSlicing + + "\tSliding: \t" + experimentRes.SlidingTime + + "\tSliding Nodes: \t" + experimentRes.numOfNodesScannedSliding + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedSliding + + "\tTucking: \t" + experimentRes.tuckingTime + + "\tTucking Nodes: \t" + experimentRes.numOfNodesScannedTucking + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedTucking + + "\tMaruyama: \t" + experimentRes.maruyamaTime + + "\tMaruyama Nodes: \t" + experimentRes.numOfNodesScannedMaruyama + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedMaruyama + + "\ttsantalis: \t" + experimentRes.TsantalisTime + + "\tTsantalis Nodes: \t" + experimentRes.numOfNodesScannedTsantalis + + "\tSlicing Edges: \t" + experimentRes.numOfEdgesScannedTsantalis + + "\tbucketing: \t" + experimentRes.BuketingTime + + "\tbucketing Nodes: \t" + experimentRes.numOfNodesScannedBuketing + + "\tbucketing Edges: \t" + experimentRes.numOfEdgesScannedBuketing + + + "\n").getBytes()); + } + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + + + private String getClassFileFullPath() { + + String pathInWorskpace = slidingInformation.pathInWorskpace.toOSString(); + String workspaceLocation = slidingInformation.workspaceLocation.toOSString(); + + return workspaceLocation + pathInWorskpace; + } + + + /* protected void handleMarkedLinesOffsets(MethodSlideDGInfo methodSlidingInfo) { + CGNode methodNode = WALAUtils.findCGNode(MyWALAWrapper.getCallGraph(), slidingInformation.methodDeclaration.getBody().getStartPosition()); + if (methodNode == null){ + System.out.println("methodNode Is null"); + return; + } + + ConcreteJavaMethod javaMethod= (ConcreteJavaMethod) methodNode.getMethod(); + int methodDeclarationLine = javaMethod.getSourcePosition().getFirstLine(); + markedLines = new HashSet<Integer>(); + + for (int markedOffset : methodSlidingInfo.getMarkedLinesOffsets()){ + markedLines.add(markedOffset + methodDeclarationLine); + } + System.out.println("Marked lines are: " + markedLines); + }*/ + + + private void doSingleRun() { + initialize(); + markedLines = getMarkedLines(); + markedVars = getMarkedVariables(); + + if (Utils.isEmpty(markedLines) // user cancel + || slidingInformation.methodDeclaration == null){ // selection is wrong... + return; + } + + PDGSliding pdgSliding= new PDGSliding(null, markedLines, slidingInformation.methodDeclaration, getClassFileFullPath()); + + + System.out.println("----PDG Control:----"); + pdgSliding.getControlDependentLines().printDependences(); + + //pdgSliding.runVariableSlidingAlgo(true); + + /*Chen changes ----------------------------------------------------------------*/ + //Get SlideDG leaves + ConcreteJavaMethod javaMethod= (ConcreteJavaMethod) pdgSliding.cgMethodNode.getMethod(); + + SlideDGConstructor s = new SlideDGConstructor(javaMethod,pdgSliding ); + + /*Criterion*/ + Integer criterionLine = Utils.EXIT_LINE; + if (markedLines.size() > 0) + { + for (Integer markedLine : markedLines) { criterionLine = markedLine;} + } + + long time= 0; + + Maruyama m = new Maruyama(pdgSliding); + + /*PDG*/ + //Sliding + if (executionType == ExceutionType.BOTH || executionType == ExceutionType.PDG){ + + /*Slicing*/ + s.resetScanNodesCount(); + time = System.nanoTime(); + s.pdgSlicing(criterionLine).printRes(); + long pdgSlicingTime = System.nanoTime()-time; + System.out.println("~~~~PDG slicingTime : " + pdgSlicingTime + "nodes: " + s.numOfScanNodes + "Edges: " + s.numOfScanEdges); + + /*Sliding*/ + s.resetScanNodesCount(); + time = System.nanoTime(); + SlidingResult slidingRes = s.pdgSliding(markedVars); + slidingRes.printRes(); + long pdgSlidingTime = System.nanoTime()-time; + System.out.println("~~~~PDG slidingTime : " + pdgSlidingTime); + + //tucking + s.resetScanNodesCount(); + time = System.nanoTime(); + s.pdgTucking(criterionLine); + long pdgTuckingTime = System.nanoTime()-time; + System.out.println("~~~~PDG tuckingTime : " + pdgTuckingTime); + + //Maruyama + s.resetScanNodesCount(); + System.out.println("Maruyama"); + System.out.println(s.maruyamaPdg(markedVars, criterionLine, m)); + + //Tsantalis + s.resetScanNodesCount(); + System.out.println("tsantalis PDG"); + s.tsantalisPDG(m); + } + + /*SlideDG*/ + //Sliding + if (executionType == ExceutionType.BOTH || executionType == ExceutionType.SLIDEDG){ + //Slicing + s.resetScanNodesCount(); + time = System.nanoTime(); + s.slideDGSlicing(criterionLine).printRes(); + long pdgSlicingTime = System.nanoTime()-time; + System.out.println("~~~~PDG slicingTime : " + pdgSlicingTime + "nodes: " + s.numOfScanNodes + "Edges: " + s.numOfScanEdges); + + //Sliding + s.resetScanNodesCount(); + time = System.nanoTime(); + s.sliding(markedVars).printRes(); + long slidingTime = System.nanoTime()-time; + System.out.println("~~~~slidingTime : " + slidingTime); + + //tucking + s.resetScanNodesCount(); + time = System.nanoTime(); + s.tucking(criterionLine).printRes(); + long tuckingTime = System.nanoTime()-time; + System.out.println("~~~~tuckingTime : " + tuckingTime); + + //Maruyama + s.resetScanNodesCount(); + System.out.println("Maruyama SlideDG"); + System.out.println(s.maruyamaSlideDG(markedVars, criterionLine, m)); + + //Tsantalis + s.resetScanNodesCount(); + System.out.println("tsantalis SlideDG"); + s.tsantalisSlideDG(m); + } + /*chen changes --------------------------------------------------------------- End*/ + } + + /* + * Get the marked lines from the user. + */ + private Set<Integer> getMarkedLines() { + Set<Integer> markedLines= new HashSet<Integer>(); + InputDialog inputDialog= new InputDialog(null,"Marked Lines", "Please enter", null,new IInputValidator(){ + public String isValid(String newText) { + if (!newText.matches( "([0-9]*"+splitTokens+"?)+")) // ([0-9]*[ ,;]?)+ + return INVALID_NUMBER_ERROR; + return null; + } + }); + inputDialog.open(); + if (inputDialog.getReturnCode() == Window.OK){ + String[] lines= inputDialog.getValue().split(splitTokens); + + for(String line:lines){ + if (!Utils.isEmpty(line)){ + markedLines.add(Integer.valueOf(line)); + } + } + return markedLines; + }else{ + return null; + } + } + + private Set<Variable> getMarkedVariables() { + Set<Variable> markedVars= new HashSet<Variable>(); + InputDialog inputDialog= new InputDialog(null,"Marked Variables", "Please enter", null,new IInputValidator(){ + public String isValid(String newText) { + if (!newText.matches( "([a-z,.,A-Z]*[0-9]*#*"+splitTokens+"?)+")) // ([0-9]*[ ,;]?)+ + return INVALID_NUMBER_ERROR; + return null; + } + }); + inputDialog.open(); + if (inputDialog.getReturnCode() == Window.OK){ + String[] vars= inputDialog.getValue().split(splitTokens); + + for(String var:vars){ + if (!Utils.isEmpty(var)){ + markedVars.add(new Variable(var, -1)); + } + } + return markedVars; + }else{ + return null; + } + } + + /* + * Get the marked lines from the user. + */ + private Set<String> getVars(boolean isReUseVars) { + String reuse = isReUseVars ? "Re-Use" : "Non Re-Use"; + String className = slidingInformation.className; + String defaultText = isReUseVars ? className + ".index1" : ""; + InputDialog inputDialog= new InputDialog(null,"Chosen "+reuse+" Vars", "Please enter", defaultText,new IInputValidator(){ + public String isValid(String newText) { + if (!newText.matches( "([\\w\\.]*"+splitTokens+"?)+")) // ([0-9]*[ ,;]?)+ + return INVALID_VAR_ERROR; + return null; + } + }); + inputDialog.open(); + if (inputDialog.getReturnCode() == Window.OK){ + String[] vars= inputDialog.getValue().split(splitTokens); + + return new HashSet<String>(Arrays.asList(vars)); + }else{ + return null; + } + } + + // Taken from SlideCodeFragmentAction + private void initialize() { + try { + workbenchWindow.getActivePage().saveAllEditors(false); + slidingInformation = new MySlidingInformation(workbenchWindow, false); + GenVars.getInstance().updateGeneralInfo( slidingInformation.projectName, slidingInformation.fileName); + if (slidingInformation.selection == null){ + MessageDialog.openError(workbenchWindow.getShell(), "error", "Please select a code fragment"); + return; + } + ASTParser parser = ASTParser.newParser(AST.JLS3); + parser.setResolveBindings(true); + parser.setSource(slidingInformation.IcompUnit); + CompilationUnit cu = (CompilationUnit) parser.createAST(null); + + //selection of code fragment + CodeAnalyzer sa = new CodeAnalyzer(slidingInformation.IcompUnit,Selection.createFromStartLength(slidingInformation.startPosition, slidingInformation.length) ,true); + cu.accept(sa); + if (!sa.getStatus().isOK()){ + MessageDialog.openError(workbenchWindow.getShell(), "error", "illegal selection: " + sa.getStatus().getEntryWithHighestSeverity().getMessage()); + return; + } + slidingInformation.compile(); + MyWALAWrapper.init(slidingInformation); + markedLines = new HashSet<Integer>(); + slidingInformation.handleMarkedLines(markedLines); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + + private boolean first = false; + + // Taken from SlideCodeFragmentAction + private boolean initializeByMethod(String projectName, String classFilePath/*Without Project*/, String methodName) { + try { + workbenchWindow.getActivePage().saveAllEditors(false); + IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); + IProject project = root.getProject(projectName); + IPath pathInWorkspace = new Path("/" + projectName+"/" + classFilePath); + IPath workspaceLocation = root.getLocation(); + String fileName = classFilePath; + IJavaProject javaProject = WALAUtils.getNamedProject(projectName); + ICompilationUnit icu = (ICompilationUnit) javaProject.findElement(pathInWorkspace.removeFirstSegments(2)); + IType[] types = icu.getTypes(); + int startPosition = 0; + for (int i = 0; i < types.length; i++) { + IType type = types[i]; + IMethod[] methods = type.getMethods(); + for (int j = 0; j < methods.length; j++) { + SourceMethod method = (SourceMethod)methods[j]; +// System.out.println(method.toDebugString()); + if (methodName.equals(method.toDebugString())){ + startPosition = method.getSourceRange().getOffset()+1; + } + } + } + if (startPosition == 0){ + MessageDialog.openError(workbenchWindow.getShell(), "error", "Didn't find method " + pathInWorkspace + "." + methodName); + return false; + } + slidingInformation = new MySlidingInformation(workbenchWindow, project, projectName, pathInWorkspace, workspaceLocation, fileName, javaProject, icu, null, startPosition, 0); + GenVars.getInstance().updateGeneralInfo( slidingInformation.projectName, slidingInformation.fileName); + ASTParser parser = ASTParser.newParser(AST.JLS3); + parser.setResolveBindings(true); + parser.setSource(slidingInformation.IcompUnit); + CompilationUnit cu = (CompilationUnit) parser.createAST(null); + + //selection of code fragment + CodeAnalyzer sa = new CodeAnalyzer(slidingInformation.IcompUnit,Selection.createFromStartLength(slidingInformation.startPosition, slidingInformation.length) ,true); + cu.accept(sa); + if (!sa.getStatus().isOK()){ + MessageDialog.openError(workbenchWindow.getShell(), "error", "illegal selection: " + sa.getStatus().getEntryWithHighestSeverity().getMessage()); + return false; + } + slidingInformation.compile(); + + MyWALAWrapper.init(slidingInformation); + return true; + + } + catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(IWorkbenchWindow) + */ + @Override + public void init(IWorkbenchWindow wnd) { + Common.workbenchWindow = workbenchWindow = wnd; + Common.shell = workbenchWindow.getShell(); + } + + /** + * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#selectionChanged(IAction, ISelection) + */ + @Override + public void selectionChanged(IAction arg0, ISelection arg1) { + } + + /** + * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#dispose() + */ + @Override + public void dispose() { + } + + @Override + public void setActiveEditor(IAction arg0, IEditorPart arg1) { + // TODO Auto-generated method stub + + } + + + private class MethodSlideDGInfo{ + String projectName; // i.e "Test" + String classFilePath/*Without Project*/; // i.e "src/mypack/LocalVarsTest.java" + String methodName; // "testLive(int, int)" + String varForSliding; + Integer lineForTucking; // i.e if method declaration is at line 100 and offsets are 5,10 than marked lines are 105,110 + String varForBlockBasedSlicing; + Integer lineForBlockBasedSlicing; + + public MethodSlideDGInfo(String projectName, String classFilePath, String methodName, + String varForSliding, Integer lineForTucking, Integer lineForBlockBasedSlicing) { + this.projectName = projectName; + this.classFilePath = classFilePath; + this.methodName = methodName; + this.varForSliding = varForSliding; + this.lineForTucking = lineForTucking; // i.e if method declaration is at line 100 and offsets are 5,10 than marked lines are 105,110 + this.lineForBlockBasedSlicing = lineForBlockBasedSlicing; + } + + public String getProjectName() { + return projectName; + } + + public String getClassFilePath() { + return classFilePath; + } + + public String getMethodName() { + return methodName; + } + + + @Override + public String toString() { + return projectName + "/" + classFilePath + "." + getMethodName(); + } + + } + + private List<MethodSlideDGInfo> getExperimentMethods() { + List<MethodSlideDGInfo> list = new ArrayList<MethodSlideDGInfo>(); + + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.java", "putIfAbsent_refactored_step1(char[], int)", "this.index",15, 15)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.java", "put_refactored_step1(char[], int)", "this.index",13, 13)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "literalIndex_refactored_step0(byte[], char[])","this.currentOffset", 19,29)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "literalIndexForType_refactored_step0(char[])","this.currentOffset", 26, 26)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "literalIndexForMethod_refactored_step0(char[], char[], char[], boolean)","this.currentOffset", 34, 34)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "literalIndexForNameAndType_refactored_step0(char[], char[])", "this.currentOffset",22, 22)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "literalIndexForField_refactored_step0(char[], char[], char[])","this.offsets", 22, 22)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "literalIndexForLdc_refactored_step0(char[])", "this.result",110, 110)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int)", "this.index", 19, 19)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "putInCacheIfAbsent_step0(char[], char[], char[], int)", "this.index",18,18)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/DoubleCache.java", "putIfAbsent_refactored_step0(double, int)", "this.result",35,35)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/DoubleCache.java", "doubleCache_put_refactored_step0(double, int)", "this.result",11,11)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/FloatCache.java", "float_cache_put_refactored_step0(float, int)", "this.result",11,11)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/FloatCache.java", "putIfAbsent_refactored_step0(float, int)", "this.result",35,35)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/IntegerCache.java", "integerCache_put_refactored_step0(int, int)", "this.result", 24,24)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/IntegerCache.java", "putIfAbsent_refactored_step0(int, int)", "this.result", 23,23)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/LongCache.java", "longCache_put_refactored_step0(long, int)","this.result", 24, 24)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/LongCache.java", "putIfAbsent_refactored_step0(long, int)","this.result", 23, 23)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ObjectCache.java", "objectCache_put_refactored_step0(Object, int)","this.result", 24, 24)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java", "numberOfDifferentLocals_refactored_step0(StackMapFrame)","this.result", 158,158)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/StackMapFrame.java", "getNumberOfLocals_refactored_step0()","this.result", 24, 24)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/BranchLabel.java", "addForwardReference(int)","this.forwardReferences", 29, 29)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/BranchLabel.java", "becomeDelegateFor(BranchLabel)","this.forwardReferences", 35, 35)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "aload(int)","this.bCodeStream", 23, 23)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "astore(int)","this.bCodeStream", 20, 20)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "dload(int)","this.bCodeStream", 23, 23)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "dstore(int)","this.bCodeStream", 20, 20)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "exitUserScope(BlockScope)","this.visibleLocals", 19, 19)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "fieldAccess(byte, int, char[], char[], char[])","this.bCodeStream", 36, 36)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "fload(int)","this.bCodeStream", 22, 22)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "goto_(BranchLabel)","this.lastAbruptCompletion", 31, 31)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "iinc(int, int)","this.bCodeStream", 18, 18)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "iload(int)","this.bCodeStream", 22, 22)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "initializeMaxLocals(MethodBinding)","this.maxLocals", 29, 29)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "lload(int)","this.bCodeStream", 22, 22)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "recordPositionsFrom(int, int, boolean)","this.lastEntryPC", 327, 327)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "reset(AbstractMethodDeclaration, ClassFile)","this.lineNumberEnd", 21, 21)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "ret(int)","this.bCodeStream", 16, 16)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "createProblemType(TypeDeclaration, CompilationResult)","this.classFile", 31, 31)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "addAttributes()","this.header", 91, 91)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "addProblemClinit(CategorizedProblem[])","this.contents", 46, 46)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "completeCodeAttribute(int)","this.contents", 131, 131)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "completeCodeAttributeForClinit(int)","this.contents", 134, 134)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateAnnotation(Annotation, int)","this.contentsOffset", 71, 71)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateAnnotationDefaultAttribute(AnnotationMethodDeclaration, int)","this.contents", 17, 17)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateElementValueForNonConstantExpression(Expression, int, TypeBinding)","this.contents", 60, 60)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateEnclosingMethodAttribute()","this.contentsOffset", 31, 31)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateExceptionsAttribute(ReferenceBinding[])","this.contentsOffset", 24, 24)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateInnerClassAttribute(int, ReferenceBinding[])","this.contentsOffset", 56, 56)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateLineNumberAttribute()","this.contentsOffset", 47, 47)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateMethodInfoAttributes(MethodBinding)","this.missingTypes", 44, 44)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "generateRuntimeAnnotationsForParameters(Argument[])","this.contentsOffset", 3123-2985, 3123-2985)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ClassFile.java", "initialize(SourceTypeBinding, ClassFile, boolean)","this.contents", 87, 87)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/CompilationResult.java", "getAllProblems()","this.allProblems", 46, 46)); + + //todo list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/CompilationResult.java", "record(CategorizedProblem, ReferenceContext)","this.problemsMap", 18, 18)); + + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/Compiler.java", "process(CompilationUnitDeclaration, int)","this.stats", 39, 39)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/Compiler.java", "processAnnotations()","this.stats", 65, 65)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ProcessTaskManager.java", "removeNextUnit()","yield", 34, 34)); + + //list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ReadManager.java", "getContents(ICompilationUnit)","yield", 64, 64)); + + //todo list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ReadManager.java", "run()","this.contentsRead", 31, 31)); + + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/ASTNode.java", "resolveAnnotations(BlockScope, Annotation[], Binding)","foundDuplicate", 133, 133)); + //todotist.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "generateCode(BlockScope, CodeStream, boolean)","this.left", 452, 452)); + //todolist.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "generateCode(BlockScope, CodeStream, boolean)","this.right", 452, 452)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "generateOptimizedGreaterThan(BlockScope, CodeStream, BranchLabel, BranchLabel, boolean)","this.left", 50, 50)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "generateOptimizedGreaterThan(BlockScope, CodeStream, BranchLabel, BranchLabel, boolean)","this.right", 51, 51)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "generateLogicalAnd(BlockScope, CodeStream, boolean)","this.left", 33, 33)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "generateLogicalAnd(BlockScope, CodeStream, boolean)","this.Left", 33, 33)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "generateLogicalAnd(BlockScope, CodeStream, boolean)","codeStream", 33, 33)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "generateLogicalXor(BlockScope, CodeStream, boolean)","codeStream", 47, 47)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/BinaryExpression.java", "nonRecursiveResolveTypeUpwards(BlockScope)","rightType", 107, 107)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java", "checkUnusedImports()","this.scope", 6, 6)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java", "recordStringLiteral(StringLiteral, boolean)","this.stringLiterals", 24, 24)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java", "recordSuppressWarnings(IrritantSet, Annotation, int, int)","this.suppressWarningIrritants", 19, 19)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java", "recordSuppressWarnings(IrritantSet, Annotation, int, int)","this.suppressWarningAnnotations", 20, 20)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/ast/CompilationUnitDeclaration.java", "recordSuppressWarnings(IrritantSet, Annotation, int, int)","this.suppressWarningScopePositions", 21, 21)); + //todo list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/ast/ConditionalExpression.java", "analyseCode(BlockScope, FlowContext, FlowInfo)","this.mergedInitStateIndex", 97, 97)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/classfmt/AnnotationInfo.java", "decodeDefaultValue()","value", 86, 86)); + //todo list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/HashSetOfInt.java", "HashSetOfInt(int)","this.set", 7, 7)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/HashSetOfInt.java", "add(int)","this.set", 16, 16)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/HashSetOfInt.java", "rehash()","this.set", 8, 8)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/HashtableOfInt.java", "rehash()","this.threshold", 9, 9)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/HashtableOfInt.java", "rehash()","this.valueTable", 8, 8)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/HashtableOfObject.java", "removeKey(char[])","this.valueTable", 12, 12)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/HashtableOfPackage.java", "put(char[], PackageBinding)","this.valueTable", 11, 11)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/ManifestAnalyzer.java", "analyzeManifestContents(InputStream)","state", 94, 94)); + list.add(new MethodSlideDGInfo("Test","src/org/eclipse/jdt/internal/compiler/util/SimpleLookupTable.java", "removeValue(Object)","rehash", 9, 9)); + list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CodeStream.java", "insertionIndex(int[], int, int)","this.m", 21, 21)); + + + //list.add(new MethodSlideDGInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/BranchLabel.java", "place()","this.forwardReferenceCount", 47, 47)); + + + + + return list; + + + } + + private static boolean runExperiment = true; +} + + + + + + + Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/SlideDGConstructor.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/SlideDGConstructor.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/slideDG/SlideDGConstructor.java 2015-08-09 16:15:29 UTC (rev 4597) @@ -0,0 +1,1382 @@ +package com.ibm.wala.refactoring.slideDG; +import com.ibm.wala.cfg.*; +import com.ibm.wala.classLoader.IBytecodeMethod; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +imp... [truncated message content] |
From: <ran...@us...> - 2015-08-09 13:07:46
|
Revision: 4596 http://sourceforge.net/p/wala/code/4596 Author: ranettinger Date: 2015-08-09 13:07:44 +0000 (Sun, 09 Aug 2015) Log Message: ----------- A test case for documenting case 101 from the Tiarks Benchmark Added Paths: ----------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample101Left.java Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample101Left.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample101Left.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/buckets/tests/TestExample101Left.java 2015-08-09 13:07:44 UTC (rev 4596) @@ -0,0 +1,52 @@ +package com.ibm.wala.refactoring.buckets.tests; + +import java.util.ArrayList; +import java.util.Arrays; + +import com.ibm.wala.refactoring.buckets.DependenceMap; + +public class TestExample101Left extends AbstractTestExample { + // the hammock contains line 116-126 + + @Override + protected void buildDataDependences() { + dataDependentLines = new DependenceMap(); + controlDependentLines = new DependenceMap(); + addNodeDependencies(dataDependentLines,117,new int[]{118}); + addNodeDependencies(dataDependentLines,118,new int[]{120}); + addNodeDependencies(dataDependentLines,120,new int[]{122}); + addNodeDependencies(dataDependentLines,122,new int[]{124}); + addNodeDependencies(dataDependentLines,124,new int[]{126}); + addNodeDependencies(controlDependentLines,116,new int[]{117,118}); + addNodeDependencies(controlDependentLines,119,new int[]{120}); + addNodeDependencies(controlDependentLines,121,new int[]{122}); + addNodeDependencies(controlDependentLines,123,new int[]{124}); + addNodeDependencies(controlDependentLines,125,new int[]{126}); + controlDependentLines = controlDependentLines.invert(); + + + + } + + @Override + protected void buildMarkedNodes() { + markedLines = new ArrayList<Integer>(); + markedLines.add(116); + markedLines.add(117); + markedLines.add(118); + markedLines.add(119); + markedLines.add(120); + //markedLines.add(121);this node is predicate with no controlled statements that are marked + markedLines.add(123); + markedLines.add(124); + markedLines.add(125); + markedLines.add(126); + } + + @Override + protected void setHammockLinesNums() { + hammockLinesNums= Arrays.asList(116,117,118,119,120,121,122,123,124,125,126); + + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: Kailiang Y. <yin...@gm...> - 2014-04-05 23:12:41
|
Hi, I want to do static analysis on web application using WALA. The target folder contains html files and javascript files. Does wala support analysis scope for javascript? http://wala.sourceforge.net/wiki/index.php/UserGuide:AnalysisScope For example, input a folder directory (include html, js file), output callGraph for all files. thanks |
From: <mos...@us...> - 2013-04-06 19:29:20
|
Revision: 4645 http://wala.svn.sourceforge.net/wala/?rev=4645&view=rev Author: moshe1100 Date: 2013-04-06 19:29:08 +0000 (Sat, 06 Apr 2013) Log Message: ----------- Fix reduced scope tucking reject check Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/FileUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java 2013-03-29 22:17:15 UTC (rev 4644) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java 2013-04-06 19:29:08 UTC (rev 4645) @@ -102,7 +102,7 @@ } }, TUCKING_RUN("Tucking"), - PARTIAL_TUCKING_RUN("Partial Tucking"); // Tucking without return statements + PARTIAL_TUCKING_RUN("Reduced Scope Tucking"); // Tucking without return statements private String title; Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/FileUtils.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/FileUtils.java 2013-03-29 22:17:15 UTC (rev 4644) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/FileUtils.java 2013-04-06 19:29:08 UTC (rev 4645) @@ -56,7 +56,7 @@ } }, TUCKING("Tucking"), - PARTIAL_TUCKING_RUN("Partial Tucking"); // Tucking without return statements + PARTIAL_TUCKING_RUN("Reduced Scope Tucking"); // Tucking without return statements private String title; Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java 2013-03-29 22:17:15 UTC (rev 4644) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java 2013-04-06 19:29:08 UTC (rev 4645) @@ -245,15 +245,17 @@ Set<Variable> varsOfEdgeSet = dataFlowToExit.getVarsOfEdgeSet(nodeOrLine, Utils.EXIT_LINE); if (sliceLineOrNodesNumbers.contains(nodeOrLine)){ // in slice for (Variable variable : varsOfEdgeSet) { - eachGlobalDefNodeSlice.put(variable, nodeOrLine); - globalDefsInSlice.add(variable); + eachGlobalDefNodeSlice.put(variable.getSSAOriginVar(), nodeOrLine); + // variable may be local var. It is possible when using reduced scope tucking - local variables may be considered as global (live out of scope) + globalDefsInSlice.add(variable.getSSAOriginVar()); + } } if (cosliceLineOrNodesNumbers.contains(nodeOrLine)){ // in coslice for (Variable variable : varsOfEdgeSet) { - eachGlobalDefNodeCoslice.put(variable, nodeOrLine); - globalDefsInCoslice.add(variable); + eachGlobalDefNodeCoslice.put(variable.getSSAOriginVar(), nodeOrLine); + globalDefsInCoslice.add(variable.getSSAOriginVar()); } } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java 2013-03-29 22:17:15 UTC (rev 4644) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java 2013-04-06 19:29:08 UTC (rev 4645) @@ -221,6 +221,13 @@ return name; } + public Variable getSSAOriginVar(){ + if (hasSSAName()){ + return new Variable(getSSAOriginName(), getPdgSymbolNumber()); + } + return this; + } + // return true if this is a temp variable WALA uses in SSA (i.e this.intCache_Temp$17) public boolean hasTempName() { return name != null && name.indexOf(PDGSlidingVarsUtils.SSA_TEMP_VAR) != -1; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mos...@us...> - 2013-03-29 22:17:24
|
Revision: 4644 http://wala.svn.sourceforge.net/wala/?rev=4644&view=rev Author: moshe1100 Date: 2013-03-29 22:17:15 +0000 (Fri, 29 Mar 2013) Log Message: ----------- PDG Line graph Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyInternalFrame.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenuBar.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/ScreensConstants.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/SlidingUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/Utils.java Added Paths: ----------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/PDGLinesGraphScr.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java 2013-03-22 11:39:35 UTC (rev 4643) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/output/AnalyzerLogger.java 2013-03-29 22:17:15 UTC (rev 4644) @@ -462,7 +462,7 @@ for (com.ibm.wala.ipa.slicer.Statement predStatement : predStatements ){ int predStatementIndex =pdg.getNumber(predStatement); map.addDependence(predStatementIndex, j, (Variable)null); - controlWithoutFlow.remove(j); +// controlWithoutFlow.remove(j); } } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyInternalFrame.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyInternalFrame.java 2013-03-22 11:39:35 UTC (rev 4643) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyInternalFrame.java 2013-03-29 22:17:15 UTC (rev 4644) @@ -92,21 +92,24 @@ } }); openButton.setAlignmentX(Component.CENTER_ALIGNMENT); + Dimension preferredSize = new Dimension(100, 25); + openButton.setMaximumSize(preferredSize); panel.add(Box.createVerticalStrut(20)); panel.add(openButton); - addButtonToPanel(panel, "Main Screen", ScreensConstants.MAIN_SCR); - addButtonToPanel(panel, "Slice/Coslice", ScreensConstants.SLICE_COSLICE_SCR); - addButtonToPanel(panel, "PDG Nodes", ScreensConstants.PDG_SCR); - addButtonToPanel(panel, "Blocks", ScreensConstants.BLOCKS_SCR); - addButtonToPanel(panel, "Blocks Graph", ScreensConstants.BLOCKS_GRAPH_SCR); - addButtonToPanel(panel, "PDG Graph", ScreensConstants.PDG_GRAPH_SCR); + addButtonToPanel(panel, "Main Screen", ScreensConstants.MAIN_SCR, preferredSize); + addButtonToPanel(panel, "Slice/Coslice", ScreensConstants.SLICE_COSLICE_SCR, preferredSize); + addButtonToPanel(panel, "PDG Nodes", ScreensConstants.PDG_SCR, preferredSize); + addButtonToPanel(panel, "Blocks", ScreensConstants.BLOCKS_SCR, preferredSize); + addButtonToPanel(panel, "Blocks Graph", ScreensConstants.BLOCKS_GRAPH_SCR, preferredSize); + addButtonToPanel(panel, "PDG Graph", ScreensConstants.PDG_GRAPH_SCR, preferredSize); + addButtonToPanel(panel, "Lines Graph", ScreensConstants.PDG_LINES_SCR, preferredSize); return MyPanel.createTitledPanel("Actions", panel, Color.BLACK, true); } - private void addButtonToPanel(JPanel panel, String buttonName, final String scrConstant) { + private void addButtonToPanel(JPanel panel, String buttonName, final String scrConstant, Dimension preferredSize) { JButton button = new JButton(buttonName); button.addActionListener(new ActionListener() { @@ -116,6 +119,7 @@ } }); button.setAlignmentX(Component.CENTER_ALIGNMENT); + button.setMaximumSize(preferredSize); panel.add(Box.createVerticalStrut(20)); panel.add(button); Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenuBar.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenuBar.java 2013-03-22 11:39:35 UTC (rev 4643) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenuBar.java 2013-03-29 22:17:15 UTC (rev 4644) @@ -161,6 +161,17 @@ }); menu.add(menuItem); + + menuItem = new MyMenuItem("PDG Lines Graph"); + menuItem.addActionListener(new ActionListener(){ + + public void actionPerformed(ActionEvent e) + { + mainDesktop.displayFrame(ScreensConstants.PDG_LINES_SCR, ScreenTypes.INTERNAL); + } + + }); + menu.add(menuItem); } Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/PDGLinesGraphScr.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/PDGLinesGraphScr.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/PDGLinesGraphScr.java 2013-03-29 22:17:15 UTC (rev 4644) @@ -0,0 +1,82 @@ +package com.ibm.wala.refactoring.pdgSliding.tools.gui.screen; + +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import com.ibm.wala.refactoring.pdgSliding.tools.graph.Node; +import com.ibm.wala.refactoring.pdgSliding.tools.tables.IndexToDataTable; +import com.ibm.wala.refactoring.pdgSliding.tools.tables.MyTable; +import com.ibm.wala.refactoring.pdgSliding.tools.tables.model.MyTableModel; +import com.ibm.wala.refactoring.pdgSliding.tools.tables.rowObjects.IndexWithData; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.FileUtils; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.SlidingUtils; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.Utils; + +public class PDGLinesGraphScr extends GraphScr { + + private static final long serialVersionUID = 1L; + + @Override + protected MyTable createDataTable() { + return new IndexToDataTable("Node", "Statement", "Line"); + } + + @Override + protected String getTableTitle() { + return "PDG Nodes"; + } + + @Override + protected void initGraphData() { + List<String> readStringFromFile = FileUtils.readStringFromFile(FileUtils.PDG_GRAPH_INFO); + String label = ""; + for (String line : readStringFromFile) { + if ("Control:".equals(line.trim())){ + label = "Control"; + continue; + } + String[] split = line.split(";"); + String from = split[0]; + String[] toNodes = split[1].split(","); + + // convert to node to line + from = SlidingUtils.getNodeLine(Utils.getLineFromString(from)); + if (!Utils.isEmpty(from)){ + for (String to : toNodes) { + if (!Utils.isEmpty(to)){ + String toLine = SlidingUtils.getNodeLine(Utils.getLineFromString(to)); + if (!Utils.isEmpty(toLine)){ + panel.addEdge(from, toLine, label); + } + } + } + } + } + } + + @Override + protected void initTableData() { + // init PDG table + List<IndexWithData> pairsData = PDGScr.getPairData(FileUtils.PDG_NODES_INFO, false, true); + ((MyTableModel)getDataTable().getModel()).setTableData(pairsData); + } + + @Override + protected void handleNodeSelected() { + // Marking graph nodes selected in table + int[] selectedRows = dataTable.getSelectedRows(); + Set<String> selectedRowsSet = new HashSet<String>(); + for (int i : selectedRows) { + selectedRowsSet.add(dataTable.getValueAt(i, 0).toString()); + } + Collection<Node> nodes = panel.getNodes().values(); + for (Node node : nodes) { + node.setFixed(selectedRowsSet.contains(getFixedLabel(node.getLabel()))); + } + + panel.repaint(); + + } +} \ No newline at end of file Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/ScreensConstants.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/ScreensConstants.java 2013-03-22 11:39:35 UTC (rev 4643) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/ScreensConstants.java 2013-03-29 22:17:15 UTC (rev 4644) @@ -8,6 +8,7 @@ public static final String PDG_SCR = packageStr + "PDGScr"; public static final String CELL_DATA_SCR = packageStr + "CellDataScr"; public static final String PDG_GRAPH_SCR = packageStr + "PDGNodesGraphScr"; + public static final String PDG_LINES_SCR = packageStr + "PDGLinesGraphScr"; public static final String BLOCKS_GRAPH_SCR = packageStr + "BlocksGraphScr"; public static final String BLOCKS_SCR = packageStr + "BlocksScr"; Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/SlidingUtils.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/SlidingUtils.java 2013-03-22 11:39:35 UTC (rev 4643) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/SlidingUtils.java 2013-03-29 22:17:15 UTC (rev 4644) @@ -117,6 +117,19 @@ return pdgNodesMap; } + public static String getNodeLine(Integer node){ + if (node == -1001){ + return "Entry"; + }else if (node == -1000){ + return "Exit"; + } + Pair<String, String> pair = pdgNodesMap.get(node); + if (pair == null){ + return ""; + } + return pair.getFirst(); + } + public static boolean isPhiNode(Integer nodeNum){ return phiInstructionsMap.containsKey(nodeNum); } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/Utils.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/Utils.java 2013-03-22 11:39:35 UTC (rev 4643) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/Utils.java 2013-03-29 22:17:15 UTC (rev 4644) @@ -57,4 +57,15 @@ } + public static Integer getLineFromString(String from) { + if ("exit".equalsIgnoreCase(from)){ + return -1000; + }else if ("entry".equalsIgnoreCase(from)){ + return -1001; + }else if (isValidIntegerNumber(from)){ + return Integer.parseInt(from); + } + return -1; + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mos...@us...> - 2013-03-22 11:39:43
|
Revision: 4643 http://wala.svn.sourceforge.net/wala/?rev=4643&view=rev Author: moshe1100 Date: 2013-03-22 11:39:35 +0000 (Fri, 22 Mar 2013) Log Message: ----------- fix experiment Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java 2013-03-22 09:13:31 UTC (rev 4642) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java 2013-03-22 11:39:35 UTC (rev 4643) @@ -636,7 +636,7 @@ // This is odd because in ConstantPool.literalIndex_refactored_step0(int) it does see that this.intCache.putIfAbsentM has side effects fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(byte[], char[])", "org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 12), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); // also fixing for arraycopy (only needed for line 338, line 325 is flowing to exit because of the put field statement "this.offsets = new int[index* 2]" - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(byte[], char[])", "java.lang.System.arraycopy", 108), Variable.createVariablesFromNames("this.poolContent")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(byte[], char[])", "java.lang.System.arraycopy", 107), Variable.createVariablesFromNames("this.poolContent")); fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(byte[], char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 26), Variable.createVariablesFromNames("referenceContext")); //Fixes for ConstantPool.literalIndex_refactored_step0(char[] utf8Constant) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mos...@us...> - 2013-03-22 09:13:38
|
Revision: 4642 http://wala.svn.sourceforge.net/wala/?rev=4642&view=rev Author: moshe1100 Date: 2013-03-22 09:13:31 +0000 (Fri, 22 Mar 2013) Log Message: ----------- Handle reduced scope tucking reject status Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSliding.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSliding.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSliding.java 2013-02-22 15:34:00 UTC (rev 4641) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSliding.java 2013-03-22 09:13:31 UTC (rev 4642) @@ -49,6 +49,7 @@ private DependenceMap antiDataDependentLines = new DependenceMap(); private DependenceMap controlDependentLines = new DependenceMap(); private Map<Boolean, Set<Integer>> originalFlowToExitLinesOrNodes = new HashMap<Boolean, Set<Integer>>(); // true - nodes, false - lines + private Map<Boolean, DependenceMap> originalDataFlowDependentLines = new HashMap<Boolean, DependenceMap>(); // before we added flow to exit by the marked lines (true - nodes, false - lines) // Map<Integer,ASTNode> nodeIndexMap = null; // private int numberOfLines; @@ -204,10 +205,7 @@ // checking if global vars have defs in slice and coslice (for the same var) GlobalDefsInSliceAndCosliceData repeatingGlobalDefs = new GlobalDefsInSliceAndCosliceData(); - Set<Integer> flowToExitNodes = originalFlowToExitLinesOrNodes.get(useNodesAlgo); - boolean reject = tuckingAlgo.checkIfNeedToReject(tuckingAlgo.getSliceLineOrNodesNumbers(), - tuckingAlgo.getCoSliceLineOrNodesNumbers(), useNodesAlgo, - flowToExitNodes, repeatingGlobalDefs); + boolean reject = checkTuckingRejectStatus(useNodesAlgo, tuckingAlgo, repeatingGlobalDefs); // printing the slice and coslice PDGSlidingRuns tuckingRun = ignoreReturnStatements ? AnalyzerLogger.PDGSlidingRuns.PARTIAL_TUCKING_RUN : AnalyzerLogger.PDGSlidingRuns.TUCKING_RUN; @@ -217,6 +215,30 @@ System.out.println("************************* TUCKING Ended *******************************\n"); } + protected boolean checkTuckingRejectStatus(boolean useNodesAlgo, TuckingAlgo tuckingAlgo, + GlobalDefsInSliceAndCosliceData repeatingGlobalDefs) { + Set<Integer> flowToExitNodes = originalFlowToExitLinesOrNodes.get(useNodesAlgo); + DependenceMap dataFlowToExit = originalDataFlowDependentLines.get(useNodesAlgo).clone(); + // when we run on reduced scope (i.e without the return statement), we need to make all nodes that flow to to the statements outside the scope, as flow to exit nodes + Collection<Integer> returnNodesOrLines = tuckingAlgo.getReturnNodesOrLines(); + if (!Utils.isEmpty(returnNodesOrLines)){ + Set<Integer> flowToOuterScope = new HashSet<Integer>(); + DependenceMap invertedDataFlow = dataFlowToExit.invert(); // inverting so we can get all lines/nodes that flow to a specific point + for (Integer outOfScope : returnNodesOrLines) { + HashSet<Integer> flowToOutOfScopeToAdd = invertedDataFlow.get(outOfScope); // getting the nodes that should flow to exit + flowToOuterScope.addAll(flowToOutOfScopeToAdd); + for (Integer node : flowToOutOfScopeToAdd) { // adding them to data flow map (with the variables that flow) + dataFlowToExit.addDependence(node, Utils.EXIT_LINE, dataFlowToExit.getVarsOfEdgeSet(node, outOfScope)); + } + } + System.out.println("Adding to flowToExit for check reject: " + flowToOuterScope); + flowToExitNodes.addAll(flowToOuterScope); + } + boolean reject = tuckingAlgo.checkIfNeedToReject(tuckingAlgo.getSliceLineOrNodesNumbers(), + tuckingAlgo.getCoSliceLineOrNodesNumbers(), useNodesAlgo, flowToExitNodes, dataFlowToExit, repeatingGlobalDefs); + return reject; + } + private PDGSlidingAlgo getPdgSlidingAlgoAccordingToMode(boolean useNodesAlgo) { if (!useNodesAlgo){ // Run algorithm with calculated dependencies (Using Lines) @@ -466,6 +488,7 @@ DependencesUtil.calcDependencesFromEntryToExit(dataFlowPDG, dataFlowDependentLines); // Saving the original lines to exit before adding the marked ones originalFlowToExitLinesOrNodes.put(false, dataFlowDependentLines.invert().get(Utils.EXIT_LINE)); + originalDataFlowDependentLines.put(false, dataFlowDependentLines.clone()); // Adding edges to exit from marked lines DependencesUtil.addMarkedLinesEdgesToExit(dataFlowDependentLines, markedLines); @@ -477,6 +500,7 @@ // Saving the original lines to exit before adding the marked ones originalFlowToExitLinesOrNodes.put(true, ssaDataFlowDependentNodes.invert().get(Utils.EXIT_LINE)); + originalDataFlowDependentLines.put(true, ssaDataFlowDependentNodes.clone()); // Adding edges to exit from marked lines (SSA) - need to do it by node index instead of line number SSADependencesUtil.addMarkedLinesEdgesToExit(ssaDataFlowDependentNodes, markedLines, dataFlowPDG); Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java 2013-02-22 15:34:00 UTC (rev 4641) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java 2013-03-22 09:13:31 UTC (rev 4642) @@ -31,6 +31,7 @@ private boolean nodesMode; // resolution of program - pdg nodes or source lines private PDG pdg; private boolean ignoreReturnStatements; + private Collection<Integer> returnNodesOrLines; // the nodes/lines out of scope // Compensations private Map<Integer, Set<Variable>> pen1, pen2, pen3; @@ -64,7 +65,7 @@ if (ignoreReturnStatements){ // removing the "return" nodes/lines for fairness to tucking - Collection<Integer> returnNodesOrLines = isNodeMode() ? PDGSlidingVarsUtils.getReturnNodesToLineMap().keySet() : PDGSlidingVarsUtils.getReturnNodesToLineMap().values(); + returnNodesOrLines = isNodeMode() ? PDGSlidingVarsUtils.getReturnNodesToLineMap().keySet() : PDGSlidingVarsUtils.getReturnNodesToLineMap().values(); System.out.println("Removing return " + lines + ": " + returnNodesOrLines); nodesForCoslice.removeAll(returnNodesOrLines); } @@ -229,8 +230,8 @@ // Getting all Global vars that have defs in slice and coslice public boolean checkIfNeedToReject(Set<Integer> sliceLineOrNodesNumbers, Set<Integer> cosliceLineOrNodesNumbers, boolean useNodesAlgo, - Set<Integer> originalFlowToExitNodes, GlobalDefsInSliceAndCosliceData repeatingGlobalDefs) { - DependenceMap dataFlowInverted = dataFlowDependentLines.invert(); + Set<Integer> originalFlowToExitNodes, DependenceMap dataFlowToExit, + GlobalDefsInSliceAndCosliceData repeatingGlobalDefs) { if (Utils.isEmpty(originalFlowToExitNodes)){ return false; } @@ -241,7 +242,7 @@ MultiMap<Variable, Integer> eachGlobalDefNodeCoslice = new HashSetMultiMap<Variable, Integer>(); // for knowing which node responsible for the global def in the coslice // Going over all the nodes that flow to exit and getting all defs (separating it to in slice and coslice) for (Integer nodeOrLine : originalFlowToExitNodes) { - Set<Variable> varsOfEdgeSet = dataFlowInverted.getVarsOfEdgeSet(Utils.EXIT_LINE, nodeOrLine); + Set<Variable> varsOfEdgeSet = dataFlowToExit.getVarsOfEdgeSet(nodeOrLine, Utils.EXIT_LINE); if (sliceLineOrNodesNumbers.contains(nodeOrLine)){ // in slice for (Variable variable : varsOfEdgeSet) { eachGlobalDefNodeSlice.put(variable, nodeOrLine); @@ -276,4 +277,8 @@ return !globalDefsInSlice.isEmpty(); } + + public Collection<Integer> getReturnNodesOrLines() { + return returnNodesOrLines; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mos...@us...> - 2013-02-22 15:34:10
|
Revision: 4641 http://wala.svn.sourceforge.net/wala/?rev=4641&view=rev Author: moshe1100 Date: 2013-02-22 15:34:00 +0000 (Fri, 22 Feb 2013) Log Message: ----------- Fix pen3 bug and tucking global vars check Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSlidingAlgo.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSlidingAlgo.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSlidingAlgo.java 2013-02-21 16:44:00 UTC (rev 4640) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/PDGSlidingAlgo.java 2013-02-22 15:34:00 UTC (rev 4641) @@ -133,7 +133,9 @@ } for (Integer line : slice) { - handlePen3(line, inputToCoSliceNonV); + if (!isEntryNode(line)){ // skip entry nodes from slice + handlePen3(line, inputToCoSliceNonV); + } } @@ -381,11 +383,11 @@ if (predecessors!=null){ for(Integer predNode: predecessors){ if (!slice.contains(predNode)){ - if (isEntryNode(predNode)){ - // skip nodes of entry in slice/coslice - continue; - } - slice.add(predNode); +// if (isEntryNode(predNode)){ +// // skip nodes of entry in slice/coslice but keep getting their predecessors (i.e not adding nodes of HEAP_RET_CALLEE but getting its predecessors) +// continue; +// } + slice.add(predNode); worklist.add(predNode); } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java 2013-02-21 16:44:00 UTC (rev 4640) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java 2013-02-22 15:34:00 UTC (rev 4641) @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -19,6 +18,8 @@ import com.ibm.wala.refactoring.pdgSliding.variables.GlobalDefsInSliceAndCosliceData; import com.ibm.wala.refactoring.pdgSliding.variables.PDGSlidingVarsUtils; import com.ibm.wala.refactoring.pdgSliding.variables.Variable; +import com.ibm.wala.util.collections.HashSetMultiMap; +import com.ibm.wala.util.collections.MultiMap; public class TuckingAlgo implements ISliceNodesAndLines{ private Set<Integer> markedLinesOrNodes ; @@ -236,8 +237,8 @@ originalFlowToExitNodes.remove(Utils.ENTRY_LINE); Set<Variable> globalDefsInSlice = new HashSet<Variable>(); Set<Variable> globalDefsInCoslice = new HashSet<Variable>(); - Map<Variable, Integer> eachGlobalDefNodeSlice = new HashMap<Variable, Integer>(); // for knowing which node responsible for the global def in the slice - Map<Variable, Integer> eachGlobalDefNodeCoslice = new HashMap<Variable, Integer>(); // for knowing which node responsible for the global def in the coslice + MultiMap<Variable, Integer> eachGlobalDefNodeSlice = new HashSetMultiMap<Variable, Integer>(); // for knowing which node responsible for the global def in the slice + MultiMap<Variable, Integer> eachGlobalDefNodeCoslice = new HashSetMultiMap<Variable, Integer>(); // for knowing which node responsible for the global def in the coslice // Going over all the nodes that flow to exit and getting all defs (separating it to in slice and coslice) for (Integer nodeOrLine : originalFlowToExitNodes) { Set<Variable> varsOfEdgeSet = dataFlowInverted.getVarsOfEdgeSet(Utils.EXIT_LINE, nodeOrLine); @@ -260,11 +261,15 @@ if (!globalDefsInSlice.isEmpty()){ for (Variable globalDef : globalDefsInSlice) { System.out.println("Global def " + globalDef + " in slice and coslice"); - Integer nodeIndexSlice = eachGlobalDefNodeSlice.get(globalDef); - Integer nodeIndexCoslice = eachGlobalDefNodeCoslice.get(globalDef); + Set<Integer> nodeIndicesSlice = eachGlobalDefNodeSlice.get(globalDef); + Set<Integer> nodeIndicesCoslice = eachGlobalDefNodeCoslice.get(globalDef); - repeatingGlobalDefs.addGlobalVar(globalDef, useNodesAlgo ? PDGSlidingVarsUtils.getNodeLine(nodeIndexSlice) : nodeIndexSlice, - useNodesAlgo ? PDGSlidingVarsUtils.getNodeLine(nodeIndexCoslice) : nodeIndexCoslice); + for (Integer nodeIndexSlice : nodeIndicesSlice) { + for (Integer nodeIndexCoslice : nodeIndicesCoslice) { + repeatingGlobalDefs.addGlobalVar(globalDef, useNodesAlgo ? PDGSlidingVarsUtils.getNodeLine(nodeIndexSlice) : nodeIndexSlice, + useNodesAlgo ? PDGSlidingVarsUtils.getNodeLine(nodeIndexCoslice) : nodeIndexCoslice); + } + } } } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java 2013-02-21 16:44:00 UTC (rev 4640) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java 2013-02-22 15:34:00 UTC (rev 4641) @@ -49,6 +49,7 @@ import com.ibm.wala.types.TypeReference; public class PDGSlidingVarsUtils { + private static final String DOT = "."; private static final String NEW_STATEMENT = "new "; private static PDGSlidingSymbolsMap symbolsMap = new PDGSlidingSymbolsMap(); // A map of vars symbols (Representing number in instructions to real name) private static StatementsDefsAndUses statementsDefsAndUses = null; @@ -100,19 +101,21 @@ SSAInstruction instruction = statementWithInstructionIndex.getInstruction(); if (instruction instanceof SSAGetInstruction){ int def = instruction.getDef(); - int ref = ((SSAGetInstruction)instruction).getRef(); + SSAGetInstruction getInstruction = (SSAGetInstruction)instruction; + int ref = getInstruction.getRef(); String refName = getRefName(ref, statement, instruction); - String fieldName = refName + "." + ((SSAGetInstruction)instruction).getDeclaredField().getName().toString(); + String fieldName = refName + DOT + getInstruction.getDeclaredField().getName().toString(); putInSymbolMap(def, getTempName(fieldName, def)); statementsDefsAndUses.addUse(statement, ref); // adding use of ref - statementsDefsAndUses.addUse(statement, fieldName, def); // adding use of field + statementsDefsAndUses.addUse(statement, fieldName, def, getClassFromTypeReference(getInstruction.getDeclaredField().getDeclaringClass())); // adding use of field statementsDefsAndUses.addDef(statement, getTempName(fieldName, def), def); // adding def of field symbol (i.e 35 = getfield is def of 35) }else if (instruction instanceof SSAPutInstruction){ - int ref = ((SSAPutInstruction)instruction).getRef(); + SSAPutInstruction putInstruction = (SSAPutInstruction)instruction; + int ref = putInstruction.getRef(); String refName = getRefName(ref, statement, instruction); - String realName = refName + "." + ((SSAPutInstruction)instruction).getDeclaredField().getName().toString(); - statementsDefsAndUses.addDef(statement, realName, ref); // adding def + String realName = refName + DOT + putInstruction.getDeclaredField().getName().toString(); + statementsDefsAndUses.addDef(statement, realName, ref, getClassFromTypeReference(putInstruction.getDeclaredField().getDeclaringClass())); // adding def handleDefaultInstrucionDefsAndUses(statement, instruction); // replacing "new" statements with current def name (if found) for (int i=0; i < instruction.getNumberOfUses(); i++){ @@ -144,7 +147,7 @@ if (!Utils.isEmpty(localNames)){ putInSymbolMap(def, getSSAName(localNames[0], def)); }else{ - putInSymbolMap(def, refName + "." + method + parameters); + putInSymbolMap(def, refName + DOT + method + parameters); } statementsDefsAndUses.addDef(statement, def); // adding def } @@ -274,14 +277,14 @@ // static field refName = getDeclaringClassFromField(field, true); } - String useString = refName + "." + fieldName; + String useString = refName + DOT + fieldName; // Heap Param Caller - adding to Uses statementsDefsAndUses.addUse(statement, useString, use, getDeclaringClassFromField(field, false)); // adding use }else if (pk instanceof StaticFieldKey){ IField field = ((StaticFieldKey)pk).getField(); String fieldName = field.getName().toString(); - String useString = getRefName(-1/*static*/, statement, null) + "." + fieldName; - statementsDefsAndUses.addUse(statement, useString, -1); // adding use + String useString = getRefName(-1/*static*/, statement, null) + DOT + fieldName; + statementsDefsAndUses.addUse(statement, useString, -1, getDeclaringClassFromField(field, false)); // adding use } // else if (pk instanceof ArrayLengthKey){ // System.out.println("Adding use: " + pk.toString()); @@ -300,7 +303,7 @@ // // static field // refName = getDeclaringClassFromField(field, true); // } - String useString = refName + "." + fieldName; + String useString = refName + DOT + fieldName; // Heap Return Caller - adding to Defs statementsDefsAndUses.addDef(statement, useString, use, getDeclaringClassFromField(field, false)); // adding def }else if (pk instanceof StaticFieldKey){ @@ -308,7 +311,7 @@ String fieldName = field.getName().toString(); String refName = getDeclaringClassFromField(field, false); // String useString = getRefName(-1/*static*/, statement, null) + "." + fieldName; - String useString = refName + "." + fieldName; + String useString = refName + DOT + fieldName; // Heap Return Caller - adding to Defs statementsDefsAndUses.addDef(statement, useString, -1, refName); // adding def } @@ -326,7 +329,7 @@ IField field = ((InstanceFieldKey)pk).getField(); String fieldName = field.getName().toString(); String refName = getDeclaringClassFromField(field, true); - String defString = refName + "." + fieldName; + String defString = refName + DOT + fieldName; // Heap Param Callee - adding to Defs, Heap Ret Callee - adding use if (statement.getKind().equals(Kind.HEAP_PARAM_CALLEE)){ statementsDefsAndUses.addDef(statement, defString, null, getDeclaringClassFromField(field, false)); // adding def @@ -337,7 +340,7 @@ IField field = ((StaticFieldKey)pk).getField(); String fieldName = field.getName().toString(); String refName = getDeclaringClassFromField(field, false); - String defString = refName + "." + fieldName; + String defString = refName + DOT + fieldName; // Heap Param Callee - adding to Defs, Heap Ret Callee - adding use if (statement.getKind().equals(Kind.HEAP_PARAM_CALLEE)){ statementsDefsAndUses.addDef(statement, defString, null, refName); // adding def @@ -418,7 +421,7 @@ private static String getTempName(String realName, int symbol) { return realName+SSA_TEMP_VAR+symbol; - } + } private static String getDeclaringClassFromField(IField field, boolean isInstanceField) { // String packageName = field.getDeclaringClass().getName().getPackage().toString(); @@ -532,7 +535,7 @@ TypeName typeName = typeRef.getName(); String packageName = typeName.getPackage() == null ? "" : typeName.getPackage().toString(); String className = typeName.getClassName().toString(); - packageName = packageName == null ? "" : packageName.replaceAll("/", ".") + "."; + packageName = packageName == null ? "" : packageName.replaceAll("/", DOT) + DOT; return packageName + className; } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java 2013-02-21 16:44:00 UTC (rev 4640) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java 2013-02-22 15:34:00 UTC (rev 4641) @@ -123,7 +123,7 @@ } else if (!name.equals(other.name)) return false; if (className != null && other.className != null) { - if (!className.equals(other.className != null)) + if (!className.equals(other.className)) return false; // checking className only when both are not null } return true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mos...@us...> - 2013-02-21 16:44:08
|
Revision: 4640 http://wala.svn.sourceforge.net/wala/?rev=4640&view=rev Author: moshe1100 Date: 2013-02-21 16:44:00 +0000 (Thu, 21 Feb 2013) Log Message: ----------- fix compile Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/sliding/methodSliders/GeneralSliding.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/sliding/methodSliders/GeneralSliding.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/sliding/methodSliders/GeneralSliding.java 2013-02-21 16:33:50 UTC (rev 4639) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/sliding/methodSliders/GeneralSliding.java 2013-02-21 16:44:00 UTC (rev 4640) @@ -265,7 +265,7 @@ //init before any slice computations WALAwrapper.init(fileName, projName, methodName, className,methodDeclaration.getBody().getStartPosition()); - MyWALAWrapper.init(fileName, projName, methodName, className,methodDeclaration.getBody().getStartPosition()); + MyWALAWrapper.init(fileName, projName, methodName, className,methodDeclaration); createSliceandCoSlice(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mos...@us...> - 2013-02-21 16:34:04
|
Revision: 4639 http://wala.svn.sourceforge.net/wala/?rev=4639&view=rev Author: moshe1100 Date: 2013-02-21 16:33:50 +0000 (Thu, 21 Feb 2013) Log Message: ----------- Logger Analayzer tool Added Paths: ----------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/AbugraphPanel.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Edge.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Node.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/MainDesktop.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/CallBackObject.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/ComponentsConstants.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/EqualSizesLayout.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/FrameStamp.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/JCalendarButton.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/JCalendarPopup.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/JXTaskBar.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyComboBox.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyDialog.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyInternalFrame.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyLabel.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenu.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenuBar.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyMenuItem.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyPanel.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyRealInternalFrame.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyScrollPane.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyTableTextField.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/components/MyTextField.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/BlocksGraphScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/BlocksScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/CellDataScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/GraphScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/MainScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/OriginalMethodScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/PDGNodesGraphScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/PDGScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/ScreensConstants.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/SliceAndCosliceScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/SymbolsMapExternalScr.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/screen/TabsFrameWithTables.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/IndexToDataTable.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/MyTable.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/SourceCodeTable.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/model/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/model/AbstractColumn.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/model/MyTableModel.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/renderers/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/renderers/MyCheckboxTableCellRenderer.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/renderers/MyDefaultTableCellRenderer.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/renderers/SourceCodeTableRenderer.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/rowObjects/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/rowObjects/ExtraColumnData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/rowObjects/IndexWithData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/tables/rowObjects/SourceLine.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/BlockData.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/FileUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/GeneralGuiServices.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/IconicManager.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/MyDate.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/MyException.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/Pair.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/SlidingUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/UIDecorations.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/Utils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/multiMap/ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/multiMap/AbstractMultiMap.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/multiMap/HashSetMultiMap.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/utils/multiMap/MultiMap.java Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/AbugraphPanel.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/AbugraphPanel.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/AbugraphPanel.java 2013-02-21 16:33:50 UTC (rev 4639) @@ -0,0 +1,887 @@ +/* + * AbugraphPanel.java + * + * Copyright (c) 2004 Sun Microsystems, Inc. + * All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * -Redistribution of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * -Redistribution in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * Neither the name of Sun Microsystems, Inc. or the names of contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING + * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") + * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE + * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS + * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST + * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY + * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed, licensed or intended + * for use in the design, construction, operation or maintenance of any + * nuclear facility. + */ + +package com.ibm.wala.refactoring.pdgSliding.tools.graph; + +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Point; +import java.awt.RenderingHints; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; +import java.util.ConcurrentModificationException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import javax.swing.JPanel; +import javax.swing.SwingUtilities; + +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.CallBackObject; + + +/** + * AbuGraph panel class + */ +public class AbugraphPanel extends JPanel +implements Runnable, MouseListener, MouseMotionListener +{ + //~Constants ---------------------------------------------------------------- + private static final float MIN_ZOOM_LEVEL = 1f; + private static final int DEF_ZOOM_LEVEL = 1; + private static final float ZOOM_STEP = 0.25f; + + //~Variables ---------------------------------------------------------------- + private CallBackObject callBack; + private Map<String, Integer> node_labels; + private Map<Integer, Node> nodes; + private Set<Edge> edges; + private Thread thread; + private boolean showEdgeLabels; + private boolean pause; + private int numMouseButtonsDown; + private Node selected; + private boolean pickfixed; + private Image offscreen; + private Dimension offscreensize; + private Graphics offgraphics; + private Set<Integer> releasedNodeIndexes; + private float zoomLevel; + private Point clickedPoint; + + private Point minXY = new Point(0,0); + private Point maxXY = new Point(800,800); + + private boolean roundNodes = true; + //~Methods ------------------------------------------------------------------ + + /** + * Abugraph constructor (to be replaced when menu works) + */ + public AbugraphPanel(CallBackObject callBack) + { + this.callBack = callBack; + this.node_labels = new HashMap<String, Integer>(); + this.edges = new HashSet<Edge>(); + this.releasedNodeIndexes = new HashSet<Integer>(); + this.nodes = new HashMap<Integer, Node>(); + this.zoomLevel = DEF_ZOOM_LEVEL; + addMouseListener(this); + addMouseWheelListener(new MouseWheelListener() { + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + if (e.getWheelRotation() < 0){ + zoomIn(); + }else{ + zoomOut(); + } + AbugraphPanel.this.repaint(); + + } + }); + + } + + public void setRoundNodes(boolean roundNodes) { + this.roundNodes = roundNodes; + } + + /** + * Method to clear the panel + */ + public void clear() + { + this.edges.clear(); + this.nodes.clear(); + this.node_labels.clear(); + this.releasedNodeIndexes.clear(); + } + + /** + * This method is called after loading a file. It is used to recover the + * zoom level used by that file graph. + */ + public void defineZoomLevel() + { + if( !this.edges.isEmpty() ) + { + int sum_lengths = 0; + for(Edge e: this.edges) sum_lengths += e.getLength(); + this.zoomLevel = sum_lengths/this.edges.size(); + } + else this.zoomLevel = DEF_ZOOM_LEVEL; + } + + /** + * Method to zoomIn + */ + public void zoomIn() + { + this.zoomLevel += ZOOM_STEP; + getParent().doLayout(); +// for(Edge e: this.edges){ +// e.setLength(this.zoomLevel); +// e.changeFontSize(true, false); +// } +// for(Node n : this.nodes.values()){ +// n.changeFontSize(true, false); +// } + } + + /** + * Method to zoomOut + */ + public void zoomOut() + { + this.zoomLevel -= ZOOM_STEP; + if(this.zoomLevel < MIN_ZOOM_LEVEL) this.zoomLevel = MIN_ZOOM_LEVEL; + getParent().doLayout(); +// for(Edge e: this.edges){ +// e.setLength(this.zoomLevel); +// e.changeFontSize(false, false); +// } +// for(Node n : this.nodes.values()){ +// n.changeFontSize(false, false); +// } + } + + /** + * Method to define de 'showEdgeLabels' attribute + */ + public void setLabels(boolean arg) + { + this.showEdgeLabels = arg; + } + + /** + * Method to define de 'pause' attribute + */ + public void setPause(boolean arg) + { + this.pause = arg; + } + + /** + * Method to get the nodes collection + */ + public Map<Integer, Node> getNodes() + { + return this.nodes; + } + + public Set<Edge> getEdges() { + return edges; + } + + /** + * Method to get a new node index. It tries to re-use a discarded index, but + * if it is not possible, it generates a new one + */ + private int getNextNodeIndex() + { + int rv; + if(this.releasedNodeIndexes.isEmpty()) + { + rv = this.nodes.size(); + } + else + { + rv = this.releasedNodeIndexes.iterator().next(); + this.releasedNodeIndexes.remove(rv); + } + return rv; + } + + /** + * Method to add a new node + * @param ar_label Node label + * + * @return The node index + */ + public int addNode(String ar_label, boolean round) + { + int nodeIdx = this.getNextNodeIndex(); + Node n = new Node(ar_label, round); +// if(nodeIdx == 0) n.setFixed(true); + n.setX(10 + 380 * Math.random()); + n.setY(10 + 380 * Math.random()); + this.nodes.put(nodeIdx,n); + this.node_labels.put(ar_label,nodeIdx); + return nodeIdx; + } + + /** + * Method to update the edges label + * + * @param ar_orig The edge originator node + * @param ar_dest The edge destination node + * @param ar_newLabel The new label + */ + public void updateEdge(String ar_orig, String ar_dest, String ar_newLabel) + { + Integer origIndex = this.node_labels.get(ar_orig); + if(origIndex == null) return; + + Integer destIndex = this.node_labels.get(ar_dest); + if(destIndex == null) return; + + Edge e = new Edge(origIndex, destIndex, 50); + if(this.edges.remove(e) == true) + { + e.setLabel(ar_newLabel); + this.edges.add(e); + } + } + + /** + * Method to update the node label + * + * @param ar_label Current label (the one to be replaced) + * @param ar_newLabel The new label + */ + public void updateNode(String ar_label, String ar_newLabel) + { + Integer nodeToUpdate = this.node_labels.get(ar_label); + if(nodeToUpdate != null) + { + Node node2update = nodes.get(nodeToUpdate); + node2update.setLabel(ar_newLabel); + + Integer nodeExist = this.node_labels.get(ar_newLabel); + if(nodeExist != null) + { + Node existingNode = this.nodes.get(nodeExist); + + Set<Integer> existingFromNodes = existingNode.getFromNodes(); + for(Integer from2remove : existingFromNodes) + { + Edge e2remove = new Edge(from2remove,nodeExist,50); + this.edges.remove(e2remove); + Edge e2add = new Edge(from2remove,nodeToUpdate,50); + this.edges.add(e2add); + node2update.addFrom(from2remove); + } + + Set<Integer> existingToNodes = existingNode.getToNodes(); + for(Integer to2remove : existingToNodes) + { + Edge e2remove = new Edge(nodeExist,to2remove,50); + this.edges.remove(e2remove); + Edge e2add = new Edge(nodeToUpdate,to2remove,50); + this.edges.add(e2add); + node2update.addTo(to2remove); + } + + this.removeNode(nodeExist); + } + + this.node_labels.remove(ar_label); + this.node_labels.put(ar_newLabel,nodeToUpdate); + } + } + + /** + * Method to remove an edge + * + * @param ar_from Originating node + * @param ar_to Destination node + */ + public void removeEdge(String ar_from,String ar_to) + { + Integer from = this.node_labels.get(ar_from); + if(from == null) return; + + Integer to = this.node_labels.get(ar_to); + if(to == null) return; + + Edge e = new Edge(from,to,50); + + if( this.edges.remove(e) == true) + { + Node nodeFrom = nodes.get(e.getFrom()); + if(nodeFrom != null) + { + nodeFrom.decNeighbours(); + if( !nodeFrom.hasNeighbours() ) removeNode(e.getFrom()); + else nodeFrom.removeTo(to); + } + + Node nodeTo = nodes.get(e.getTo()); + if(nodeTo != null) + { + nodeTo.decNeighbours(); + if(!nodeTo.hasNeighbours()) removeNode(e.getTo()); + else nodeTo.removeFrom(from); + } + } + } + + /** + * Method to remove a node from the graph + * + * @param ar_nodeIdx Node index + */ + public void removeNode(int ar_nodeIdx) + { + Node node2del = this.nodes.get(ar_nodeIdx); + this.node_labels.remove(node2del.getLabel()); + this.nodes.remove(new Integer(ar_nodeIdx)); + this.releasedNodeIndexes.add(ar_nodeIdx); + } + + /** + * Method to add a new edge + * + * @param ar_from Originating node + * @param ar_to Destination node + * @param ar_label The edge label + * + * @return The just created edge + */ + public Edge addEdge(String ar_from, String ar_to, String ar_label) + { + //System.out.println("+++ Adding edge from ["+from+"] to ["+to+']') + + Integer from = this.node_labels.get(ar_from); + if(from == null) from = this.addNode(ar_from, roundNodes); + + Integer to = this.node_labels.get(ar_to); + if(to == null) to = this.addNode(ar_to, roundNodes); + + Edge e = new Edge(from,to,50,ar_label); + + if( edges.add(e) == true ) + { + Node fromNode = this.nodes.get(from); + fromNode.incNeighbours(); + + Node toNode = this.nodes.get(to); + toNode.incNeighbours(); + + fromNode.addTo(to); + toNode.addFrom(from); + } + + return e; + } + + /** + * Thread 'run' method. Basically checks the pause flag and calls the + * 'relax()' method periodically. + */ + public void run() + { + Thread me = Thread.currentThread(); + while (thread == me) + { + while(this.pause == true) + { + try { Thread.sleep(1000); } + catch (InterruptedException e) {break;} + } + + relax(); + + try { Thread.sleep(10); } + catch (InterruptedException e) {break;} + } + } + + /** + * "Relaxing" method. Used to periodically update the graph. + */ + private synchronized void relax() + { + try{ + for(Edge e : this.edges) + { + Node nodeTo = this.nodes.get(e.getTo()); + Node nodeFrom = this.nodes.get(e.getFrom()); + + if(nodeTo == null || nodeFrom == null) continue; + + double vx = nodeTo.getX() - nodeFrom.getX(); + double vy = nodeTo.getY() - nodeFrom.getY(); + double len = Math.sqrt(vx*vx + vy*vy); + len = (len == 0) ? .0001 : len; + double f = (e.getLength() - len) / (len * 3); + double dx = f * vx; + double dy = f * vy; + nodeTo.setDx(dx + nodeTo.getDx()); + nodeTo.setDy(dy + nodeTo.getDy()); + nodeFrom.setDx(nodeFrom.getDx() - dx); + nodeFrom.setDy(nodeFrom.getDy() - dy); + } + + Set<Entry<Integer, Node>> entrySet = nodes.entrySet(); + for( Map.Entry me : entrySet ) + { + Node n1 = (Node)me.getValue(); + double dx = 0; + double dy = 0; + for( Map.Entry mf : entrySet ) + { + Node n2 = (Node)mf.getValue(); + if (n1.equals(n2)) continue; + + double vx = n1.getX() - n2.getX(); + double vy = n1.getY() - n2.getY(); + double len = vx * vx + vy * vy; + if (len == 0) + { + dx += Math.random(); + dy += Math.random(); + } + else if (len < 100 * 100) + { + dx += vx / len; + dy += vy / len; + } + } + double dlen = dx * dx + dy * dy; + if (dlen > 0) + { + dlen = Math.sqrt(dlen) / 2; + n1.setDx(n1.getDx()+(dx/dlen)); + n1.setDy(n1.getDy()+(dy/dlen)); + } + } + + Dimension d = getSize(); + for( Map.Entry me : entrySet ) + { + Node n = (Node)me.getValue(); + if ( !n.isFixed() ) + { + n.addToX(Math.max(-5, Math.min(5, n.getDx()))); + n.addToY(Math.max(-5, Math.min(5, n.getDy()))); + } + + if (n.getX() < 0) + { + n.setX(0); + } + else if (n.getX() > d.width) + { + n.setX(d.width); + } + + if (n.getY() < 0) + { + n.setY(0); + } + else if (n.getY() > d.height) + { + n.setY(d.height); + } + + n.setDx(n.getDx() / 2.0); + n.setDy(n.getDy() / 2.0); + } + repaint(); + + }catch (ConcurrentModificationException ex){ + // do nothing + } + } + + /** + * Thread start method + */ + public void start() + { + thread = new Thread(this); + thread.start(); + } + + /** + * Thread stop method + */ + public void stop() + { + thread = null; + } + + @Override + protected void paintComponent(Graphics ar_g) { + Dimension d = getSize(); + + Graphics2D g2 = (Graphics2D) ar_g; + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, // Anti-alias! + RenderingHints.VALUE_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, // Anti-alias! + RenderingHints.VALUE_TEXT_ANTIALIAS_ON); + g2.setRenderingHint(RenderingHints.KEY_RENDERING, // Anti-alias! + RenderingHints.VALUE_RENDER_QUALITY); + + int w = d.width;// real width of canvas + int h = d.height;// real height of canvas + // Translate used to make sure scale is centered +// g2.translate(w/2, h/2); + g2.scale(zoomLevel, zoomLevel); +// g2.translate(-w/2, -h/2); + + super.paintComponent(ar_g); + if ((offscreen == null) || (d.width != offscreensize.width) + || (d.height != offscreensize.height)) + { + offscreen = createImage(d.width, d.height); + offscreensize = d; + if (offgraphics != null) + { + offgraphics.dispose(); + } + offgraphics = offscreen.getGraphics(); + //offgraphics.setFont(NODE_LABEL_FONT); + } + offgraphics.setColor(getBackground()); + offgraphics.fillRect(0, 0, d.width, d.height); + + //Draw all edges and nodes + for(Edge e : edges) e.draw(offgraphics, this.nodes, this.showEdgeLabels); + FontMetrics fm = null; + resetMinMaxPoints(); + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + if (fm == null){ + offgraphics.setFont(n.getFont()); + fm = offgraphics.getFontMetrics(); + } + n.draw(offgraphics, fm, selected); + + handleMinMaxPoints(n); + } + handleMinXYNegative(); + ar_g.drawImage(offscreen, 0, 0, null); + } + + private void handleMinXYNegative() { + if (minXY.x < 0 || minXY.y < 0){ + int dx = minXY.x >= 0 ? 0 : 0-minXY.x; + int dy = minXY.y >= 0 ? 0 : 0-minXY.y; + + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + n.addToX(dx); + n.addToY(dy); + } + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + repaint(); + } + }); + + } + + + + } + + private void resetMinMaxPoints() { + minXY.x = 0; + minXY.y = 0; + maxXY.x = 500; + maxXY.y = 500; + + } + + private void handleMinMaxPoints(Node n) { + minXY.x = (int) Math.min(minXY.x, n.getX()); + minXY.y = (int) Math.min(minXY.y, n.getY()); + maxXY.x = (int) Math.max(maxXY.x, n.getX()); + maxXY.y = (int) Math.max(maxXY.y, n.getY()); + + + } + + /** + * Update method + * + * @param ar_g Graphics object reference + */ +// public synchronized void update(Graphics ar_g) +// { +// Dimension d = getSize(); +// if ((offscreen == null) || (d.width != offscreensize.width) +// || (d.height != offscreensize.height)) +// { +// offscreen = createImage(d.width, d.height); +// offscreensize = d; +// if (offgraphics != null) +// { +// offgraphics.dispose(); +// } +// offgraphics = offscreen.getGraphics(); +// //offgraphics.setFont(NODE_LABEL_FONT); +// } +// offgraphics.setColor(getBackground()); +// offgraphics.fillRect(0, 0, d.width, d.height); +// +// //Draw all edges and nodes +// for(Edge e : edges) e.draw(offgraphics, this.nodes, this.showEdgeLabels); +// FontMetrics fm = null; +// for( Map.Entry me : nodes.entrySet() ) +// { +// Node n = (Node)me.getValue(); +// if (fm == null){ +// offgraphics.setFont(n.getFont()); +// fm = offgraphics.getFontMetrics(); +// } +// n.draw(offgraphics, fm, selected); +// } +// ar_g.drawImage(offscreen, 0, 0, null); +// } + + /** + * Method to get the current graph state, that is, the data structures + * which allows re-build the graph after deserialization from a file. + * + * + * @return Array of Objects containig: + * <ul> + * <li> The nodes map as first element + * <li> The edges set as second element + * <li> The releases node indexes set as third element + * <li> The node showEdgeLabels map as fourth element + * </ul> + */ + public Object[] getGraphState() + { + Object[] rv = null; + if( !this.edges.isEmpty() ) + { + rv = new Object[4]; + rv[0] = this.nodes; + rv[1] = this.edges; + rv[2] = this.releasedNodeIndexes; + rv[3] = this.node_labels; + } + + return rv; + } + + /** + * Method to set the graph state (this is the complementary method of + * 'getGraphState()' + * + * + * @param Array of Objects containig: + * <ul> + * <li> The nodes map as first element + * <li> The edges set as second element + * <li> The releases node indexes set as third element + * <li> The node showEdgeLabels map as fourth element + * </ul> + */ + public void setGraphState(Object[] ar_state) + { + this.nodes = (Map<Integer,Node>)ar_state[0]; + this.edges = (Set<Edge>)ar_state[1]; + this.releasedNodeIndexes = (Set<Integer>)ar_state[2]; + this.node_labels = (Map<String,Integer>)ar_state[3]; + } + + // + // Event handling methods + // + + /** + * Invoked when the mouse button has been clicked (pressed + * and released) on a component. + */ + public void mouseClicked(MouseEvent e) {} + + /** + * Invoked when a mouse button has been pressed on a component. + */ + public void mousePressed(MouseEvent e) + { + clickedPoint = e.getPoint(); + numMouseButtonsDown++; + addMouseMotionListener(this); + double bestdist = Double.MAX_VALUE; + int x = e.getX(); + int y = e.getY(); + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + double dist = (n.getX()-x) * (n.getX()-x) + (n.getY()-y) * (n.getY()-y); + if (dist < bestdist && dist < 90) + { + selected = n; + bestdist = dist; + } + } + if(selected != null) + { + pickfixed = selected.isFixed(); + selected.setFixed(true); + selected.setX(x); + selected.setY(y); + } + repaint(); + getParent().doLayout(); + e.consume(); + } + + /** + * Invoked when a mouse button has been released on a component. + */ + public void mouseReleased(MouseEvent e) + { + numMouseButtonsDown--; + removeMouseMotionListener(this); + Node selectedNode = null; + if(selected != null) + { + selectedNode = selected; + selected.setFixed(pickfixed); + selected.setX( e.getX() ); + selected.setY( e.getY() ); + if (numMouseButtonsDown == 0) selected = null; + } + repaint(); + getParent().doLayout(); + + callBack.doAction(selectedNode); + + e.consume(); + } + + /** + * Invoked when the mouse enters a component. + */ + public void mouseEntered(MouseEvent e) {} + + /** + * Invoked when the mouse exits a component. + */ + public void mouseExited(MouseEvent e) {} + + /** + * Invoked when a mouse button is pressed on a component and then + * dragged. <code>MOUSE_DRAGGED</code> events will continue to be + * delivered to the component where the drag originated until the + * mouse button is released (regardless of whether the mouse position + * is within the bounds of the component). + * <p> + * Due to platform-dependent Drag&Drop implementations, + * <code>MOUSE_DRAGGED</code> events may not be delivered during a native + * Drag&Drop operation. + */ + public void mouseDragged(MouseEvent e) + { + if (selected != null){ + double oldX = selected.getX(); + double oldY = selected.getY(); + selected.setX( e.getX() ); + selected.setY( e.getY() ); + if (e.isShiftDown()){ // moving all the other nodes together when shift is pressed + double dx = selected.getX() - oldX; + double dy = selected.getY() - oldY; + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + if (selected != n){ + n.setX(n.getX() + dx); + n.setY(n.getY() + dy); + } + + } + } + }else if (clickedPoint != null){ // not dragging any node - move all nodes + double dx = e.getX() - clickedPoint.getX(); + double dy = e.getY() - clickedPoint.getY(); + for( Map.Entry me : nodes.entrySet() ) + { + Node n = (Node)me.getValue(); + n.setX(n.getX() + dx); + n.setY(n.getY() + dy); + + } + clickedPoint = e.getPoint(); + + + } + repaint(); + getParent().doLayout(); + e.consume(); + } + + /** + * Invoked when the mouse cursor has been moved onto a component + * but no buttons have been pushed. + */ + public void mouseMoved(MouseEvent e) {} + + public float getZoomLevel() { + return zoomLevel; + } + + public void revertToOriginal() { + this.zoomLevel = DEF_ZOOM_LEVEL; +// for(Edge e: this.edges){ +// e.setLength(this.zoomLevel); +// e.changeFontSize(true, true); +// } +// for(Node n : this.nodes.values()){ +// n.changeFontSize(true, true); +// } + + } + + @Override + public Dimension getPreferredSize() { +// Dimension size = getParent().getSize(); + int width = maxXY.x - minXY.x; + int height = maxXY.y - minXY.y; + return new Dimension((int)(width * zoomLevel), (int)(height * zoomLevel)); +// return super.getPreferredSize(); + } +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Edge.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Edge.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Edge.java 2013-02-21 16:33:50 UTC (rev 4639) @@ -0,0 +1,265 @@ +/* + * Edge.java + * + * Copyright (c) 2007 Ignacio Labrador Pavon + * 28814 Daganzo, Madrid. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of copyright holders nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +package com.ibm.wala.refactoring.pdgSliding.tools.graph; + +import java.awt.Color; +import java.awt.Font; +import java.awt.Graphics; +import java.awt.Polygon; +import java.io.Serializable; +import java.util.Map; + +/** + * Edge class. + * + * @author ilp + * @since June-2007 + */ +public class Edge implements Serializable +{ + //~Constants ---------------------------------------------------------------- + private static final long serialVersionUID = -3721211867649111L; + private static final Color EDGE_LABEL_COLOR = Color.blue; + private static final Color ARC_COLOR_1 = Color.black; + private static final Color ARC_COLOR_2 = Color.lightGray; + private static final Color ARC_COLOR_3 = Color.red; + private static final Font EDGE_LABEL_FONT = new Font("default",Font.ITALIC,12); + private static final int ARROW_SIZE = 8; + private static final double ARROW_HOOK = 0.8; + + //~Variables ---------------------------------------------------------------- + private Integer from = null; + private Integer to = null; + private String label = null; + private int hash = 0; + private int length = 0; + private Font font = EDGE_LABEL_FONT; + + //~Methods ------------------------------------------------------------------ + + /** + * Constructor (without label) + * + * @param from Originating node + * @param to Destination node + */ + public Edge(int from, int to, int length) + { + this.from = from; + this.to = to; + this.label = null; + this.length = length; + } + + /** + * Constructor + * + * @param from Originating node + * @param to Destination node + * @param label Edge label + */ + public Edge(int from, int to, int length, String label) + { + this.from = from; + this.to = to; + this.label = label; + this.length = length; + } + + /** + * Overrides the Object.hashcode method. Just the members 'from' and 'to' are + * used to calculate the hash code. + */ + public int hashCode() + { + if(hash == 0) + { + StringBuilder sb = new StringBuilder(); + sb.append(from); + sb.append('-'); + sb.append(to); + hash = sb.toString().hashCode(); + } + return hash; + } + + /** + * Overrides the Object.equals method + */ + public boolean equals(Object other) + { + if(other instanceof Edge) return (this.hash == other.hashCode()); + else throw new ClassCastException(); + } + + /** + * Method to return the edge associated value + */ + public String getLabel() + { + return this.label; + } + + /** + * Method to define the edge associated value + */ + public void setLabel(String lbl) + { + this.label = lbl; + } + + /** + * Method to return the 'from' + */ + public Integer getFrom() + { + return this.from; + } + + /** + * Method to return the 'to' + */ + public Integer getTo() + { + return this.to; + } + + /** + * Method to return the 'to' + */ + public int getLength() + { + return this.length; + } + + /** + * Method to return the 'to' + */ + public void setLength(int ar_length) + { + this.length = ar_length; + } + + /** + * Method to draw an edge consisting on a line with an arrow, and a label. + * + * @param g Graphics object where the edge is painted + * @param nodes Nodes map (relates node with node index) + * @param showLabels Flag to request edge labels drawing + */ + public void draw(Graphics g, Map<Integer, Node> nodes, boolean showLabels) + { + Node nodeFrom = nodes.get(this.from); + Node nodeTo = nodes.get(this.to); + + if(nodeFrom == null || nodeTo == null) return; + + int x0 = (int) nodeFrom.getX(); + int y0 = (int) nodeFrom.getY(); + int x1 = (int) nodeTo.getX(); + int y1 = (int) nodeTo.getY(); + int len = (int)Math.abs(Math.sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1))-this.length); + + Color c = (len < 10) ? ARC_COLOR_1 + : len < 20 ? ARC_COLOR_2 + : ARC_COLOR_3; + g.setColor(c); + + int dx = x1 - x0; + int dy = y1 - y0; + double d = Math.sqrt((dx*dx)+(dy*dy)); + + if(d != 0) + { + //The line + g.drawLine(x0, y0, x1, y1); + + //The edge labels (if requested) + int midX0 = (x1+x0)/2; + int midY0 = (y1+y0)/2; + if (showLabels && this.label != null) + { + Font prevFont = g.getFont(); + Color prevColor = g.getColor(); + g.setFont(font); + g.setColor(EDGE_LABEL_COLOR); + int font_height = g.getFontMetrics().getHeight(); + int font_width = g.getFontMetrics().charWidth('x'); + int x_label = ((x1+midX0)/2) + font_width; + int y_label = (y1+midY0)/2; + if(y1 > y0 && x1 < x0) y_label += font_height; + else if(y1 < y0 && x1 > x0) y_label += font_height; + g.drawString(this.label,x_label,y_label); + g.setFont(prevFont); + g.setColor(prevColor); + } + + // The arrow + Polygon p = new Polygon(); + dx = (int)(dx / d * ARROW_SIZE); + dy = (int)(dy / d * ARROW_SIZE); + x1 = (x1+midX0) / 2; + y1 = (y1+midY0) / 2; + p.addPoint(x1,y1); + p.addPoint(x1-(int)(dx-(dy/2.0)), y1-(int)((dx/2.0)+dy)); + p.addPoint(x1-(int)((dx*ARROW_HOOK)), y1-(int)((dy*ARROW_HOOK))); + p.addPoint(x1-(int)((dy/2.0)+dx), y1-(int)(dy-(dx/2.0))); + g.fillPolygon(p); + g.drawPolygon(p); + } + } + + /** + * Returns a string containig the edge information + */ + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append(from); + sb.append(" -> "); + sb.append(to); + sb.append(" ["); + sb.append(this.label); + sb.append(']'); + return sb.toString(); + } + + public void changeFontSize(boolean increase, boolean reset){ + if (reset){ + font = EDGE_LABEL_FONT; + return; + } + float size = font.getSize() + (increase ? 1 : -1); + font = font.deriveFont(Math.min(size, 16)); + } +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Node.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Node.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/graph/Node.java 2013-02-21 16:33:50 UTC (rev 4639) @@ -0,0 +1,431 @@ +/* + * Node.java + * + * Copyright (c) 2007 Ignacio Labrador Pavon + * 28814 Daganzo, Madrid. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of copyright holders nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +package com.ibm.wala.refactoring.pdgSliding.tools.graph; + +import java.awt.Color; +import java.awt.Font; +import java.awt.FontMetrics; +import java.awt.Graphics; +import java.io.Serializable; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * Node class + * + * @author ilp + * @since July-2007 + */ +public class Node implements Comparable, Serializable +{ + //~Constants ---------------------------------------------------------------- + private static final long serialVersionUID = 1429861986214L; + private static final Color FIXED_NODE_COLOR = Color.orange; + private static final Color DEF_NODE_COLOR = Color.yellow; + private static final Color SELECT_NODE_COLOR = Color.pink; + private static final Font NODE_LABEL_FONT = new Font("default",Font.BOLD,12); + + //~Variables ---------------------------------------------------------------- + private int hash = 0; + private double x; + private double y; + private double dx; + private double dy; + private boolean fixed; + private String label; + private int neighbours; + private Set<Integer> from; + private Set<Integer> to; + private Integer level = null; // distance from root + private Font font = NODE_LABEL_FONT; + + private boolean round = true; // if !round - draw a square + + + //~Methods ------------------------------------------------------------------ + + /** + * Void constructor + */ + public Node() + { + this.neighbours = 0; + this.fixed = false; + this.from = new HashSet<Integer>(); + this.to = new HashSet<Integer>(); + } + + /** + * Constructor with a label as argument + */ + public Node(String ar_label, boolean round) + { + this.neighbours = 0; + this.fixed = false; + this.label = ar_label; + this.from = new HashSet<Integer>(); + this.to = new HashSet<Integer>(); + this.round = round; + } + + /** + * Method to add to the 'x' member the specified value + */ + public void addToX(double arg) + { + this.x += arg; + } + + /** + * Method to add to the 'y' member the specified value + */ + public void addToY(double arg) + { + this.y += arg; + } + + /** + * Method to define the 'x' member + */ + public void setX(double arg) + { + this.x = arg; + } + + /** + * Method to define the 'y' member + */ + public void setY(double arg) + { + this.y = arg; + } + + /** + * Method to get the 'x' member + */ + public double getX() + { + return this.x; + } + + /** + * Method to get the 'y' member + */ + public double getY() + { + return this.y; + } + + /** + * Method to get the 'label' member + */ + public String getLabel() + { + return this.label; + } + + /** + * Method to define the 'label' member + */ + public void setLabel(String arg) + { + this.label = arg; + } + + /** + * Method to fix a position for the node + */ + public void setFixed(boolean arg) + { + this.fixed = arg; + } + + /** + * Method to check if a node has a fixed position + */ + public boolean isFixed() + { + return this.fixed; + } + + /** + * Method to increase the number of node neighbours + */ + public void incNeighbours() + { + if(this.neighbours < Integer.MAX_VALUE) this.neighbours++; + } + + /** + * Method to check if a node has neighbour nodes + */ + public boolean hasNeighbours() + { + return (this.neighbours > 0); + } + + /** + * Method to decrease the number of node neighbours + */ + public void decNeighbours() + { + if(this.neighbours > 0) this.neighbours--; + } + + /** + * Method to get the 'dx' member + */ + public double getDx() + { + return this.dx; + } + + /** + * Method to get the 'dy' member + */ + public double getDy() + { + return this.dy; + } + + /** + * Method to define the 'dx' member + */ + public void setDx(double arg) + { + this.dx = arg; + } + + /** + * Method to define the 'dy' member + */ + public void setDy(double arg) + { + this.dy = arg; + } + + /** + * Overrides the Object.hashcode() method + */ + public int hashCode() + { + if(this.hash == 0) + { + StringBuffer sb = new StringBuffer(); + sb.append(label);; + this.hash = sb.toString().hashCode(); + } + return hash; + } + + /** + * Overrides the Object.equals() method + */ + public boolean equals(Object other) + { + if(other instanceof Node) return (this.hash == other.hashCode()); + else throw new ClassCastException(); + } + + /** + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + public int compareTo(Object other) + { + if(other instanceof Node) + { + Node o = (Node)other; + return this.label.compareTo(o.label); + } + else throw new ClassCastException(); + } + + /** + * Method to add a new pointed node. + * + * @return 'true' if the argumet is actually a new pointed node, 'false' + * otherwise. + */ + public boolean addTo(int ar_to) + { + return this.to.add(ar_to); + } + + /** + * Method to add a new pointing node. + * + * @return 'true' if the argumet is actually a new pointed node, 'false' + * otherwise. + */ + public boolean addFrom(int ar_from) + { + return this.from.add(ar_from); + } + + /** + * Method to remove a pointing node. + */ + public void removeFrom(int ar_from) + { + this.from.remove(ar_from); + } + + /** + * Method to remove a pointed node. + */ + public void removeTo(int ar_to) + { + this.to.remove(ar_to); + } + + /** + * Method to retreive the from nodes set + */ + public Set<Integer> getFromNodes() + { + return this.from; + } + + /** + * Method to retreive the to nodes set + */ + public Set<Integer> getToNodes() + { + return this.to; + } + + /** + * Method to paint the node + * + * @param ar_g Graphics object where the node is painted + * @param ar_fm Font metrics + * @param ar_selected Selected node (if this node is the ar_selected one, it is + * painted in a different way) + */ + public void draw(Graphics ar_g, FontMetrics ar_fm, Node ar_selected) + { + int x = (int)this.x; + int y = (int)this.y; + int w = ar_fm.stringWidth(this.label) + 10; + int h = ar_fm.getHeight() + 4; + + ar_g.setFont(font); + + Color c = (this == ar_selected) ? SELECT_NODE_COLOR + : this.isFixed() ? FIXED_NODE_COLOR + : DEF_NODE_COLOR; + ar_g.setColor(c); + if (round){ + ar_g.fillOval(x-w/2, y-h/2, w, h); + ar_g.setColor(Color.black); + ar_g.drawOval(x - w / 2, y - h / 2, w - 1, h - 1); + }else{ + ar_g.fillRect(x-w/2, y-h/2, w, h); + ar_g.setColor(Color.black); + ar_g.drawRect(x - w / 2, y - h / 2, w - 1, h - 1); + } + ar_g.drawString(this.label,x-(w-10)/2,(y-(h-4)/2)+ar_fm.getAscent()); + } + + /** + * Returns a string with the node data + */ + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append(label); + sb.append(" -Neigbours:"); + sb.append(this.neighbours); + return sb.toString(); + } + + // Getting the distance from root + public int getLevel(Map<Integer, Node> nodesMap) { + if (level == null){ + Set<Integer> fromNodes = getFromNodes(); + level = 0; + for (Integer from : fromNodes) { + level = Math.max(nodesMap.get(from).getLevel(nodesMap)+1, level); + } + } + return level; + } + + public void changeFontSize(boolean increase, boolean reset){ + if (reset){ + font = NODE_LABEL_FONT; + return; + } + float size = font.getSize() + (increase ? 1 : -1); + font = font.deriveFont(size); + } + + public Font getFont() { + return font; + } + + // Getting all pred nodes + public Set<Node> getPredNodes(Map<Integer, Node> nodesMap, Set<Node> visitedNodes, boolean reursive) { + Set<Node> predNodes = new HashSet<Node>(); + Set<Integer> fromNodes = getFromNodes(); + for (Integer fromNode : fromNodes) { + Node node = nodesMap.get(fromNode); + predNodes.add(node); + if (reursive && !visitedNodes.contains(node)){ + visitedNodes.add(node); + predNodes.addAll(node.getPredNodes(nodesMap, visitedNodes, reursive)); + } + } + + return predNodes; + + } + + // Getting all Succ nodes + public Set<Node> getSuccNodes(Map<Integer, Node> nodesMap, Set<Node> visitedNodes, boolean reursive) { + Set<Node> predNodes = new HashSet<Node>(); + Set<Integer> toNodes = getToNodes(); + for (Integer fromNode : toNodes) { + Node node = nodesMap.get(fromNode); + predNodes.add(node); + if (reursive && !visitedNodes.contains(node)){ + visitedNodes.add(node); + predNodes.addAll(node.getSuccNodes(nodesMap, visitedNodes, reursive)); + } + } + + return predNodes; + + } +} Added: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/MainDesktop.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/MainDesktop.java (rev 0) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tools/gui/MainDesktop.java 2013-02-21 16:33:50 UTC (rev 4639) @@ -0,0 +1,493 @@ +package com.ibm.wala.refactoring.pdgSliding.tools.gui; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Toolkit; +import java.awt.Window; +import java.io.File; +import java.lang.reflect.Constructor; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; + +import javax.swing.JDesktopPane; +import javax.swing.JFrame; +import javax.swing.UIManager; + +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.FrameStamp; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.JXTaskBar; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.MyInternalFrame; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.components.MyMenuBar; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.screen.OriginalMethodScr; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.screen.ScreensConstants; +import com.ibm.wala.refactoring.pdgSliding.tools.gui.screen.ScreensConstants.ScreenTypes; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.GeneralGuiServices; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.MyException; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.SlidingUtils; +import com.ibm.wala.refactoring.pdgSliding.tools.utils.Utils; + + +@SuppressWarnings("serial") +public class MainDesktop extends JFrame +{ + private static final String VERSION = "1.0.0"; + + // the desktop containing all the internal frames + private JDesktopPane desktop; + private File loadDataFile = null; + + private static MainDesktop mainDesktop_Instance; + + private OriginalMethodScr floatingMethodScr = null; + + public static final MainDesktop getInstance() + { + if (mainDesktop_Instance == null){ + mainDesktop_Instance = new MainDesktop(); + } + return mainDesktop_Instance; + } + + // list of internal frames + FramesList framesList = new FramesList(); + + // Is the current frame that was created is modal. + private ScreenTypes currCreatedFrameType; + + // The frameStamp of the current frame. + private FrameStamp currCreatedFrameStamp; + + // Indicates if the current time, is a creation time for the frame. + private boolean frameCreationTime = false; + + // Constructs a new instance. + public MainDesktop() + { + super("Sliding Analyzer V" + VERSION); + try + { + jbInit(); + initialize(); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + private void initialize() + { + initMenuBar(); + } + + /** + * Method: jbInit <br> + * General: Creates the main frame and initializes all its components + * + * @throws any exception not handled by the internal frames + */ + private void jbInit() throws Exception + { + //make sure application closes when the frame is closed + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + //initialize a specialized layered pane for displaying internal frames + desktop = new JDesktopPane(); + desktop.setLayout(null); + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(desktop, BorderLayout.CENTER); + + + // adding a task bar + JXTaskBar taskBar = new JXTaskBar(desktop); + this.getContentPane().add(taskBar, BorderLayout.SOUTH); + + //Set up the GUI. This part has been generated by JDeveloper + this.setSize(new Dimension(1028, 730)); +// this.setSize(1024, 768); + + this.setVisible(true); + this.setResizable(true); + } + + public void initMenuBar() + { + setJMenuBar(new MyMenuBar(this)); + } + + /** + * Method: addInternalFrame <br> + * General: adds a new internal frame to the desktop in the center of the screen + * + * @param the frame to be added + * @throws any excpetion that didn't allow the frame to be drawn and get + * selected on the screen + */ + protected void addInternalFrame(MyInternalFrame frame) throws Exception + { + // we centralize the frame on the screen + frame.setLocation(desktop.getWidth() / 2 - frame.getFrameContainer().getWidth() / 2, + desktop.getHeight() / 2 - frame.getFrameContainer().getHeight() / 2); + + // Add the frame to the JDesktopPane only if the frame is a JInternalFrame. + if (ScreenTypes.INTERNAL.equals(currCreatedFrameType)) + { + desktop.add(frame.getFrameContainer()); +// frame.setMaximum(true); + + } + } + + /** + * Method: createFrame <br> + * General: Creates the requested frame + * + */ + @SuppressWarnings("unchecked") + protected MyInternalFrame createFrame(String frameClassName, FrameStamp frameStamp, + Object[] param, ScreenTypes screenType) + { + MyInternalFrame frame = null; + currCreatedFrameType = screenType; + currCreatedFrameStamp = frameStamp; + + try + { + + //first retrieve the class reference + Class c = Class.forName(frameClassName); + + //the new frame to be created + if (param == null) + { + //create frame object + frameCreationTime = true; + frame = (MyInternalFrame) c.newInstance(); + frameCreationTime = false; + } + else + { + // Create an array of all the classes of the params. + Class[] vecClasses = {Object[].class}; + + // Get the specific consturctor according to the classes that builds it. + Constructor constructor = c.getConstructor(vecClasses); + + // These are the initial arguments of the constructor. + Object[] initArgs = {param}; + + // Create a new instance of the frame, with the chosen constructor. + frameCreationTime = true; + frame = (MyInternalFrame) constructor.newInstance(initArgs); + frameCreationTime = false; + } + + framesList.addFrame(frame, frameStamp); //and add it to the list + addInternalFrame(frame); //add the frame + } + catch (Exception e) + { + e.printStackTrace(); + GeneralGuiServices.showExceptionMessage(e, this); + return null; + } + if (ScreensConstants.ORIGINAL_METHOD_SCR.equals(frameClassName)){ + floatingMethodScr = (OriginalMethodScr) frame; + } + return frame; + } + + + /** + * Method: isCurrCreatedFrameModal <br> + * General: Returning if the current frame is modal frame or not. + * + */ + public ScreenTypes getCurrentFrameType() throws MyException + { + // Check if the time this method called is the creation time (Constructor) + // of the current frame. + // Allowed this invokation just at the creation of the frame. + if (!frameCreationTime) + { + throw new MyException("Exception creating frame"); + } + + return currCreatedFrameType; + } + + public FrameStamp getCurrFrameStamp() throws MyException + { + if (!frameCreationTime) + { + throw new MyException("Exception creating frame"); + } + + return currCreatedFrameStamp; + } + + /** + * Method: findFrame <br> + * General: Looks for the specified frame in the list frame. + * + * @author Maayan Goldstein + */ + protected MyInternalFrame findFrame(FrameStamp frameStamp) + { + //we first look for it in the list + MyInternalFrame frame = null; + try + { + frame = framesList.retrieveFrame(frameStamp); + } + catch (NullPointerException e) + { + //ShavitLogger.error(e); + return frame; + } + + return frame; + } + + /** + * Method: isCurrCreatedFrameModal <br> + * General: Delete the current frame from the list of frames. + * + * @author Shay Molho + */ + public boolean closeFrame(FrameStamp closeFrameStamp) + { + MyInternalFrame frame = framesList.getFrame(closeFrameStamp); + if (floatingMethodScr == frame){ + floatingMethodScr = null; + } + boolean displayLastFrame = ScreenTypes.INTERNAL.equals(frame.getFrameType()); + boolean deleteFrame = framesList.deleteFrame(closeFrameStamp); + // showing another frame if exist + MyInternalFrame lastFrame = framesList.getLastFrame(); + if (lastFrame != null && displayLastFrame){ + displayFrame(lastFrame.getClass().getName(), ScreenTypes.INTERNAL); + } + return deleteFrame; + } + + public MyInternalFrame displayFrame(String frameClassName, ScreenTypes screenType) + { + return displayFrame(frameClassName, null, null, screenType); + } + + public MyInterna... [truncated message content] |
From: <mos...@us...> - 2013-02-20 23:17:20
|
Revision: 4638 http://wala.svn.sourceforge.net/wala/?rev=4638&view=rev Author: moshe1100 Date: 2013-02-20 23:17:12 +0000 (Wed, 20 Feb 2013) Log Message: ----------- fixes for experiment Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/StatementsDefsAndUses.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java 2013-02-16 00:14:09 UTC (rev 4637) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java 2013-02-20 23:17:12 UTC (rev 4638) @@ -390,9 +390,9 @@ //CharArrayCache.putIfAbsent_refactored_step0() - list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.java", "putIfAbsent_refactored_step0(char[], int)", 6,19)); + list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.java", "putIfAbsent_refactored_step0(char[], int)", 7,20)); //CharArrayCache.put_refactored_step0() - list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.java", "put_refactored_step0(char[], int)", 11,24)); + list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/CharArrayCache.java", "put_refactored_step0(char[], int)", 12,25)); //ConstantPool.dumpBytes_refactored_step0() list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "dumpBytes_refactored_step0()", 3)); //ConstantPool.literalIndex_refactored_step0(byte[], char[]) @@ -424,7 +424,7 @@ //ConstantPool.putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int) list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int)", 5, 11, 15, 21)); //ConstantPool.putInCacheIfAbsent() - list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "putInCacheIfAbsent(char[], char[], char[], int)", 7,13,19,23,29)); + list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/ConstantPool.java", "putInCacheIfAbsent_step0(char[], char[], char[], int)", 7,13,19,23,29)); //DoubleCache.doubleCache_put_refactored_step0(double, int) list.add(new MethodSlidingInfo("Test", "src/org/eclipse/jdt/internal/compiler/codegen/DoubleCache.java", "doubleCache_put_refactored_step0(double, int)", 11)); //DoubleCache.putIfAbsent_refactored_step0(double, int) Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/StatementsDefsAndUses.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/StatementsDefsAndUses.java 2013-02-16 00:14:09 UTC (rev 4637) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/StatementsDefsAndUses.java 2013-02-20 23:17:12 UTC (rev 4638) @@ -43,6 +43,10 @@ public void addDef(Statement stmt, Integer def){ addDef(stmt, PDGSlidingVarsUtils.VARS_REF_SIGN + def + PDGSlidingVarsUtils.VARS_REF_SIGN, def); } + public void addUse(Statement stmt, String use, Integer pdgSymbolNumber, String declaringClass){ + DefsAndUses defsAndUses = getDefsAndUses(stmt); + defsAndUses.addUse(use, pdgSymbolNumber, declaringClass); + } public void addUse(Statement stmt, String use, Integer pdgSymbolNumber){ DefsAndUses defsAndUses = getDefsAndUses(stmt); defsAndUses.addUse(use, pdgSymbolNumber); @@ -51,6 +55,10 @@ DefsAndUses defsAndUses = getDefsAndUses(stmt); defsAndUses.addDef(def, pdgSymbolNumber); } + public void addDef(Statement stmt, String def, Integer pdgSymbolNumber, String declaringClass){ + DefsAndUses defsAndUses = getDefsAndUses(stmt); + defsAndUses.addDef(def, pdgSymbolNumber, declaringClass); + } public void addDef(Statement stmt, Variable def){ DefsAndUses defsAndUses = getDefsAndUses(stmt); defsAndUses.addDef(def); @@ -260,19 +268,31 @@ Set<Variable> uses = new HashSet<Variable>(); public void addDef(String def, Integer pdgSymbolNumber){ - defs.add(new Variable(def, pdgSymbolNumber)); + addDef(def, pdgSymbolNumber, null); } public void addDef(Variable def){ defs.add(def); } - public void addUse(String use, Integer pdgSymbolNumber){ + public void addDef(String def, Integer pdgSymbolNumber, String declaringClass){ + Variable var = new Variable(def, pdgSymbolNumber); + var.setClassName(declaringClass); + defs.add(var); + } + public void addUse(String use, Integer pdgSymbolNumber, String declaringClass){ Variable varData = PDGSlidingVarsUtils.getSymbolsMap().getVarData(pdgSymbolNumber); if (varData != null){ uses.add(varData); // phi var }else{ - uses.add(new Variable(use, pdgSymbolNumber)); + Variable var = new Variable(use, pdgSymbolNumber); + var.setClassName(declaringClass); + uses.add(var); } } + + public void addUse(String use, Integer pdgSymbolNumber){ + addUse(use, pdgSymbolNumber, null); + } + public void addUse(Variable use){ uses.add(use); } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java 2013-02-16 00:14:09 UTC (rev 4637) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/tucking/TuckingAlgo.java 2013-02-20 23:17:12 UTC (rev 4638) @@ -263,8 +263,8 @@ Integer nodeIndexSlice = eachGlobalDefNodeSlice.get(globalDef); Integer nodeIndexCoslice = eachGlobalDefNodeCoslice.get(globalDef); - repeatingGlobalDefs.addGlobalVar(globalDef, PDGSlidingVarsUtils.getNodeLine(nodeIndexSlice), - PDGSlidingVarsUtils.getNodeLine(nodeIndexCoslice)); + repeatingGlobalDefs.addGlobalVar(globalDef, useNodesAlgo ? PDGSlidingVarsUtils.getNodeLine(nodeIndexSlice) : nodeIndexSlice, + useNodesAlgo ? PDGSlidingVarsUtils.getNodeLine(nodeIndexCoslice) : nodeIndexCoslice); } } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java 2013-02-16 00:14:09 UTC (rev 4637) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java 2013-02-20 23:17:12 UTC (rev 4638) @@ -276,7 +276,7 @@ } String useString = refName + "." + fieldName; // Heap Param Caller - adding to Uses - statementsDefsAndUses.addUse(statement, useString, use); // adding use + statementsDefsAndUses.addUse(statement, useString, use, getDeclaringClassFromField(field, false)); // adding use }else if (pk instanceof StaticFieldKey){ IField field = ((StaticFieldKey)pk).getField(); String fieldName = field.getName().toString(); @@ -302,7 +302,7 @@ // } String useString = refName + "." + fieldName; // Heap Return Caller - adding to Defs - statementsDefsAndUses.addDef(statement, useString, use); // adding def + statementsDefsAndUses.addDef(statement, useString, use, getDeclaringClassFromField(field, false)); // adding def }else if (pk instanceof StaticFieldKey){ IField field = ((StaticFieldKey)pk).getField(); String fieldName = field.getName().toString(); @@ -310,7 +310,7 @@ // String useString = getRefName(-1/*static*/, statement, null) + "." + fieldName; String useString = refName + "." + fieldName; // Heap Return Caller - adding to Defs - statementsDefsAndUses.addDef(statement, useString, -1); // adding def + statementsDefsAndUses.addDef(statement, useString, -1, refName); // adding def } // else if (pk instanceof ArrayLengthKey){ // System.out.println("Adding use: " + pk.toString()); @@ -329,9 +329,9 @@ String defString = refName + "." + fieldName; // Heap Param Callee - adding to Defs, Heap Ret Callee - adding use if (statement.getKind().equals(Kind.HEAP_PARAM_CALLEE)){ - statementsDefsAndUses.addDef(statement, defString, null); // adding def + statementsDefsAndUses.addDef(statement, defString, null, getDeclaringClassFromField(field, false)); // adding def }else{ - statementsDefsAndUses.addUse(statement, defString, null); // adding def + statementsDefsAndUses.addUse(statement, defString, null, getDeclaringClassFromField(field, false)); // adding use } }else if (pk instanceof StaticFieldKey){ IField field = ((StaticFieldKey)pk).getField(); @@ -340,9 +340,9 @@ String defString = refName + "." + fieldName; // Heap Param Callee - adding to Defs, Heap Ret Callee - adding use if (statement.getKind().equals(Kind.HEAP_PARAM_CALLEE)){ - statementsDefsAndUses.addDef(statement, defString, null); // adding def + statementsDefsAndUses.addDef(statement, defString, null, refName); // adding def }else{ - statementsDefsAndUses.addUse(statement, defString, null); // adding def + statementsDefsAndUses.addUse(statement, defString, null, refName); // adding use } }else{ // array key } @@ -634,20 +634,22 @@ fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(byte[], char[])", "org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 12), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); // also fixing for arraycopy (only needed for line 338, line 325 is flowing to exit because of the put field statement "this.offsets = new int[index* 2]" fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(byte[], char[])", "java.lang.System.arraycopy", 108), Variable.createVariablesFromNames("this.poolContent")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(byte[], char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 26), Variable.createVariablesFromNames("referenceContext")); //Fixes for ConstantPool.literalIndex_refactored_step0(char[] utf8Constant) fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM",10), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 25), Variable.createVariablesFromNames("referenceContext")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 211), Variable.createVariablesFromNames("referenceContext")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 232), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 24), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 210), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 231), Variable.createVariablesFromNames("referenceContext")); //Fixes for ConstantPool.literalIndex_refactored_step0(char[] stringCharArray, byte[] utf8encoding) fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[], byte[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM",10), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[], byte[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 28), Variable.createVariablesFromNames("referenceContext")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(byte[], char[])", "java.lang.System.arraycopy", 52), Variable.createVariablesFromNames("this.poolContent")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[], byte[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 27), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(char[], byte[])", "java.lang.System.arraycopy", 51), Variable.createVariablesFromNames("this.poolContent")); //Fixes for ConstantPool.literalIndex_refactored_step0(double key) fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(double)","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 60), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(double)","org.eclipse.jdt.internal.compiler.codegen.ConstantPool.resizePoolContents", 119), Variable.createVariablesFromNames("this.poolContent")); //Fixes for ConstantPool.literalIndex_refactored_step0(float key) fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndex_refactored_step0(float)","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 60), Variable.createVariablesFromNames("referenceContext")); @@ -661,11 +663,11 @@ //Fixes for ConstantPool.literalIndexForType_refactored_step0(char[]) fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForType_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM",10), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForType_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 28), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForType_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 27), Variable.createVariablesFromNames("referenceContext")); //Fixes for ConstantPool.literalIndexForMethod_refactored_step0(char[], char[], char[], boolean) - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForMethod_refactored_step0(char[], char[], char[], boolean)","org.eclipse.jdt.internal.compiler.codegen.ConstantPool.putInCacheIfAbsentM",32), Variable.createVariablesFromNames("this.methodsAndFieldsCache")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForMethod_refactored_step0(char[], char[], char[], boolean)","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 80), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForMethod_refactored_step0(char[], char[], char[], boolean)","org.eclipse.jdt.internal.compiler.codegen.ConstantPool.putInCacheIfAbsentM",15), Variable.createVariablesFromNames("this.methodsAndFieldsCache")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForMethod_refactored_step0(char[], char[], char[], boolean)","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 63), Variable.createVariablesFromNames("referenceContext")); //Fixes for ConstantPool.literalIndexForNameAndType_refactored_step0(char[], char[]) fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForNameAndType_refactored_step0(char[], char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 72), Variable.createVariablesFromNames("referenceContext")); @@ -675,23 +677,23 @@ //Fixes for ConstantPool.literalIndexForLdc_refactored_step0(char[]) fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 13), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 28), Variable.createVariablesFromNames("referenceContext")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 105), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 120), Variable.createVariablesFromNames("referenceContext")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.remove", 323), Variable.createVariablesFromNames("keyTable", "valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.remove", 328), Variable.createVariablesFromNames("keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 27), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 104), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.lookup.ClassScope.problemReporter", 118), Variable.createVariablesFromNames("referenceContext")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.remove", 321), Variable.createVariablesFromNames("keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("literalIndexForLdc_refactored_step0(char[])","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.remove", 326), Variable.createVariablesFromNames("keyTable", "valueTable")); //Fixes for ConstantPool.putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int) fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 20), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 122), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int)","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 137), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 120), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInNameAndTypeCacheIfAbsent_refactored_step0(char[], char[], int)","org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 135), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); - //Fixes for ConstantPool.putInCacheIfAbsent(char[], char[], char[], int) - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 26), Variable.createVariablesFromNames("charArrayCache.elementSize", "charArrayCache.keyTable", "charArrayCache.valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 42), Variable.createVariablesFromNames("charArrayCache.elementSize", "charArrayCache.keyTable", "charArrayCache.valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 66), Variable.createVariablesFromNames("charArrayCache.elementSize", "charArrayCache.keyTable", "charArrayCache.valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 166), Variable.createVariablesFromNames("charArrayCache.elementSize", "charArrayCache.keyTable", "charArrayCache.valueTable")); - fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 181), Variable.createVariablesFromNames("charArrayCache.elementSize", "charArrayCache.keyTable", "charArrayCache.valueTable")); + //Fixes for ConstantPool.putInCacheIfAbsent_step0(char[], char[], char[], int) + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent_step0(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 26), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent_step0(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 42), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent_step0(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 66), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent_step0(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.util.HashtableOfObject.put", 166), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); + fixedFlowToExitMethods.put(new FixMethodFlowToExitKey("putInCacheIfAbsent_step0(char[], char[], char[], int)", "org.eclipse.jdt.internal.compiler.codegen.CharArrayCache.putIfAbsentM", 181), Variable.createVariablesFromNames("elementSize", "keyTable", "valueTable")); } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java 2013-02-16 00:14:09 UTC (rev 4637) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/Variable.java 2013-02-20 23:17:12 UTC (rev 4638) @@ -7,7 +7,7 @@ import com.ibm.wala.refactoring.pdgSliding.Utils; public class Variable { -// private String className; + private String className; // may be null // private String packageName; // private boolean isStatic = false; @@ -28,12 +28,21 @@ public boolean isInitVar() { return isInitVar; } + + public void setClassName(String className) { + this.className = className; + } + + public String getClassName() { + return className; + } public Variable(Variable variable) { this(variable.getName(), variable.getPdgSymbolNumber()); addDefLines(variable.getDefLines()); this.isInitVar = variable.isInitVar(); + this.className = variable.className; } public String getName() { @@ -88,10 +97,13 @@ } + + @Override public int hashCode() { final int prime = 31; int result = 1; + result = prime * result + ((className == null) ? 0 : className.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @@ -110,6 +122,10 @@ return false; } else if (!name.equals(other.name)) return false; + if (className != null && other.className != null) { + if (!className.equals(other.className != null)) + return false; // checking className only when both are not null + } return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mos...@us...> - 2013-02-16 00:14:15
|
Revision: 4637 http://wala.svn.sourceforge.net/wala/?rev=4637&view=rev Author: moshe1100 Date: 2013-02-16 00:14:09 +0000 (Sat, 16 Feb 2013) Log Message: ----------- runExperiment = false Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java 2013-02-16 00:13:26 UTC (rev 4636) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java 2013-02-16 00:14:09 UTC (rev 4637) @@ -451,5 +451,5 @@ return list; } - private static boolean runExperiment = true; + private static boolean runExperiment = false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <mos...@us...> - 2013-02-16 00:13:36
|
Revision: 4636 http://wala.svn.sourceforge.net/wala/?rev=4636&view=rev Author: moshe1100 Date: 2013-02-16 00:13:26 +0000 (Sat, 16 Feb 2013) Log Message: ----------- Experiment memory problems Modified Paths: -------------- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java 2013-02-15 21:43:20 UTC (rev 4635) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/ProgramSlidingOnPdgAction.java 2013-02-16 00:13:26 UTC (rev 4636) @@ -25,6 +25,7 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; @@ -45,6 +46,7 @@ import com.ibm.wala.cast.java.loader.JavaSourceLoaderImpl.ConcreteJavaMethod; import com.ibm.wala.ipa.callgraph.CGNode; import com.ibm.wala.refactoring.pdgSliding.output.AnalyzerLogger; +import com.ibm.wala.refactoring.pdgSliding.variables.PDGSlidingVarsUtils; import com.ibm.wala.refactoring.pdgSliding.wala.MySlidingInformation; import com.ibm.wala.refactoring.pdgSliding.wala.MyWALAWrapper; import com.ibm.wala.refactoring.sliding.GenVars; @@ -93,6 +95,14 @@ PDGSliding pdgSliding= new PDGSliding(null, markedLines, slidingInformation.methodDeclaration, getClassFileFullPath()); pdgSliding.runVariableSlidingAlgo(true); + // Freeing some memory for next run + try { + MyWALAWrapper.init(slidingInformation); + PDGSlidingVarsUtils.cleanUp(); + System.gc(); + } catch (JavaModelException e) { + e.printStackTrace(); + } System.out.println("Finished Sliding on method " + methodSlidingInfo.getMethodName()); } @@ -441,5 +451,5 @@ return list; } - private static boolean runExperiment = false; + private static boolean runExperiment = true; } Modified: incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java =================================================================== --- incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java 2013-02-15 21:43:20 UTC (rev 4635) +++ incubator/com.ibm.wala.refactoring/src/com/ibm/wala/refactoring/pdgSliding/variables/PDGSlidingVarsUtils.java 2013-02-16 00:13:26 UTC (rev 4636) @@ -51,7 +51,7 @@ public class PDGSlidingVarsUtils { private static final String NEW_STATEMENT = "new "; private static PDGSlidingSymbolsMap symbolsMap = new PDGSlidingSymbolsMap(); // A map of vars symbols (Representing number in instructions to real name) - private static StatementsDefsAndUses statementsDefsAndUses = new StatementsDefsAndUses(); + private static StatementsDefsAndUses statementsDefsAndUses = null; private static PDG flowPDG = null; // This map is used for setting prefixed methods flow to exit because WALA doesn't "see" this method has side effect and we need to fix it manually @@ -454,7 +454,7 @@ } } - private static void cleanUp() { + public static void cleanUp() { symbolsMap.clear(); statementsDefsAndUses = new StatementsDefsAndUses(); instructionIndexToNodeNumber.clear(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |