blob: 1d7da7238e49b883a235c6c7e2fc811b35c35470 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena;
import java.util.* ;
import java.security.AccessController;
import java.security.PrivilegedAction;
import org.apache.jena.util.Metadata ;
/** Methods and constants that define features of the current the environment.
* Primarily for other parts of the Jena framework.
*/
public class JenaRuntime
{
/**
* <p>
* The global <tt>isRDF11</tt> exists only to support development in Jena2.
* It is not expected that this flag will be "true" for Jena2 releases.
* </p>
* <p>
* Jena2 provides RDF 1.0 (AKA RDF 2004) and as much of RDF 1.1 that can be provided without
* invalidating existing data and applciations. For example, the Turtle family parsers
* cover the RDF 1.1 defined grammars.
* </p>
* <p>
* RDF 1.1 does make some changes that will effect some applications. The RDF Working Group
* do not expect these to be that major but they are visible in some situations.
* </p>
* <p>
* One of these changes is that literals always have a datatype. RDF 1.0 plain literals
* (e.g. <tt>"foo"</tt> and <tt>"foo"@en</tt>) do not have datatype.
* </p>
* <p>
* In RDF 1.1:
* <ul>
* <li>string literals without language tag have datatype <tt>xsd:string</tt></li>
* <li>string literals with language tag have datatype <tt>rdf:langString</tt>.
* They still have a language tag.</li>
* </ul>
* <p>
* In RDF 1.0, <tt>"foo"</tt> and <tt>"foo"^^xsd:string</tt> are different RDF terms.
* Triples <tt>:s :p "foo"</tt> and <tt>:s :p "foo"^^xsd:string</tt> are two different RDF triples.
* Jena memory models provide "same value" semantics, so these can both be found looking for
* object of <tt>"foo"</tt> but two such triples are found.
* </p>
* <p>
* Other storage implementations do not provide these "same value" semantics.
* Two triples are stored in a graph or in a database.
* </p>
* <p>
* In RDF 1.1, <tt>"foo"</tt> and <tt>"foo"^^xsd:string</tt> are the same RDF term; it is just
* two different ways to write it. The example triples above are the same triple.
* Only one triple would be stored in a graph or on disk.
* </p>
* <p>
* It is common for applications to work either with RDF 1.0 untyped strings or with typed
* <tt>xsd:strings</tt>. Mixed working is less common. Mixed working applications will be
* affected by the changes in RDF 1.1.
* </p>
* <p>
* Default full RDF 1.1 behaviour is expected in Jena3, with the change of major version
* number used to indicate the application-visible change.
* </p>
*/
public static boolean isRDF11 = true ;
// --------------------------------------------------------------
private static String metadataLocation = "org/apache/jena/jena-properties.xml" ;
private static Metadata metadata = new Metadata(metadataLocation) ;
public static String getMetadata(String key, String defaultValue) { return metadata.get(key, defaultValue) ; }
/** The JVM does not implement java.security (correctly) */
public static final String featureNoSecurity = "http://jena.hpl.hp.com/2004/07/feature/noSecurity" ;
/** The JVM does not implement java.nio.charset.Charset operations (correctly) */
public static final String featureNoCharset = "http://jena.hpl.hp.com/2004/07/feature/noCharset" ;
static Map<String, String> features = new HashMap<>() ;
static {
// Note getSystemProperty uses featureNoSecurity but works if it
// has not been initialized
if ( getSystemProperty(featureNoSecurity) != null )
setFeature(featureNoSecurity) ;
if ( getSystemProperty(featureNoCharset) != null )
setFeature(featureNoCharset) ;
}
public static void setFeature(String featureName) { features.put(featureName, "true") ; }
public static boolean runUnder(String featureName) { return features.containsKey(featureName) ; }
public static boolean runNotUnder(String featureName) { return ! features.containsKey(featureName) ; }
static final String lineSeparator = getSystemProperty("line.separator", "\n") ;
public static String getLineSeparator()
{
return lineSeparator ;
}
public static String getSystemProperty(String propName)
{
return getSystemProperty(propName, null) ;
}
public static String getSystemProperty(final String propName, String defaultValue)
{
try {
return System.getProperty(propName, defaultValue) ;
} catch (SecurityException ex)
{
if ( runUnder(featureNoSecurity))
return defaultValue ;
try {
PrivilegedAction<String> a = new PrivilegedAction<String>() {
@Override
public String run() {
return System.getProperty(propName);
}
} ;
return AccessController.doPrivileged(a) ;
} catch (Exception ex2)
{
// Give up
return defaultValue ;
}
}
}
}