@SuppressWarnings("unchecked")
    protected <T> T loadLocatedAsset(AssetKey<T> key, AssetInfo info, AssetProcessor proc, AssetCache cache) {
        AssetLoader loader = handler.aquireLoader(key);
        Object obj;
        try {
            handler.establishParentKey(key);
            obj = loader.load(info);
        } catch (IOException ex) {
            throw new AssetLoadException("An exception has occurred while loading asset: " + key, ex);
        } finally {
            handler.releaseParentKey(key);
        }
        if (obj == null) {
            throw new AssetLoadException("Error occurred while loading asset \""
                    + key + "\" using " + loader.getClass().getSimpleName());
        } else {
            if (logger.isLoggable(Level.FINER)) {
                logger.log(Level.FINER, "Loaded {0} with {1}",
                        new Object[]{key, loader.getClass().getSimpleName()});
            }

            if (proc != null) {
                // do processing on asset before caching
                obj = proc.postProcess(key, obj);
            }

            if (cache != null) {
                // At this point, obj should be of type T
                cache.addToCache(key, (T) obj);
            }

            for (AssetEventListener listener : eventListeners) {
                listener.assetLoaded(key);
            }

            return (T) obj;
        }
    }
Loads an asset that has already been located.
@param <T> The asset type
@param key The asset key
@param info The AssetInfo from the locator
@param proc AssetProcessor to use, or null to disable processing
@param cache The cache to store the asset in, or null to disable caching
@return The loaded asset

@throws AssetLoadException If failed to load asset due to exception or
other error.
jme3-core/src/main/java/com/jme3/asset/DesktopAssetManager.java