/* * 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.sparql.util; import java.util.HashMap ; import java.util.Map ; import org.apache.jena.atlas.logging.Log ; import org.apache.jena.sparql.ARQConstants ; import org.apache.jena.sparql.function.library.leviathan.LeviathanConstants ; @SuppressWarnings("deprecation") public class MappedLoader { // Map string => string of prefixes // e.g. http://jena.apache.org/ARQ/property# => // java:com.hp.hpl.jena.sparql.pfunction. static Map<String, String> uriMap = new HashMap<>(); static { // ARQ library uriMap.put(ARQConstants.ARQFunctionLibraryURI, ARQConstants.ARQFunctionLibrary); uriMap.put(ARQConstants.ARQFunctionLibraryURI_Jena2, ARQConstants.ARQFunctionLibrary); uriMap.put(ARQConstants.ARQPropertyFunctionLibraryURI, ARQConstants.ARQPropertyFunctionLibrary); uriMap.put(ARQConstants.ARQPropertyFunctionLibraryURI_Jena2, ARQConstants.ARQPropertyFunctionLibrary); uriMap.put(ARQConstants.ARQProcedureLibraryURI, ARQConstants.ARQProcedureLibrary); // Old name, new name uriMap.put("java:com.hp.hpl.jena.query.function.library.", "java:org.apache.jena.sparql.function.library."); uriMap.put("java:com.hp.hpl.jena.query.pfunction.library.", "java:org.apache.jena.sparql.pfunction.library."); // Leviathan library uriMap.put(LeviathanConstants.LeviathanFunctionLibraryURI, LeviathanConstants.LeviathanFunctionLibrary); } public static boolean isPossibleDynamicURI(String uri, Class<?> expectedClass) { String mappedUri = mapDynamicURI(uri); if (mappedUri == null) return false; // Need to force the load to check everything. // Callers (who are expectedClass sensitive) should have // an "alreadyLoaded" cache return loadClass(uri, expectedClass) != null; } public static String mapDynamicURI(String uri) { // Jena2 -> Jena3 transition if ( uri.startsWith("http://jena.hpl.hp.com/ARQ") ) { String newURI = uri.replace("http://jena.hpl.hp.com/", "http://jena.apache.org/") ; Log.warnOnce(MappedLoader.class, "Loading function or property function with old style 'jena.hpl.hp.com' used - preferred style is to use 'jena.apache.org': "+uri+ " => "+newURI, uri) ; } Map.Entry<String, String> e = find(uri); if (e == null) { if (uri.startsWith(ARQConstants.javaClassURIScheme)) return uri; return null; } String k = e.getKey(); String v = e.getValue(); uri = uri.substring(k.length()); uri = v + uri; return uri; } private static Map.Entry<String, String> find(String uri) { for (Map.Entry<String, String> e : uriMap.entrySet()) { String k = e.getKey(); if (uri.startsWith(k)) { return e; } } return null; } public static Class<?> loadClass(String uri, Class<?> expectedClass) { String mappedUri = mapDynamicURI(uri); if (mappedUri == null) return null; return Loader.loadClass(mappedUri, expectedClass); } }