@Override
    public <T> T loadAssetFromStream(AssetKey<T> key, InputStream inputStream) {
        if (key == null) {
            throw new IllegalArgumentException("key cannot be null");
        }

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

        AssetProcessor proc = handler.getProcessor(key.getProcessorType());
        StreamAssetInfo info = new StreamAssetInfo(this, key, inputStream);
        return loadLocatedAsset(key, info, proc, null);
    }
Clones the asset using the given processor and registers the clone
with the cache.

@param <T> The asset type
@param key The asset key
@param obj The asset to clone / register, must implement
    {@link CloneableSmartAsset}.
@param proc The processor which will generate the clone, cannot be null
@param cache The cache to register the clone with, cannot be null.
@return The cloned asset, cannot be the same as the given asset since
    it is a clone.

@throws IllegalStateException If asset does not implement
{@link CloneableSmartAsset}, if the cache is null, or if the
processor did not clone the asset.
jme3-core/src/main/java/com/jme3/asset/DesktopAssetManager.java