View Javadoc

1   /*
2    * Copyright (c) 2007, James Leigh All rights reserved.
3    * 
4    * Redistribution and use in source and binary forms, with or without
5    * modification, are permitted provided that the following conditions are met:
6    * 
7    * - Redistributions of source code must retain the above copyright notice, this
8    *   list of conditions and the following disclaimer.
9    * - Redistributions in binary form must reproduce the above copyright notice,
10   *   this list of conditions and the following disclaimer in the documentation
11   *   and/or other materials provided with the distribution. 
12   * - Neither the name of the openrdf.org nor the names of its contributors may
13   *   be used to endorse or promote products derived from this software without
14   *   specific prior written permission.
15   * 
16   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17   * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19   * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20   * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21   * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22   * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23   * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24   * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26   * POSSIBILITY OF SUCH DAMAGE.
27   * 
28   */
29  package org.openrdf.elmo.rolemapper;
30  
31  import java.net.URL;
32  import java.util.Collection;
33  import java.util.Map;
34  import java.util.concurrent.ConcurrentHashMap;
35  
36  import org.slf4j.Logger;
37  import org.slf4j.LoggerFactory;
38  
39  /**
40   * Tracks recorded roles and maps them to their subject type.
41   * 
42   * @author James Leigh
43   * 
44   */
45  public class TypeMapper<URI> {
46  
47  	private final Logger logger = LoggerFactory.getLogger(TypeMapper.class);
48  
49  	private Map<Class<?>, URI> types;
50  
51  	public TypeMapper() {
52  		types = new ConcurrentHashMap<Class<?>, URI>(256);
53  	}
54  
55  	public Collection<URI> findTypes(Class<?> javaClass,
56  			Collection<URI> rdfTypes) {
57  		URI type = types.get(javaClass);
58  		if (type != null) {
59  			rdfTypes.add(type);
60  			return rdfTypes;
61  		}
62  		Class<?> superclass = javaClass.getSuperclass();
63  		if (superclass != null)
64  			findTypes(superclass, rdfTypes);
65  		Class<?>[] interfaces = javaClass.getInterfaces();
66  		for (int i = 0, n = interfaces.length; i < n; i++) {
67  			findTypes(interfaces[i], rdfTypes);
68  		}
69  		return rdfTypes;
70  	}
71  
72  	/**
73  	 * Finds the rdf:Class<?> for this Java Class<?>.
74  	 * 
75  	 * @param javaClass
76  	 * @return URI of the rdf:Class<?> for this Java Class<?> or null.
77  	 */
78  	public URI findType(Class<?> role) {
79  		return types.get(role);
80  	}
81  
82  	public synchronized void recordRole(Class<?> role, URI rdfType) {
83  		assert rdfType != null;
84  		if (!types.containsKey(role)) {
85  			types.put(role, rdfType);
86  			if (logger.isDebugEnabled()) {
87  				String sn = role.getSimpleName();
88  				String cn = role.getName().replace('.', '/') + ".class";
89  				ClassLoader cl = role.getClassLoader();
90  				if (cl == null)
91  					cl = Thread.currentThread().getContextClassLoader();
92  				URL location = cl.getResource(cn);
93  				logger.debug("Role {} loaded from {}", sn, location);
94  			}
95  		}
96  	}
97  }