/** * 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; } }