Search in sources :

Example 1 with PDStoredBusinessEntity

use of com.helger.pd.indexer.storage.PDStoredBusinessEntity in project phoss-directory by phax.

the class ExportHelper method getAsXML.

@Nonnull
public static IMicroDocument getAsXML(@Nonnull final ICommonsOrderedMap<IParticipantIdentifier, ICommonsList<PDStoredBusinessEntity>> aMap, final boolean bIncludeDocTypes) {
    // XML root
    final IMicroDocument aDoc = new MicroDocument();
    final IMicroElement aRoot = aDoc.appendElement(XML_EXPORT_NS_URI, "root");
    aRoot.setAttribute("version", "2");
    aRoot.setAttribute("creationdt", PDTWebDateHelper.getAsStringXSD(PDTFactory.getCurrentZonedDateTimeUTC()));
    // For all BCs
    for (final Map.Entry<IParticipantIdentifier, ICommonsList<PDStoredBusinessEntity>> aEntry : aMap.entrySet()) {
        final IParticipantIdentifier aParticipantID = aEntry.getKey();
        final PDBusinessCard aBC = new PDBusinessCard();
        aBC.setParticipantIdentifier(new PDIdentifier(aParticipantID.getScheme(), aParticipantID.getValue()));
        for (final PDStoredBusinessEntity aSBE : aEntry.getValue()) aBC.businessEntities().add(aSBE.getAsBusinessEntity());
        final IMicroElement eBC = aBC.getAsMicroXML(XML_EXPORT_NS_URI, "businesscard");
        // New in v2 - add all Document types
        if (bIncludeDocTypes && aEntry.getValue().isNotEmpty())
            for (final IDocumentTypeIdentifier aDocTypeID : aEntry.getValue().getFirst().documentTypeIDs()) eBC.appendChild(_createMicroElement(aDocTypeID));
        aRoot.appendChild(eBC);
    }
    return aDoc;
}
Also used : PDIdentifier(com.helger.pd.businesscard.generic.PDIdentifier) IMicroDocument(com.helger.xml.microdom.IMicroDocument) MicroDocument(com.helger.xml.microdom.MicroDocument) ICommonsList(com.helger.commons.collection.impl.ICommonsList) PDBusinessCard(com.helger.pd.businesscard.generic.PDBusinessCard) PDStoredBusinessEntity(com.helger.pd.indexer.storage.PDStoredBusinessEntity) IMicroElement(com.helger.xml.microdom.IMicroElement) IDocumentTypeIdentifier(com.helger.peppolid.IDocumentTypeIdentifier) IMicroDocument(com.helger.xml.microdom.IMicroDocument) ICommonsOrderedMap(com.helger.commons.collection.impl.ICommonsOrderedMap) Map(java.util.Map) IParticipantIdentifier(com.helger.peppolid.IParticipantIdentifier) Nonnull(javax.annotation.Nonnull)

Example 2 with PDStoredBusinessEntity

use of com.helger.pd.indexer.storage.PDStoredBusinessEntity in project phoss-directory by phax.

the class AbstractPagePublicSearch method createParticipantDetails.

