| 1 | /* | |
| 2 | * Copyright (c) 2014 Maxim Yunusov | |
| 3 | * Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 | * you may not use this file except in compliance with the License. | |
| 5 | * You may obtain a copy of the License at | |
| 6 | * | |
| 7 | * http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 | * | |
| 9 | * Unless required by applicable law or agreed to in writing, software | |
| 10 | * distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 | * See the License for the specific language governing permissions and | |
| 13 | * limitations under the License. | |
| 14 | */ | |
| 15 | ||
| 16 | package org.maxur.perfmodel.backend.service.impl; | |
| 17 | ||
| 18 | import org.jvnet.hk2.annotations.Service; | |
| 19 | import org.maxur.perfmodel.backend.service.Application; | |
| 20 | import org.slf4j.Logger; | |
| 21 | import org.slf4j.LoggerFactory; | |
| 22 | ||
| 23 | import javax.inject.Named; | |
| 24 | import javax.swing.*; | |
| 25 | import java.awt.*; | |
| 26 | import java.awt.image.BufferedImage; | |
| 27 | import java.io.IOException; | |
| 28 | import java.net.URI; | |
| 29 | import java.net.URL; | |
| 30 | import java.util.Optional; | |
| 31 | ||
| 32 | import static java.lang.String.format; | |
| 33 | import static java.util.Optional.empty; | |
| 34 | import static javax.swing.SwingUtilities.invokeLater; | |
| 35 | import static org.maxur.perfmodel.backend.utils.OsUtils.isWindows; | |
| 36 | ||
| 37 | /** | |
| 38 | * This class represents Performance Model Calculator Application | |
| 39 | * It's GUI Implementation with Tray Icon | |
| 40 | * | |
| 41 | * @author Maxim | |
| 42 | * @version 1.0 | |
| 43 | * @since <pre>24.10.2014</pre> | |
| 44 | * <p> | |
| 45 | * see http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/misc/TrayIconDemoProject/src/misc/TrayIconDemo.java | |
| 46 | */ | |
| 47 | @Service | |
| 48 | public class TrayIconApplication extends Application { | |
| 49 | ||
| 50 | private static final Logger LOGGER = LoggerFactory.getLogger(TrayIconApplication.class); | |
| 51 | ||
| 52 | public static final String IMG_FAVICON_PATH = "/img/favicon.png"; | |
| 53 | ||
| 54 | private TrayIcon trayIcon; | |
| 55 | ||
| 56 | @SuppressWarnings("unused") | |
| 57 | @Named("webapp.folderName") | |
| 58 | private String webappUrl; | |
| 59 | ||
| 60 | public TrayIconApplication() { | |
| 61 | } | |
| 62 | ||
| 63 | @Override | |
| 64 | public boolean isApplicable() { | |
| 65 | //Check the SystemTray support | |
| 66 |
1
1. isApplicable : replaced return of integer sized value with (x == 0 ? 1 : 0) → NO_COVERAGE |
return SystemTray.isSupported(); |
| 67 | } | |
| 68 | ||
| 69 | @Override | |
| 70 | protected void onInit() { | |
| 71 | try { | |
| 72 |
1
1. onInit : negated conditional → NO_COVERAGE |
final String className = isWindows() ? |
| 73 | "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" : | |
| 74 | "javax.swing.plaf.metal.MetalLookAndFeel"; | |
| 75 |
1
1. onInit : removed call to javax/swing/UIManager::setLookAndFeel → NO_COVERAGE |
UIManager.setLookAndFeel(className); |
| 76 | } catch (UnsupportedLookAndFeelException | IllegalAccessException | |
| 77 | | InstantiationException | ClassNotFoundException ex | |
| 78 | ) { | |
| 79 | LOGGER.error("Tray application is not created", ex); | |
| 80 | } | |
| 81 | UIManager.put("swing.boldMetal", Boolean.FALSE); | |
| 82 | } | |
| 83 | ||
| 84 | @Override | |
| 85 | protected void onStart() { | |
| 86 |
1
1. onStart : removed call to javax/swing/SwingUtilities::invokeLater → NO_COVERAGE |
invokeLater(this::run); |
| 87 | } | |
| 88 | ||
| 89 | private void run() { | |
| 90 | final PopupMenu popup = new PopupMenu(); | |
| 91 | final Optional<Image> image = createImage(IMG_FAVICON_PATH, "tray icon"); | |
| 92 | final Image img; | |
| 93 |
1
1. run : negated conditional → NO_COVERAGE |
if (image.isPresent()) { |
| 94 | img = image.get(); | |
| 95 | } else { | |
| 96 | img = createImageFrom(); | |
| 97 | LOGGER.error(format("Resource '%s' is not found", IMG_FAVICON_PATH)); | |
| 98 | } | |
| 99 | trayIcon = new TrayIcon(img); | |
| 100 |
1
1. run : removed call to java/awt/TrayIcon::setToolTip → NO_COVERAGE |
trayIcon.setToolTip("Performance Model Calculator"); |
| 101 |
1
1. run : removed call to java/awt/TrayIcon::setImageAutoSize → NO_COVERAGE |
trayIcon.setImageAutoSize(true); |
| 102 | ||
| 103 | MenuItem aboutItem = new MenuItem("About"); | |
| 104 | MenuItem startClientItem = new MenuItem("Start Client"); | |
| 105 | MenuItem manageServiceItem = new MenuItem("Stop Service"); | |
| 106 | MenuItem exitItem = new MenuItem("Exit"); | |
| 107 | ||
| 108 | //Add components to popup menu | |
| 109 | popup.add(startClientItem); | |
| 110 | popup.add(manageServiceItem); | |
| 111 | popup.add(aboutItem); | |
| 112 |
1
1. run : removed call to java/awt/PopupMenu::addSeparator → NO_COVERAGE |
popup.addSeparator(); |
| 113 | popup.add(exitItem); | |
| 114 | ||
| 115 |
1
1. run : removed call to java/awt/TrayIcon::setPopupMenu → NO_COVERAGE |
trayIcon.setPopupMenu(popup); |
| 116 | ||
| 117 | try { | |
| 118 |
1
1. run : removed call to java/awt/SystemTray::add → NO_COVERAGE |
SystemTray.getSystemTray().add(trayIcon); |
| 119 | } catch (AWTException e) { | |
| 120 | LOGGER.debug("TrayIcon could not be added.", e); | |
| 121 | LOGGER.error("TrayIcon could not be added."); | |
| 122 | return; | |
| 123 | } | |
| 124 | ||
| 125 |
2
1. lambda$run$0 : removed call to org/maxur/perfmodel/backend/service/impl/TrayIconApplication::openBrowser → NO_COVERAGE 2. run : removed call to java/awt/TrayIcon::addActionListener → NO_COVERAGE |
trayIcon.addActionListener(e -> openBrowser()); |
| 126 | ||
| 127 |
2
1. lambda$run$1 : removed call to org/maxur/perfmodel/backend/service/impl/TrayIconApplication::openBrowser → NO_COVERAGE 2. run : removed call to java/awt/MenuItem::addActionListener → NO_COVERAGE |
startClientItem.addActionListener(e -> openBrowser()); |
| 128 | ||
| 129 |
1
1. run : removed call to java/awt/MenuItem::addActionListener → NO_COVERAGE |
manageServiceItem.addActionListener(e -> { |
| 130 |
1
1. lambda$run$2 : negated conditional → NO_COVERAGE |
if (webServer().isStarted()) { |
| 131 |
1
1. lambda$run$2 : removed call to org/maxur/perfmodel/backend/service/WebServer::stop → NO_COVERAGE |
webServer().stop(); |
| 132 | } else { | |
| 133 |
1
1. lambda$run$2 : removed call to org/maxur/perfmodel/backend/service/WebServer::restart → NO_COVERAGE |
webServer().restart(); |
| 134 | } | |
| 135 |
1
1. lambda$run$2 : negated conditional → NO_COVERAGE |
final String label = webServer().isStarted() ? "Stop Service" : "Start Service"; |
| 136 |
1
1. lambda$run$2 : removed call to java/awt/MenuItem::setLabel → NO_COVERAGE |
manageServiceItem.setLabel(label); |
| 137 |
1
1. lambda$run$2 : negated conditional → NO_COVERAGE |
final String message = webServer().isStarted() ? "Web Service was started" : "Web Service was stopped"; |
| 138 |
1
1. lambda$run$2 : removed call to java/awt/TrayIcon::displayMessage → NO_COVERAGE |
trayIcon.displayMessage("Performance Model Calculator", |
| 139 | message, | |
| 140 | TrayIcon.MessageType.INFO); | |
| 141 |
1
1. lambda$run$2 : removed call to java/awt/MenuItem::setEnabled → NO_COVERAGE |
startClientItem.setEnabled(webServer().isStarted()); |
| 142 | }); | |
| 143 | ||
| 144 |
2
1. lambda$run$3 : removed call to javax/swing/JOptionPane::showMessageDialog → NO_COVERAGE 2. run : removed call to java/awt/MenuItem::addActionListener → NO_COVERAGE |
aboutItem.addActionListener(e -> JOptionPane.showMessageDialog(null, |
| 145 | "Performance Model Calculator. Version: " + this.getClass().getPackage().getImplementationVersion())); | |
| 146 | ||
| 147 | ||
| 148 |
1
1. run : removed call to java/awt/MenuItem::addActionListener → NO_COVERAGE |
exitItem.addActionListener(e -> { |
| 149 |
1
1. lambda$run$4 : removed call to org/maxur/perfmodel/backend/service/impl/TrayIconApplication::stop → NO_COVERAGE |
stop(); |
| 150 | }); | |
| 151 | } | |
| 152 | ||
| 153 | @Override | |
| 154 | protected void onStop() { | |
| 155 |
1
1. onStop : removed call to java/awt/SystemTray::remove → NO_COVERAGE |
SystemTray.getSystemTray().remove(trayIcon); |
| 156 | } | |
| 157 | ||
| 158 | private static Image createImageFrom() { | |
| 159 | BufferedImage bufferedImage = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB); | |
| 160 | Graphics graphics = bufferedImage.getGraphics(); | |
| 161 |
1
1. createImageFrom : removed call to java/awt/Graphics::setColor → NO_COVERAGE |
graphics.setColor(Color.RED); |
| 162 |
1
1. createImageFrom : removed call to java/awt/Graphics::fillRect → NO_COVERAGE |
graphics.fillRect(0, 0, 100, 100); |
| 163 |
1
1. createImageFrom : mutated return of Object value for org/maxur/perfmodel/backend/service/impl/TrayIconApplication::createImageFrom to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE |
return bufferedImage; |
| 164 | } | |
| 165 | ||
| 166 | //Obtain the image URL | |
| 167 | private static Optional<Image> createImage(String path, String description) { | |
| 168 | final URL imageURL = TrayIconApplication.class.getResource(path); | |
| 169 |
2
1. createImage : negated conditional → NO_COVERAGE 2. createImage : mutated return of Object value for org/maxur/perfmodel/backend/service/impl/TrayIconApplication::createImage to ( if (x != null) null else throw new RuntimeException ) → NO_COVERAGE |
return imageURL == null ? empty() : Optional.of((new ImageIcon(imageURL, description)).getImage()); |
| 170 | } | |
| 171 | ||
| 172 | private void openBrowser() { | |
| 173 | URI uri = URI.create(webappUrl); | |
| 174 |
1
1. openBrowser : negated conditional → NO_COVERAGE |
Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null; |
| 175 |
2
1. openBrowser : negated conditional → NO_COVERAGE 2. openBrowser : negated conditional → NO_COVERAGE |
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) { |
| 176 | try { | |
| 177 |
1
1. openBrowser : removed call to java/awt/Desktop::browse → NO_COVERAGE |
desktop.browse(uri); |
| 178 | } catch (IOException e) { | |
| 179 | LOGGER.error("Cannot open browser", e); | |
| 180 | } | |
| 181 | } | |
| 182 | } | |
| 183 | ||
| 184 | ||
| 185 | } | |
| 186 | ||
| 187 | ||
Mutations | ||
| 66 |
1.1 |
|
| 72 |
1.1 |
|
| 75 |
1.1 |
|
| 86 |
1.1 |
|
| 93 |
1.1 |
|
| 100 |
1.1 |
|
| 101 |
1.1 |
|
| 112 |
1.1 |
|
| 115 |
1.1 |
|
| 118 |
1.1 |
|
| 125 |
1.1 2.2 |
|
| 127 |
1.1 2.2 |
|
| 129 |
1.1 |
|
| 130 |
1.1 |
|
| 131 |
1.1 |
|
| 133 |
1.1 |
|
| 135 |
1.1 |
|
| 136 |
1.1 |
|
| 137 |
1.1 |
|
| 138 |
1.1 |
|
| 141 |
1.1 |
|
| 144 |
1.1 2.2 |
|
| 148 |
1.1 |
|
| 149 |
1.1 |
|
| 155 |
1.1 |
|
| 161 |
1.1 |
|
| 162 |
1.1 |
|
| 163 |
1.1 |
|
| 169 |
1.1 2.2 |
|
| 174 |
1.1 |
|
| 175 |
1.1 2.2 |
|
| 177 |
1.1 |