org.lexevs.dao.index.indexregistry.MultiIndexRegistry.java Source code

Java tutorial

Introduction

Here is the source code for org.lexevs.dao.index.indexregistry.MultiIndexRegistry.java

Source

/*
 * Copyright: (c) 2004-2010 Mayo Foundation for Medical Education and 
 * Research (MFMER). All rights reserved. MAYO, MAYO CLINIC, and the
 * triple-shield Mayo logo are trademarks and service marks of MFMER.
 *
 * Except as contained in the copyright notice above, or as used to identify 
 * MFMER as the author of this software, the trade names, trademarks, service
 * marks, or product names of the copyright holder shall not be used in
 * advertising, promotion or otherwise in connection with this software without
 * prior written authorization of the copyright holder.
 * 
 * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/legal/epl-v10.html
 * 
 */
package org.lexevs.dao.index.indexregistry;

import org.LexGrid.LexBIG.DataModel.Core.AbsoluteCodingSchemeVersionReference;
import org.LexGrid.LexBIG.Exceptions.LBParameterException;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.lucene.search.Filter;
import org.lexevs.dao.database.utility.DaoUtility;
import org.lexevs.dao.index.lucenesupport.BaseLuceneIndexTemplate;
import org.lexevs.dao.index.lucenesupport.LuceneDirectoryCreator;
import org.lexevs.dao.index.lucenesupport.LuceneDirectoryFactory.NamedDirectory;
import org.lexevs.dao.index.lucenesupport.LuceneIndexTemplate;
import org.lexevs.dao.index.lucenesupport.MultiBaseLuceneIndexTemplate;
import org.lexevs.dao.indexer.utility.CodingSchemeMetaData;
import org.lexevs.dao.indexer.utility.ConcurrentMetaData;
import org.lexevs.system.constants.SystemVariables;
import org.lexevs.system.model.LocalCodingScheme;
import org.lexevs.system.service.SystemResourceService;
import org.springframework.beans.factory.InitializingBean;

import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author <A HREF="mailto:bauer.scott@mayo.edu">Scott Bauer </A>
 *
 */
public class MultiIndexRegistry implements IndexRegistry, InitializingBean {

    private SystemVariables systemVariables;

    //Wired to DelegatingSystemResourceService
    private SystemResourceService systemResourceService;

    //Wired to BaseLuceneIndexTemplate
    private LuceneIndexTemplate luceneIndexTemplate;

    //Wired to DefaultLuceneDirectoryCreator
    private LuceneDirectoryCreator luceneDirectoryCreator;

    private ConcurrentMetaData concurrentMetaData;

    private Map<String, LuceneIndexTemplate> luceneIndexNameToTemplateMap = new HashMap<String, LuceneIndexTemplate>();

    private Map<String, NamedDirectory> luceneIndexNameToDirctoryMap = new HashMap<String, NamedDirectory>();

    private Map<CodingSchemeUriVersionPair, String> luceneCodingSchemeToIndexNameMap = new HashMap<CodingSchemeUriVersionPair, String>();

    private Map<String, Filter> codingSchemeFilterMap = new HashMap<String, Filter>();

    public void setCodingSchemeFilterMap(Map<String, Filter> codingSchemeFilterMap) {
        this.codingSchemeFilterMap = codingSchemeFilterMap;
    }

