/* * Copyright (C) 2010 The Android Open Source Project * * 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. */ package com.android.quicksearchbox; import com.android.quicksearchbox.util.Factory; import android.content.Context; import android.util.Log; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.concurrent.Executor; /** * Creates corpora. */ public class SearchableCorpusFactory implements CorpusFactory { private static final String TAG = "QSB.SearchableCorpusFactory"; private final Context mContext; private final Config mConfig; private final SearchSettings mSettings; private final Factory<Executor> mWebCorpusExecutorFactory; public SearchableCorpusFactory(Context context, Config config, SearchSettings settings, Factory<Executor> webCorpusExecutorFactory) { mContext = context; mConfig = config; mSettings = settings; mWebCorpusExecutorFactory = webCorpusExecutorFactory; } public Collection<Corpus> createCorpora(Sources sources) { ArrayList<Corpus> corpora = new ArrayList<Corpus>(); addSpecialCorpora(corpora, sources); addSingleSourceCorpora(corpora, sources); return corpora; } protected Context getContext() { return mContext; } protected Config getConfig() { return mConfig; } protected Executor createWebCorpusExecutor() { return mWebCorpusExecutorFactory.create(); } /** * Adds any corpora that are not simple single source corpora. * * @param corpora List to add corpora to. * @param sources All available sources. */ protected void addSpecialCorpora(ArrayList<Corpus> corpora, Sources sources) { addCorpus(corpora, createWebCorpus(sources)); addCorpus(corpora, createAppsCorpus(sources)); } /** * Adds corpora for all sources that are not already used by a corpus. * * @param corpora List to add the new corpora to. Corpora will not be created for the sources * used by corpora already in this list. * @param sources Sources to create corpora for. */ protected void addSingleSourceCorpora(ArrayList<Corpus> corpora, Sources sources) { // Set of all sources that are already used HashSet<Source> claimedSources = new HashSet<Source>(); for (Corpus specialCorpus : corpora) { claimedSources.addAll(specialCorpus.getSources()); } // Creates corpora for all unclaimed sources for (Source source : sources.getSources()) { if (!claimedSources.contains(source)) { addCorpus(corpora, createSingleSourceCorpus(source)); } } } private void addCorpus(ArrayList<Corpus> corpora, Corpus corpus) { if (corpus != null) corpora.add(corpus); } protected Corpus createWebCorpus(Sources sources) { Source webSource = getWebSource(sources); if (webSource != null && !webSource.canRead()) { Log.w(TAG, "Can't read web source " + webSource.getName()); webSource = null; } Source browserSource = getBrowserSource(sources); if (browserSource != null && !browserSource.canRead()) { Log.w(TAG, "Can't read browser source " + browserSource.getName()); browserSource = null; } Executor executor = createWebCorpusExecutor(); return new WebCorpus(mContext, mConfig, mSettings, executor, webSource, browserSource); } protected Corpus createAppsCorpus(Sources sources) { Source appsSource = getAppsSource(sources); return new AppsCorpus(mContext, mConfig, appsSource); } protected Corpus createSingleSourceCorpus(Source source) { if (!source.canRead()) return null; return new SingleSourceCorpus(mContext, mConfig, source); } protected Source getWebSource(Sources sources) { return sources.getWebSearchSource(); } protected Source getBrowserSource(Sources sources) { String name = getContext().getString(R.string.browser_search_component); return sources.getSource(name); } protected Source getAppsSource(Sources sources) { String name = getContext().getString(R.string.installed_apps_component); return sources.getSource(name); } }