1 package org.apache.maven.plugins.javadoc; 2 3 /* 4 * Licensed to the Apache Software Foundation (ASF) under one 5 * or more contributor license agreements. See the NOTICE file 6 * distributed with this work for additional information 7 * regarding copyright ownership. The ASF licenses this file 8 * to you under the Apache License, Version 2.0 (the 9 * "License"); you may not use this file except in compliance 10 * with the License. You may obtain a copy of the License at 11 * 12 * http://www.apache.org/licenses/LICENSE-2.0 13 * 14 * Unless required by applicable law or agreed to in writing, 15 * software distributed under the License is distributed on an 16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17 * KIND, either express or implied. See the License for the 18 * specific language governing permissions and limitations 19 * under the License. 20 */ 21 22 import java.io.File; 23 24 /** 25 * Contains several OS-specific methods from Commons-Lang3's SystemUtils. We don't want to use that class because it 26 * uses enums for Java versions, which implies that with every new Java version a new commons-lang3 is required. 27 * 28 * @author Robert Scholte 29 * @since 3.0.1 30 */ 31 class SystemUtils 32 { 33 /** 34 * <p> 35 * The {@code os.name} System Property. Operating system name. 36 * </p> 37 * <p> 38 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does 39 * not exist. 40 * </p> 41 * <p> 42 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or 43 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of 44 * sync with that System property. 45 * </p> 46 * 47 * @since Java 1.1 48 */ 49 public static final String OS_NAME = getSystemProperty( "os.name" ); 50 51 /** 52 * The prefix String for all Windows OS. 53 */ 54 private static final String OS_NAME_WINDOWS_PREFIX = "Windows"; 55 56 /** 57 * <p> 58 * Is {@code true} if this is AIX. 59 * </p> 60 * <p> 61 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 62 * </p> 63 */ 64 public static final boolean IS_OS_AIX = getOSMatchesName( "AIX" ); 65 66 /** 67 * <p> 68 * Is {@code true} if this is Mac. 69 * </p> 70 * <p> 71 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 72 * </p> 73 */ 74 public static final boolean IS_OS_MAC_OSX = getOSMatchesName( "Mac OS X" ); 75 76 /** 77 * <p> 78 * Is {@code true} if this is Windows. 79 * </p> 80 * <p> 81 * The field will return {@code false} if {@code OS_NAME} is {@code null}. 82 * </p> 83 */ 84 public static final boolean IS_OS_WINDOWS = getOSMatchesName( OS_NAME_WINDOWS_PREFIX ); 85 86 /** 87 * The System property key for the Java home directory. 88 */ 89 private static final String JAVA_HOME_KEY = "java.home"; 90 91 /** 92 * <p> 93 * The {@code line.separator} System Property. Line separator (<code>"\n"</code> on UNIX). 94 * </p> 95 * <p> 96 * Defaults to {@code null} if the runtime does not have security access to read this property or the property does 97 * not exist. 98 * </p> 99 * <p> 100 * This value is initialized when the class is loaded. If {@link System#setProperty(String,String)} or 101 * {@link System#setProperties(java.util.Properties)} is called after this class is loaded, the value will be out of 102 * sync with that System property. 103 * </p> 104 * 105 * @since Java 1.1 106 */ 107 public static final String LINE_SEPARATOR = getSystemProperty( "line.separator" ); 108 109 /** 110 * Decides if the operating system matches. 111 * 112 * @param osNamePrefix the prefix for the os name 113 * @return true if matches, or false if not or can't determine 114 */ 115 private static boolean getOSMatchesName( final String osNamePrefix ) 116 { 117 return isOSNameMatch( OS_NAME, osNamePrefix ); 118 } 119 120 /** 121 * Decides if the operating system matches. 122 * <p> 123 * This method is package private instead of private to support unit test invocation. 124 * </p> 125 * 126 * @param osName the actual OS name 127 * @param osNamePrefix the prefix for the expected OS name 128 * @return true if matches, or false if not or can't determine 129 */ 130 static boolean isOSNameMatch( final String osName, final String osNamePrefix ) 131 { 132 if ( osName == null ) 133 { 134 return false; 135 } 136 return osName.startsWith( osNamePrefix ); 137 } 138 139 /** 140 * <p> 141 * Gets the Java home directory as a {@code File}. 142 * </p> 143 * 144 * @return a directory 145 * @throws SecurityException if a security manager exists and its {@code checkPropertyAccess} method doesn't allow 146 * access to the specified system property. 147 * @see System#getProperty(String) 148 * @since 2.1 149 */ 150 public static File getJavaHome() 151 { 152 return new File( System.getProperty( JAVA_HOME_KEY ) ); 153 } 154 155 /** 156 * <p> 157 * Gets a System property, defaulting to {@code null} if the property cannot be read. 158 * </p> 159 * <p> 160 * If a {@code SecurityException} is caught, the return value is {@code null} and a message is written to 161 * {@code System.err}. 162 * </p> 163 * 164 * @param property the system property name 165 * @return the system property value or {@code null} if a security problem occurs 166 */ 167 private static String getSystemProperty( final String property ) 168 { 169 try 170 { 171 return System.getProperty( property ); 172 } 173 catch ( final SecurityException ex ) 174 { 175 // we are not allowed to look at this property 176 System.err.println( "Caught a SecurityException reading the system property '" + property 177 + "'; the SystemUtils property value will default to null." ); 178 return null; 179 } 180 } 181 }