    public MultiIndexRegistry() {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void registerCodingSchemeIndex(String codingSchemeUri, String version, String indexName) {
        LuceneIndexTemplate template = this.createLuceneIndexTemplate(indexName);
        luceneIndexNameToTemplateMap.put(indexName, template);
        luceneCodingSchemeToIndexNameMap.put(new CodingSchemeUriVersionPair(codingSchemeUri, version), indexName);

    }

    @Override
    public void unRegisterCodingSchemeIndex(String codingSchemeUri, String version) {
        CodingSchemeUriVersionPair key = new CodingSchemeUriVersionPair(codingSchemeUri, version);
        String indexName = this.luceneCodingSchemeToIndexNameMap.get(key);

        if (!StringUtils.isBlank(indexName)) {
            luceneCodingSchemeToIndexNameMap.remove(key);
            String mapKey = DaoUtility.createKey(codingSchemeUri, version);
            this.codingSchemeFilterMap.remove(mapKey);
        }
    }

    protected NamedDirectory createIndexDirectory(String indexName) {
        String baseIndexPath = systemVariables.getAutoLoadIndexLocation();
        NamedDirectory namedDirectory = luceneDirectoryCreator.getDirectory(indexName, new File(baseIndexPath));
        luceneIndexNameToDirctoryMap.put(indexName, namedDirectory);
        return namedDirectory;
    }

    protected LuceneIndexTemplate createLuceneIndexTemplate(String indexName) {
        NamedDirectory directory = this.createIndexDirectory(indexName);

        return new BaseLuceneIndexTemplate(directory);
    }

    @Override
    public LuceneIndexTemplate getLuceneIndexTemplate(String codingSchemeUri, String version) {
        CodingSchemeUriVersionPair key = new CodingSchemeUriVersionPair(codingSchemeUri, version);
        if (!this.luceneCodingSchemeToIndexNameMap.containsKey(key)) {
            this.autoRegisterIndex(codingSchemeUri, version);
        }
        String indexName = luceneCodingSchemeToIndexNameMap.get(key);

        return this.luceneIndexNameToTemplateMap.get(indexName);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        File indexDir = new File(systemVariables.getAutoLoadIndexLocation());
        for (File f : indexDir.listFiles()) {
            if (f.exists() && f.isDirectory()) {
                luceneIndexNameToTemplateMap.put(f.getName(), buildTemplateForIndexName(f.getName()));
            }
        }
    }

    private LuceneIndexTemplate buildTemplateForIndexName(String name) {
        BaseLuceneIndexTemplate baseTemplate = new BaseLuceneIndexTemplate();
        for (CodingSchemeMetaData md : ConcurrentMetaData.getInstance().getCodingSchemeList()) {
            if (md.getIndexDirectoryName().equals(name)) {
                new BaseLuceneIndexTemplate(md.getDirectory());
                break;
            }
        }
        return baseTemplate;
    }

    protected void autoRegisterIndex(String codingSchemeUri, String version) {
        String codingSchemeName;

        try {
            codingSchemeName = systemResourceService
                    .getInternalCodingSchemeNameForUserCodingSchemeName(codingSchemeUri, version);
            LocalCodingScheme lcs = LocalCodingScheme.getLocalCodingScheme(codingSchemeName, version);

            String indexName = concurrentMetaData.getIndexMetaDataValue(lcs.getKey());

            if (StringUtils.isBlank(indexName)) {
                throw new RuntimeException("Cannot autoregister index for CodingScheme: " + codingSchemeUri
                        + " Version: " + version + ".\n"
                        + "The Lucene index for this CodingScheme may have been dropped, or indexing may have failed. "
                        + "Reindexing may be needed.");
            }
            this.registerCodingSchemeIndex(codingSchemeUri, version, indexName);

        } catch (RuntimeException e) {
            throw new RuntimeException(e);
        } catch (LBParameterException e) {
            throw new RuntimeException(
                    "Problems getting coding scheme name. uri = " + codingSchemeUri + " version = " + version, e);
        }
    }

    protected static class CodingSchemeUriVersionPair {
        private String uri;
        private String version;

        private CodingSchemeUriVersionPair(String uri, String version) {
            this.uri = uri;
            this.version = version;
        }

        @Override
        public int hashCode() {
            final int prime = 31;
            int result = 1;
            result = prime * result + ((uri == null) ? 0 : uri.hashCode());
            result = prime * result + ((version == null) ? 0 : version.hashCode());
            return result;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            CodingSchemeUriVersionPair other = (CodingSchemeUriVersionPair) obj;
            if (uri == null) {
                if (other.uri != null)
                    return false;
            } else if (!uri.equals(other.uri))
                return false;
            if (version == null) {
                if (other.version != null)
                    return false;
            } else if (!version.equals(other.version))
                return false;
            return true;
        }
    }

    @Override
    public LuceneIndexTemplate getCommonLuceneIndexTemplate() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public LuceneIndexTemplate getCommonLuceneIndexTemplate(
            List<AbsoluteCodingSchemeVersionReference> codingSchemes) {
        return getLuceneIndexTemplate(codingSchemes);
    }

    @Override
    public LuceneIndexTemplate getSearchLuceneIndexTemplate() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void destroyIndex(String indexName) {

        String location = systemVariables.getAutoLoadIndexLocation();
        try {
            Path path = Paths.get(location, indexName);

            File indexDir2Delete = new File(path.toString());

            if (indexDir2Delete.exists()) {
                try {
                    if (indexDir2Delete.isDirectory())
                        FileUtils.cleanDirectory(indexDir2Delete);

                    indexDir2Delete.delete();
                } catch (Exception e) {
                    FileUtils.deleteQuietly(indexDir2Delete);
                }
            }
            //FileUtils.deleteDirectory(new File(path.toString()));
            concurrentMetaData.removeIndexMetaDataValue(indexName);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Map<String, Filter> getCodingSchemeFilterMap() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Map<String, Filter> getBoundaryDocFilterMap() {
        // TODO Auto-generated method stub
        throw new UnsupportedOperationException("Boundary Docs no longer in use");
    }

    public SystemVariables getSystemVariables() {
        return systemVariables;
    }

    public void setSystemVariables(SystemVariables systemVariables) {
        this.systemVariables = systemVariables;
    }

    public SystemResourceService getSystemResourceService() {
        return systemResourceService;
    }

    public void setSystemResourceService(SystemResourceService systemResourceService) {
        this.systemResourceService = systemResourceService;
    }

    public LuceneIndexTemplate getLuceneIndexTemplate() {
        return luceneIndexTemplate;
    }

    public void setLuceneIndexTemplate(LuceneIndexTemplate luceneIndexTemplate) {
        this.luceneIndexTemplate = luceneIndexTemplate;
    }

    public LuceneDirectoryCreator getLuceneDirectoryCreator() {
        return luceneDirectoryCreator;
    }

    public void setLuceneDirectoryCreator(LuceneDirectoryCreator luceneDirectoryCreator) {
        this.luceneDirectoryCreator = luceneDirectoryCreator;
    }

    public ConcurrentMetaData getConcurrentMetaData() {
        return concurrentMetaData;
    }

    public void setConcurrentMetaData(ConcurrentMetaData concurrentMetaData) {
        this.concurrentMetaData = concurrentMetaData;
    }

    private LuceneIndexTemplate getLuceneIndexTemplate(List<AbsoluteCodingSchemeVersionReference> codingSchemes) {
        List<NamedDirectory> directories = getNamedDirectoriesForCodingSchemes(codingSchemes);
        return new MultiBaseLuceneIndexTemplate(directories);
    }

    private List<NamedDirectory> getNamedDirectoriesForCodingSchemes(
            List<AbsoluteCodingSchemeVersionReference> codingSchemes) {
        List<NamedDirectory> directories = new ArrayList<NamedDirectory>();
        for (CodingSchemeMetaData csmd : concurrentMetaData.getCodingSchemeList()) {
            for (AbsoluteCodingSchemeVersionReference ref : codingSchemes) {
                if (csmd.getCodingSchemeUri().equals(ref.getCodingSchemeURN())
                        && csmd.getCodingSchemeVersion().equals(ref.getCodingSchemeVersion())) {
                    directories.add(csmd.getDirectory().getIndexReader().maxDoc() > 0 ? csmd.getDirectory()
                            : csmd.getDirectory().refresh());
                }
            }
        }
        return directories;
    }

}