/** * This file is part of CloudML [ http://cloudml.org ] * * Copyright (C) 2012 - SINTEF ICT * Contact: Franck Chauvel <franck.chauvel@sintef.no> * * Module: root * * CloudML is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * CloudML is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with CloudML. If not, see * <http://www.gnu.org/licenses/>. */ package org.cloudml.ui.graph; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.image.ImageObserver; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.DefaultListModel; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.table.JTableHeader; import org.apache.commons.collections15.Transformer; import org.cloudml.codecs.DrawnIconVertexDemo; import org.cloudml.codecs.Edge; import org.cloudml.codecs.JsonCodec; import org.cloudml.codecs.Vertex; import org.cloudml.core.*; import org.cloudml.core.Component; import org.cloudml.facade.*; import org.cloudml.facade.commands.CloudMlCommand; import org.cloudml.facade.commands.CommandFactory; import edu.uci.ics.jung.visualization.GraphZoomScrollPane; import edu.uci.ics.jung.visualization.VisualizationViewer; import edu.uci.ics.jung.visualization.control.CrossoverScalingControl; import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse; import edu.uci.ics.jung.visualization.control.ModalGraphMouse; import edu.uci.ics.jung.visualization.control.ScalingControl; public class Visu { private JTable properties; private JTable runtimeProperties; private JList nodeTypes; private Deployment dmodel; private DrawnIconVertexDemo v; private CloudML cml; public Visu(Deployment model, DrawnIconVertexDemo v){ this.dmodel=model; this.v=v; cml=Factory.getInstance().getCloudML(); } public void createFrame(){ final VisualizationViewer<Vertex, Edge> vv= v.getVisualisationViewer(); vv.getRenderContext().setVertexIconTransformer(new Transformer<Vertex,Icon>() { public Icon transform(final Vertex v) { return new Icon() { public int getIconHeight() { return 40; } public int getIconWidth() { return 40; } public void paintIcon(java.awt.Component c, Graphics g, int x, int y) { ImageIcon img; if(v.getType() == "node"){ img=new ImageIcon(this.getClass().getResource("/server.png")); } else if(v.getType() == "platform") { img=new ImageIcon(this.getClass().getResource("/dbms.png")); }else{ img=new ImageIcon(this.getClass().getResource("/soft.png")); } ImageObserver io=new ImageObserver() { public boolean imageUpdate(Image img, int infoflags, int x, int y, int width, int height) { // TODO Auto-generated method stub return false; } }; g.drawImage(img.getImage(), x, y, getIconHeight(), getIconWidth(), io); if(!vv.getPickedVertexState().isPicked(v)) { g.setColor(Color.black); } else { g.setColor(Color.red); properties.setModel(new CPIMTable(v)); runtimeProperties.setModel(new CPSMTable(v)); } g.drawString(v.getName(), x-10, y+50); }}; }}); // create a frame to hold the graph final JFrame frame = new JFrame(); Container content = frame.getContentPane(); final GraphZoomScrollPane panel = new GraphZoomScrollPane(vv); content.add(panel, BorderLayout.CENTER); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); final ModalGraphMouse gm = new DefaultModalGraphMouse<Integer,Number>(); vv.setGraphMouse(gm); final ScalingControl scaler = new CrossoverScalingControl(); JButton plus = new JButton("+"); plus.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { scaler.scale(vv, 1.1f, vv.getCenter()); } }); JButton save = new JButton("save"); save.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); int returnVal = fc.showDialog(frame, "save"); File result = fc.getSelectedFile(); JsonCodec codec=new JsonCodec(); OutputStream streamResult; try { streamResult = new FileOutputStream(result); codec.save(dmodel, streamResult); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); JButton saveImage = new JButton("save as image"); saveImage.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); int returnVal = fc.showDialog(frame, "save"); File result = fc.getSelectedFile(); JsonCodec codec=new JsonCodec(); v.writeJPEGImage(result); } }); //WE NEED TO UPDATE THE FACADE AND THE GUI JButton load = new JButton("load"); load.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JFileChooser fc = new JFileChooser(); int returnVal = fc.showDialog(frame, "load"); File result = fc.getSelectedFile(); JsonCodec codec=new JsonCodec(); try { InputStream stream = new FileInputStream(result); Deployment model = (Deployment)codec.load(stream); dmodel=model; v.setDeploymentModel(dmodel); ArrayList<Vertex> V=v.drawFromDeploymentModel(); nodeTypes.removeAll(); nodeTypes.setModel(fillList()); properties.setModel(new CPIMTable(V.get(0))); runtimeProperties.setModel(new CPSMTable(V.get(0))); CommandFactory fcommand=new CommandFactory(); CloudMlCommand load=fcommand.loadDeployment(result.getPath()); cml.fireAndWait(load); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); JButton minus = new JButton("-"); minus.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { scaler.scale(vv, 1/1.1f, vv.getCenter()); } }); JButton deploy=new JButton("Deploy!"); deploy.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //cad.deploy(dmodel); System.out.println("deploy"); CommandFactory fcommand=new CommandFactory(); CloudMlCommand deploy=fcommand.deploy(); cml.fireAndWait(deploy); } }); //right panel JPanel intermediary=new JPanel(); intermediary.setLayout(new BoxLayout(intermediary, BoxLayout.PAGE_AXIS)); intermediary.setBorder(BorderFactory.createLineBorder(Color.black)); JLabel jlCPIM=new JLabel(); jlCPIM.setText("CPIM"); JLabel jlCPSM=new JLabel(); jlCPSM.setText("CPSM"); properties=new JTable(null); //properties.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); JTableHeader h=properties.getTableHeader(); JPanel props=new JPanel(); props.setLayout(new BorderLayout()); props.add(new JScrollPane(properties),BorderLayout.CENTER); props.add(h,BorderLayout.NORTH); runtimeProperties=new JTable(null); //runtimeProperties.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS); JTableHeader h2=runtimeProperties.getTableHeader(); JPanel runProps=new JPanel(); runProps.setLayout(new BorderLayout()); runProps.add(h2,BorderLayout.NORTH); runProps.add(new JScrollPane(runtimeProperties),BorderLayout.CENTER); intermediary.add(jlCPIM); intermediary.add(props); intermediary.add(jlCPSM); intermediary.add(runProps); content.add(intermediary,BorderLayout.EAST); //Left panel JPanel selection=new JPanel(); JLabel nodes=new JLabel(); nodes.setText("Types"); selection.setLayout(new BoxLayout(selection, BoxLayout.PAGE_AXIS)); nodeTypes=new JList(fillList()); nodeTypes.setLayoutOrientation(JList.VERTICAL); nodeTypes.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); nodeTypes.setVisibleRowCount(10); JScrollPane types = new JScrollPane (nodeTypes); types.setPreferredSize(new Dimension(150, 80)); selection.add(nodes); selection.add(types); content.add(selection,BorderLayout.WEST); ((DefaultModalGraphMouse<Integer,Number>) gm).add(new MyEditingGraphMousePlugin(0, vv, v.getGraph(), nodeTypes,dmodel)); JPanel controls = new JPanel(); controls.add(plus); controls.add(minus); controls.add(save); controls.add(saveImage); controls.add(load); controls.add(deploy); controls.add(((DefaultModalGraphMouse<Integer,Number>) gm).getModeComboBox()); content.add(controls, BorderLayout.SOUTH); frame.pack(); frame.setVisible(true); } public DefaultListModel fillList(){ DefaultListModel lm=new DefaultListModel(); for(ExternalComponent n:dmodel.getComponents().onlyExternals()){ lm.addElement(n.getName()); } for(Component n:dmodel.getComponents()){ lm.addElement(n.getName()); } for(Relationship b:dmodel.getRelationships()){ lm.addElement(b.getName()); } return lm; } }