001 /*
002 * SonarQube, open source software quality management tool.
003 * Copyright (C) 2008-2014 SonarSource
004 * mailto:contact AT sonarsource DOT com
005 *
006 * SonarQube is free software; you can redistribute it and/or
007 * modify it under the terms of the GNU Lesser General Public
008 * License as published by the Free Software Foundation; either
009 * version 3 of the License, or (at your option) any later version.
010 *
011 * SonarQube is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * Lesser General Public License for more details.
015 *
016 * You should have received a copy of the GNU Lesser General Public License
017 * along with this program; if not, write to the Free Software Foundation,
018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
019 */
020 package org.sonar.api.utils;
021
022 import org.apache.commons.lang.SystemUtils;
023 import org.sonar.api.BatchComponent;
024 import org.sonar.api.ServerComponent;
025
026 import javax.annotation.CheckForNull;
027 import java.util.Map;
028 import java.util.Properties;
029
030 /**
031 * Proxy over {@link java.lang.System}. It aims to improve testability of classes
032 * that interact with low-level system methods, for example :
033 * <p/>
034 * <pre>
035 * public class MyClass {
036 * private final System2 system;
037 *
038 * public MyClass(System2 s) {
039 * this.system = s;
040 * }
041 *
042 * public long xxx() {
043 * return system.now();
044 * }
045 * }
046 *
047 * {@literal @}Test
048 * public void should_return_xxx() {
049 * // using Mockito
050 * System2 system = mock(System2.class);
051 * long now = 123456789L;
052 * doReturn(now).when(system).now();
053 * assertThat(new MyClass(system).xxx()).isEqualTo(now);
054 * }
055 * </pre>
056 * <p/>
057 * Note that the name System2 was chosen to not conflict with {@link java.lang.System}.
058 * <p/>
059 * An instance is available in IoC container since 4.3.
060 *
061 * @since 4.2
062 */
063 public class System2 implements BatchComponent, ServerComponent {
064
065 public static final System2 INSTANCE = new System2();
066
067 /**
068 * Shortcut for {@link System#currentTimeMillis()}
069 */
070 public long now() {
071 return System.currentTimeMillis();
072 }
073
074 /**
075 * Shortcut for {@link System#getProperties()}
076 */
077 public Properties properties() {
078 return System.getProperties();
079 }
080
081 /**
082 * Shortcut for {@link System#getProperty(String)}
083 */
084 @CheckForNull
085 public String property(String key) {
086 return System.getProperty(key);
087 }
088
089 /**
090 * Shortcut for {@link System#getenv()}
091 */
092 public Map<String, String> envVariables() {
093 return System.getenv();
094 }
095
096 /**
097 * Shortcut for {@link System#getenv(String)}
098 */
099 @CheckForNull
100 public String envVariable(String key) {
101 return System.getenv(key);
102 }
103
104 /**
105 * True if this is MS Windows.
106 */
107 public boolean isOsWindows() {
108 return SystemUtils.IS_OS_WINDOWS;
109 }
110
111 /**
112 * True if Java 7 or Java 8 runtime environment
113 * @since 4.3
114 */
115 public boolean isJavaAtLeast17() {
116 return SystemUtils.isJavaVersionAtLeast(1.7f);
117 }
118
119 public void println(String obj) {
120 System.out.print(obj);
121 }
122 }