Search in sources :

Example 36 with IJsonObject

use of com.helger.json.IJsonObject in project phoss-directory by phax.

the class ExportAllManager method queryAllContainedParticipantsAsJSON.

@Nonnull
public static IJsonObject queryAllContainedParticipantsAsJSON() throws IOException {
    final Query aQuery = new MatchAllDocsQuery();
    // Query all and group by participant ID
    final ICommonsSortedSet<IParticipantIdentifier> aSet = new CommonsTreeSet<>(Comparator.comparing(IParticipantIdentifier::getURIEncoded));
    PDMetaManager.getStorageMgr().searchAll(aQuery, -1, PDField.PARTICIPANT_ID::getDocValue, aSet::add);
    // XML root
    final IJsonObject aObj = new JsonObject();
    aObj.add("version", 1);
    aObj.add("creationdt", PDTWebDateHelper.getAsStringXSD(PDTFactory.getCurrentZonedDateTimeUTC()));
    aObj.add("count", aSet.size());
    // For all participants
    final IJsonArray aArray = new JsonArray();
    for (final IParticipantIdentifier aParticipantID : aSet) aArray.add(aParticipantID.getURIEncoded());
    aObj.addJson("participants", aArray);
    return aObj;
}
Also used : IJsonArray(com.helger.json.IJsonArray) JsonArray(com.helger.json.JsonArray) Query(org.apache.lucene.search.Query) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) CommonsTreeSet(com.helger.commons.collection.impl.CommonsTreeSet) IJsonObject(com.helger.json.IJsonObject) JsonObject(com.helger.json.JsonObject) IJsonObject(com.helger.json.IJsonObject) IJsonArray(com.helger.json.IJsonArray) MatchAllDocsQuery(org.apache.lucene.search.MatchAllDocsQuery) IParticipantIdentifier(com.helger.peppolid.IParticipantIdentifier) Nonnull(javax.annotation.Nonnull)

Example 37 with IJsonObject

use of com.helger.json.IJsonObject 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
        final 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();
        }
        // 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 38 with IJsonObject

use of com.helger.json.IJsonObject in project phoss-directory by phax.

the class PDBusinessCard method getAsJson.

@Nonnull
public IJsonObject getAsJson() {
    final IJsonObject ret = new JsonObject();
    ret.addJson("participant", m_aParticipantIdentifier.getAsJson());
    ret.addJson("entity", new JsonArray().addAllMapped(m_aBusinessEntities, PDBusinessEntity::getAsJson));
    return ret;
}
Also used : JsonArray(com.helger.json.JsonArray) IJsonObject(com.helger.json.IJsonObject) IJsonObject(com.helger.json.IJsonObject) JsonObject(com.helger.json.JsonObject) Nonnull(javax.annotation.Nonnull)

Example 39 with IJsonObject

use of com.helger.json.IJsonObject in project phoss-directory by phax.

the class PDBusinessEntity method getAsJson.

@Nonnull
public IJsonObject getAsJson() {
    final IJsonObject ret = new JsonObject();
    ret.addJson("name", new JsonArray().addAllMapped(m_aNames, PDName::getAsJson));
    ret.add("countrycode", m_sCountryCode);
    if (hasGeoInfo())
        ret.add("geoinfo", m_sGeoInfo);
    if (m_aIDs.isNotEmpty())
        ret.addJson("id", new JsonArray().addAllMapped(m_aIDs, PDIdentifier::getAsJson));
    if (m_aWebsiteURIs.isNotEmpty())
        ret.addJson("website", new JsonArray().addAll(m_aWebsiteURIs));
    if (m_aContacts.isNotEmpty())
        ret.addJson("contact", new JsonArray().addAllMapped(m_aContacts, PDContact::getAsJson));
    if (hasAdditionalInfo())
        ret.add("additionalinfo", m_sAdditionalInfo);
    if (hasRegistrationDate())
        ret.add("regdate", PDTWebDateHelper.getAsStringXSD(m_aRegistrationDate));
    return ret;
}
Also used : JsonArray(com.helger.json.JsonArray) IJsonObject(com.helger.json.IJsonObject) IJsonObject(com.helger.json.IJsonObject) JsonObject(com.helger.json.JsonObject) Nonnull(javax.annotation.Nonnull)

Example 40 with IJsonObject

use of com.helger.json.IJsonObject in project phoss-directory by phax.

the class PDContact method getAsJson.

@Nonnull
public IJsonObject getAsJson() {
    final IJsonObject ret = new JsonObject();
    ret.add("type", m_sType);
    ret.add("name", m_sName);
    ret.add("phonenumber", m_sPhoneNumber);
    ret.add("email", m_sEmail);
    return ret;
}
Also used : IJsonObject(com.helger.json.IJsonObject) IJsonObject(com.helger.json.IJsonObject) JsonObject(com.helger.json.JsonObject) Nonnull(javax.annotation.Nonnull)

Aggregations

IJsonObject (com.helger.json.IJsonObject)79 JsonObject (com.helger.json.JsonObject)44 Nonnull (javax.annotation.Nonnull)41 IJsonArray (com.helger.json.IJsonArray)22 JsonArray (com.helger.json.JsonArray)19 Test (org.junit.Test)15 JsonWriter (com.helger.json.serialize.JsonWriter)12 IJson (com.helger.json.IJson)10 Map (java.util.Map)10 StopWatch (com.helger.commons.timing.StopWatch)9 IParticipantIdentifier (com.helger.peppolid.IParticipantIdentifier)9 ZonedDateTime (java.time.ZonedDateTime)9 CommonsArrayList (com.helger.commons.collection.impl.CommonsArrayList)7 IError (com.helger.commons.error.IError)7 PDBusinessCard (com.helger.pd.businesscard.generic.PDBusinessCard)5 IDocumentTypeIdentifier (com.helger.peppolid.IDocumentTypeIdentifier)5 Nullable (javax.annotation.Nullable)5 Nonempty (com.helger.commons.annotation.Nonempty)4 ReturnsMutableCopy (com.helger.commons.annotation.ReturnsMutableCopy)3 CommonsLinkedHashMap (com.helger.commons.collection.impl.CommonsLinkedHashMap)3