/* * 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)); } }