/*
 
* Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved.
 
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 
*
 
* This code is free software; you can redistribute it and/or modify it
 
* under the terms of the GNU General Public License version 2 only, as
 
* published by the Free Software Foundation.
  
Oracle designates this
 
* particular file as subject to the "Classpath" exception as provided
 
* by Oracle in the LICENSE file that accompanied this code.
 
*
 
* This code is distributed in the hope that it will be useful, but WITHOUT
 
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 
* FITNESS FOR A PARTICULAR PURPOSE.
  
See the GNU General Public License
 
* version 2 for more details (a copy is included in the LICENSE file that
 
* accompanied this code).
 
*
 
* You should have received a copy of the GNU General Public License version
 
* 2 along with this work; if not, write to the Free Software Foundation,
 
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 
*
 
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 
* or visit www.oracle.com if you need additional information or have any
 
* questions.
 
*/

package sun.security.action;

import java.security.AccessController;
import java.security.PrivilegedAction;

/**
 
* A convenience class for retrieving the string value of a system
 
* property as a privileged action.
 
*
 
* <p>An instance of this class can be used as the argument of
 
* <code>AccessController.doPrivileged</code>.
 
*
 
* <p>The following code retrieves the value of the system
 
* property named <code>"prop"</code> as a privileged action: <p>
 
*
 
* <pre>
 
* String s = java.security.AccessController.doPrivileged
 
*
                      
(new GetPropertyAction("prop"));
 
* </pre>
 
*
 
* @author Roland Schemers
 
*
 
*
 
* @since 1.2
 
*/


public class GetPropertyAction implements PrivilegedAction<String> {
    
private String theProp;
    
private String defaultVal;

    
/**
     
* Constructor that takes the name of the system property whose
     
* string value needs to be determined.
     
*
     
* @param theProp the name of the system property.
     
*/

    
public GetPropertyAction(String theProp) {
        
this.theProp = theProp;
    
}

    
/**
     
* Constructor that takes the name of the system property and the default
     
* value of that property.
     
*
     
* @param theProp the name of the system property.
     
* @param defaulVal the default value.
     
*/

    
public GetPropertyAction(String theProp, String defaultVal) {
        
this.theProp = theProp;
        
this.defaultVal = defaultVal;
    
}

    
/**
     
* Determines the string value of the system property whose
     
* name was specified in the constructor.
     
*
     
* @return the string value of the system property,
     
*
         
or the default value if there is no property with that key.
     
*/

    
public String run() {
        
String value = System.getProperty(theProp);
        
return (value == null) ? defaultVal : value;
    
}

    
/**
     
* Convenience method to get a property without going through doPrivileged
     
* if no security manager is present. This is unsafe for inclusion in a
     
* public API but allowable here since this class is by default restricted
     
* by the package.access security property.
     
*
     
* Note that this method performs a privileged action using caller-provided
     
* inputs. The caller of this method should take care to ensure that the
     
* inputs are not tainted and the returned property is not made accessible
     
* to untrusted code if it contains sensitive information.
     
*
     
* @param theProp the name of the system property.
     
*/

    
public static String privilegedGetProperty(String theProp) {
        
if (System.getSecurityManager() == null) {
            
return System.getProperty(theProp);
        
} else {
            
return AccessController.doPrivileged(
                    
new GetPropertyAction(theProp));
        
}
    
}
}