net.di2e.ecdr.search.transform.response.rss.RSSResponseTransformer.java Source code

Java tutorial

Introduction

Here is the source code for net.di2e.ecdr.search.transform.response.rss.RSSResponseTransformer.java

Source

/**
 * Copyright (C) 2014 Cohesive Integrations, LLC (info@cohesiveintegrations.com)
 *
 * 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 net.di2e.ecdr.search.transform.response.rss;

import com.rometools.rome.feed.synd.SyndContent;
import com.rometools.rome.feed.synd.SyndEntry;
import com.rometools.rome.feed.synd.SyndFeed;
import com.rometools.rome.io.FeedException;
import com.rometools.rome.io.SyndFeedInput;
import com.rometools.rome.io.XmlReader;
import ddf.catalog.data.Metacard;
import ddf.catalog.data.Result;
import ddf.catalog.data.impl.MetacardImpl;
import ddf.catalog.data.impl.ResultImpl;
import ddf.catalog.operation.QueryRequest;
import ddf.catalog.operation.SourceResponse;
import ddf.catalog.operation.impl.SourceResponseImpl;
import net.di2e.ecdr.api.queryresponse.SearchResponseTransformer;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Map;

public class RSSResponseTransformer implements SearchResponseTransformer {

    private static final Logger LOGGER = LoggerFactory.getLogger(RSSResponseTransformer.class);

    @Override
    public SourceResponse processSearchResponse(InputStream inputStream, QueryRequest request, String siteName) {
        ArrayList<Result> resultList = new ArrayList<>();
        Map<String, Serializable> responseProperties = null;
        SyndFeedInput input = new SyndFeedInput();
        try {
            SyndFeed feed = input.build(new XmlReader(inputStream));
            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Marshaled response into feed object: \n{}", feed.toString());
            }
            for (SyndEntry entry : feed.getEntries()) {
                resultList.add(convertEntryToResult(entry, siteName));
            }

        } catch (IOException | FeedException e) {
            LOGGER.warn("Could not transform response to metacards, returning 0 results.", e);
        }
        int totalResults = resultList.size();
        return new SourceResponseImpl(request, responseProperties, resultList, totalResults);
    }

    private Result convertEntryToResult(SyndEntry entry, String siteName) {
        ResultImpl result = new ResultImpl();
        result.setMetacard(convertEntryToMetacard(entry, siteName));
        return result;
    }

    private Metacard convertEntryToMetacard(SyndEntry entry, String siteName) {
        MetacardImpl metacard = new MetacardImpl();
        String id = entry.getUri();
        String link = entry.getLink();
        // might have had an issue with a whitespace in the ID so this is just a safety check
        id = StringUtils.deleteWhitespace(id);
        metacard.setId(id);
        if (entry.getLink() != null) {
            try {
                metacard.setResourceURI(new URI(link));
            } catch (URISyntaxException use) {
                LOGGER.warn("Could not set URI due to bad link in data.", use);
            }
        }
        metacard.setSourceId(siteName);
        metacard.setTitle(entry.getTitle());
        metacard.setCreatedDate(entry.getPublishedDate());
        if (entry.getUpdatedDate() != null) {
            metacard.setModifiedDate(entry.getUpdatedDate());
        }
        SyndContent content = entry.getDescription();
        if (content.getType().equals("text/xml")) {
            metacard.setMetadata(content.getValue());
        } else {
            metacard.setMetadata("<xml-fragment>" + content.getValue() + "</xml-fragment>");
        }
        return metacard;
    }
}