Projects >> atlas-feeds >>bcddcd309d3bc78ea153174051c3c838eef6b9ee

Chunk
Conflicting content
        }

        if (id != null) {
<<<<<<< HEAD
            return new InterlinkBroadcast(id, episode).withDuration(toDuration(broadcast.getBroadcastDuration())).withBroadcastStart(broadcast.getTransmissionTime()).withLastUpdated(broadcast.getLastUpdated());
=======
            return new InterlinkBroadcast(id, DEFAULT_OPERATION).withDuration(toDuration(broadcast.getBroadcastDuration())).withBroadcastStart(broadcast.getTransmissionTime()).withLastUpdated(broadcast.getLastUpdated());
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
        }
        return null;
    }
Solution content
        }

        if (id != null) {
            return new InterlinkBroadcast(id, DEFAULT_OPERATION, episode).withDuration(toDuration(broadcast.getBroadcastDuration())).withBroadcastStart(broadcast.getTransmissionTime()).withLastUpdated(broadcast.getLastUpdated());
        }
        return null;
    }
File
C4PlaylistToInterterlinkFeedAdapter.java
Developer's decision
Manual
Kind of conflict
Method invocation
Return statement
Chunk
Conflicting content
public class InterlinkBrand extends InterlinkContent {

<<<<<<< HEAD
	public InterlinkBrand(String id) {
		super(id, null);
=======
	private final Set series = Sets.newHashSet();
	private final Set episodes = Sets.newHashSet();

	public InterlinkBrand(String id, Operation operation) {
		super(id, operation, null);
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
	}
	
	public InterlinkBrand withTitle(String title) {
Solution content
public class InterlinkBrand extends InterlinkContent {

	public InterlinkBrand(String id, Operation operation) {
		super(id, operation, null);
	}
	
	public InterlinkBrand withTitle(String title) {
File
InterlinkBrand.java
Developer's decision
Combination
Kind of conflict
Attribute
Method invocation
Method signature
Chunk
Conflicting content
	private String service;
    private final InterlinkEpisode episode;

<<<<<<< HEAD
	public InterlinkBroadcast(String id, InterlinkEpisode episode) {
		super(id);
        this.episode = episode;
=======
	public InterlinkBroadcast(String id, Operation operation) {
		super(id, operation);
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
	}

	public InterlinkBroadcast withBroadcastStart(DateTime broadcastStart) {
Solution content
	private String service;
    private final InterlinkEpisode episode;

	public InterlinkBroadcast(String id, Operation operation, InterlinkEpisode episode) {
		super(id, operation);
        this.episode = episode;
	}

	public InterlinkBroadcast withBroadcastStart(DateTime broadcastStart) {
File
InterlinkBroadcast.java
Developer's decision
Manual
Kind of conflict
Attribute
Method invocation
Method signature
Chunk
Conflicting content
    private final String link;
    private final InterlinkContent parent;
	
<<<<<<< HEAD
	public InterlinkEpisode(String id, Integer index, String link, InterlinkContent parent) {
		super(id, index);
=======
	public InterlinkEpisode(String id, Operation operation, Integer index, String link) {
		super(id, operation, index);
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
        this.link = link;
        this.parent = parent;
	}
Solution content
    private final String link;
    private final InterlinkContent parent;
	
	public InterlinkEpisode(String id, Operation operation, Integer index, String link, InterlinkContent parent) {
		super(id, operation, index);
        this.link = link;
        this.parent = parent;
	}
File
InterlinkEpisode.java
Developer's decision
Manual
Kind of conflict
Method invocation
Method signature
Chunk
Conflicting content
    private String service;
    private final InterlinkEpisode episode;

<<<<<<< HEAD
    public InterlinkOnDemand(String id, DateTime availabilityStart, DateTime availabilityEnd, Duration duration, InterlinkEpisode episode) {
		super(id);
=======
    public InterlinkOnDemand(String id, Operation operation, DateTime availabilityStart, DateTime availabilityEnd, Duration duration) {
		super(id, operation);
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
        this.availabilityStart = availabilityStart;
        this.availabilityEnd = availabilityEnd;
        this.duration = duration;
Solution content
    private String service;
    private final InterlinkEpisode episode;

    public InterlinkOnDemand(String id, Operation operation, DateTime availabilityStart, DateTime availabilityEnd, Duration duration, InterlinkEpisode episode) {
		super(id, operation);
        this.availabilityStart = availabilityStart;
        this.availabilityEnd = availabilityEnd;
        this.duration = duration;
File
InterlinkOnDemand.java
Developer's decision
Manual
Kind of conflict
Method invocation
Method signature
Chunk
Conflicting content
		return this;

	private final InterlinkBrand brand;
	
<<<<<<< HEAD
	public InterlinkSeries(String id, Integer index, InterlinkBrand brand) {
		super(id, index);
        this.brand = brand;
=======
	public InterlinkSeries(String id, Operation operation, Integer index) {
		super(id, operation, index);
	}
	
	public InterlinkSeries addEpisode(InterlinkEpisode episode) {
		episodes.add(episode);
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
	}
	
	public InterlinkSeries withTitle(String title) {
Solution content
	}
	

	private final InterlinkBrand brand;
	
	public InterlinkSeries(String id, Operation operation, Integer index, InterlinkBrand brand) {
		super(id, operation, index);
        this.brand = brand;
	public InterlinkSeries withTitle(String title) {
File
InterlinkSeries.java
Developer's decision
Manual
Kind of conflict
Attribute
Method declaration
Method invocation
Method signature
Return statement
Chunk
Conflicting content
	private @Autowired KnownTypeQueryExecutor executor;

	public @Bean InterlinkController feedController() {
<<<<<<< HEAD
		return new InterlinkController(resolver, executor);
=======
		return new InterlinkController(resolver, ImmutableMap.of(Publisher.C4, new C4PlaylistToInterterlinkFeedAdapter(resolver)));
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
	}
}
Solution content
	private @Autowired KnownTypeQueryExecutor executor;

	public @Bean InterlinkController feedController() {
		return new InterlinkController(resolver, executor, ImmutableMap.of(Publisher.C4, new C4PlaylistToInterterlinkFeedAdapter(resolver)));
	}
}
File
InterlinkingModule.java
Developer's decision
Manual
Kind of conflict
Method invocation
Return statement
Chunk
Conflicting content
		.onlyTruncateAtAWordBoundary()
		.omitTrailingPunctuationWhenTruncated()
		.onlyStartANewSentenceIfTheSentenceIsAtLeastPercentComplete(50).withOmissionMarker("...");
<<<<<<< HEAD
    
    public InterlinkFeed fromBrands(String id, String publisher, DateTime from, DateTime to, List brands) {
        InterlinkFeed feed = feed(id, publisher);
        
        for (Brand brand: brands) {
            InterlinkBrand interlinkBrand = fromBrand(brand);
            if (qualifies(from, to, brand)) {
                feed.addEntry(interlinkBrand);
            }
            
            Map seriesLookup = Maps.newHashMap();
            for (Item item : brand.getItems()) {
                InterlinkSeries linkSeries = null;
                if (item instanceof Episode) {
                    Episode episode = (Episode) item;
                    Series series = episode.getSeriesSummary();
                    if (series != null && qualifies(from, to, series)) {
                        linkSeries = seriesLookup.get(series.getCanonicalUri());
                        if (linkSeries == null) {
                            linkSeries = fromSeries(series, interlinkBrand);
                            feed.addEntry(linkSeries);
                            seriesLookup.put(series.getCanonicalUri(), linkSeries);
=======
	
	private final Truncator descriptionTruncator = new Truncator()
		.withMaxLength(180)
		.onlyTruncateAtAWordBoundary()
		.omitTrailingPunctuationWhenTruncated()
		.onlyStartANewSentenceIfTheSentenceIsAtLeastPercentComplete(50).withOmissionMarker("...");
	
    public InterlinkFeed fromPlaylist(Playlist playlist) {
        InterlinkFeed feed = new InterlinkFeed(playlist.getCanonicalUri());

        // TODO These are dummy entries
        feed.withAuthor(new InterlinkFeedAuthor(playlist.getPublisher().name(), playlist.getPublisher().name()));
        feed.withUpdatedAt(new DateTime());

        for (Playlist subPlaylist : playlist.getPlaylists()) {
            if (subPlaylist instanceof Brand) {
                InterlinkBrand brand = fromBrand((Brand) subPlaylist);
                feed.addBrand(brand);

                Map seriesLookup = Maps.newHashMap();

                for (Item item : subPlaylist.getItems()) {

                    if (item instanceof Episode) {
                        Episode episode = (Episode) item;
                        Series series = episode.getSeriesSummary();
                        if (series != null) {
                            InterlinkSeries linkSeries = seriesLookup.get(series.getCanonicalUri());
                            if (linkSeries == null) {
                                linkSeries = fromSeries(series);
                                brand.addSeries(linkSeries);
                                seriesLookup.put(series.getCanonicalUri(), linkSeries);
                            }
                            linkSeries.addEpisode(fromItem(episode));
                            continue;
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
                        }
                    }
                }
Solution content
		.onlyTruncateAtAWordBoundary()
		.omitTrailingPunctuationWhenTruncated()
		.onlyStartANewSentenceIfTheSentenceIsAtLeastPercentComplete(50).withOmissionMarker("...");
	
	private final Truncator descriptionTruncator = new Truncator()
        .withMaxLength(180)
        .onlyTruncateAtAWordBoundary()
        .omitTrailingPunctuationWhenTruncated()
        .onlyStartANewSentenceIfTheSentenceIsAtLeastPercentComplete(50).withOmissionMarker("...");
    
    public InterlinkFeed fromBrands(String id, String publisher, DateTime from, DateTime to, List brands) {
        InterlinkFeed feed = feed(id, publisher);
        
        for (Brand brand: brands) {
            InterlinkBrand interlinkBrand = fromBrand(brand);
            if (qualifies(from, to, brand)) {
                feed.addEntry(interlinkBrand);
            }
            
            Map seriesLookup = Maps.newHashMap();
            for (Item item : brand.getItems()) {
                InterlinkSeries linkSeries = null;
                if (item instanceof Episode) {
                    Episode episode = (Episode) item;
                    Series series = episode.getSeriesSummary();
                    if (series != null && qualifies(from, to, series)) {
                        linkSeries = seriesLookup.get(series.getCanonicalUri());
                        if (linkSeries == null) {
                            linkSeries = fromSeries(series, interlinkBrand);
                            feed.addEntry(linkSeries);
                            seriesLookup.put(series.getCanonicalUri(), linkSeries);
                        }
                    }
                }
File
PlaylistToInterlinkFeedAdapter.java
Developer's decision
Combination
Kind of conflict
Attribute
Cast expression
Comment
Continue statement
For statement
If statement
Method invocation
Method signature
Variable
Chunk
Conflicting content
        return feed;
    }

<<<<<<< HEAD
    private InterlinkSeries fromSeries(Series series, InterlinkBrand brand) {
        return new InterlinkSeries(series.getCanonicalUri(), series.getSeriesNumber(), brand)
=======
    private InterlinkSeries fromSeries(Series series) {
        return new InterlinkSeries(idFrom(series), DEFAULT_OPERATION, series.getSeriesNumber())
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
        	.withTitle(series.getTitle())
        	.withDescription(toDescription(series))
        	.withLastUpdated(series.getLastUpdated())
Solution content
        return feed;
    }

    private InterlinkSeries fromSeries(Series series, InterlinkBrand brand) {
        return new InterlinkSeries(idFrom(series), DEFAULT_OPERATION, series.getSeriesNumber(), brand)
        	.withTitle(series.getTitle())
        	.withDescription(toDescription(series))
        	.withLastUpdated(series.getLastUpdated())
File
PlaylistToInterlinkFeedAdapter.java
Developer's decision
Manual
Kind of conflict
Method invocation
Method signature
Return statement
Chunk
Conflicting content
        	.withThumbnail(series.getImage());
    }

<<<<<<< HEAD
    private void populateFeedWithItem(InterlinkFeed feed, Item item, DateTime to, DateTime from, InterlinkContent parent) {
        InterlinkEpisode episode = new InterlinkEpisode(item.getCanonicalUri(), itemIndexFrom(item), item.getCanonicalUri(), parent)
            .withTitle(item.getTitle())
            .withDescription(item.getDescription())
            .withLastUpdated(item.getLastUpdated())
            .withSummary(toSummary(item))
            .withThumbnail(item.getImage());
        
        if (qualifies(from, to, item)) {
            feed.addEntry(episode);
        }
=======
    private InterlinkEpisode fromItem(Item item) {
        InterlinkEpisode episode = new InterlinkEpisode(idFrom(item), DEFAULT_OPERATION, itemIndexFrom(item), item.getCanonicalUri())
        	.withTitle(item.getTitle())
        	.withLastUpdated(item.getLastUpdated())
        	.withSummary(toSummary(item))
        	.withDescription(toDescription(item))
        	.withThumbnail(item.getImage());
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a

        for (Broadcast broadcast : broadcasts(item)) {
            if (qualifies(from, to, broadcast)) {
Solution content
        	.withThumbnail(series.getImage());
    }

    private void populateFeedWithItem(InterlinkFeed feed, Item item, DateTime to, DateTime from, InterlinkContent parent) {
        InterlinkEpisode episode = new InterlinkEpisode(idFrom(item), DEFAULT_OPERATION, itemIndexFrom(item), item.getCanonicalUri(), parent)
            .withTitle(item.getTitle())
            .withDescription(item.getDescription())
            .withLastUpdated(item.getLastUpdated())
            .withSummary(toSummary(item))
            .withThumbnail(item.getImage());
        
        if (qualifies(from, to, item)) {
            feed.addEntry(episode);
        }

        for (Broadcast broadcast : broadcasts(item)) {
            if (qualifies(from, to, broadcast)) {
File
PlaylistToInterlinkFeedAdapter.java
Developer's decision
Manual
Kind of conflict
If statement
Method invocation
Method signature
Variable
Chunk
Conflicting content
        String id = broadcast.getBroadcastOn() + "-" + broadcast.getTransmissionTime().getMillis();
        String service = CHANNEL_LOOKUP.get(broadcast.getBroadcastOn());

<<<<<<< HEAD
        return new InterlinkBroadcast(id, episode)
=======
        return new InterlinkBroadcast(id, DEFAULT_OPERATION)
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
    		.withLastUpdated(broadcast.getLastUpdated())
        	.withDuration(toDuration(broadcast.getBroadcastDuration()))
        	.withBroadcastStart(broadcast.getTransmissionTime())
Solution content
        String id = broadcast.getBroadcastOn() + "-" + broadcast.getTransmissionTime().getMillis();
        String service = CHANNEL_LOOKUP.get(broadcast.getBroadcastOn());

        return new InterlinkBroadcast(id, DEFAULT_OPERATION, episode)
    		.withLastUpdated(broadcast.getLastUpdated())
        	.withDuration(toDuration(broadcast.getBroadcastDuration()))
        	.withBroadcastStart(broadcast.getTransmissionTime())
File
PlaylistToInterlinkFeedAdapter.java
Developer's decision
Manual
Kind of conflict
Method invocation
Return statement
Chunk
Conflicting content
    static InterlinkOnDemand fromLocation(Location linkLocation, InterlinkEpisode episode, int d) {
        Duration duration = new Duration(d*1000);
        
<<<<<<< HEAD
        return new InterlinkOnDemand(linkLocation.getUri(), linkLocation.getPolicy().getAvailabilityStart(), linkLocation.getPolicy().getAvailabilityEnd(), duration, episode)
=======
        return new InterlinkOnDemand(linkLocation.getUri(), DEFAULT_OPERATION, linkLocation.getPolicy().getAvailabilityStart(), linkLocation.getPolicy().getAvailabilityEnd(), duration)
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
            .withLastUpdated(linkLocation.getLastUpdated())
            .withService("4oD");
    }
Solution content
    static InterlinkOnDemand fromLocation(Location linkLocation, InterlinkEpisode episode, int d) {
        Duration duration = new Duration(d*1000);
        
        return new InterlinkOnDemand(linkLocation.getUri(), DEFAULT_OPERATION, linkLocation.getPolicy().getAvailabilityStart(), linkLocation.getPolicy().getAvailabilityEnd(), duration, episode)
            .withLastUpdated(linkLocation.getLastUpdated())
            .withService("4oD");
    }
File
PlaylistToInterlinkFeedAdapter.java
Developer's decision
Manual
Kind of conflict
Method invocation
Return statement
Chunk
Conflicting content
import javax.servlet.http.HttpServletResponse;

<<<<<<< HEAD
import org.atlasapi.content.criteria.ContentQuery;
import org.atlasapi.content.criteria.ContentQueryBuilder;
import org.atlasapi.content.criteria.attribute.Attributes;
import org.atlasapi.feeds.interlinking.C4PlaylistToInterterlinkFeedAdapter;
=======
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
import org.atlasapi.feeds.interlinking.DelegatingPlaylistToInterlinkAdapter;
import org.atlasapi.feeds.interlinking.PlaylistToInterlinkFeed;
import org.atlasapi.feeds.interlinking.PlaylistToInterlinkFeedAdapter;
Solution content
import javax.servlet.http.HttpServletResponse;

import org.atlasapi.content.criteria.ContentQuery;
import org.atlasapi.content.criteria.ContentQueryBuilder;
import org.atlasapi.content.criteria.attribute.Attributes;
import org.atlasapi.feeds.interlinking.DelegatingPlaylistToInterlinkAdapter;
import org.atlasapi.feeds.interlinking.PlaylistToInterlinkFeed;
import org.atlasapi.feeds.interlinking.PlaylistToInterlinkFeedAdapter;
File
InterlinkController.java
Developer's decision
Combination
Kind of conflict
Import
Chunk
Conflicting content
import org.atlasapi.feeds.interlinking.PlaylistToInterlinkFeed;
import org.atlasapi.feeds.interlinking.PlaylistToInterlinkFeedAdapter;
import org.atlasapi.feeds.interlinking.outputting.InterlinkFeedOutputter;
<<<<<<< HEAD
import org.atlasapi.media.entity.Brand;
=======
import org.atlasapi.feeds.interlinking.validation.InterlinkOutputValidator;
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
import org.atlasapi.media.entity.Playlist;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.persistence.content.ContentResolver;
Solution content
import org.atlasapi.feeds.interlinking.PlaylistToInterlinkFeed;
import org.atlasapi.feeds.interlinking.PlaylistToInterlinkFeedAdapter;
import org.atlasapi.feeds.interlinking.outputting.InterlinkFeedOutputter;
import org.atlasapi.feeds.interlinking.validation.InterlinkOutputValidator;
import org.atlasapi.media.entity.Brand;
import org.atlasapi.media.entity.Playlist;
import org.atlasapi.media.entity.Publisher;
import org.atlasapi.persistence.content.ContentResolver;
File
InterlinkController.java
Developer's decision
Concatenation
Kind of conflict
Import
Chunk
Conflicting content
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

<<<<<<< HEAD
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
=======
import com.google.common.base.Charsets;
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
import com.metabroadcast.common.media.MimeType;
import com.metabroadcast.common.time.DateTimeZones;
Solution content
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.google.common.base.Charsets;
import com.google.common.collect.Lists;
import com.metabroadcast.common.media.MimeType;
import com.metabroadcast.common.time.DateTimeZones;
File
InterlinkController.java
Developer's decision
Combination
Kind of conflict
Import
Chunk
Conflicting content
    
    private final static String FEED_ID = "https://www.channel4.com/linking/";

<<<<<<< HEAD
    private final ContentResolver resolver;
    private final InterlinkFeedOutputter outputter = new InterlinkFeedOutputter();
    private final PlaylistToInterlinkFeed adapter;
    private final DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd").withZone(DateTimeZones.LONDON);
    private final KnownTypeQueryExecutor executor;

    public InterlinkController(ContentResolver resolver, KnownTypeQueryExecutor executor) {
        this.resolver = resolver;
        this.executor = executor;

        Map delegates = Maps.newHashMap();
        delegates.put(Publisher.C4, new C4PlaylistToInterterlinkFeedAdapter());
        this.adapter = new DelegatingPlaylistToInterlinkAdapter(delegates, new PlaylistToInterlinkFeedAdapter());
    }

    @RequestMapping("/feeds/bbc-interlinking")
    public void showFeed(HttpServletResponse response, @RequestParam String uri) throws IOException {
        response.setContentType(MimeType.APPLICATION_ATOM_XML.toString());
        response.setStatus(HttpServletResponse.SC_OK);
        
        Playlist playlist = (Playlist) resolver.findByUri(uri);
        List brands = Lists.newArrayList();
        for (Playlist subPlaylist: playlist.getPlaylists()) {
            if (subPlaylist instanceof Brand) {
                brands.add((Brand) subPlaylist);
            }
        }
        
        outputter.output(adapter.fromBrands(playlist.getCanonicalUri(), playlist.getPublisher().title(), null, null, brands), response.getOutputStream());
    }

    @RequestMapping("/feeds/bbc-interlinking/{date}")
    public void updatedFeed(HttpServletResponse response, @PathVariable String date) throws IOException {
        DateTime from = fmt.parseDateTime(date);
        DateTime to = from.plusDays(1);
        response.setContentType(MimeType.APPLICATION_ATOM_XML.toString());
        response.setStatus(HttpServletResponse.SC_OK);

        ContentQuery query = ContentQueryBuilder.query()
                .equalTo(Attributes.ITEM_PUBLISHER, Publisher.C4.key())
                .after(Attributes.BRAND_THIS_OR_CHILD_LAST_UPDATED, from)
                .before(Attributes.BRAND_THIS_OR_CHILD_LAST_UPDATED, to)
                .build();
        List brands = executor.executeBrandQuery(query);
        
        outputter.output(adapter.fromBrands(FEED_ID+date, Publisher.C4.title(), from, to, brands), response.getOutputStream());
    }
=======
	private final ContentResolver resolver;
	private final InterlinkFeedOutputter outputter = new InterlinkFeedOutputter();
	private final InterlinkOutputValidator validator = new InterlinkOutputValidator();
	private final PlaylistToInterlinkFeed adapter;

	public InterlinkController(ContentResolver resolver, Map delegates) {
		this.resolver = resolver;
		this.adapter = new DelegatingPlaylistToInterlinkAdapter(delegates, new PlaylistToInterlinkFeedAdapter());
	}
	
	@RequestMapping("/feeds/bbc-interlinking")
	public void showFeed(HttpServletResponse response, @RequestParam String uri) throws IOException {
		response.setContentType(MimeType.APPLICATION_ATOM_XML.toString());
		response.setStatus(HttpServletResponse.SC_OK);
		outputter.output(adapter.fromPlaylist((Playlist) resolver.findByUri(uri)), response.getOutputStream());
	}
	
	@RequestMapping("/feeds/bbc-interlinking/validate")
	public void valiudateFeed(HttpServletResponse response, @RequestParam String uri) throws Exception {
		response.setStatus(HttpServletResponse.SC_OK);
		
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		
		outputter.output(adapter.fromPlaylist((Playlist) resolver.findByUri(uri)), out);
		
		validator.validatesAgainstSchema(out.toString(Charsets.UTF_8.toString()), response.getOutputStream());
	}
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
}
Solution content
        
    
    private final static String FEED_ID = "https://www.channel4.com/linking/";
    private final ContentResolver resolver;
    private final InterlinkFeedOutputter outputter = new InterlinkFeedOutputter();
    private final PlaylistToInterlinkFeed adapter;
    private final DateTimeFormatter fmt = DateTimeFormat.forPattern("yyyyMMdd").withZone(DateTimeZones.LONDON);
    private final KnownTypeQueryExecutor executor;
    private final InterlinkOutputValidator validator = new InterlinkOutputValidator();

    public InterlinkController(ContentResolver resolver, KnownTypeQueryExecutor executor, Map delegates) {
        this.resolver = resolver;
        this.executor = executor;
        this.adapter = new DelegatingPlaylistToInterlinkAdapter(delegates, new PlaylistToInterlinkFeedAdapter());
    }

    @RequestMapping("/feeds/bbc-interlinking")
    public void showFeed(HttpServletResponse response, @RequestParam String uri) throws IOException {
        response.setContentType(MimeType.APPLICATION_ATOM_XML.toString());
        response.setStatus(HttpServletResponse.SC_OK);
        
        Playlist playlist = (Playlist) resolver.findByUri(uri);
        List brands = Lists.newArrayList();
        for (Playlist subPlaylist: playlist.getPlaylists()) {
            if (subPlaylist instanceof Brand) {
                brands.add((Brand) subPlaylist);
            }
        }
        
        outputter.output(adapter.fromBrands(playlist.getCanonicalUri(), playlist.getPublisher().title(), null, null, brands), response.getOutputStream());
    }

    @RequestMapping("/feeds/bbc-interlinking/{date}")
    public void updatedFeed(HttpServletResponse response, @PathVariable String date) throws IOException {
        DateTime from = fmt.parseDateTime(date);
        DateTime to = from.plusDays(1);
        response.setContentType(MimeType.APPLICATION_ATOM_XML.toString());
        response.setStatus(HttpServletResponse.SC_OK);

        ContentQuery query = ContentQueryBuilder.query()
                .equalTo(Attributes.ITEM_PUBLISHER, Publisher.C4.key())
                .after(Attributes.BRAND_THIS_OR_CHILD_LAST_UPDATED, from)
                .before(Attributes.BRAND_THIS_OR_CHILD_LAST_UPDATED, to)
                .build();
        List brands = executor.executeBrandQuery(query);
        
        outputter.output(adapter.fromBrands(FEED_ID+date, Publisher.C4.title(), from, to, brands), response.getOutputStream());
    }
    
    @RequestMapping("/feeds/bbc-interlinking/validate")
    public void valiudateFeed(HttpServletResponse response, @RequestParam String uri) throws Exception {
        response.setStatus(HttpServletResponse.SC_OK);
        
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        
        Playlist playlist = (Playlist) resolver.findByUri(uri);
        List brands = Lists.newArrayList();
        for (Playlist subPlaylist: playlist.getPlaylists()) {
            if (subPlaylist instanceof Brand) {
                brands.add((Brand) subPlaylist);
            }
        }
        outputter.output(adapter.fromBrands(playlist.getCanonicalUri(), playlist.getPublisher().title(), null, null, brands), out);
        
        validator.validatesAgainstSchema(out.toString(Charsets.UTF_8.toString()), response.getOutputStream());
    }
}
File
InterlinkController.java
Developer's decision
Manual
Kind of conflict
Annotation
Attribute
Method declaration
Method invocation
Chunk
Conflicting content
			.withThumbnail("thumbnail");
		
		// add an episode directly to the brand
<<<<<<< HEAD
		InterlinkEpisode episodeWithoutASeries = new InterlinkEpisode("notInASeries", 2, "link", brand).withTitle("Episode not in a series").withLastUpdated(lastUpdated);
		InterlinkBroadcast broadcastWithoutASeries = new InterlinkBroadcast("broadcastNotInASeries", episodeWithoutASeries);
		InterlinkOnDemand onDemandWithoutASeries = new InterlinkOnDemand("odNotInASeries", lastUpdated, lastUpdated, new Duration(1000), episodeWithoutASeries);
		
		InterlinkSeries series = new InterlinkSeries("series2", 2, brand)
=======
		InterlinkEpisode episodeWithoutASeries = new InterlinkEpisode("notInASeries", Operation.STORE, 2, "link").withTitle("Episode not in a series").withLastUpdated(lastUpdated);
		
		episodeWithoutASeries.addBroadcast(new InterlinkBroadcast("broadcastNotInASeries", Operation.STORE));
		episodeWithoutASeries.addOnDemand(new InterlinkOnDemand("odNotInASeries", Operation.STORE, lastUpdated, lastUpdated, new Duration(1000)));
		
		brand.addEpisodeWithoutASeries(episodeWithoutASeries);
		
		InterlinkSeries series = new InterlinkSeries("series2", Operation.STORE, 2)
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
			.withTitle("Lark Rise to Candleford Series 2")
			.withSummary("Adaption of Flora Thompson's");
		
Solution content
			.withThumbnail("thumbnail");
		
		// add an episode directly to the brand
		InterlinkEpisode episodeWithoutASeries = new InterlinkEpisode("notInASeries", Operation.STORE, 2, "link", brand).withTitle("Episode not in a series").withLastUpdated(lastUpdated);
		InterlinkBroadcast broadcastWithoutASeries = new InterlinkBroadcast("broadcastNotInASeries", Operation.STORE, episodeWithoutASeries);
		InterlinkOnDemand onDemandWithoutASeries = new InterlinkOnDemand("odNotInASeries", Operation.STORE, lastUpdated, lastUpdated, new Duration(1000), episodeWithoutASeries);
		
		InterlinkSeries series = new InterlinkSeries("series2", Operation.STORE, 2, brand)

			.withTitle("Lark Rise to Candleford Series 2")
			.withSummary("Adaption of Flora Thompson's");
		
File
InterlinkFeedOutputterTest.java
Developer's decision
Manual
Kind of conflict
Method invocation
Variable
Chunk
Conflicting content
            .withTitle("Lark Rise to Candleford Episode 3")
            .withLastUpdated(lastUpdated);
		
<<<<<<< HEAD
		InterlinkOnDemand onDemand = new InterlinkOnDemand("ondemand5", lastUpdated, lastUpdated, new Duration(1000), episode);
		
		InterlinkBroadcast broadcast = new InterlinkBroadcast("broadcast4", episode)
			.withBroadcastStart(new DateTime("2010-01-10T21:00:00Z"))
			.withDuration(Duration.standardMinutes(45)).withLastUpdated(lastUpdated);
		
=======
		InterlinkOnDemand onDemand = new InterlinkOnDemand("ondemand5", Operation.STORE, lastUpdated, lastUpdated, new Duration(1000));
		
		InterlinkBroadcast broadcast = new InterlinkBroadcast("broadcast4", Operation.STORE)
			.withBroadcastStart(new DateTime("2010-01-10T21:00:00Z"))
			.withDuration(Duration.standardMinutes(45)).withLastUpdated(lastUpdated);
		
		InterlinkEpisode episode = new InterlinkEpisode("episode3", Operation.STORE, 3, "link")
			.withTitle("Lark Rise to Candleford Episode 3")
			.addBroadcast(broadcast)
			.addOnDemand(onDemand)
			.withLastUpdated(lastUpdated);
		
		series.addEpisode(episode);
		
>>>>>>> fa532ed384be96906b9e1aa77a54df6725cffd9a
		InterlinkFeed feed = new InterlinkFeed("https://www.bbc.co.uk/interlinking/20100115")
			.withTitle("BBC Daily Change Feed")
			.withSubtitle("All metadata changes for on demand BBC content")
Solution content
            .withTitle("Lark Rise to Candleford Episode 3")
            .withLastUpdated(lastUpdated);
		
		InterlinkOnDemand onDemand = new InterlinkOnDemand("ondemand5", Operation.STORE, lastUpdated, lastUpdated, new Duration(1000), episode);
		
		InterlinkBroadcast broadcast = new InterlinkBroadcast("broadcast4", Operation.STORE, episode)
			.withBroadcastStart(new DateTime("2010-01-10T21:00:00Z"))
			.withDuration(Duration.standardMinutes(45)).withLastUpdated(lastUpdated);
		
		InterlinkFeed feed = new InterlinkFeed("https://www.bbc.co.uk/interlinking/20100115")
			.withTitle("BBC Daily Change Feed")
			.withSubtitle("All metadata changes for on demand BBC content")
File
InterlinkFeedOutputterTest.java
Developer's decision
Manual
Kind of conflict
Method invocation
Variable