@Nonnull
protected HCNodeList createParticipantDetails(@Nonnull final Locale aDisplayLocale, @Nonnull final String sParticipantID, @Nonnull final IParticipantIdentifier aParticipantID, final boolean bIsLoggedInUserAdministrator) {
    final HCNodeList aDetails = new HCNodeList();
    // Search document matching participant ID
    final ICommonsList<PDStoredBusinessEntity> aResultDocs = PDMetaManager.getStorageMgr().getAllDocumentsOfParticipant(aParticipantID);
    // Group by participant ID
    final ICommonsMap<IParticipantIdentifier, ICommonsList<PDStoredBusinessEntity>> aGroupedDocs = PDStorageManager.getGroupedByParticipantID(aResultDocs);
    if (aGroupedDocs.isEmpty())
        LOGGER.error("No stored document matches participant identifier '" + sParticipantID + "' - cannot show details");
    else {
        if (aGroupedDocs.size() > 1)
            LOGGER.warn("Found " + aGroupedDocs.size() + " entries for participant identifier '" + sParticipantID + "' - weird");
        // Get the first one
        final ICommonsList<PDStoredBusinessEntity> aStoredEntities = aGroupedDocs.getFirstValue();
        // Details header
        {
            IHCNode aDetailsHeader = null;
            final boolean bIsPeppolDefault = aParticipantID.hasScheme(PeppolIdentifierFactory.INSTANCE.getDefaultParticipantIdentifierScheme());
            if (bIsPeppolDefault) {
                final IParticipantIdentifierScheme aIIA = ParticipantIdentifierSchemeManager.getSchemeOfIdentifier(aParticipantID);
                if (aIIA != null) {
                    final HCH1 aH1 = h1("Details for: " + aParticipantID.getValue());
                    if (StringHelper.hasText(aIIA.getSchemeAgency()))
                        aH1.addChild(small(" (" + aIIA.getSchemeAgency() + ")"));
                    aDetailsHeader = new BootstrapPageHeader().addChild(aH1);
                }
            }
            if (aDetailsHeader == null) {
                // Fallback
                aDetailsHeader = BootstrapWebPageUIHandler.INSTANCE.createPageHeader("Details for " + sParticipantID);
            }
            aDetails.addChild(aDetailsHeader);
        }
        final BootstrapTabBox aTabBox = new BootstrapTabBox();
        // Business information
        {
            final HCNodeList aOL = new HCNodeList();
            int nIndex = 1;
            for (final PDStoredBusinessEntity aStoredEntity : aStoredEntities) {
                final BootstrapCard aCard = aOL.addAndReturnChild(new BootstrapCard());
                aCard.addClass(CSS_CLASS_RESULT_PANEL);
                if (aStoredEntities.size() > 1)
                    aCard.createAndAddHeader().addChild("Business information entity " + nIndex);
                final BootstrapViewForm aViewForm = PDCommonUI.showBusinessInfoDetails(aStoredEntity, aDisplayLocale);
                aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("Full Peppol participant ID").setCtrl(code(sParticipantID)));
                if (GlobalDebug.isDebugMode() || bIsLoggedInUserAdministrator) {
                    aViewForm.addChild(new HCHR());
                    aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("[Debug] Creation DT").setCtrl(PDTToString.getAsString(aStoredEntity.getMetaData().getCreationDT(), aDisplayLocale)));
                    aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("[Debug] Owner ID").setCtrl(code(aStoredEntity.getMetaData().getOwnerID())));
                    aViewForm.addFormGroup(new BootstrapFormGroup().setLabel("[Debug] Requesting Host").setCtrl(code(aStoredEntity.getMetaData().getRequestingHost())));
                }
                aCard.createAndAddBody().addChild(aViewForm);
                ++nIndex;
            }
            // Add whole list or just the first item?
            final IHCNode aTabLabel = span("Business information ").addChild(badgePrimary(aStoredEntities.size()));
            aTabBox.addTab("businessinfo", aTabLabel, aOL, true);
        }
        // Document types
        {
            final HCNodeList aDocTypeCtrl = new HCNodeList();
            final ICommonsList<String> aNames = new CommonsArrayList<>();
            for (final PDStoredBusinessEntity aStoredEntity : aStoredEntities) aNames.addAllMapped(aStoredEntity.names(), PDStoredMLName::getName);
            aDocTypeCtrl.addChild(info("The following document types are supported by " + _getImplodedMapped(", ", " and ", aNames, x -> "'" + x + "'") + ":"));
            HCOL aDocTypeOL = null;
            final ICommonsList<IDocumentTypeIdentifier> aDocTypeIDs = aResultDocs.getFirst().documentTypeIDs().getSorted(IDocumentTypeIdentifier.comparator());
            for (final IDocumentTypeIdentifier aDocTypeID : aDocTypeIDs) {
                if (aDocTypeOL == null)
                    aDocTypeOL = aDocTypeCtrl.addAndReturnChild(new HCOL());
                final HCLI aLI = aDocTypeOL.addItem();
                aLI.addChild(NiceNameUI.getDocumentTypeID(aDocTypeID));
            }
            if (aDocTypeOL == null)
                aDocTypeCtrl.addChild(warn("This participant does not support any document types!"));
            aTabBox.addTab("doctypes", span("Supported document types ").addChild(badgePrimary(aDocTypeIDs.size())), aDocTypeCtrl, false);
        }
        aDetails.addChild(aTabBox);
    }
    return aDetails;
}
Also used : HCH1(com.helger.html.hc.html.sections.HCH1) HCOL(com.helger.html.hc.html.grouping.HCOL) IDocumentTypeIdentifier(com.helger.peppolid.IDocumentTypeIdentifier) BootstrapWebPageUIHandler(com.helger.photon.bootstrap4.pages.BootstrapWebPageUIHandler) PDMetaManager(com.helger.pd.indexer.mgr.PDMetaManager) LoggerFactory(org.slf4j.LoggerFactory) Function(java.util.function.Function) NiceNameUI(com.helger.pd.publisher.nicename.NiceNameUI) PDCommonUI(com.helger.pd.publisher.ui.PDCommonUI) IHCNode(com.helger.html.hc.IHCNode) ParticipantIdentifierSchemeManager(com.helger.peppolid.peppol.pidscheme.ParticipantIdentifierSchemeManager) BootstrapPageHeader(com.helger.photon.bootstrap4.utils.BootstrapPageHeader) Nonempty(com.helger.commons.annotation.Nonempty) Locale(java.util.Locale) PDServerConfiguration(com.helger.pd.indexer.settings.PDServerConfiguration) IHasID(com.helger.commons.id.IHasID) EnumHelper(com.helger.commons.lang.EnumHelper) IParticipantIdentifierScheme(com.helger.peppolid.peppol.pidscheme.IParticipantIdentifierScheme) GlobalDebug(com.helger.commons.debug.GlobalDebug) IParticipantIdentifier(com.helger.peppolid.IParticipantIdentifier) Nonnull(javax.annotation.Nonnull) Nullable(javax.annotation.Nullable) PDTToString(com.helger.commons.datetime.PDTToString) BootstrapViewForm(com.helger.photon.bootstrap4.form.BootstrapViewForm) BootstrapTabBox(com.helger.photon.bootstrap4.nav.BootstrapTabBox) HCNodeList(com.helger.html.hc.impl.HCNodeList) PDStoredBusinessEntity(com.helger.pd.indexer.storage.PDStoredBusinessEntity) HCLI(com.helger.html.hc.html.grouping.HCLI) PDStorageManager(com.helger.pd.indexer.storage.PDStorageManager) BootstrapFormGroup(com.helger.photon.bootstrap4.form.BootstrapFormGroup) Logger(org.slf4j.Logger) CommonsArrayList(com.helger.commons.collection.impl.CommonsArrayList) PeppolIdentifierFactory(com.helger.peppolid.factory.PeppolIdentifierFactory) StringHelper(com.helger.commons.string.StringHelper) AbstractAppWebPage(com.helger.pd.publisher.ui.AbstractAppWebPage) Collection(java.util.Collection) ValueEnforcer(com.helger.commons.ValueEnforcer) BootstrapCard(com.helger.photon.bootstrap4.card.BootstrapCard) PDStoredMLName(com.helger.pd.indexer.storage.PDStoredMLName) ICommonsList(com.helger.commons.collection.impl.ICommonsList) HCHR(com.helger.html.hc.html.grouping.HCHR) ICommonsMap(com.helger.commons.collection.impl.ICommonsMap) DefaultCSSClassProvider(com.helger.html.css.DefaultCSSClassProvider) ICSSClassProvider(com.helger.html.css.ICSSClassProvider) ICommonsList(com.helger.commons.collection.impl.ICommonsList) BootstrapCard(com.helger.photon.bootstrap4.card.BootstrapCard) HCNodeList(com.helger.html.hc.impl.HCNodeList) HCHR(com.helger.html.hc.html.grouping.HCHR) HCH1(com.helger.html.hc.html.sections.HCH1) PDStoredMLName(com.helger.pd.indexer.storage.PDStoredMLName) BootstrapViewForm(com.helger.photon.bootstrap4.form.BootstrapViewForm) IDocumentTypeIdentifier(com.helger.peppolid.IDocumentTypeIdentifier) BootstrapTabBox(com.helger.photon.bootstrap4.nav.BootstrapTabBox) BootstrapPageHeader(com.helger.photon.bootstrap4.utils.BootstrapPageHeader) PDStoredBusinessEntity(com.helger.pd.indexer.storage.PDStoredBusinessEntity) IParticipantIdentifierScheme(com.helger.peppolid.peppol.pidscheme.IParticipantIdentifierScheme) HCOL(com.helger.html.hc.html.grouping.HCOL) HCLI(com.helger.html.hc.html.grouping.HCLI) BootstrapFormGroup(com.helger.photon.bootstrap4.form.BootstrapFormGroup) IParticipantIdentifier(com.helger.peppolid.IParticipantIdentifier) IHCNode(com.helger.html.hc.IHCNode) Nonnull(javax.annotation.Nonnull)

