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

org.apache.sling.api.adapter.SlingAdaptable Maven / Gradle / Ivy

Go to download

The Apache Sling API defines an extension to the Servlet API 2.4 to provide access to content and unified access to request parameters hiding the differences between the different methods of transferring parameters from client to server. Note that the Apache Sling API bundle does not include the Servlet API but instead requires the API to be provided by the Servlet container in which the Apache Sling framework is running or by another bundle.

There is a newer version: 2.9.0
Show newest version
/*
 * 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.sling.api.adapter;

import java.util.HashMap;
import java.util.Map;

/**
 * The SlingAdaptable class is an (abstract) default implementation
 * of the Adaptable interface. It just uses the default
 * {@link AdapterManager} implemented to adapt itself to the requested type.
 * 

* Extensions of this class may overwrite the {@link #adaptTo(Class)} method * using their own knowledge of adapters and should call this base class * implementation to fall back for other types. * * @since 2.2 (Sling API Bundle 2.2.0) */ public abstract class SlingAdaptable implements Adaptable { /** The adapter manager used for adapting the synthetic resource. */ private static volatile AdapterManager ADAPTER_MANAGER; /** * Sets the global {@link AdapterManager} to be used by this class. *

* This method is intended to only be called by the {@link AdapterManager} * wanting to register itself for use. Currently only a single adapter * manager is supported by this class. * * @param adapterMgr The {@link AdapterManager} to be globally used. */ public static void setAdapterManager(final AdapterManager adapterMgr) { ADAPTER_MANAGER = adapterMgr; } /** * Unsets the global {@link AdapterManager}. *

* This method is intended to only be called by the {@link AdapterManager} * wanting to unregister itself. Currently only a single adapter manager is * supported by this class. * * @param adapterMgr The {@link AdapterManager} to be unset. If this is not * the same as currently registered this method has no effect. */ public static void unsetAdapterManager(final AdapterManager adapterMgr) { if (ADAPTER_MANAGER == adapterMgr) { ADAPTER_MANAGER = null; } } /** * Cached adapters per type. *

* This map is created on demand by the {@link #adaptTo(Class)} method as a * regular HashMap. This means, that extensions of this class * are intended to be short-lived to not hold on to objects and classes for * too long. */ private Map, Object> adaptersCache; /** * Calls into the registered {@link AdapterManager} to adapt this object to * the desired type. *

* This method implements a cache of adapters to improve performance. That * is repeated calls to this method with the same class will result in the * same object to be returned. * * @param The generic type to which this resource is adapted * to * @param type The Class object of the target type, such as * javax.jcr.Node.class or * java.io.File.class * @return The adapter target or null if the resource cannot * adapt to the requested type */ @SuppressWarnings("unchecked") public AdapterType adaptTo(Class type) { AdapterType result = null; synchronized ( this ) { if ( adaptersCache != null ) { result = (AdapterType) adaptersCache.get(type); } if ( result == null ) { final AdapterManager mgr = ADAPTER_MANAGER; result = (mgr == null ? null : mgr.getAdapter(this, type)); if ( result != null ) { if ( adaptersCache == null ) { adaptersCache = new HashMap, Object>(); } adaptersCache.put(type, result); } } } return result; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy