package org.mutabilitydetector.checkers.info; /* * #%L * MutabilityDetector * %% * Copyright (C) 2008 - 2014 Graham Allan * %% * Licensed 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. * #L% */ import java.util.HashMap; import java.util.Map; public final class AnalysisDatabase { public static final class InfoKey<C> { private final Class<C> clazz; private InfoKey(Class<C> clazz) { this.clazz = clazz; } Class<C> classForInfo() { return clazz; } } public static final InfoKey<PrivateMethodInvocationInformation> PRIVATE_METHOD_INVOCATION = new InfoKey<PrivateMethodInvocationInformation>(PrivateMethodInvocationInformation.class); public static final InfoKey<TypeStructureInformation> TYPE_STRUCTURE = new InfoKey<TypeStructureInformation>(TypeStructureInformation.class); @SuppressWarnings("rawtypes") private final Map infoMap = new HashMap(); private final InformationRetrievalRunner sessionCheckerRunner; private AnalysisDatabase(InformationRetrievalRunner sessionCheckerRunner) { this.sessionCheckerRunner = sessionCheckerRunner; } public static AnalysisDatabase newAnalysisDatabase(InformationRetrievalRunner sessionCheckerRunner) { return new AnalysisDatabase(sessionCheckerRunner); } @SuppressWarnings("unchecked") public <I extends AnalysisInformation> I requestInformation(InfoKey<I> infoCategory) { return (infoMap.containsKey(infoCategory)) ? (I) infoMap.get(infoCategory) : createInfoForCategory(infoCategory); } private <I> InfoKeyException newException(InfoKey<I> infoCategory) { return new InfoKeyException("Programming error in instantiating information class for " + infoCategory.classForInfo().getName()); } @SuppressWarnings("unchecked") private <I extends AnalysisInformation> I createInfoForCategory(InfoKey<I> infoCategory) { I info = null; if (infoCategory == PRIVATE_METHOD_INVOCATION) { info = (I) new PrivateMethodInvocationInformation(sessionCheckerRunner); } else if (infoCategory == TYPE_STRUCTURE) { info = (I) new TypeStructureInformation(sessionCheckerRunner); } if (info == null) { throw newException(infoCategory); } infoMap.put(infoCategory, info); return info; } }