# DefaultResourceCache.java

    /*
     * 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.pdfbox.pdmodel;

    import java.io.IOException;
    import java.lang.ref.SoftReference;
    import java.util.HashMap;
    import java.util.Map;
    import org.apache.pdfbox.cos.COSObject;
    import org.apache.pdfbox.pdmodel.documentinterchange.markedcontent.PDPropertyList;
    import org.apache.pdfbox.pdmodel.font.PDFont;
    import org.apache.pdfbox.pdmodel.graphics.PDXObject;
    import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
    import org.apache.pdfbox.pdmodel.graphics.pattern.PDAbstractPattern;
    import org.apache.pdfbox.pdmodel.graphics.shading.PDShading;
    import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;

    /**
     * A resource cached based on SoftReference, retains resources until memory pressure causes them
     * to be garbage collected.
     *
     * @author John Hewson
     */
    public class DefaultResourceCache implements ResourceCache
    {
        private final Map<COSObject, SoftReference<PDFont>> fonts =
                new HashMap<>();

        private final Map<COSObject, SoftReference<PDColorSpace>> colorSpaces =
                new HashMap<>();

        private final Map<COSObject, SoftReference<PDXObject>> xobjects =
                new HashMap<>();

        private final Map<COSObject, SoftReference<PDExtendedGraphicsState>> extGStates =
                new HashMap<>();

        private final Map<COSObject, SoftReference<PDShading>> shadings =
                new HashMap<>();

        private final Map<COSObject, SoftReference<PDAbstractPattern>> patterns =
                new HashMap<>();

        private final Map<COSObject, SoftReference<PDPropertyList>> properties =
                new HashMap<>();

        @Override
        public PDFont getFont(COSObject indirect) throws IOException
        {
            SoftReference<PDFont> font = fonts.get(indirect);
            if (font != null)
            {
                return font.get();
            }
            return null;
        }

        @Override
        public void put(COSObject indirect, PDFont font) throws IOException
        {
            fonts.put(indirect, new SoftReference<>(font));
        }

        @Override
        public PDColorSpace getColorSpace(COSObject indirect) throws IOException
        {
            SoftReference<PDColorSpace> colorSpace = colorSpaces.get(indirect);
            if (colorSpace != null)
            {
                return colorSpace.get();
            }
            return null;
        }

        @Override
        public void put(COSObject indirect, PDColorSpace colorSpace) throws IOException
        {
            colorSpaces.put(indirect, new SoftReference<>(colorSpace));
        }

        @Override
        public PDExtendedGraphicsState getExtGState(COSObject indirect)
        {
            SoftReference<PDExtendedGraphicsState> extGState = extGStates.get(indirect);
            if (extGState != null)
            {
                return extGState.get();
            }
            return null;
        }

        @Override
        public void put(COSObject indirect, PDExtendedGraphicsState extGState)
        {
            extGStates.put(indirect, new SoftReference<>(extGState));
        }

        @Override
        public PDShading getShading(COSObject indirect) throws IOException
        {
            SoftReference<PDShading> shading = shadings.get(indirect);
            if (shading != null)
            {
                return shading.get();
            }
            return null;
        }

        @Override
        public void put(COSObject indirect, PDShading shading) throws IOException
        {
            shadings.put(indirect, new SoftReference<>(shading));
        }

        @Override
        public PDAbstractPattern getPattern(COSObject indirect) throws IOException
        {
            SoftReference<PDAbstractPattern> pattern = patterns.get(indirect);
            if (pattern != null)
            {
                return pattern.get();
            }
            return null;
        }

        @Override
        public void put(COSObject indirect, PDAbstractPattern pattern) throws IOException
        {
            patterns.put(indirect, new SoftReference<>(pattern));
        }

        @Override
        public PDPropertyList getProperties(COSObject indirect)
        {
            SoftReference<PDPropertyList> propertyList = properties.get(indirect);
            if (propertyList != null)
            {
                return propertyList.get();
            }
            return null;
        }

        @Override
        public void put(COSObject indirect, PDPropertyList propertyList)
        {
            properties.put(indirect, new SoftReference<>(propertyList));
        }

        @Override
        public PDXObject getXObject(COSObject indirect) throws IOException
        {
            SoftReference<PDXObject> xobject = xobjects.get(indirect);
            if (xobject != null)
            {
                return xobject.get();
            }
            return null;
        }

        @Override
        public void put(COSObject indirect, PDXObject xobject) throws IOException
        {
            xobjects.put(indirect, new SoftReference<>(xobject));
        }
    }