All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ca.uhn.fhir.context.ProvidedResourceScanner Maven / Gradle / Ivy

There is a newer version: 7.6.1
Show newest version
package ca.uhn.fhir.context;

/*
 * #%L
 * HAPI FHIR - Core Library
 * %%
 * Copyright (C) 2014 - 2016 University Health Network
 * %%
 * Licensed 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.
 * #L%
 */

import org.hl7.fhir.instance.model.api.IBaseResource;

import ca.uhn.fhir.model.api.annotation.ProvidesResources;

/**
 * Scans a class tagged with {@code ProvidesResources} and adds any resources listed to its FhirContext's resource
 * definition list. This makes the profile generator find the classes.
 *
 * @see ca.uhn.fhir.model.api.annotation.ProvidesResources
 */
public class ProvidedResourceScanner {
	private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ProvidedResourceScanner.class);
	private FhirContext myContext;

	/**
	 * Constructor
	 * 
	 * @param theContext
	 *           - context whose resource definition list is to be updated by the scanner
	 */
	public ProvidedResourceScanner(FhirContext theContext) {
		myContext = theContext;
	}

	/**
	 * If {@code theProvider} is tagged with the {@code ProvidesResources} annotation, this method will add every
	 * resource listed by the {@code resources} method.
	 * 

* Notes: *

*
    *
  • if {@code theProvider} isn't annotated with {@code resources} nothing is done; it's expected that most * RestfulServers and ResourceProviders won't be annotated.
  • *
  • any object listed in {@code resources} that doesn't implement {@code IResource} will generate a warning in the * log.
  • *
* * @param theProvider * - Normally, either a {@link ca.uhn.fhir.rest.server.RestfulServer} or a * {@link ca.uhn.fhir.rest.server.IResourceProvider} that might be annotated with * {@link ca.uhn.fhir.model.api.annotation.ProvidesResources} */ @SuppressWarnings("unchecked") public void scanForProvidedResources(Object theProvider) { ProvidesResources annotation = theProvider.getClass().getAnnotation(ProvidesResources.class); if (annotation == null) return; for (Class clazz : annotation.resources()) { if (IBaseResource.class.isAssignableFrom(clazz)) { myContext.getResourceDefinition((Class) clazz); } else { ourLog.warn(clazz.getSimpleName() + "is not assignable from IResource"); } } } /** * Remove any metadata that was added by any {@code ProvidesResources} annotation * present in {@code theProvider}. This method is callled from {@code RestfulService} * when it is unregistering a Resource Provider. * * @param theProvider * - Normally a {@link ca.uhn.fhir.rest.server.IResourceProvider} that might * be annotated with {@link ca.uhn.fhir.model.api.annotation.ProvidesResources} */ public void removeProvidedResources(Object theProvider) { ProvidesResources annotation = theProvider.getClass().getAnnotation(ProvidesResources.class); if (annotation == null) return; for (Class clazz : annotation.resources()) { if (IBaseResource.class.isAssignableFrom(clazz)) { // TODO -- not currently used but should be finished for completeness } else { ourLog.warn(clazz.getSimpleName() + "is not assignable from IResource"); } } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy