• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one
3  * or more contributor license agreements. See the NOTICE file
4  * distributed with this work for additional information
5  * regarding copyright ownership. The ASF licenses this file
6  * to you under the Apache License, Version 2.0 (the  "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 /*
19  * $Id: FuncSystemProperty.java 468655 2006-10-28 07:12:06Z minchau $
20  */
21 package org.apache.xpath.functions;
22 
23 import java.io.BufferedInputStream;
24 import java.io.InputStream;
25 import java.util.Properties;
26 
27 import org.apache.xpath.XPathContext;
28 import org.apache.xpath.objects.XNumber;
29 import org.apache.xpath.objects.XObject;
30 import org.apache.xpath.objects.XString;
31 import org.apache.xpath.res.XPATHErrorResources;
32 
33 /**
34  * Execute the SystemProperty() function.
35  * @xsl.usage advanced
36  */
37 public class FuncSystemProperty extends FunctionOneArg
38 {
39     static final long serialVersionUID = 3694874980992204867L;
40   /**
41    * The path/filename of the property file: XSLTInfo.properties
42    * Maintenance note: see also
43    * org.apache.xalan.processor.TransformerFactoryImpl.XSLT_PROPERTIES
44    */
45   static final String XSLT_PROPERTIES =
46             "org/apache/xalan/res/XSLTInfo.properties";
47 
48   /**
49    * Execute the function.  The function must return
50    * a valid object.
51    * @param xctxt The current execution context.
52    * @return A valid XObject.
53    *
54    * @throws javax.xml.transform.TransformerException
55    */
execute(XPathContext xctxt)56   public XObject execute(XPathContext xctxt) throws javax.xml.transform.TransformerException
57   {
58 
59     String fullName = m_arg0.execute(xctxt).str();
60     int indexOfNSSep = fullName.indexOf(':');
61     String result;
62     String propName = "";
63 
64     // List of properties where the name of the
65     // property argument is to be looked for.
66     Properties xsltInfo = new Properties();
67 
68     loadPropertyFile(XSLT_PROPERTIES, xsltInfo);
69 
70     if (indexOfNSSep > 0)
71     {
72       String prefix = (indexOfNSSep >= 0)
73                       ? fullName.substring(0, indexOfNSSep) : "";
74       String namespace;
75 
76       namespace = xctxt.getNamespaceContext().getNamespaceForPrefix(prefix);
77       propName = (indexOfNSSep < 0)
78                  ? fullName : fullName.substring(indexOfNSSep + 1);
79 
80       if (namespace.startsWith("http://www.w3.org/XSL/Transform")
81               || namespace.equals("http://www.w3.org/1999/XSL/Transform"))
82       {
83         result = xsltInfo.getProperty(propName);
84 
85         if (null == result)
86         {
87           warn(xctxt, XPATHErrorResources.WG_PROPERTY_NOT_SUPPORTED,
88                new Object[]{ fullName });  //"XSL Property not supported: "+fullName);
89 
90           return XString.EMPTYSTRING;
91         }
92       }
93       else
94       {
95         warn(xctxt, XPATHErrorResources.WG_DONT_DO_ANYTHING_WITH_NS,
96              new Object[]{ namespace,
97                            fullName });  //"Don't currently do anything with namespace "+namespace+" in property: "+fullName);
98 
99         try
100         {
101           result = System.getProperty(propName);
102 
103           if (null == result)
104           {
105 
106             // result = System.getenv(propName);
107             return XString.EMPTYSTRING;
108           }
109         }
110         catch (SecurityException se)
111         {
112           warn(xctxt, XPATHErrorResources.WG_SECURITY_EXCEPTION,
113                new Object[]{ fullName });  //"SecurityException when trying to access XSL system property: "+fullName);
114 
115           return XString.EMPTYSTRING;
116         }
117       }
118     }
119     else
120     {
121       try
122       {
123         result = System.getProperty(fullName);
124 
125         if (null == result)
126         {
127 
128           // result = System.getenv(fullName);
129           return XString.EMPTYSTRING;
130         }
131       }
132       catch (SecurityException se)
133       {
134         warn(xctxt, XPATHErrorResources.WG_SECURITY_EXCEPTION,
135              new Object[]{ fullName });  //"SecurityException when trying to access XSL system property: "+fullName);
136 
137         return XString.EMPTYSTRING;
138       }
139     }
140 
141     if (propName.equals("version") && result.length() > 0)
142     {
143       try
144       {
145         // Needs to return the version number of the spec we conform to.
146         return new XString("1.0");
147       }
148       catch (Exception ex)
149       {
150         return new XString(result);
151       }
152     }
153     else
154       return new XString(result);
155   }
156 
157   /**
158    * Retrieve a propery bundle from a specified file
159    *
160    * @param file The string name of the property file.  The name
161    * should already be fully qualified as path/filename
162    * @param target The target property bag the file will be placed into.
163    */
loadPropertyFile(String file, Properties target)164   public void loadPropertyFile(String file, Properties target)
165   {
166     try
167     {
168       // Use SecuritySupport class to provide priveleged access to property file
169       SecuritySupport ss = SecuritySupport.getInstance();
170 
171       InputStream is = ss.getResourceAsStream(ObjectFactory.findClassLoader(),
172                                               file);
173 
174       // get a buffered version
175       BufferedInputStream bis = new BufferedInputStream(is);
176 
177       target.load(bis);  // and load up the property bag from this
178       bis.close();  // close out after reading
179     }
180     catch (Exception ex)
181     {
182       // ex.printStackTrace();
183       throw new org.apache.xml.utils.WrappedRuntimeException(ex);
184     }
185   }
186 }
187