Example 3 with PDStoredBusinessEntity

use of com.helger.pd.indexer.storage.PDStoredBusinessEntity in project phoss-directory by phax.

the class PublicSearchXServletHandler method handleRequest.

public void handleRequest(@Nonnull final IRequestWebScopeWithoutResponse aRequestScope, @Nonnull final UnifiedResponse aUnifiedResponse) throws Exception {
    if (SearchRateLimit.INSTANCE.rateLimiter() != null) {
        final String sRateLimitKey = "ip:" + aRequestScope.getRemoteAddr();
        final boolean bOverLimit = SearchRateLimit.INSTANCE.rateLimiter().overLimitWhenIncremented(sRateLimitKey);
        if (bOverLimit) {
            // Too Many Requests
            if (LOGGER.isDebugEnabled())
                LOGGER.debug("REST search rate limit exceeded for " + sRateLimitKey);
            aUnifiedResponse.setStatus(CHttp.HTTP_TOO_MANY_REQUESTS);
            return;
        }
    }
    final IRequestParamContainer aParams = aRequestScope.params();
    // http://127.0.0.1:8080/search -> null
    // http://127.0.0.1:8080/search/ -> "/"
    // http://127.0.0.1:8080/search/x -> "/x"
    final String sPathInfo = StringHelper.getNotNull(aRequestScope.getPathInfo(), "");
    final ESearchVersion eSearchVersion = ESearchVersion.getFromPathInfoOrNull(sPathInfo);
    if (eSearchVersion == ESearchVersion.V1) {
        // Version 1.0
        // Determine output format
        final ICommonsList<String> aParts = StringHelper.getExploded('/', sPathInfo.substring(1));
        final String sFormat = aParts.getAtIndex(1);
        final EPDOutputFormat eOutputFormat = EPDOutputFormat.getFromIDCaseInsensitiveOrDefault(sFormat, EPDOutputFormat.XML);
        if (LOGGER.isDebugEnabled())
            LOGGER.debug("Using REST query API 1.0 with output format " + eOutputFormat + " (" + sPathInfo + ") from '" + aRequestScope.getUserAgent().getAsString() + "'");
        // Determine result offset and count
        final int nResultPageIndex = aParams.getAsInt(PARAM_RESULT_PAGE_INDEX, aParams.getAsInt("rpi", DEFAULT_RESULT_PAGE_INDEX));
        if (nResultPageIndex < 0) {
            LOGGER.error("ResultPageIndex " + nResultPageIndex + " is invalid. It must be >= 0.");
            aUnifiedResponse.setStatus(CHttp.HTTP_BAD_REQUEST);
            return;
        }
        final int nResultPageCount = aParams.getAsInt(PARAM_RESULT_PAGE_COUNT, aParams.getAsInt("rpc", DEFAULT_RESULT_PAGE_COUNT));
        if (nResultPageCount <= 0) {
            LOGGER.error("ResultPageCount " + nResultPageCount + " is invalid. It must be > 0.");
            aUnifiedResponse.setStatus(CHttp.HTTP_BAD_REQUEST);
            return;
        }
        final int nFirstResultIndex = nResultPageIndex * nResultPageCount;
        final int nLastResultIndex = (nResultPageIndex + 1) * nResultPageCount - 1;
        if (nFirstResultIndex > MAX_RESULTS) {
            LOGGER.error("The first result index " + nFirstResultIndex + " is invalid. It must be <= " + MAX_RESULTS + ".");
            aUnifiedResponse.setStatus(CHttp.HTTP_BAD_REQUEST);
            return;
        }
        if (nLastResultIndex > MAX_RESULTS) {
            LOGGER.error("The last result index " + nLastResultIndex + " is invalid. It must be <= " + MAX_RESULTS + ".");
            aUnifiedResponse.setStatus(CHttp.HTTP_BAD_REQUEST);
            return;
        }
        // Format output?
        final boolean bBeautify = aParams.getAsBoolean(PARAM_BEAUTIFY, false);
        // Determine query terms
        final StringBuilder aSBQueryString = new StringBuilder();
        final ICommonsMap<EPDSearchField, ICommonsList<String>> aQueryValues = new CommonsHashMap<>();
        for (final EPDSearchField eSF : EPDSearchField.values()) {
            final String sFieldName = eSF.getFieldName();
            // Check if one or more request parameters are present for the current
            // search field
            final ICommonsList<String> aValues = aParams.getAsStringList(sFieldName);
            if (aValues != null && aValues.isNotEmpty()) {
                aQueryValues.put(eSF, aValues);
                for (final String sValue : aValues) {
                    if (aSBQueryString.length() > 0)
                        aSBQueryString.append('&');
                    aSBQueryString.append(sFieldName).append('=').append(sValue);
                }
            }
        }
        if (aQueryValues.isEmpty()) {
            LOGGER.error("No valid query term provided!");
            aUnifiedResponse.setStatus(CHttp.HTTP_BAD_REQUEST);
            return;
        }
        if (LOGGER.isDebugEnabled())
            LOGGER.debug("Using the following query terms: " + aQueryValues);
        final ICommonsList<Query> aQueries = new CommonsArrayList<>();
        for (final Map.Entry<EPDSearchField, ICommonsList<String>> aEntry : aQueryValues.entrySet()) {
            final EPDSearchField eField = aEntry.getKey();
            for (final String sQuery : aEntry.getValue()) {
                final Query aQuery = eField.getQuery(sQuery);
                if (aQuery != null)
                    aQueries.add(aQuery);
                else
                    LOGGER.error("Failed to create query '" + sQuery + "' of field " + eField + " - ignoring term!");
            }
        }
        if (aQueries.isEmpty()) {
            LOGGER.error("No valid queries could be created!");
            aUnifiedResponse.setStatus(CHttp.HTTP_BAD_REQUEST);
            return;
        }
        // Build final query term
        Query aLuceneQuery;
        if (aQueries.size() == 1) {
            aLuceneQuery = aQueries.getFirst();
        } else {
            // Connect all with "AND"
            final BooleanQuery.Builder aBuilder = new BooleanQuery.Builder();
            for (final Query aQuery : aQueries) aBuilder.add(aQuery, Occur.MUST);
            aLuceneQuery = aBuilder.build();
        }
        // Only-non deleted
        aLuceneQuery = PDQueryManager.andNotDeleted(aLuceneQuery);
        // How many results to deliver at most
        final int nMaxResults = nLastResultIndex + 1;
        // Search all documents
        final PDStorageManager aStorageMgr = PDMetaManager.getStorageMgr();
        final ICommonsList<PDStoredBusinessEntity> aResultDocs = aStorageMgr.getAllDocuments(aLuceneQuery, nMaxResults);
        // Also get the total hit count for UI display. May be < 0 in case of
        // error
        final int nTotalBEs = aStorageMgr.getCount(aLuceneQuery);
        if (LOGGER.isDebugEnabled())
            LOGGER.debug("  Result for <" + aLuceneQuery + "> (max=" + nMaxResults + ") " + (nTotalBEs == 1 ? "is 1 document" : "are " + nTotalBEs + " documents"));
        // Filter by index/count
        final int nEffectiveLastIndex = Math.min(nLastResultIndex, aResultDocs.size() - 1);
        final List<PDStoredBusinessEntity> aResultView = nFirstResultIndex >= aResultDocs.size() ? Collections.emptyList() : aResultDocs.subList(nFirstResultIndex, nEffectiveLastIndex + 1);
        // Group results by participant ID
        final ICommonsMap<IParticipantIdentifier, ICommonsList<PDStoredBusinessEntity>> aGroupedDocs = PDStorageManager.getGroupedByParticipantID(aResultView);
        final ZonedDateTime aNow = PDTFactory.getCurrentZonedDateTimeUTC();
        // build result
        switch(eOutputFormat) {
            case XML:
                {
                    final XMLWriterSettings aXWS = new XMLWriterSettings().setIndent(bBeautify ? EXMLSerializeIndent.INDENT_AND_ALIGN : EXMLSerializeIndent.NONE);
                    final IMicroDocument aDoc = new MicroDocument();
                    final IMicroElement eRoot = aDoc.appendElement("resultlist");
                    eRoot.setAttribute(RESPONSE_VERSION, eSearchVersion.getVersion());
                    eRoot.setAttribute(RESPONSE_TOTAL_RESULT_COUNT, nTotalBEs);
                    eRoot.setAttribute(RESPONSE_USED_RESULT_COUNT, aResultView.size());
                    eRoot.setAttribute(RESPONSE_RESULT_PAGE_INDEX, nResultPageIndex);
                    eRoot.setAttribute(RESPONSE_RESULT_PAGE_COUNT, nResultPageCount);
                    eRoot.setAttribute(RESPONSE_FIRST_RESULT_INDEX, nFirstResultIndex);
                    eRoot.setAttribute(RESPONSE_LAST_RESULT_INDEX, nEffectiveLastIndex);
                    eRoot.setAttribute(RESPONSE_QUERY_TERMS, aSBQueryString.toString());
                    eRoot.setAttribute(RESPONSE_CREATION_DT, PDTWebDateHelper.getAsStringXSD(aNow));
                    for (final ICommonsList<PDStoredBusinessEntity> aPerParticipant : aGroupedDocs.values()) {
                        final IMicroElement eItem = PDStoredBusinessEntity.getAsSearchResultMicroElement(aPerParticipant);
                        eRoot.appendChild(eItem);
                    }
                    if (false) {
                        // Demo validation
                        final CollectingSAXErrorHandler aErrHdl = new CollectingSAXErrorHandler();
                        final Validator v = new XMLSchemaCache(aErrHdl).getValidator(new ClassPathResource("/schema/directory-search-result-list-v1.xsd"));
                        v.validate(TransformSourceFactory.create(MicroWriter.getNodeAsBytes(aDoc, aXWS)));
                        for (final IError aError : aErrHdl.getErrorList()) LOGGER.error(aError.getAsString(AppCommonUI.DEFAULT_LOCALE));
                    }
                    aUnifiedResponse.disableCaching();
                    aUnifiedResponse.setMimeType(eOutputFormat.getMimeType());
                    aUnifiedResponse.setContent(MicroWriter.getNodeAsBytes(aDoc, aXWS));
                    break;
                }
            case JSON:
                final JsonWriterSettings aJWS = new JsonWriterSettings().setIndentEnabled(bBeautify);
                final IJsonObject aDoc = new JsonObject();
                aDoc.add(RESPONSE_VERSION, eSearchVersion.getVersion());
                aDoc.add(RESPONSE_TOTAL_RESULT_COUNT, nTotalBEs);
                aDoc.add(RESPONSE_USED_RESULT_COUNT, aResultView.size());
                aDoc.add(RESPONSE_RESULT_PAGE_INDEX, nResultPageIndex);
                aDoc.add(RESPONSE_RESULT_PAGE_COUNT, nResultPageCount);
                aDoc.add(RESPONSE_FIRST_RESULT_INDEX, nFirstResultIndex);
                aDoc.add(RESPONSE_LAST_RESULT_INDEX, nEffectiveLastIndex);
                aDoc.add(RESPONSE_QUERY_TERMS, aSBQueryString.toString());
                aDoc.add(RESPONSE_CREATION_DT, PDTWebDateHelper.getAsStringXSD(aNow));
                final IJsonArray aMatches = new JsonArray();
                for (final ICommonsList<PDStoredBusinessEntity> aPerParticipant : aGroupedDocs.values()) {
                    final IJsonObject aItem = PDStoredBusinessEntity.getAsSearchResultJsonObject(aPerParticipant);
                    aMatches.add(aItem);
                }
                aDoc.addJson("matches", aMatches);
                aUnifiedResponse.disableCaching();
                aUnifiedResponse.setMimeType(eOutputFormat.getMimeType());
                aUnifiedResponse.setContentAndCharset(aDoc.getAsJsonString(aJWS), StandardCharsets.UTF_8);
                break;
            default:
                throw new IllegalStateException("Unsupported output format: " + eOutputFormat);
        }
    } else {
        LOGGER.error("Unsupported version provided (" + sPathInfo + ")");
        aUnifiedResponse.setStatus(CHttp.HTTP_NOT_FOUND);
    }
}
Also used : BooleanQuery(org.apache.lucene.search.BooleanQuery) ICommonsList(com.helger.commons.collection.impl.ICommonsList) Query(org.apache.lucene.search.Query) BooleanQuery(org.apache.lucene.search.BooleanQuery) CollectingSAXErrorHandler(com.helger.xml.sax.CollectingSAXErrorHandler) JsonObject(com.helger.json.JsonObject) IJsonObject(com.helger.json.IJsonObject) IMicroDocument(com.helger.xml.microdom.IMicroDocument) MicroDocument(com.helger.xml.microdom.MicroDocument) XMLSchemaCache(com.helger.xml.schema.XMLSchemaCache) PDStoredBusinessEntity(com.helger.pd.indexer.storage.PDStoredBusinessEntity) ZonedDateTime(java.time.ZonedDateTime) IJsonObject(com.helger.json.IJsonObject) CommonsHashMap(com.helger.commons.collection.impl.CommonsHashMap) IRequestParamContainer(com.helger.web.scope.IRequestParamContainer) JsonWriterSettings(com.helger.json.serialize.JsonWriterSettings) EPDOutputFormat(com.helger.pd.publisher.search.EPDOutputFormat) XMLWriterSettings(com.helger.xml.serialize.write.XMLWriterSettings) IError(com.helger.commons.error.IError) ClassPathResource(com.helger.commons.io.resource.ClassPathResource) EPDSearchField(com.helger.pd.publisher.search.EPDSearchField) IJsonArray(com.helger.json.IJsonArray) JsonArray(com.helger.json.JsonArray) IMicroElement(com.helger.xml.microdom.IMicroElement) IJsonArray(com.helger.json.IJsonArray) IMicroDocument(com.helger.xml.microdom.IMicroDocument) Map(java.util.Map) ICommonsMap(com.helger.commons.collection.impl.ICommonsMap) CommonsHashMap(com.helger.commons.collection.impl.CommonsHashMap) CommonsArrayList(com.helger.commons.collection.impl.CommonsArrayList) PDStorageManager(com.helger.pd.indexer.storage.PDStorageManager) Validator(javax.xml.validation.Validator) IParticipantIdentifier(com.helger.peppolid.IParticipantIdentifier)

