io.wcm.caravan.pipeline.extensions.hal.crawler.OutputProcessors.java Source code

Java tutorial

Introduction

Here is the source code for io.wcm.caravan.pipeline.extensions.hal.crawler.OutputProcessors.java

Source

/*
 * #%L
 * wcm.io
 * %%
 * Copyright (C) 2014 wcm.io
 * %%
 * 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.
 * #L%
 */
package io.wcm.caravan.pipeline.extensions.hal.crawler;

import java.util.List;

import org.osgi.annotation.versioning.ProviderType;

import com.google.common.collect.Iterables;

import io.wcm.caravan.hal.resource.HalResource;
import io.wcm.caravan.hal.resource.Link;
import io.wcm.caravan.io.http.request.CaravanHttpRequest;
import io.wcm.caravan.pipeline.JsonPipelineOutput;

/**
 * Default output processors
 */
@ProviderType
public final class OutputProcessors {

    private OutputProcessors() {
        // nothing to do
    }

    /**
     * Creates a flat Collection of HAL links for each processed request.
     * @return Output processor creating flat links collection
     */
    public static OutputProcessor report() {
        return new OutputProcessor() {

            @Override
            public JsonPipelineOutput process(JsonPipelineOutput previousStepOutput,
                    List<JsonPipelineOutput> loadedLinkOutputs) {

                // create output HAL
                String url = getUrl(previousStepOutput);
                HalResource hal = new HalResource(url);

                // add URL with relation to links
                CaravanHttpRequest request = getRequest(previousStepOutput);
                if (request != null && request.getHeaders().containsKey(HalCrawler.HEADER_CRAWLER_RELATION)) {
                    String relation = Iterables
                            .getFirst(request.getHeaders().get(HalCrawler.HEADER_CRAWLER_RELATION), null);
                    hal.addLinks(relation, new Link(url));
                }

                // add child links
                loadedLinkOutputs.stream().map(loadedLinkOutput -> new HalResource(loadedLinkOutput.getPayload()))
                        .flatMap(loadedLinkHal -> loadedLinkHal.getLinks().entries().stream())
                        .filter(entry -> !"self".equals(entry.getKey()))
                        .forEach(entry -> hal.addLinks(entry.getKey(), entry.getValue()));

                // output
                return previousStepOutput.withPayload(hal.getModel());
            }

            @Override
            public String getId() {
                return "REPORT";
            }

        };
    }

    private static String getUrl(JsonPipelineOutput previousStepOutput) {
        CaravanHttpRequest request = getRequest(previousStepOutput);
        return request == null ? null : request.getUrl();
    }

    private static CaravanHttpRequest getRequest(JsonPipelineOutput previousStepOutput) {

        List<CaravanHttpRequest> requests = previousStepOutput.getRequests();
        if (requests.isEmpty()) {
            return null;
        }
        return requests.get(requests.size() - 1);

    }

}