Java tutorial
/* * Copyright 2003 - 2016 The eFaps Team * * 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 org.efaps.esjp.admin.index; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.lang3.EnumUtils; import org.efaps.admin.dbproperty.DBProperties; import org.efaps.admin.index.ISearch; import org.efaps.admin.index.Indexer; import org.efaps.admin.index.SearchConfig; import org.efaps.admin.program.esjp.EFapsApplication; import org.efaps.admin.program.esjp.EFapsUUID; import org.efaps.db.CachedPrintQuery; import org.efaps.db.Instance; import org.efaps.db.MultiPrintQuery; import org.efaps.db.PrintQuery; import org.efaps.db.QueryBuilder; import org.efaps.esjp.ci.CIAdminIndex; import org.efaps.esjp.db.InstanceUtils; import org.efaps.util.EFapsException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The Class ResultTableProvider_Base. * * @author The eFaps Team */ @EFapsUUID("02edb104-402e-4860-91cf-3102d5bfa1af") @EFapsApplication("eFaps-Kernel") public abstract class Search_Base implements ISearch { /** The Constant CACHEKEY. */ protected static final String CACHEKEY = Search.class.getName() + ".CacheKey"; /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; /** * Logging instance used in this class. */ private static final Logger LOG = LoggerFactory.getLogger(Search.class); /** The query. */ private String query; /** The initialized. */ private boolean initialized; /** The result fields. */ private Map<String, Collection<String>> resultFields; /** The result fields. */ private Map<String, String> resultLabels; /** The configs. */ private List<SearchConfig> configs; /** The name. */ private String name; /** * Inits the. */ private void init() { if (!this.initialized) { try { this.initialized = true; this.resultFields = new LinkedHashMap<>(); this.resultLabels = new HashMap<>(); this.configs = new ArrayList<>(); // this should be replaced by an actual evaluation of which one // of the searches should be used final QueryBuilder indxQueryBldr = new QueryBuilder(CIAdminIndex.IndexSearch); indxQueryBldr.setLimit(1); final List<Instance> searches = indxQueryBldr.getCachedQuery(Search.CACHEKEY).execute(); Instance searchInst = null; if (!searches.isEmpty()) { searchInst = searches.get(0); } if (InstanceUtils.isValid(searchInst)) { final PrintQuery print = new CachedPrintQuery(searchInst, Search.CACHEKEY); print.addAttribute(CIAdminIndex.IndexSearch.Config, CIAdminIndex.IndexSearch.Name); print.execute(); this.name = print.getAttribute(CIAdminIndex.IndexSearch.Name); if (print.getAttribute(CIAdminIndex.IndexSearch.Config) != null) { this.configs = print.getAttribute(CIAdminIndex.IndexSearch.Config); } final QueryBuilder queryBldr = new QueryBuilder(CIAdminIndex.IndexSearchResultField); queryBldr.addWhereAttrEqValue(CIAdminIndex.IndexSearchResultField.SearchLink, searchInst); queryBldr.addOrderByAttributeAsc(CIAdminIndex.IndexSearchResultField.Priority); final MultiPrintQuery multi = queryBldr.getCachedPrint(Search.CACHEKEY); multi.setEnforceSorted(true); multi.addAttribute(CIAdminIndex.IndexSearchResultField.Key, CIAdminIndex.IndexSearchResultField.Label); multi.execute(); while (multi.next()) { final String key = multi.getAttribute(CIAdminIndex.IndexSearchResultField.Key); final String label = multi.getAttribute(CIAdminIndex.IndexSearchResultField.Label); final QueryBuilder keyQueryBldr = new QueryBuilder(CIAdminIndex.IndexSearchResultFieldKey); keyQueryBldr.addWhereAttrEqValue(CIAdminIndex.IndexSearchResultFieldKey.ResultFieldLink, multi.getCurrentInstance()); final MultiPrintQuery keyMulti = keyQueryBldr.getCachedPrint(Search.CACHEKEY); keyMulti.addAttribute(CIAdminIndex.IndexSearchResultField.Key); keyMulti.execute(); final Set<String> keys = new HashSet<>(); while (keyMulti.next()) { final String keyTmp = keyMulti .<String>getAttribute(CIAdminIndex.IndexSearchResultFieldKey.Key); if (EnumUtils.isValidEnum(Indexer.Key.class, keyTmp)) { keys.add(keyTmp); } else { keys.add(DBProperties.getProperty(keyTmp)); } } this.resultFields.put(key, keys); this.resultLabels.put(key, DBProperties.getProperty(label)); } } } catch (final EFapsException e) { LOG.error("Catched", e); } } } @Override public void setQuery(final String _query) { this.query = _query; } @Override public String getQuery() { return this.query; } @Override public Map<String, Collection<String>> getResultFields() { init(); return this.resultFields; } @Override public Map<String, String> getResultLabel() { init(); return this.resultLabels; } @Override public List<SearchConfig> getConfigs() throws EFapsException { init(); return this.configs; } @Override public String getName() { init(); return this.name; } }