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    
028    import java.util.Date;
029    import java.util.Map;
030    import java.util.Properties;
031    
032    /**
033     * Proxy over {@link java.lang.System}. It aims to improve testability of classes
034     * that interact with low-level system methods, for example :
035     * <p/>
036     * <pre>
037     * public class MyClass {
038     *   private final System2 system;
039     *
040     *   public MyClass(System2 s) {
041     *     this.system = s;
042     *   }
043     *
044     *   public long xxx() {
045     *     return system.now();
046     *   }
047     * }
048     *
049     * {@literal @}Test
050     * public void should_return_xxx() {
051     *   // using Mockito
052     *   System2 system = mock(System2.class);
053     *   long now = 123456789L;
054     *   doReturn(now).when(system).now();
055     *   assertThat(new MyClass(system).xxx()).isEqualTo(now);
056     * }
057     * </pre>
058     * <p/>
059     * Note that the name System2 was chosen to not conflict with {@link java.lang.System}.
060     * <p/>
061     * An instance is available in IoC container since 4.3.
062     *
063     * @since 4.2
064     */
065    public class System2 implements BatchComponent, ServerComponent {
066    
067      public static final System2 INSTANCE = new System2();
068    
069      /**
070       * Shortcut for {@link System#currentTimeMillis()}
071       */
072      public long now() {
073        return System.currentTimeMillis();
074      }
075    
076      /**
077       * Shortcut for {@link System#getProperties()}
078       */
079      public Properties properties() {
080        return System.getProperties();
081      }
082    
083      /**
084       * Shortcut for {@link System#getProperty(String)}
085       */
086      @CheckForNull
087      public String property(String key) {
088        return System.getProperty(key);
089      }
090    
091      /**
092       * Shortcut for {@link System#getenv()}
093       */
094      public Map<String, String> envVariables() {
095        return System.getenv();
096      }
097    
098      /**
099       * Shortcut for {@link System#getenv(String)}
100       */
101      @CheckForNull
102      public String envVariable(String key) {
103        return System.getenv(key);
104      }
105    
106      /**
107       * True if this is MS Windows.
108       */
109      public boolean isOsWindows() {
110        return SystemUtils.IS_OS_WINDOWS;
111      }
112    
113      /**
114       * True if Java 7 or Java 8 runtime environment
115       * @since 4.3
116       */
117      public boolean isJavaAtLeast17() {
118        return SystemUtils.isJavaVersionAtLeast(1.7f);
119      }
120    
121      public void println(String obj) {
122        System.out.print(obj);
123      }
124    
125      public Date newDate() {
126        return new Date();
127      }
128    }