Example 4 with PDStoredBusinessEntity

use of com.helger.pd.indexer.storage.PDStoredBusinessEntity in project phoss-directory by phax.

the class PagePublicSearchSimple method _showResultList.

private void _showResultList(@Nonnull final WebPageExecutionContext aWPEC, @Nonnull @Nonempty final String sQuery, @Nonnegative final int nMaxResults) {
    final HCNodeList aNodeList = aWPEC.getNodeList();
    final Locale aDisplayLocale = aWPEC.getDisplayLocale();
    final IRequestWebScopeWithoutResponse aRequestScope = aWPEC.getRequestScope();
    final PDStorageManager aStorageMgr = PDMetaManager.getStorageMgr();
    // Search all documents
    if (LOGGER.isInfoEnabled())
        LOGGER.info("Searching generically for '" + sQuery + "'");
    // Build Lucene query
    Query aLuceneQuery = PDQueryManager.convertQueryStringToLuceneQuery(PDMetaManager.getLucene(), CPDStorage.FIELD_ALL_FIELDS, sQuery);
    aLuceneQuery = EQueryMode.NON_DELETED_ONLY.getEffectiveQuery(aLuceneQuery);
    if (LOGGER.isDebugEnabled())
        LOGGER.debug("Created query for '" + sQuery + "' is <" + aLuceneQuery + ">");
    PDSessionSingleton.getInstance().setLastQuery(aLuceneQuery);
    // Search all documents
    final ICommonsList<PDStoredBusinessEntity> aResultBEs = aStorageMgr.getAllDocuments(aLuceneQuery, nMaxResults);
    // Also get the total hit count for UI display. May be < 0 in case of
    // error
    final int nTotalBEs = aStorageMgr.getCount(aLuceneQuery);
    if (LOGGER.isInfoEnabled())
        LOGGER.info("  Result for <" + aLuceneQuery + "> (max=" + nMaxResults + ") " + (aResultBEs.size() == 1 ? "is 1 document" : "are " + aResultBEs.size() + " documents") + "." + (nTotalBEs >= 0 ? " " + nTotalBEs + " total hits are available." : ""));
    // Group by participant ID
    final ICommonsMap<IParticipantIdentifier, ICommonsList<PDStoredBusinessEntity>> aGroupedBEs = PDStorageManager.getGroupedByParticipantID(aResultBEs);
    // Display results
    if (aGroupedBEs.isEmpty()) {
        aNodeList.addChild(info("No search results found for query '" + sQuery + "'"));
    } else {
        aNodeList.addChild(div(badgeSuccess("Found " + (aGroupedBEs.size() == 1 ? "1 entity" : aGroupedBEs.size() + " entities") + " matching '" + sQuery + "'")));
        if (nTotalBEs > nMaxResults) {
            aNodeList.addChild(div(badgeWarn("Found more entities than displayed (" + nTotalBEs + " entries exist). Try to be more specific.")));
        }
        // Show basic information
        final HCOL aOL = new HCOL().setStart(1);
        for (final Map.Entry<IParticipantIdentifier, ICommonsList<PDStoredBusinessEntity>> aEntry : aGroupedBEs.entrySet()) {
            final IParticipantIdentifier aDocParticipantID = aEntry.getKey();
            final ICommonsList<PDStoredBusinessEntity> aDocs = aEntry.getValue();
            // Start result document
            final HCDiv aResultItem = div().addClass(CSS_CLASS_RESULT_DOC);
            final HCDiv aHeadRow = aResultItem.addAndReturnChild(new HCDiv());
            {
                final boolean bIsPeppolDefault = aDocParticipantID.hasScheme(PEPPOL_DEFAULT_SCHEME);
                IHCNode aParticipantNode = null;
                if (bIsPeppolDefault) {
                    final IParticipantIdentifierScheme aScheme = ParticipantIdentifierSchemeManager.getSchemeOfIdentifier(aDocParticipantID);
                    if (aScheme != null) {
                        aParticipantNode = new HCNodeList().addChild(aDocParticipantID.getValue());
                        if (StringHelper.hasText(aScheme.getSchemeAgency()))
                            ((HCNodeList) aParticipantNode).addChild(" (" + aScheme.getSchemeAgency() + ")");
                    }
                }
                if (aParticipantNode == null) {
                    // Fallback
                    aParticipantNode = code(aDocParticipantID.getURIEncoded());
                }
                aHeadRow.addChild("Participant ID: ").addChild(aParticipantNode);
            }
            if (aDocs.size() > 1)
                aHeadRow.addChild(" (" + aDocs.size() + " entities)");
            // Show all entities of the stored document
            final HCUL aUL = aResultItem.addAndReturnChild(new HCUL());
            for (final PDStoredBusinessEntity aStoredDoc : aEntry.getValue()) {
                final BootstrapTable aTable = new BootstrapTable(HCCol.perc(20), HCCol.star());
                aTable.setCondensed(true);
                if (aStoredDoc.hasCountryCode()) {
                    // Add country flag (if available)
                    final String sCountryCode = aStoredDoc.getCountryCode();
                    final Locale aCountry = CountryCache.getInstance().getCountry(sCountryCode);
                    aTable.addBodyRow().addCell("Country:").addCell(new HCNodeList().addChild(PDCommonUI.getFlagNode(sCountryCode)).addChild(" ").addChild(span(aCountry != null ? aCountry.getDisplayCountry(aDisplayLocale) + " (" + sCountryCode + ")" : sCountryCode).addClass(CSS_CLASS_RESULT_DOC_COUNTRY_CODE)));
                }
                if (aStoredDoc.names().isNotEmpty()) {
                    // TODO add locale filter here
                    final ICommonsList<PDStoredMLName> aNames = PDCommonUI.getUIFilteredNames(aStoredDoc.names(), aDisplayLocale);
                    IHCNode aNameCtrl;
                    if (aNames.size() == 1)
                        aNameCtrl = PDCommonUI.getMLNameNode(aNames.getFirst(), aDisplayLocale);
                    else {
                        final HCUL aNameUL = new HCUL();
                        aNames.forEach(x -> aNameUL.addItem(PDCommonUI.getMLNameNode(x, aDisplayLocale)));
                        aNameCtrl = aNameUL;
                    }
                    aTable.addBodyRow().addCell("Entity Name:").addCell(span(aNameCtrl).addClass(CSS_CLASS_RESULT_DOC_NAME));
                }
                if (aStoredDoc.hasGeoInfo())
                    aTable.addBodyRow().addCell("Geographical information:").addCell(div(HCExtHelper.nl2divList(aStoredDoc.getGeoInfo())).addClass(CSS_CLASS_RESULT_DOC_GEOINFO));
                if (aStoredDoc.hasAdditionalInformation())
                    aTable.addBodyRow().addCell("Additional information:").addCell(div(HCExtHelper.nl2divList(aStoredDoc.getAdditionalInformation())).addClass(CSS_CLASS_RESULT_DOC_FREETEXT));
                aUL.addAndReturnItem(aTable).addClass(CSS_CLASS_RESULT_DOC_HEADER);
            }
            final BootstrapButton aShowDetailsBtn = new BootstrapButton(EBootstrapButtonType.SUCCESS, EBootstrapButtonSize.DEFAULT).addChild("Show details").setIcon(EDefaultIcon.MAGNIFIER).addClass(CSS_CLASS_RESULT_DOC_SDBUTTON).setOnClick(aWPEC.getSelfHref().add(FIELD_QUERY, sQuery).add(CPageParam.PARAM_ACTION, CPageParam.ACTION_VIEW).add(FIELD_PARTICIPANT_ID, aDocParticipantID.getURIEncoded()));
            aResultItem.addChild(div(aShowDetailsBtn));
            aOL.addItem(aResultItem);
            // Is the max result limit reached?
            if (aOL.getChildCount() >= nMaxResults)
                break;
        }
        aNodeList.addChild(aOL);
        aNodeList.addChild(div(new BootstrapButton().setOnClick(AJAX_EXPORT_LAST.getInvocationURL(aRequestScope)).addChild("Download results as XML").setIcon(EDefaultIcon.SAVE_ALL)));
    }
}
Also used : Locale(java.util.Locale) HCDiv(com.helger.html.hc.html.grouping.HCDiv) ICommonsList(com.helger.commons.collection.impl.ICommonsList) HCNodeList(com.helger.html.hc.impl.HCNodeList) Query(org.apache.lucene.search.Query) PDStoredMLName(com.helger.pd.indexer.storage.PDStoredMLName) IRequestWebScopeWithoutResponse(com.helger.web.scope.IRequestWebScopeWithoutResponse) HCUL(com.helger.html.hc.html.grouping.HCUL) BootstrapTable(com.helger.photon.bootstrap4.table.BootstrapTable) PDStoredBusinessEntity(com.helger.pd.indexer.storage.PDStoredBusinessEntity) IParticipantIdentifierScheme(com.helger.peppolid.peppol.pidscheme.IParticipantIdentifierScheme) HCOL(com.helger.html.hc.html.grouping.HCOL) BootstrapButton(com.helger.photon.bootstrap4.button.BootstrapButton) Map(java.util.Map) ICommonsMap(com.helger.commons.collection.impl.ICommonsMap) PDStorageManager(com.helger.pd.indexer.storage.PDStorageManager) IParticipantIdentifier(com.helger.peppolid.IParticipantIdentifier) IHCNode(com.helger.html.hc.IHCNode)

