JMadModelDefinitionManagerImpl.java

// @formatter:off
 /*******************************************************************************
 *
 * This file is part of JMad.
 * 
 * Copyright (c) 2008-2011, CERN. All rights reserved.
 *
 * 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.
 * 
 ******************************************************************************/
// @formatter:on

/**
 * 
 */
package cern.accsoft.steering.jmad.modeldefs;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;

import cern.accsoft.steering.jmad.modeldefs.domain.JMadModelDefinition;
import cern.accsoft.steering.jmad.modeldefs.io.ModelFileFinder;
import cern.accsoft.steering.jmad.modeldefs.io.impl.ModelFileFinderImpl;

/**
 * This is the default implementation of a class that knows about the available Model definitions. It uses certain
 * finders to search for model definitions and stores them internally for further retrieval.
 * 
 * @author Kajetan Fuchsberger (kajetan.fuchsberger at cern.ch)
 */
public abstract class JMadModelDefinitionManagerImpl implements JMadModelDefinitionManager {

    /**
     * A list of all available model definitions. This is set to null on purpose. So it is loaded the first time we need
     * it.
     */
    private List<JMadModelDefinition> modelDefinitions = null;

    /**
     * this list will be walked through and every finder is used to search for modelDefinitions.
     */
    private List<ModelDefinitionFinder> finders = new ArrayList<ModelDefinitionFinder>();

    /** The hashmap for the fileFinders */
    private final Map<JMadModelDefinition, ModelFileFinder> modelFileFinders = new WeakHashMap<JMadModelDefinition, ModelFileFinder>();

    private List<JMadModelDefinition> findAllModelDefinitions() {
        List<JMadModelDefinition> modelDefs = new ArrayList<JMadModelDefinition>();
        for (ModelDefinitionFinder finder : this.getFinders()) {
            modelDefs.addAll(finder.findAllModelDefinitions());
        }
        return modelDefs;
    }

    @Override
    public List<JMadModelDefinition> getAllModelDefinitions() {
        /*
         * lazy loading of the model definitions
         */
        if (this.modelDefinitions == null) {
            this.modelDefinitions = findAllModelDefinitions();
        }
        return this.modelDefinitions;
    }

    @Override
    public JMadModelDefinition getModelDefinition(String name, boolean ignoreCase) {
        List<JMadModelDefinition> foundModelDefinitions = getAllModelDefinitions();

        for (JMadModelDefinition modelDefinition : foundModelDefinitions) {
            if (name.equals(modelDefinition.getName())) {
                return modelDefinition;
            }
            if (ignoreCase && (name.equalsIgnoreCase(modelDefinition.getName()))) {
                return modelDefinition;
            }
        }
        return null;

    }

    @Override
    public JMadModelDefinition getModelDefinition(String name) {
        return getModelDefinition(name, false);
    }

    public void setFinders(List<ModelDefinitionFinder> finders) {
        this.finders = finders;
    }

    private List<ModelDefinitionFinder> getFinders() {
        return finders;
    }

    @Override
    public ModelFileFinder getModelFileFinder(JMadModelDefinition modelDefinition) {
        ModelFileFinder fileFinder = this.modelFileFinders.get(modelDefinition);
        if (fileFinder == null) {
            fileFinder = createModelFileFinder(modelDefinition);
            this.modelFileFinders.put(modelDefinition, fileFinder);
        }
        return fileFinder;
    }

    /**
     * creates a new modelFileFinder for a model definition
     * 
     * @param modelDefinition the model definition for which to create a {@link ModelFileFinder}
     * @return the fully configured {@link ModelFileFinder}
     */
    private ModelFileFinder createModelFileFinder(JMadModelDefinition modelDefinition) {
        ModelFileFinderImpl fileFinder = createModelFileFinder();
        fileFinder.setModelFilePathOffsets(modelDefinition.getModelPathOffsets());
        fileFinder.setSourceInformation(modelDefinition.getSourceInformation());
        return fileFinder;
    }

    /**
     * lookup method injected by spring
     * 
     * @return a fully configured ModelFileFinder
     */
    protected abstract ModelFileFinderImpl createModelFileFinder();

}