001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the "License");
007 * you may not use this file except in compliance with the License.
008 * You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018 /*
019 * $Id: FuncSystemProperty.java 1225414 2011-12-29 02:38:30Z mrglavas $
020 */
021 package org.apache.xpath.functions;
022
023 import java.io.BufferedInputStream;
024 import java.io.InputStream;
025 import java.util.Properties;
026
027 import org.apache.xpath.XPathContext;
028 import org.apache.xpath.objects.XObject;
029 import org.apache.xpath.objects.XString;
030 import org.apache.xpath.res.XPATHErrorResources;
031
032 /**
033 * Execute the SystemProperty() function.
034 * @xsl.usage advanced
035 */
036 public class FuncSystemProperty extends FunctionOneArg
037 {
038 static final long serialVersionUID = 3694874980992204867L;
039 /**
040 * The path/filename of the property file: XSLTInfo.properties
041 * Maintenance note: see also
042 * org.apache.xalan.processor.TransformerFactoryImpl.XSLT_PROPERTIES
043 */
044 static final String XSLT_PROPERTIES =
045 "org/apache/xalan/res/XSLTInfo.properties";
046
047 /**
048 * Execute the function. The function must return
049 * a valid object.
050 * @param xctxt The current execution context.
051 * @return A valid XObject.
052 *
053 * @throws javax.xml.transform.TransformerException
054 */
055 public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
056 {
057
058 String fullName = m_arg0.execute(xctxt).str();
059 int indexOfNSSep = fullName.indexOf(':');
060 String result;
061 String propName = "";
062
063 // List of properties where the name of the
064 // property argument is to be looked for.
065 Properties xsltInfo = new Properties();
066
067 loadPropertyFile(XSLT_PROPERTIES, xsltInfo);
068
069 if (indexOfNSSep > 0)
070 {
071 String prefix = (indexOfNSSep >= 0)
072 ? fullName.substring(0, indexOfNSSep) : "";
073 String namespace;
074
075 namespace = xctxt.getNamespaceContext().getNamespaceForPrefix(prefix);
076 propName = (indexOfNSSep < 0)
077 ? fullName : fullName.substring(indexOfNSSep + 1);
078
079 if (namespace.startsWith("http://www.w3.org/XSL/Transform")
080 || namespace.equals("http://www.w3.org/1999/XSL/Transform"))
081 {
082 result = xsltInfo.getProperty(propName);
083
084 if (null == result)
085 {
086 warn(xctxt, XPATHErrorResources.WG_PROPERTY_NOT_SUPPORTED,
087 new Object[]{ fullName }); //"XSL Property not supported: "+fullName);
088
089 return XString.EMPTYSTRING;
090 }
091 }
092 else
093 {
094 warn(xctxt, XPATHErrorResources.WG_DONT_DO_ANYTHING_WITH_NS,
095 new Object[]{ namespace,
096 fullName }); //"Don't currently do anything with namespace "+namespace+" in property: "+fullName);
097
098 try
099 {
100 result = System.getProperty(propName);
101
102 if (null == result)
103 {
104
105 // result = System.getenv(propName);
106 return XString.EMPTYSTRING;
107 }
108 }
109 catch (SecurityException se)
110 {
111 warn(xctxt, XPATHErrorResources.WG_SECURITY_EXCEPTION,
112 new Object[]{ fullName }); //"SecurityException when trying to access XSL system property: "+fullName);
113
114 return XString.EMPTYSTRING;
115 }
116 }
117 }
118 else
119 {
120 try
121 {
122 result = System.getProperty(fullName);
123
124 if (null == result)
125 {
126
127 // result = System.getenv(fullName);
128 return XString.EMPTYSTRING;
129 }
130 }
131 catch (SecurityException se)
132 {
133 warn(xctxt, XPATHErrorResources.WG_SECURITY_EXCEPTION,
134 new Object[]{ fullName }); //"SecurityException when trying to access XSL system property: "+fullName);
135
136 return XString.EMPTYSTRING;
137 }
138 }
139
140 if (propName.equals("version") && result.length() > 0)
141 {
142 try
143 {
144 // Needs to return the version number of the spec we conform to.
145 return new XString("1.0");
146 }
147 catch (Exception ex)
148 {
149 return new XString(result);
150 }
151 }
152 else
153 return new XString(result);
154 }
155
156 /**
157 * Retrieve a propery bundle from a specified file
158 *
159 * @param file The string name of the property file. The name
160 * should already be fully qualified as path/filename
161 * @param target The target property bag the file will be placed into.
162 */
163 public void loadPropertyFile(String file, Properties target)
164 {
165 try
166 {
167 // Use SecuritySupport class to provide privileged access to property file
168 InputStream is = SecuritySupport.getResourceAsStream(ObjectFactory.findClassLoader(),
169 file);
170
171 // get a buffered version
172 BufferedInputStream bis = new BufferedInputStream(is);
173
174 target.load(bis); // and load up the property bag from this
175 bis.close(); // close out after reading
176 }
177 catch (Exception ex)
178 {
179 // ex.printStackTrace();
180 throw new org.apache.xml.utils.WrappedRuntimeException(ex);
181 }
182 }
183 }