Example 5 with PDStoredBusinessEntity

use of com.helger.pd.indexer.storage.PDStoredBusinessEntity in project phoss-directory by phax.

the class ExportAllManager method queryAllContainedBusinessCardsAsCSV.

public static void queryAllContainedBusinessCardsAsCSV(@Nonnull final EQueryMode eQueryMode, @Nonnull @WillNotClose final CSVWriter aCSVWriter) throws IOException {
    _unify(aCSVWriter);
    final Query aQuery = eQueryMode.getEffectiveQuery(new MatchAllDocsQuery());
    aCSVWriter.writeNext("Participant ID", "Names (per-row)", "Country code", "Geo info", "Identifier schemes", "Identifier values", "Websites", "Contact type", "Contact name", "Contact phone", "Contact email", "Additional info", "Registration date", "Document types");
    final Consumer<? super PDStoredBusinessEntity> aConsumer = aEntity -> {
        aCSVWriter.writeNext(aEntity.getParticipantID().getURIEncoded(), StringHelper.getImplodedMapped("\n", aEntity.names(), PDStoredMLName::getNameAndLanguageCode), aEntity.getCountryCode(), aEntity.getGeoInfo(), StringHelper.getImplodedMapped("\n", aEntity.identifiers(), PDStoredIdentifier::getScheme), StringHelper.getImplodedMapped("\n", aEntity.identifiers(), PDStoredIdentifier::getValue), StringHelper.getImploded("\n", aEntity.websiteURIs()), StringHelper.getImplodedMapped("\n", aEntity.contacts(), PDStoredContact::getType), StringHelper.getImplodedMapped("\n", aEntity.contacts(), PDStoredContact::getName), StringHelper.getImplodedMapped("\n", aEntity.contacts(), PDStoredContact::getPhone), StringHelper.getImplodedMapped("\n", aEntity.contacts(), PDStoredContact::getEmail), aEntity.getAdditionalInformation(), aEntity.getRegistrationDate() == null ? "" : aEntity.getRegistrationDate().toString(), StringHelper.getImplodedMapped("\n", aEntity.documentTypeIDs(), IDocumentTypeIdentifier::getURIEncoded));
    };
    PDMetaManager.getStorageMgr().searchAllDocuments(aQuery, -1, aConsumer);
    aCSVWriter.flush();
}
Also used : Query(org.apache.lucene.search.Query) EExcelVersion(com.helger.poi.excel.EExcelVersion) CommonsTreeSet(com.helger.commons.collection.impl.CommonsTreeSet) IDocumentTypeIdentifier(com.helger.peppolid.IDocumentTypeIdentifier) PDMetaManager(com.helger.pd.indexer.mgr.PDMetaManager) LoggerFactory(org.slf4j.LoggerFactory) IMicroDocument(com.helger.xml.microdom.IMicroDocument) PDTFactory(com.helger.commons.datetime.PDTFactory) IMicroElement(com.helger.xml.microdom.IMicroElement) PDStoredBusinessEntity(com.helger.pd.indexer.storage.PDStoredBusinessEntity) PDField(com.helger.pd.indexer.storage.field.PDField) ThreadSafe(javax.annotation.concurrent.ThreadSafe) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) ICommonsOrderedMap(com.helger.commons.collection.impl.ICommonsOrderedMap) StandardCharsets(java.nio.charset.StandardCharsets) JsonObject(com.helger.json.JsonObject) WorkbookCreationHelper(com.helger.poi.excel.WorkbookCreationHelper) ICommonsList(com.helger.commons.collection.impl.ICommonsList) IJsonArray(com.helger.json.IJsonArray) UnifiedResponse(com.helger.servlet.response.UnifiedResponse) CSVWriter(com.helger.commons.csv.CSVWriter) PDStoredContact(com.helger.pd.indexer.storage.PDStoredContact) Writer(java.io.Writer) WebFileIO(com.helger.photon.app.io.WebFileIO) ESuccess(com.helger.commons.state.ESuccess) FileSystemResource(com.helger.commons.io.resource.FileSystemResource) IJsonObject(com.helger.json.IJsonObject) MicroDocument(com.helger.xml.microdom.MicroDocument) CHttpHeader(com.helger.commons.http.CHttpHeader) JsonArray(com.helger.json.JsonArray) FileHelper(com.helger.commons.io.file.FileHelper) PDStoredIdentifier(com.helger.pd.indexer.storage.PDStoredIdentifier) ICommonsSortedSet(com.helger.commons.collection.impl.ICommonsSortedSet) IParticipantIdentifier(com.helger.peppolid.IParticipantIdentifier) Nonnull(javax.annotation.Nonnull) WillNotClose(javax.annotation.WillNotClose) Logger(org.slf4j.Logger) CommonsArrayList(com.helger.commons.collection.impl.CommonsArrayList) StringHelper(com.helger.commons.string.StringHelper) PDTWebDateHelper(com.helger.commons.datetime.PDTWebDateHelper) IOException(java.io.IOException) File(java.io.File) JsonWriter(com.helger.json.serialize.JsonWriter) SimpleReadWriteLock(com.helger.commons.concurrent.SimpleReadWriteLock) MicroWriter(com.helger.xml.microdom.serialize.MicroWriter) Consumer(java.util.function.Consumer) PDStoredMLName(com.helger.pd.indexer.storage.PDStoredMLName) EQueryMode(com.helger.pd.indexer.storage.EQueryMode) CommonsLinkedHashMap(com.helger.commons.collection.impl.CommonsLinkedHashMap) ExcelStyle(com.helger.poi.excel.style.ExcelStyle) Comparator(java.util.Comparator) Query(org.apache.lucene.search.Query) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) PDStoredIdentifier(com.helger.pd.indexer.storage.PDStoredIdentifier) PDStoredMLName(com.helger.pd.indexer.storage.PDStoredMLName) IDocumentTypeIdentifier(com.helger.peppolid.IDocumentTypeIdentifier) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) PDStoredContact(com.helger.pd.indexer.storage.PDStoredContact)

