http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/com/gemstone/sequence/ZoomingPanel.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/sequence/ZoomingPanel.java b/geode-core/src/test/java/com/gemstone/sequence/ZoomingPanel.java deleted file mode 100644 index 782ee7b..0000000 --- a/geode-core/src/test/java/com/gemstone/sequence/ZoomingPanel.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.sequence; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseMotionAdapter; - -/** - * Created by IntelliJ IDEA. - * User: dan - * Date: Oct 28, 2010 - * Time: 10:30:40 PM - * To change this template use File | Settings | File Templates. - */ -public class ZoomingPanel extends JPanel { - private int zoomBoxStartX; - private int zoomBoxStartY; - private int zoomBoxWidth; - private int zoomBoxHeight; - private SequenceDiagram child; - - - public ZoomingPanel() { - super(); - addMouseListener(new MouseAdapter() { - @Override - public void mousePressed(MouseEvent e) { - startBox(e.getX(), e.getY()); - } - - @Override - public void mouseReleased(MouseEvent e) { - endBox(e.getX(), e.getY()); - } - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getButton() != MouseEvent.BUTTON1) { - unzoom(); - } else { - child.selectState(e.getX(), e.getY()); - } - - } - }); - - addMouseMotionListener(new MouseMotionAdapter() { - @Override - public void mouseDragged(MouseEvent e) { - Rectangle r = new Rectangle(e.getX(), e.getY(), 1, 1); - ((JPanel)e.getSource()).scrollRectToVisible(r); - showBox(e.getX(), e.getY()); - } - - @Override - public void mouseMoved(MouseEvent e) { - int popupX = ZoomingPanel.this.getLocationOnScreen().x + e.getX(); - int popupY = ZoomingPanel.this.getLocationOnScreen().y + e.getY(); - child.showPopupText(e.getX(), e.getY(), popupX, popupY); - } - }); - BorderLayout layout = new BorderLayout(); - layout.setHgap(0); - layout.setVgap(0); - this.setLayout(layout); - } - - private void unzoom() { - resizeMe(0, 0, getWidth(), getHeight()); - } - - void resizeMe(int zoomBoxX, int zoomBoxY, int zoomBoxWidth, int zoomBoxHeight) { - Dimension viewSize = getParent().getSize(); - double windowWidth = viewSize.getWidth(); - double windowHeight = viewSize.getHeight(); - double scaleX = getWidth() / ((double) zoomBoxWidth); - double scaleY = getHeight() / ((double) zoomBoxHeight); - int oldWidth = getWidth(); - int oldHeight = getHeight(); - int width = (int) (scaleX * windowWidth); - int height = (int) (scaleY * windowHeight); -// this.setPreferredSize(new Dimension(width, height)); - child.resizeMe(width, height); - //TODO not sure this one is needed - this.revalidate(); - - //scroll to the new rectangle -// int scrollX = (int) (zoomBoxX * scaleX); -// int scrollY = (int) (zoomBoxY * scaleY); -// int scrollWidth= (int) (zoomBoxWidth * scaleX); -// int scrollHeight = (int) (zoomBoxHeight * scaleY); - int scrollX = (int) (zoomBoxX * (width / (double) oldWidth)); - int scrollY = (int) (zoomBoxY * (height / (double) oldHeight)); - int scrollWidth= (int) (zoomBoxWidth * (width / (double) oldWidth)); - int scrollHeight = (int) (zoomBoxHeight * (height / (double) oldHeight)); - Rectangle r = new Rectangle(scrollX, scrollY, scrollWidth, scrollHeight); - ((JViewport)getParent()).scrollRectToVisible(r); - repaint(); - - } - - public void setSequenceDiagram(SequenceDiagram diag) { - this.child = diag; - this.add(child, BorderLayout.CENTER); - } - - private void showBox(int x, int y) { - if(zoomBoxWidth != -1) { - repaint(getBoxX(), getBoxY(), getBoxWidth(), getBoxHeight()); - } - - this.zoomBoxWidth = x - zoomBoxStartX; - this.zoomBoxHeight = y - zoomBoxStartY; - - repaint(getBoxX(), getBoxY(), getBoxWidth(), getBoxHeight()); - } - - private void startBox(int x, int y) { - this.zoomBoxStartX = x; - this.zoomBoxStartY = y; - } - - private void endBox(int x, int y) { - if(zoomBoxStartX != -1 && zoomBoxStartY != -1 - && zoomBoxWidth != -1 && zoomBoxHeight != -1 - && zoomBoxWidth != 0 && zoomBoxHeight != 0) { - resizeMe(getBoxX() , getBoxY(), getBoxWidth(), getBoxHeight()); - repaint(getBoxX(), getBoxY(), getBoxWidth(), getBoxHeight()); - this.zoomBoxStartX = -1; - this.zoomBoxStartY = -1; - this.zoomBoxWidth = -1; - this.zoomBoxHeight = -1; - } - } - - public int getBoxX() { - return zoomBoxWidth >= 0 ? zoomBoxStartX : zoomBoxStartX + zoomBoxWidth; - } - - public int getBoxY() { - return zoomBoxHeight >= 0 ? zoomBoxStartY : zoomBoxStartY + zoomBoxHeight; - } - - public int getBoxHeight() { - return zoomBoxHeight >= 0 ? zoomBoxHeight : -zoomBoxHeight; - } - - public int getBoxWidth() { - return zoomBoxWidth >= 0 ? zoomBoxWidth : -zoomBoxWidth; - } - - - - @Override - public void paint(Graphics g) { - super.paint(g); - - if(zoomBoxStartX != -1 && zoomBoxStartY != -1 && zoomBoxWidth != -1 && zoomBoxHeight != -1) { - Graphics2D g2 = (Graphics2D) g.create(); - - Composite old = g2.getComposite(); - g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f)); - g2.setColor(Color.BLUE); - -// g2.drawRect(zoomBoxStartX, zoomBoxStartY, zoomBoxWidth, zoomBoxHeight); -// g2.setBackground(Color.BLUE); - g2.fillRect(getBoxX(), getBoxY(), getBoxWidth(), getBoxHeight()); - g2.setComposite(old); - } - } -}
http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/com/gemstone/sequence/gemfire/DefaultLineMapper.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/sequence/gemfire/DefaultLineMapper.java b/geode-core/src/test/java/com/gemstone/sequence/gemfire/DefaultLineMapper.java deleted file mode 100644 index 5f8268e..0000000 --- a/geode-core/src/test/java/com/gemstone/sequence/gemfire/DefaultLineMapper.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.sequence.gemfire; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.sequence.LineMapper; - -/** - * A lifeline mapper that just returns a shortened version of - * a member id. - * - */ -public class DefaultLineMapper implements LineMapper { - private static Pattern MEMBER_ID_RE = Pattern.compile(".*\\((\\d+)(:admin)?(:loner)?\\).*:\\d+(/\\d+|.*:.*)"); - - public String getShortNameForLine(String name) { - Matcher matcher = MEMBER_ID_RE.matcher(name); - if(matcher.matches()) { - return matcher.group(1); - } else { - return name; - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/com/gemstone/sequence/gemfire/GemfireSequenceDisplay.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/sequence/gemfire/GemfireSequenceDisplay.java b/geode-core/src/test/java/com/gemstone/sequence/gemfire/GemfireSequenceDisplay.java deleted file mode 100644 index 062ba7e..0000000 --- a/geode-core/src/test/java/com/gemstone/sequence/gemfire/GemfireSequenceDisplay.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.sequence.gemfire; - -import org.apache.geode.internal.sequencelog.GraphType; -import org.apache.geode.internal.sequencelog.io.Filter; -import org.apache.geode.internal.sequencelog.io.GraphReader; -import org.apache.geode.internal.sequencelog.model.*; -import org.apache.sequence.*; - -import javax.swing.*; -import java.awt.event.*; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.*; -import java.util.regex.Pattern; - -/** - */ -public class GemfireSequenceDisplay { - - private JLabel selectedGraphsLabel; - private SelectGraphDialog selectGraphDialog; - - private Map<GraphID, Map<String, Lifeline>> lineMap = new HashMap(); - private Map<GraphID, List<Arrow>> arrowMap = new HashMap(); - private SequenceDiagram sequenceDiagram; - private JFrame frame; - private SequencePanel sequencePanel; - - /** - * Create the GUI and show it. For thread safety, - * this method should be invoked from the - * event-dispatching thread. - * - * @param graphs - * @param lineMapper - */ - private void createAndShowGUI(final GraphSet graphs, LineMapper lineMapper) { - //Create and set up the window. - - frame = new JFrame("SequenceDiagram"); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - - createMenu(); - createSequenceDiagram(graphs, lineMapper); - createSequenceMaps(graphs); - - createSelectGraphDialog(graphs); - - // for (GraphID id : graphs.getMap().keySet()) { - // showSubDiagram(id); - // - // } - - sequencePanel = new SequencePanel(sequenceDiagram); - frame.getContentPane().add(sequencePanel); - //Display the window. - frame.pack(); - frame.setVisible(true); - showGraphSelector(); - } - - private void createMenu() { - JMenuBar menuBar = new JMenuBar(); - - JMenu sequenceMenu = new JMenu("Sequence"); - sequenceMenu.setMnemonic(KeyEvent.VK_S); - sequenceMenu.getAccessibleContext().setAccessibleDescription( - "The only menu in this program that has menu items"); - menuBar.add(sequenceMenu); - JMenuItem selectGraphs = new JMenuItem("Choose Graphs", - KeyEvent.VK_G); - selectGraphs.setAccelerator(KeyStroke.getKeyStroke( - KeyEvent.VK_G, ActionEvent.ALT_MASK)); - selectGraphs.getAccessibleContext().setAccessibleDescription( - "Select what graphs to display"); - selectGraphs.setActionCommand("selectgraphs"); - selectGraphs.addActionListener(new ActionListener() { - - public void actionPerformed(ActionEvent e) { - showGraphSelector(); - } - }); - - sequenceMenu.add(selectGraphs); - frame.setJMenuBar(menuBar); - } - - private void createSelectGraphDialog(final GraphSet graphs) { - selectGraphDialog = new SelectGraphDialog(graphs); - selectGraphDialog.addSelectionListener(new SelectGraphDialog.SelectionListener() { - - public void selectionChanged(List<GraphID> selectedIds) { - updateGraphs(selectedIds); - } - }); - selectGraphDialog.pack(); - } - - private void updateGraphs(List<GraphID> selectedIds) { - List<GraphID> existingDiagrams =(List) sequenceDiagram.getSubDiagramsNames(); - for(GraphID id : selectedIds) { - showSubDiagram(id); - existingDiagrams.remove(id); - } - for(GraphID id : existingDiagrams) { - hideSubDiagram(id); - } - - sequenceDiagram.resizeMe(sequenceDiagram.getWidth(), sequenceDiagram.getHeight()); - sequencePanel.revalidate(); - sequencePanel.repaint(); - // sequenceDiagram.revalidate(); - // sequenceDiagram.repaint(); - } - - private void showGraphSelector() { - selectGraphDialog.setVisible(true); - } - - private void hideGraphSelector() { - selectGraphDialog.setVisible(false); - } - - // private static SequenceDiagram createSequenceDiagram() { - // long startTime = System.currentTimeMillis(); - // List<Lifeline> lines = new ArrayList<Lifeline>(); - // List<Arrow> arrows = new ArrayList<Arrow>(); - // for(int i =0 ; i < 10; i++) { - // List<LifelineState> states = new ArrayList<LifelineState>(); - // for(int j =0; j < 5; j++) { - // LifelineState state = new LifelineState(startTime + 20* j, startTime + 20 * j + 20); - // states.add(state); - // } - // Lifeline line = new Lifeline(i, states); - // lines.add(line); - // - // if(i > 0) { - // Arrow arrow = new Arrow("arrow" + i, line, lines.get(i - 1), line.getStates().get(2)); - // arrows.add(arrow); - // } - // } - // - // SequenceDiagram diag = new SequenceDiagram(startTime, startTime + 20 * 5, lines, arrows); - // return diag; - // } - - private void createSequenceMaps(GraphSet graphs) { - - Map<GraphID, Graph> map = graphs.getMap(); - for (Map.Entry<GraphID, Graph> entry : map.entrySet()) { - GraphID graphId = entry.getKey(); - Graph graph = entry.getValue(); - Map<String, Lifeline> lines = new LinkedHashMap<String, Lifeline>(graphs.getLocations().size()); - List<Arrow> arrows = new ArrayList<Arrow>(); - Map<Vertex, LifelineState> states = new HashMap<Vertex, LifelineState>(); - for (String location : graphs.getLocations()) { - lines.put(location, new Lifeline(graphId, location)); - } - - Collection<Edge> edges = graph.getEdges(); - for (Edge edge : edges) { - Vertex dest = edge.getDest(); - Vertex source = edge.getSource(); - if (dest == null) { - dest = source; - } - if (source == null) { - source = dest; - } - LifelineState destState = states.get(dest); - if (destState == null) { - final Lifeline lifeline = lines.get(dest.getName()); - destState = createState(lifeline, graphs, dest); - lifeline.addState(destState); - states.put(dest, destState); - } - LifelineState sourceState = states.get(source); - if (sourceState == null) { - final Lifeline lifeline = lines.get(source.getName()); - sourceState = createState(lifeline, graphs, source); - lifeline.addState(sourceState); - states.put(source, sourceState); - } - Arrow arrow = new Arrow(edge.getName(), sourceState, destState); - arrows.add(arrow); - destState.addInboundArrow(arrow); - } - - - lineMap.put(graphId, lines); - arrowMap.put(graphId, arrows); - } - } - - public void showSubDiagram(GraphID id) { - sequenceDiagram.addSubDiagram(id, lineMap.get(id), arrowMap.get(id)); - } - - public void hideSubDiagram(GraphID id) { - sequenceDiagram.removeSubDiagram(id); - } - - private SequenceDiagram createSequenceDiagram(GraphSet graphs, LineMapper lineMapper) { - - sequenceDiagram = new SequenceDiagram(graphs.getMinTime(), graphs.getMaxTime(), graphs.getLocations(), lineMapper); - return sequenceDiagram; - } - - private static LifelineState createState(Lifeline lifeline, GraphSet graphs, Vertex dest) { - long start = dest.getTimestamp(); - long end = dest.getNextVertexOnDest() == null ? graphs.getMaxTime() : dest.getNextVertexOnDest().getTimestamp(); - return new LifelineState(lifeline, dest.getState(), start, end); - } - - public static void main(String[] args) throws IOException { - File[] files; - Set<String> keyFilters = new HashSet<String>(); - boolean areGemfireLogs = false; - if (args.length > 0) { - ArrayList<File> fileList = new ArrayList<File>(); - for (int i =0; i < args.length; i++) { - String arg = args[i]; - if(arg.equals("-filterkey")) { - keyFilters.add(args[i+1]); - i++; - } else if(arg.equals("-logs")) { - areGemfireLogs = true; - } - else { - fileList.add(new File(args[i])); - } - - } - files = fileList.toArray(new File[0]); - } else { - System.err.println("Usage: java -jar sequence.jar (-logs) (-filterkey key)* <file>+\n\n" + - "\t-logs (expiremental) instead of using .graph files, parse the gemfire logs to generate the sequence display" + - "\t-filterkey a java regular expression to match against key names. If specified\n" + - "The list of key sequence diagrams will only contain matching keys"); - System.exit(1); - return; - } - - final GraphSet graphs; - - graphs = getGraphs(areGemfireLogs, keyFilters, files); - - final LineMapper lineMapper = getLineMapper(files); - final GemfireSequenceDisplay display = new GemfireSequenceDisplay(); - //Schedule a job for the event-dispatching thread: - //creating and showing this application's GUI. - javax.swing.SwingUtilities.invokeLater(new Runnable() { - public void run() { - display.createAndShowGUI(graphs, lineMapper); - } - }); - } - - private static GraphSet getGraphs(boolean useLogFiles, Set<String> keyFilters, File[] files) - throws IOException { - Filter graphFilter = new KeyFilter(keyFilters); - - - GraphReader reader = new GraphReader(files); - final GraphSet graphs; - if(keyFilters.isEmpty()) { - graphs = reader.readGraphs(useLogFiles); - } else { - graphs = reader.readGraphs(graphFilter, useLogFiles); - } - return graphs; - } - - /** - * @param files - * @return - */ - private static LineMapper getLineMapper(File[] files) { - if(HydraLineMapper.isInHydraRun(files)) { - return new HydraLineMapper(files); - } else { - return new DefaultLineMapper(); - } - } - - private static class KeyFilter implements Filter { - Set<Pattern> patterns = new HashSet<Pattern>(); - - - public KeyFilter(Set<String> keyFilters) { - for(String filterString : keyFilters) { - patterns.add(Pattern.compile(filterString)); - } - } - - public boolean accept(GraphType graphType, String name, String edgeName, - String source, String dest) { - if(graphType.equals(GraphType.KEY)) { - for(Pattern pattern : patterns) { - if(pattern.matcher(name).find()) { - return true; - } - } - - return false; - } else { - return true; - } - } - - public boolean acceptPattern(GraphType graphType, Pattern pattern, - String edgeName, String source, String dest) { - return true; - } - - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/com/gemstone/sequence/gemfire/HydraLineMapper.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/sequence/gemfire/HydraLineMapper.java b/geode-core/src/test/java/com/gemstone/sequence/gemfire/HydraLineMapper.java deleted file mode 100644 index ccb05d7..0000000 --- a/geode-core/src/test/java/com/gemstone/sequence/gemfire/HydraLineMapper.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.sequence.gemfire; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.sequence.LineMapper; - -/** - * - */ -public class HydraLineMapper implements LineMapper { - private static final Pattern VM_NAME_PATTERN = Pattern.compile("(vm_\\d+).*_(\\d+)(_end)?\\.log"); - private static final Pattern DISK_DIR_PATTERN = Pattern.compile("vm_(\\d+).*_disk_1"); - private final Map<String, String> processIdToVMName = new HashMap<String, String>(); - private final DefaultLineMapper defaultMapper = new DefaultLineMapper(); - - public HydraLineMapper(File[] graphFiles) { - File firstFile = graphFiles[0]; - File directory = firstFile.getParentFile(); - if(directory == null || ! new File(directory, "latest.prop").exists()) { - directory = new File("."); - } - String[] files = directory.list(); - for(String file : files) { - Matcher matcher = VM_NAME_PATTERN.matcher(file); - if(matcher.matches()) { - processIdToVMName.put(matcher.group(2), matcher.group(1)); - } - } - - for(String file : files) { - Matcher matcher = DISK_DIR_PATTERN.matcher(file); - if(matcher.matches()) { - - String storeId = getDiskStoreId(file); - if(storeId != null) { - processIdToVMName.put(storeId, "disk_" + matcher.group(1)); - } - } - } - - - } - - private String getDiskStoreId(String diskStoreDir) { - File dir = new File(diskStoreDir); - String[] files = dir.list(); - for(String fileName : files) { - if(fileName.endsWith(".if")) { - try { - return getDiskStoreIdFromInitFile(dir, fileName); - } catch (Exception e) { - return null; - } - } - } - - return null; - } - - private String getDiskStoreIdFromInitFile(File dir, String fileName) - throws FileNotFoundException, IOException { - FileInputStream fis = new FileInputStream(new File(dir, fileName)); - try { - byte[] bytes = new byte[1 + 8 + 8]; - fis.read(bytes); - ByteBuffer buffer = ByteBuffer.wrap(bytes); - //Skip the record type. - buffer.get(); - long least = buffer.getLong(); - long most = buffer.getLong(); - UUID id = new UUID(most, least); - return id.toString(); - } finally { - fis.close(); - } - } - - public String getShortNameForLine(String lineName) { - String name = defaultMapper.getShortNameForLine(lineName); - if(processIdToVMName.containsKey(name)) { - return processIdToVMName.get(name); - } else { - return name; - } - } - - public static boolean isInHydraRun(File[] graphFiles) { - if(graphFiles.length == 0) { - return false; - } - File firstFile = graphFiles[0]; - File parentFile = firstFile.getParentFile(); - for(File file : graphFiles) { - if(parentFile == null && file.getParentFile() == null) { - return true; - } - if (parentFile == null || file.getParentFile() == null - || !file.getParentFile().equals(parentFile)) { - return false; - } - } - - return new File(parentFile, "latest.prop").exists() - || new File("latest.prop").exists(); - - - } - -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/com/gemstone/sequence/gemfire/SelectGraphDialog.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/com/gemstone/sequence/gemfire/SelectGraphDialog.java b/geode-core/src/test/java/com/gemstone/sequence/gemfire/SelectGraphDialog.java deleted file mode 100644 index 7863008..0000000 --- a/geode-core/src/test/java/com/gemstone/sequence/gemfire/SelectGraphDialog.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.sequence.gemfire; - -import org.apache.geode.internal.sequencelog.model.GraphID; -import org.apache.geode.internal.sequencelog.model.GraphSet; - -import javax.swing.*; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.util.*; -import java.util.List; -import java.util.regex.Pattern; - -/** - * Created by IntelliJ IDEA. - * User: dsmith - * Date: Dec 9, 2010 - * Time: 3:34:38 PM - * To change this template use File | Settings | File Templates. - */ -public class SelectGraphDialog extends JDialog { - private List<GraphID> selectedIds = new ArrayList<GraphID>(); - private Set<SelectionListener> listeners = new HashSet<SelectionListener>(); - - public SelectGraphDialog(final GraphSet graphs) { - - final List<GraphID> ids = new ArrayList<GraphID>(graphs.getMap().keySet()); - Collections.sort(ids); - final FilterableListModel listModel = new FilterableListModel(ids); - final JList list = new JList(listModel); - - JScrollPane selectGraphPane = new JScrollPane(list); - selectGraphPane.setPreferredSize(new Dimension(500, 500)); - - JButton apply = new JButton("Apply"); - apply.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - selectedIds = (List) Arrays.asList(list.getSelectedValues()); - fireSelectionChanged(); - setVisible(false); - } - }); - - JButton cancel= new JButton("Cancel"); - cancel.addActionListener(new ActionListener() { - public void actionPerformed(ActionEvent e) { - setVisible(false); - } - }); - - JPanel buttonPane = new JPanel(); - buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.LINE_AXIS)); - buttonPane.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10)); - buttonPane.add(Box.createHorizontalGlue()); - buttonPane.add(apply); - buttonPane.add(cancel); - - final JTextField searchField = new JTextField(10); - searchField.getDocument().addDocumentListener(new DocumentListener() { - public void removeUpdate(DocumentEvent e) { - doUpdate(); - } - - public void insertUpdate(DocumentEvent e) { - doUpdate(); - } - - public void changedUpdate(DocumentEvent e) { - doUpdate(); - } - - private void doUpdate() { - listModel.updateFilter(searchField.getText()); - } - }); - - - Container contentPane = getContentPane(); - contentPane.add(searchField, BorderLayout.PAGE_START); - contentPane.add(selectGraphPane, BorderLayout.CENTER); - contentPane.add(buttonPane, BorderLayout.PAGE_END); - } - - private void fireSelectionChanged() { - for(SelectionListener listener : listeners) { - listener.selectionChanged(selectedIds); - } - } - - public void addSelectionListener(SelectionListener listener) { - listeners.add(listener); - - } - - public void removeSelectionListener(SelectionListener listener) { - listeners.remove(listener); - } - - /** - * A listener for changes to the graph selections - */ - public static interface SelectionListener { - void selectionChanged(List<GraphID> selectedIds); - } - - private static class FilterableListModel extends AbstractListModel { - private final List<?> allElements; - private List<Object> filteredElements; - - public FilterableListModel(List<?> elements) { - this.allElements = elements; - this.filteredElements = new ArrayList<Object>(elements); - } - - public int getSize() { - return filteredElements.size(); - } - - public Object getElementAt(int index) { - return filteredElements.get(index); - } - - public void updateFilter(String filter) { - Pattern pattern = Pattern.compile(filter); - filteredElements = new ArrayList<Object>(); - for(Object element : allElements) { - if(pattern.matcher(element.toString()).find()) { - filteredElements.add(element); - } - } - - fireContentsChanged(this, 0, filteredElements.size()); - } - - } -} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java index 058b3c7..e3c0877 100755 --- a/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java +++ b/geode-core/src/test/java/org/apache/geode/distributed/internal/membership/gms/messenger/JGroupsMessengerJUnitTest.java @@ -155,7 +155,7 @@ public class JGroupsMessengerJUnitTest { when(services.getMessenger()).thenReturn(messenger); String jgroupsConfig = messenger.getJGroupsStackConfig(); - int startIdx = jgroupsConfig.indexOf("<com"); + int startIdx = jgroupsConfig.indexOf("<org"); int insertIdx = jgroupsConfig.indexOf('>', startIdx+4) + 1; jgroupsConfig = jgroupsConfig.substring(0, insertIdx) + "<"+InterceptUDP.class.getName()+"/>" + http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/persistence/admin/Logger.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/persistence/admin/Logger.java b/geode-core/src/test/java/org/apache/persistence/admin/Logger.java new file mode 100644 index 0000000..c0a6de9 --- /dev/null +++ b/geode-core/src/test/java/org/apache/persistence/admin/Logger.java @@ -0,0 +1,277 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.persistence.admin; + +import java.util.*; +import java.io.PrintWriter; +import java.text.*; + +/** + * Provides single point for all log messages to written to. + * Currently this class only supports static methods and always + * writes to stdout. + * + */ +public class Logger +{ + private static final PrintWriter logWriter = new PrintWriter(System.out, true); + + // Set LOGWIDTH to maxint as a cheap way of turning off formatting + private static final int LOGWIDTH = Integer.MAX_VALUE; + private static final SimpleDateFormat timeFormatter; + static { + final String defaultFormatPattern = "MM/dd/yy HH:mm:ss.SSS z"; + final String resourceName = "org.apache.persistence.admin.LoggerResources"; + final String keyName = "logger.timeStampFormat"; + String formatPattern = defaultFormatPattern; + SimpleDateFormat sdf; + try { + ResourceBundle messageRB = + ResourceBundle.getBundle(resourceName); + try { + formatPattern = messageRB.getString(keyName); + } catch (MissingResourceException e) { + System.out.println("NOTICE: Logger using default timestamp format." + + " Could not get resource key \"" + + keyName + + "\" because: " + e); + } + } catch (MissingResourceException e) { + System.out.println("NOTICE: Logger using default timestamp format." + + " Could not load resource bundle \"" + + resourceName + + "\" because: " + e); + } + if (formatPattern.length() == 0) { + sdf = null; + } else { + try { + sdf = new SimpleDateFormat(formatPattern); + } catch (RuntimeException e) { + System.out.println("NOTICE: ignoring timestamp pattern \"" + + formatPattern + + "\" because: " + e.toString()); + System.out.println(" Using default pattern: \"" + + defaultFormatPattern + "\"."); + formatPattern = defaultFormatPattern; + sdf = new SimpleDateFormat(formatPattern); + } + } + timeFormatter = sdf; + } + + static private void formatText(PrintWriter writer, String target, + int maxLength, int initialLength) { + BreakIterator boundary = BreakIterator.getLineInstance(); + boundary.setText(target); + int start = boundary.first(); + int end = boundary.next(); + int lineLength = initialLength; + + while (end != BreakIterator.DONE) { + // Look at the end and only accept whitespace breaks + char endChar = target.charAt(end-1); + while (!Character.isWhitespace(endChar)) { + int lastEnd = end; + end = boundary.next(); + if (end == BreakIterator.DONE) { + // give up. We are at the end of the string + end = lastEnd; + break; + } + endChar = target.charAt(end-1); + } + int wordEnd = end; + if (endChar == '\n') { + // trim off the \n since println will do it for us + wordEnd--; + } else if (endChar == '\t') { + // figure tabs use 8 characters + lineLength += 7; + } + String word = target.substring(start, wordEnd); + if ((lineLength + word.length()) >= maxLength) { + if (lineLength != 0) { + writer.println(); + writer.print(" "); + lineLength = 2; + } + } + lineLength += word.length(); + writer.print(word); + if (endChar == '\n') { + // force end of line + writer.println(); + writer.print(" "); + lineLength = 2; + } + start = end; + end = boundary.next(); + } + if (lineLength != 0) { + writer.println(); + } + } + + /** + * Gets a String representation of the current time. + * @return a String representation of the current time. + */ + static public String getTimeStamp() { + return formatDate(new Date()); + } + /** + * Convert a Date to a timestamp String. + * @param d a Date to format as a timestamp String. + * @return a String representation of the current time. + */ + static public String formatDate(Date d) { + if (timeFormatter == null) { + try { + // very simple format that shows millisecond resolution + return Long.toString(d.getTime()); + } catch (Exception ignore) { + return "timestampFormatFailed"; + } + } + try { + synchronized (timeFormatter) { + // Need sync: see bug 21858 + return timeFormatter.format(d); + } + } catch (Exception e1) { + // Fix bug 21857 + try { + return d.toString(); + } catch (Exception e2) { + try { + return Long.toString(d.getTime()); + } catch (Exception e3) { + return "timestampFormatFailed"; + } + } + } + } + + /** + * Logs a message to the static log destination. + * @param msg the actual message to log + */ + static public void put(String msg) { + put(msg, (Throwable)null); + } + + /** + * Logs a message to the specified log destination. + * @param log the <code>PrintWriter</code> that the message will be written to. + * @param msg the actual message to log + */ + static public void put(PrintWriter log, String msg) { + put(log, msg, (Throwable)null); + } + + /** + * Logs an exception to the static log destination. + * @param exception the actual Exception to log + */ + static public void put(Throwable exception) { + put((String)null, exception); + } + /** + * Logs an exception to the specified log destination. + * @param log the <code>PrintWriter</code> that the message will be written to. + * @param exception the actual Exception to log + */ + static public void put(PrintWriter log, Throwable exception) { + put(log, (String)null, exception); + } + + /** + * Logs a message and an exception to the static log destination. + * @param msg the actual message to log + * @param exception the actual Exception to log + */ + static public void put(String msg, Throwable exception) { + put(logWriter, msg, exception); + } + + /** + * Logs a message and an exception to the specified log destination. + * @param log the <code>PrintWriter</code> that the message will be written to. If null then the default stdout writer is used. + * @param msg the actual message to log + * @param exception the actual Exception to log + */ + static public void put(PrintWriter log, String msg, Throwable exception) { + java.io.StringWriter sw = new java.io.StringWriter(); + String header; + PrintWriter pw = new PrintWriter(sw); + + pw.println(); + header = '[' + getTimeStamp() + ' ' + Thread.currentThread().getName() + "] "; + pw.print(header); + if (msg != null) { + try { + formatText(pw, msg, LOGWIDTH, header.length()); + } catch (RuntimeException e) { + pw.println(msg); + pw.println("Ignoring exception:"); + e.printStackTrace(pw); + } + } else { + pw.println(); + } + if (exception != null) { + exception.printStackTrace(pw); + } + pw.close(); + try { + sw.close(); + } catch (java.io.IOException ignore) {} + + if (log == null) { + log = logWriter; + } + log.print(sw.toString()); + log.flush(); + } + + /** + * Formats a message. Takes special care when invoking the + * toString() method of objects that might cause NPEs. + */ + public static String format(String format, Object[] objs) { + String[] strings = new String[objs.length]; + for (int i = 0; i < objs.length; i++) { + Object obj = objs[i]; + if (obj == null) { + strings[i] = "null"; + + } else { + try { + strings[i] = obj.toString(); + + } catch (Exception ex) { + strings[i] = obj.getClass().getName() + "@" + + System.identityHashCode(obj); + } + } + } + + return java.text.MessageFormat.format(format, (Object[])strings); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/persistence/logging/Formatter.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/persistence/logging/Formatter.java b/geode-core/src/test/java/org/apache/persistence/logging/Formatter.java new file mode 100644 index 0000000..19b2319 --- /dev/null +++ b/geode-core/src/test/java/org/apache/persistence/logging/Formatter.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.persistence.logging; + +/** + * Abstract class that formats LogRecords + */ +public abstract class Formatter { + + /** Should we print a stack trace along with logging messages */ + protected static boolean STACK_TRACE = + Boolean.getBoolean("org.apache.persistence.logging.StackTraces"); + + /** + * Formats the given log record as a String + */ + public abstract String format(LogRecord record); + + /** + * Formats the message string from a log record + */ + public String formatMessage(LogRecord record) { + // Simple + return(record.getMessage()); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/persistence/logging/Handler.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/persistence/logging/Handler.java b/geode-core/src/test/java/org/apache/persistence/logging/Handler.java new file mode 100644 index 0000000..a2e81ea --- /dev/null +++ b/geode-core/src/test/java/org/apache/persistence/logging/Handler.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.persistence.logging; + +/** + * A Handler exports LogRecords to some destination. It can be + * configured to ignore log records that are below a given level. It + * can also a have formatter for formatting the log records before + * exporting the to the destination. + */ +public abstract class Handler { + + /** The minimum level for this handler. Any records below this + * level are ignored. */ + private Level level; + + /** Used to format the log records */ + private Formatter formatter; + + /** + * Creates a new <code>Handler</code> with Level.ALL and no + * formatter. + */ + protected Handler() { + this.level = Level.ALL; + this.formatter = null; + } + + /** + * Closes this Handler and frees all of its resources + */ + public abstract void close(); + + /** + * Flushes an buffered output + */ + public abstract void flush(); + + /** + * Returns the formatter for this handler + */ + public Formatter getFormatter() { + return(this.formatter); + } + + /** + * Sets the formatter for this handler + */ + public void setFormatter(Formatter formatter) { + this.formatter = formatter; + } + + /** + * Returns the level below which this handler ignores + */ + public Level getLevel() { + return(this.level); + } + + /** + * Sets the level below which this handler ignores + */ + public void setLevel(Level level) { + this.level = level; + } + + /** + * Returns <code>true</code> if a log record will be handled by this + * handler. + */ + public boolean isLoggable(LogRecord record) { + if(record.getLevel().intValue() >= this.getLevel().intValue()) { + return(true); + } else { + return(false); + } + } + + /** + * Publishes a log record to this handler + */ + public abstract void publish(LogRecord record); + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/persistence/logging/Level.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/persistence/logging/Level.java b/geode-core/src/test/java/org/apache/persistence/logging/Level.java new file mode 100644 index 0000000..c5855e4 --- /dev/null +++ b/geode-core/src/test/java/org/apache/persistence/logging/Level.java @@ -0,0 +1,128 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.persistence.logging; + +/** + * A level measures the importance of a entry in a log file. + * + * The priorty of level from highest to lowest is: + * <OL> + * <LI>ALL</LI> + * <LI>SEVERE</LI> + * <LI>WARNING</LI> + * <LI>INFO</LI> + * <LI>CONFIG</LI> + * <LI>FINE</LI> + * <LI>FINER</LI> + * <LI>FINEST</LI> + * <LI>OFF</LI> + * </OL> + */ +public class Level { + + public static final Level OFF = new Level("OFF", 4); + public static final Level SEVERE = new Level("SEVERE", 3); + public static final Level WARNING = new Level("WARNING", 2); + public static final Level INFO = new Level("INFO", 1); + public static final Level CONFIG = new Level("CONFIG", 0); + public static final Level FINE = new Level("FINE", -1); + public static final Level FINER = new Level("FINER", -2); + public static final Level FINEST = new Level("FINEST", -3); + public static final Level ALL = new Level("ALL", -4); + + private String name; + private int value; + + /** + * Creates a new <code>Level</code> with a given name and integer + * value. + */ + protected Level(String name, int value) { + this.name = name; + this.value = value; + } + + /** + * Creates a new <code>Level</code> from a string. The string + * should be something like "FINER" or "42". + */ + public static Level parse(String name) { + if(name.equalsIgnoreCase("OFF")) { + return(OFF); + + } else if(name.equalsIgnoreCase("SEVERE")) { + return(SEVERE); + + } else if(name.equalsIgnoreCase("WARNING")) { + return(WARNING); + + } else if(name.equalsIgnoreCase("INFO")) { + return(INFO); + + } else if(name.equalsIgnoreCase("CONFIG")) { + return(CONFIG); + + } else if(name.equalsIgnoreCase("FINE")) { + return(FINE); + + } else if(name.equalsIgnoreCase("FINER")) { + return(FINER); + + } else if(name.equalsIgnoreCase("FINEST")) { + return(FINEST); + + } else if(name.equalsIgnoreCase("ALL")) { + return(ALL); + } + + try { + return(new Level(name, Integer.parseInt(name))); + + } catch(NumberFormatException ex) { + throw new IllegalArgumentException("Invalid level: " + name); + } + } + + /** + * Returns the integer value for this level + */ + public int intValue() { + return(this.value); + } + + /** + * Returns a textual representation of this level + */ + public String toString() { + return("Level " + this.name + " (" + this.value + ")"); + } + + /** + * Two levels are equal if they have the same integer value + */ + public boolean equals(Object o) { + if(o instanceof Level) { + Level l = (Level) o; + if(l.value == this.value) { + return(true); + } + } + + return(false); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/persistence/logging/LogRecord.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/persistence/logging/LogRecord.java b/geode-core/src/test/java/org/apache/persistence/logging/LogRecord.java new file mode 100644 index 0000000..c2e8061 --- /dev/null +++ b/geode-core/src/test/java/org/apache/persistence/logging/LogRecord.java @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.persistence.logging; + +/** + * A <code>LogRecord</code> encapsulate an entry in a log. + */ +public class LogRecord { + + /** Global counter of sequence numbers */ + private static long nextSequenceNumber = 0; + + private Level level; + private String loggerName; + private String message; + private long millis; + private Object[] parameters; + private long sequenceNumber; + private String sourceClassName; + private String sourceMethodName; + private Throwable thrown; + + /** + * Creates a new <code>LogRecord</code> with the given level and + * message. + */ + public LogRecord(Level level, String message) { + this.level = level; + this.message = message; + this.sequenceNumber = nextSequenceNumber++; + this.millis = System.currentTimeMillis(); + } + + /** + * Sets the level at which the message id logged + */ + public void setLevel(Level level) { + this.level = level; + } + + /** + * Returns the level that the message should be logged at + */ + public Level getLevel() { + return(this.level); + } + + /** + * Sets the name of the logger to which this log record belongs + */ + public void setLoggerName(String loggerName) { + this.loggerName = loggerName; + } + + /** + * Returns the name of the logger to which this log record belongs + */ + public String getLoggerName() { + return(this.loggerName); + } + + /** + * Sets the message for this log entry + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Returns the message for this log entry + */ + public String getMessage() { + return(this.message); + } + + /** + * Sets the event time + */ + public void setMillis(long millis) { + this.millis = millis; + } + + /** + * Returns the event time in milliseconds since 1970 + */ + public long getMillis() { + return(this.millis); + } + + /** + * Sets the parameters to this log entry + */ + public void setParameters(Object[] parameters) { + this.parameters = parameters; + } + + /** + * Returns the parameters to this log entry + */ + public Object[] getParameters() { + return(this.parameters); + } + + /** + * Sets the sequence number of this log entry + */ + public void setSequenceNumber(long sequenceNumber) { + this.sequenceNumber = sequenceNumber; + } + + /** + * Returns the sequence number of this log entry + */ + public long getSequenceNumber() { + return(this.sequenceNumber); + } + + /** + * Sets the name of the source class from which this log entry was + * issued + */ + public void setSourceClassName(String sourceClassName) { + this.sourceClassName = sourceClassName; + } + + /** + * Returns the name of the source class from which this log entry + * was issued + */ + public String getSourceClassName() { + return(this.sourceClassName); + } + + /** + * Sets the name of the source method from which this log entry was + * issued + */ + public void setSourceMethodName(String sourceMethodName) { + this.sourceMethodName = sourceMethodName; + } + + /** + * Returns the name of the source method from which this log entry + * was issued + */ + public String getSourceMethodName() { + return(this.sourceMethodName); + } + + /** + * Sets the throwable associated with this log entry + */ + public void setThrown(Throwable thrown) { + this.thrown = thrown; + } + + /** + * Returns the throwable associated with this log entry + */ + public Throwable getThrown() { + return(this.thrown); + } + + /** + * Returns a brief textual description of this + * <code>LogRecord</code> + */ + public String toString() { + return(this.message + " at " + this.level); + } +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/persistence/logging/Logger.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/persistence/logging/Logger.java b/geode-core/src/test/java/org/apache/persistence/logging/Logger.java new file mode 100644 index 0000000..00e9fee --- /dev/null +++ b/geode-core/src/test/java/org/apache/persistence/logging/Logger.java @@ -0,0 +1,566 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.persistence.logging; + +import java.util.*; + +/** + * A logger is used to record messages and events. Each entry has a + * given level associated with it. There are a number of convenience + * methods for logging events. Events with a level above a certain + * are written to <code>System.err</code>. The default level is + * INFO + */ +public class Logger { + private static boolean DEBUG = Boolean.getBoolean("Logging.DEBUG"); + + /** Maps the names of Loggers to the Logger */ + private static Map loggers = new HashMap(); + + /** The name of this logger */ + private String name; + + /** The maximum level at which messages are logged. Message level + * lower than this value will be ignored. */ + private Level level; + + /** The Handlers to which this logger's records are sent */ + private Set handlers; + + /** + * Creates a new <code>Logger</code> with the given name + */ + protected Logger(String name) { + this.name = name; + + // Uses a system property to set the level + String prop = System.getProperty(name + ".LEVEL"); + if(prop != null) { + this.level = Level.parse(prop); + } else { + this.level = Level.INFO; + } + + this.handlers = new HashSet(); + + // By default, log to System.err + this.handlers.add(new StreamHandler(System.err, + new SimpleFormatter())); + } + + /** + * Returns the logger with the given name + */ + public synchronized static Logger getLogger(String name) { + Logger logger = (Logger) loggers.get(name); + if(logger == null) { + logger = new Logger(name); + loggers.put(name, logger); + } + +// Assert.assertTrue(logger != null); (cannot be null) + return(logger); + } + + /** + * Adds a Handler to receive logging messages + */ + public synchronized void addHandler(Handler handler) { + this.handlers.add(handler); + } + + /** + * Returns the Handlers associated with this logger + */ + public synchronized Handler[] getHandlers() { + return((Handler[]) this.handlers.toArray(new Handler[0])); + } + + /** + * Removes a Handler from this logger + */ + public synchronized void removeHandler(Handler handler) { + this.handlers.remove(handler); + } + + /** + * Returns the log level specifying which messages will be logged by + * this logger. + */ + public synchronized Level getLevel() { + return(this.level); + } + + /** + * Sets the log level specifying which messages will be logged by + * this logger. + */ + public synchronized void setLevel(Level level) { + this.level = level; + } + + /** + * Check if a message of the given level would actually be logged by + * this logger. + */ + public synchronized boolean isLoggable(Level msgLevel) { + if(msgLevel.equals(Level.ALL)) { + // Always log Level.ALL messages. Is this a logic error? + return(true); + } else { + return(msgLevel.intValue() >= this.level.intValue()); + } + } + + /** + * Prints the given log record to System.err + */ + public synchronized void log(LogRecord record) { + if(!isLoggable(record.getLevel())) { + // This record is beneath us + return; + } + + if(DEBUG) { + System.out.println("Logging " + record); + } + + // Publish the record to each handler + Iterator iter = this.handlers.iterator(); + while(iter.hasNext()) { + Handler handler = (Handler) iter.next(); + handler.publish(record); + handler.flush(); + } + } + + /** + * Logs a CONFIG message + */ + public synchronized void config(String msg) { + LogRecord record = new LogRecord(Level.CONFIG, msg); + log(record); + } + + /** + * Log a CONFIG message, with an array of object arguments. + */ + public synchronized void config(String msg, Object[] params) { + LogRecord record = new LogRecord(Level.CONFIG, msg); + record.setParameters(params); + log(record); + } + + /** + * Log a CONFIG message, specifying source class and method. + */ + public synchronized void config(String sourceClass, + String sourceMethod, String msg) { + LogRecord record = new LogRecord(Level.CONFIG, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a CONFIG message, specifying source class and method, with an + * array of object arguments. + */ + public synchronized void config(String sourceClass, String sourceMethod, + String msg, Object[] params) { + LogRecord record = new LogRecord(Level.CONFIG, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Log a procedure entry. + */ + public synchronized void entering(String sourceClass, String sourceMethod) { + LogRecord record = new LogRecord(Level.CONFIG, "Entering method"); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a procedure entry, with parameters. + */ + public synchronized void entering(String sourceClass, String sourceMethod, + Object[] params) { + LogRecord record = new LogRecord(Level.CONFIG, "Entering method"); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Log a procedure return. + */ + public synchronized void exiting(String sourceClass, String sourceMethod) { + LogRecord record = new LogRecord(Level.CONFIG, "Exiting method"); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a procedure return, with parameters. + */ + public synchronized void exiting(String sourceClass, String sourceMethod, + Object[] params) { + LogRecord record = new LogRecord(Level.CONFIG, "Exiting method"); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Logs a FINE message + */ + public synchronized void fine(String msg) { + LogRecord record = new LogRecord(Level.FINE, msg); + log(record); + } + + /** + * Log a FINE message, with an array of object arguments. + */ + public synchronized void fine(String msg, Object[] params) { + LogRecord record = new LogRecord(Level.FINE, msg); + record.setParameters(params); + log(record); + } + + /** + * Log a FINE message, specifying source class and method. + */ + public synchronized void fine(String sourceClass, String sourceMethod, + String msg) { + LogRecord record = new LogRecord(Level.FINE, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a FINE message, specifying source class and method, with an + * array of object arguments. + */ + public synchronized void fine(String sourceClass, String sourceMethod, + String msg, Object[] params) { + LogRecord record = new LogRecord(Level.FINE, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Logs a FINER message + */ + public synchronized void finer(String msg) { + LogRecord record = new LogRecord(Level.FINER, msg); + log(record); + } + + /** + * Log a FINER message, with an array of object arguments. + */ + public synchronized void finer(String msg, Object[] params) { + LogRecord record = new LogRecord(Level.FINER, msg); + record.setParameters(params); + log(record); + } + + /** + * Log a FINER message, specifying source class and method. + */ + public synchronized void finer(String sourceClass, String sourceMethod, + String msg) { + LogRecord record = new LogRecord(Level.FINER, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a FINER message, specifying source class and method, with an + * array of object arguments. + */ + public synchronized void finer(String sourceClass, String sourceMethod, + String msg, Object[] params) { + LogRecord record = new LogRecord(Level.FINER, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Logs a FINEST message + */ + public synchronized void finest(String msg) { + LogRecord record = new LogRecord(Level.FINEST, msg); + log(record); + } + + /** + * Log a FINEST message, with an array of object arguments. + */ + public synchronized void finest(String msg, Object[] params) { + LogRecord record = new LogRecord(Level.FINEST, msg); + record.setParameters(params); + log(record); + } + + /** + * Log a FINEST message, specifying source class and method. + */ + public synchronized void finest(String sourceClass, String sourceMethod, + String msg) { + LogRecord record = new LogRecord(Level.FINEST, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a FINEST message, specifying source class and method, with an + * array of object arguments. + */ + public synchronized void finest(String sourceClass, String sourceMethod, + String msg, Object[] params) { + LogRecord record = new LogRecord(Level.FINEST, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Logs a INFO message + */ + public synchronized void info(String msg) { + LogRecord record = new LogRecord(Level.INFO, msg); + log(record); + } + + /** + * Log a INFO message, with an array of object arguments. + */ + public synchronized void info(String msg, Object[] params) { + LogRecord record = new LogRecord(Level.INFO, msg); + record.setParameters(params); + log(record); + } + + /** + * Log a INFO message, specifying source class and method. + */ + public synchronized void info(String sourceClass, String sourceMethod, + String msg) { + LogRecord record = new LogRecord(Level.INFO, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a INFO message, specifying source class and method, with an + * array of object arguments. + */ + public synchronized void info(String sourceClass, String sourceMethod, + String msg, Object[] params) { + LogRecord record = new LogRecord(Level.INFO, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Logs a message + */ + public synchronized void log(Level msgLevel, String msg) { + LogRecord record = new LogRecord(msgLevel, msg); + log(record); + } + + /** + * Log a message, with an array of object arguments. + */ + public synchronized void log(Level msgLevel, String msg, Object[] params) { + LogRecord record = new LogRecord(msgLevel, msg); + record.setParameters(params); + log(record); + } + + /** + * Log a message, specifying source class and method. + */ + public synchronized void log(Level msgLevel, String sourceClass, String sourceMethod, + String msg) { + LogRecord record = new LogRecord(msgLevel, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a message, specifying source class and method, with an + * array of object arguments. + */ + public synchronized void log(Level msgLevel, String sourceClass, String sourceMethod, + String msg, Object[] params) { + LogRecord record = new LogRecord(msgLevel, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Log a message, specifying source class and method, with + * associated Throwable information. + */ + public synchronized void log(Level msgLevel, String sourceClass, + String sourceMethod, String msg, Throwable thrown) { + LogRecord record = new LogRecord(msgLevel, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setThrown(thrown); + log(record); + } + + /** + * Log a message, with associated Throwable information. + */ + public synchronized void log(Level msgLevel, String msg, Throwable thrown) { + LogRecord record = new LogRecord(msgLevel, msg); + record.setThrown(thrown); + log(record); + } + + /** + * Logs a SEVERE message + */ + public synchronized void severe(String msg) { + LogRecord record = new LogRecord(Level.SEVERE, msg); + log(record); + } + + /** + * Log a SEVERE message, with an array of object arguments. + */ + public synchronized void severe(String msg, Object[] params) { + LogRecord record = new LogRecord(Level.SEVERE, msg); + record.setParameters(params); + log(record); + } + + /** + * Log a SEVERE message, specifying source class and method. + */ + public synchronized void severe(String sourceClass, String sourceMethod, + String msg) { + LogRecord record = new LogRecord(Level.SEVERE, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a SEVERE message, specifying source class and method, with an + * array of object arguments. + */ + public synchronized void severe(String sourceClass, String sourceMethod, + String msg, Object[] params) { + LogRecord record = new LogRecord(Level.SEVERE, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Log throwing an exception. The logging is done using the FINER + * level. + */ + public synchronized void throwing(String sourceClass, String sourceMethod, + Throwable thrown) { + LogRecord record = new LogRecord(Level.FINER, "THROWN"); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setThrown(thrown); + log(record); + } + + /** + * Logs a WARNING message + */ + public synchronized void warning(String msg) { + LogRecord record = new LogRecord(Level.WARNING, msg); + log(record); + } + + /** + * Log a WARNING message, with an array of object arguments. + */ + public synchronized void warning(String msg, Object[] params) { + LogRecord record = new LogRecord(Level.WARNING, msg); + record.setParameters(params); + log(record); + } + + /** + * Log a WARNING message, specifying source class and method. + */ + public synchronized void warning(String sourceClass, String sourceMethod, + String msg) { + LogRecord record = new LogRecord(Level.WARNING, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + log(record); + } + + /** + * Log a WARNING message, specifying source class and method, with an + * array of object arguments. + */ + public synchronized void warning(String sourceClass, String sourceMethod, + String msg, Object[] params) { + LogRecord record = new LogRecord(Level.WARNING, msg); + record.setSourceClassName(sourceClass); + record.setSourceMethodName(sourceMethod); + record.setParameters(params); + log(record); + } + + /** + * Formats a message. Takes special care when invoking the + * toString() method of objects that might cause NPEs. + */ + public static String format(String format, Object[] objs) { + return org.apache.persistence.admin.Logger.format( format, objs ); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/persistence/logging/SimpleFormatter.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/persistence/logging/SimpleFormatter.java b/geode-core/src/test/java/org/apache/persistence/logging/SimpleFormatter.java new file mode 100644 index 0000000..c4a7e58 --- /dev/null +++ b/geode-core/src/test/java/org/apache/persistence/logging/SimpleFormatter.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.persistence.logging; + +import java.io.*; +//import java.text.*; +import java.util.*; + +/** + * A Formatter that returns a textual description of a LogRecord + */ +public class SimpleFormatter extends Formatter { + + public String format(LogRecord record) { + StringBuffer sb = new StringBuffer(); + sb.append('['); + sb.append(org.apache.persistence.admin.Logger.formatDate(new Date(record.getMillis()))); + sb.append(' '); + sb.append(Thread.currentThread().getName()); + sb.append("] "); + sb.append(record.getMessage()); + sb.append('\n'); + + if(record.getSourceClassName() != null) { + sb.append(" In "); + sb.append(record.getSourceClassName()); + if(record.getSourceMethodName() != null) { + sb.append("."); + sb.append(record.getSourceMethodName()); + } + sb.append('\n'); + } + + Object[] params = record.getParameters(); + if(params != null) { + for(int i = 0; i < params.length; i++) { + sb.append(params[i]); + sb.append('\n'); + } + } + + if(record.getThrown() != null) { + Throwable thr = record.getThrown(); + StringWriter sw = new StringWriter(); + thr.printStackTrace(new PrintWriter(sw, true)); + sb.append(sw.toString()); + sb.append('\n'); + } + + if (STACK_TRACE) { + Exception thr = new Exception("Stack Trace"); + StringWriter sw = new StringWriter(); + thr.printStackTrace(new PrintWriter(sw, true)); + sb.append(sw.toString()); + sb.append('\n'); + } + + sb.append('\n'); + + return(sb.toString()); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/persistence/logging/StreamHandler.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/persistence/logging/StreamHandler.java b/geode-core/src/test/java/org/apache/persistence/logging/StreamHandler.java new file mode 100644 index 0000000..a39f9e0 --- /dev/null +++ b/geode-core/src/test/java/org/apache/persistence/logging/StreamHandler.java @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.persistence.logging; + +import java.io.*; + +/** + * A <code>StreamHandler</code> exports log records to an + * <code>OutputStream</code>. + */ +public class StreamHandler extends Handler { + + /** The destination PrintWriter */ + private PrintWriter pw; + + /** + * Creates a new <code>StreamHandler</code> that exports log records + * to an <code>OutputStream</code> in a given format. + */ + public StreamHandler(OutputStream stream, Formatter formatter) { + super(); + this.pw = new PrintWriter(stream, true); + this.setFormatter(formatter); + } + + public void close() { + this.pw.close(); + } + + public void flush() { + this.pw.flush(); + } + + public boolean isLoggable(LogRecord record) { + if(this.pw == null) { + return(false); + } else { + return(super.isLoggable(record)); + } + } + + public void publish(LogRecord record) { + Formatter formatter = this.getFormatter(); + pw.print(formatter.format(record)); + } + +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/sequence/Arrow.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/sequence/Arrow.java b/geode-core/src/test/java/org/apache/sequence/Arrow.java new file mode 100644 index 0000000..4274aa9 --- /dev/null +++ b/geode-core/src/test/java/org/apache/sequence/Arrow.java @@ -0,0 +1,124 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sequence; + +import java.awt.*; +import java.awt.geom.GeneralPath; + +/** + * Created by IntelliJ IDEA. + * User: dsmith + * Date: Nov 12, 2010 + * Time: 12:02:20 PM + * To change this template use File | Settings | File Templates. + */ +public class Arrow { + private static int ARROW_WIDTH=10; + private static int CIRCLE_WIDTH=6; + private static int LABEL_OFFSET=10; + + private final String label; + private final LifelineState startingState; + private final LifelineState endingState; + + public Arrow(String label, LifelineState startingState, LifelineState endingState) { + this.label = label; + this.startingState = startingState; + this.endingState = endingState; + } + + + public void paint(Graphics2D g) { + Rectangle boundary = g.getClipBounds(); + int y = endingState.getStartY(); + + //don't paint if we're not in the clip area + if(y + ARROW_WIDTH < boundary.getMinY() || y - ARROW_WIDTH > boundary.getMaxY()) { + return; + } + + //TODO - we need to clip by X coordinate as well. + + boolean isReflexsive = getStartingLine() == getEndingLine(); + if(isReflexsive) { + paintReflexive(g); + } else { + paintNormal(g); + } + } + + private Lifeline getStartingLine() { + return startingState.getLine(); + } + + private Lifeline getEndingLine() { + return endingState.getLine(); + } + + private void paintReflexive(Graphics2D g) { + Lifeline startingLine = getStartingLine(); + int x = startingLine.getX(); + int y = endingState.getStartY(); + + g.drawArc(x + startingLine.getWidth() - ARROW_WIDTH / 2, y - ARROW_WIDTH, ARROW_WIDTH, ARROW_WIDTH, 90, -180); + g.drawString(label, x + startingLine.getWidth() + LABEL_OFFSET, y); +// GeneralPath path = new GeneralPath(); +// path.moveTo(x, y - ARROW_WIDTH); +// path.quadTo(x, y - ARROW_WIDTH); + } + + private void paintNormal(Graphics2D g) { + Lifeline startingLine = getStartingLine(); + Lifeline endingLine = getEndingLine(); + int x1 = startingLine.getX(); + int x2 = endingLine.getX(); + int y = endingState.getStartY(); + + if(x2 > x1) { + int startX = x1 + startingLine.getWidth(); + int endX = x2; + + GeneralPath path = new GeneralPath(); + path.moveTo(startX, y); + path.lineTo(endX, y); + path.lineTo(endX - ARROW_WIDTH, y - ARROW_WIDTH); + path.moveTo(endX, y); + path.lineTo(endX - ARROW_WIDTH, y + ARROW_WIDTH); + g.draw(path); + g.fillArc(startX, y - CIRCLE_WIDTH/2, CIRCLE_WIDTH, CIRCLE_WIDTH, 0, 360); + g.drawString(label, startX + LABEL_OFFSET, y - LABEL_OFFSET); + } else { + int startX = x1; + int endX = x2 + endingLine.getWidth(); + + GeneralPath path = new GeneralPath(); + path.moveTo(startX, y); + path.lineTo(endX, y); + path.lineTo(endX + ARROW_WIDTH, y - ARROW_WIDTH); + path.moveTo(endX, y); + path.lineTo(endX + ARROW_WIDTH, y + ARROW_WIDTH); + g.draw(path); + int labelWidth = g.getFontMetrics().stringWidth(label); + g.fillArc(startX - CIRCLE_WIDTH/2, y - CIRCLE_WIDTH/2, CIRCLE_WIDTH, CIRCLE_WIDTH, 0, 360); + g.drawString(label, startX - LABEL_OFFSET - labelWidth, y - LABEL_OFFSET); + } + } + + public LifelineState getStartingState() { + return startingState; + } +} http://git-wip-us.apache.org/repos/asf/incubator-geode/blob/06384849/geode-core/src/test/java/org/apache/sequence/Lifeline.java ---------------------------------------------------------------------- diff --git a/geode-core/src/test/java/org/apache/sequence/Lifeline.java b/geode-core/src/test/java/org/apache/sequence/Lifeline.java new file mode 100644 index 0000000..f5de6ac --- /dev/null +++ b/geode-core/src/test/java/org/apache/sequence/Lifeline.java @@ -0,0 +1,98 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sequence; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Created by IntelliJ IDEA. + * User: dsmith + * Date: Oct 29, 2010 + * Time: 3:59:02 PM + * To change this template use File | Settings | File Templates. + */ +public class Lifeline { + private List<LifelineState> states; + private final String name; + private final Comparable diagramName; + private int x; + private int width; + + public String getName() { + return name; + } + + public int getX() { + return x; + } + + public int getWidth() { + return width; + } + + public void addState(LifelineState state) { + this.states.add(state); + } + + public Lifeline(Comparable diagramName, String name) { + this.name = name; + this.states = new ArrayList<LifelineState>(); + this.diagramName = diagramName; + } + + public void resize(int x, int lineWidth, long Ybase, double Yscale) { + for(LifelineState state : states) { + state.resize(Yscale, Ybase); + } + + this.x = x; + width = lineWidth; + } + + public void paint(Graphics2D g, StateColorMap colorMap) { + Rectangle boundary = g.getClipBounds(); + if(x > boundary.getMaxX() || x + width < boundary.getMinX()) { + //no need to paint if this line isn't displayed + return; + } + //TODO - we need to clip these to the visible states + for(LifelineState state : states) { + state.paint(g, colorMap); + } + } + + public List<LifelineState> getStates() { + return states; + } + + public LifelineState getStateAt(int y) { + for(LifelineState state : states) { + if(state.getStartY() < y && state.getStartY() + state.getHeight() > y) { + return state; + } + } + return null; + } + + public Comparable getDiagramName() { + return diagramName; + } +}