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    }