Aggregations

ICommonsList (com.helger.commons.collection.impl.ICommonsList)6 PDStoredBusinessEntity (com.helger.pd.indexer.storage.PDStoredBusinessEntity)6 IParticipantIdentifier (com.helger.peppolid.IParticipantIdentifier)6 CommonsArrayList (com.helger.commons.collection.impl.CommonsArrayList)4 PDStoredMLName (com.helger.pd.indexer.storage.PDStoredMLName)4 IDocumentTypeIdentifier (com.helger.peppolid.IDocumentTypeIdentifier)4 Query (org.apache.lucene.search.Query)4 ICommonsMap (com.helger.commons.collection.impl.ICommonsMap)3 ICommonsOrderedMap (com.helger.commons.collection.impl.ICommonsOrderedMap)3 StringHelper (com.helger.commons.string.StringHelper)3 IJsonArray (com.helger.json.IJsonArray)3 IJsonObject (com.helger.json.IJsonObject)3 JsonArray (com.helger.json.JsonArray)3 JsonObject (com.helger.json.JsonObject)3 PDMetaManager (com.helger.pd.indexer.mgr.PDMetaManager)3 PDStorageManager (com.helger.pd.indexer.storage.PDStorageManager)3 IMicroDocument (com.helger.xml.microdom.IMicroDocument)3 IMicroElement (com.helger.xml.microdom.IMicroElement)3 MicroDocument (com.helger.xml.microdom.MicroDocument)3 CommonsLinkedHashMap (com.helger.commons.collection.impl.CommonsLinkedHashMap)2