de.ii.xtraplatform.ogc.csw.parser.ExtractWFSUrlsFromCSW.java Source code

Java tutorial

Introduction

Here is the source code for de.ii.xtraplatform.ogc.csw.parser.ExtractWFSUrlsFromCSW.java

Source

/**
 * Copyright 2017 European Union, interactive instruments GmbH
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */
/**
 * bla
 */
package de.ii.xtraplatform.ogc.csw.parser;

import de.ii.xtraplatform.ogc.api.CSW;
import de.ii.xtraplatform.ogc.api.filter.OGCFilter;
import de.ii.xtraplatform.ogc.api.filter.OGCFilterAnd;
import de.ii.xtraplatform.ogc.api.filter.OGCFilterLiteral;
import de.ii.xtraplatform.ogc.api.filter.OGCFilterPropertyIsEqualTo;
import de.ii.xtraplatform.ogc.api.filter.OGCFilterPropertyIsLike;
import de.ii.xtraplatform.ogc.api.filter.OGCFilterValueReference;
import de.ii.xtraplatform.ogc.api.wfs.parser.LoggingWfsCapabilitiesAnalyzer;
import de.ii.xtraplatform.ogc.api.wfs.parser.MultiWfsCapabilitiesAnalyzer;
import de.ii.xtraplatform.ogc.api.wfs.parser.WFSCapabilitiesParser;
import de.ii.xtraplatform.ogc.csw.client.CSWAdapter;
import de.ii.xtraplatform.ogc.csw.client.CSWOperation;
import de.ii.xtraplatform.ogc.csw.client.CSWOperationGetCapabilities;
import de.ii.xtraplatform.ogc.csw.client.CSWOperationGetRecords;
import de.ii.xtraplatform.ogc.csw.client.CSWQuery;
import de.ii.xtraplatform.ogc.csw.client.CSWRequest;
import org.apache.http.HttpEntity;
import org.apache.http.client.HttpClient;
import org.apache.http.util.EntityUtils;
import org.codehaus.staxmate.SMInputFactory;

import java.util.Collection;
import java.util.concurrent.ExecutionException;

/**
 * @author zahnen
 */
public class ExtractWFSUrlsFromCSW {

    private HttpClient httpClient;
    private SMInputFactory staxFactory;

    public ExtractWFSUrlsFromCSW(HttpClient httpClient, SMInputFactory staxFactory) {
        this.httpClient = httpClient;
        this.staxFactory = staxFactory;

    }

    public CSWCapabilitiesAnalyzer caps(String url) {
        CSWAdapter adapter = new CSWAdapter(url);
        adapter.initialize(httpClient, httpClient);

        CSWOperation getCapabilities = new CSWOperationGetCapabilities();
        CSWCapabilitiesAnalyzer capabilitiesAnalyzer = new CSWCapabilitiesAnalyzer();
        LoggingWfsCapabilitiesAnalyzer capabilitiesAnalyzer1 = new LoggingWfsCapabilitiesAnalyzer();
        MultiWfsCapabilitiesAnalyzer capabilitiesAnalyzer2 = new MultiWfsCapabilitiesAnalyzer(capabilitiesAnalyzer,
                capabilitiesAnalyzer1);
        de.ii.xtraplatform.ogc.api.wfs.parser.WFSCapabilitiesParser wfsCapabilitiesParser = new WFSCapabilitiesParser(
                capabilitiesAnalyzer, staxFactory);

        CSWRequest request = new CSWRequest(adapter, getCapabilities);

        HttpEntity entity = null;

        try {
            entity = request.getResponse().get();

            /*String readLine;
            BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent()));
                
            while (((readLine = br.readLine()) != null)) {
            System.out.println(readLine);
                
                
            }*/

            wfsCapabilitiesParser.parse(entity);

            System.out.println();
            System.out.println();
            System.out.println(capabilitiesAnalyzer.title);
            System.out.println(capabilitiesAnalyzer.version);
            System.out.println(capabilitiesAnalyzer.url);
            System.out.println(capabilitiesAnalyzer.outputFormats.toString());
            System.out.println(capabilitiesAnalyzer.typeNames.toString());
            System.out.println(capabilitiesAnalyzer.constraintLanguages.toString());
            System.out.println(capabilitiesAnalyzer.isoQueryables.toString());
            System.out.println();

        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        } finally {
            EntityUtils.consumeQuietly(entity);
        }

        return capabilitiesAnalyzer;
    }

    public Collection<String> extract(String url) {
        CSWCapabilitiesAnalyzer capabilitiesAnalyzer = caps(url);

        CSWAdapter adapter = new CSWAdapter(url);
        adapter.initialize(httpClient, httpClient);

        CSW.VERSION version = CSW.VERSION.fromString("2.0.2");
        adapter.setVersion(version.toString());
        adapter.getNsStore().addNamespace(CSW.getPR(version), CSW.getNS(version));

        CSWOperationGetRecords getRecords = createGetRecords(capabilitiesAnalyzer);

        //getRecords.toKvp(adapter.getNsStore(), version);
        //getRecords.toXml(adapter.getNsStore(), version);

        //adapter.setHttpMethod("POST");

        CSWRequest request = new CSWRequest(adapter, getRecords);

        ExtractWfsUrlsCSWRecordsAnalyzer analyzer = new ExtractWfsUrlsCSWRecordsAnalyzer();
        LoggingCSWRecordsAnalyzer loggingCSWRecordsAnalyzer = new LoggingCSWRecordsAnalyzer();
        MultiCSWRecordsAnalyzer multiCSWRecordsAnalyzer = new MultiCSWRecordsAnalyzer(loggingCSWRecordsAnalyzer,
                analyzer);

        CSWRecordsParser recordParser = new CSWRecordsParser(multiCSWRecordsAnalyzer, staxFactory);

        HttpEntity entity = null;
        int nextRecord = 1;

        while (nextRecord > 0 && analyzer.hasMore()) {
            getRecords.setStartPosition(nextRecord);

            try {
                entity = request.getResponse().get();

                recordParser.parse(entity);

                // TODO: loop over nextRecord

                System.out.println();
                System.out.println();
                System.out.println(
                        analyzer.getNumberParsed() + " records of " + analyzer.getNumberMatched() + " parsed");
                System.out.println(analyzer.getUrls().size() + " WFS found:");
                System.out.println(analyzer.getUrls().toString());
                System.out.println();

                nextRecord = analyzer.getNextRecord();

            } catch (InterruptedException | ExecutionException e) {
                // ignore
                e.printStackTrace();
            } finally {
                EntityUtils.consumeQuietly(entity);
            }
        }

        return analyzer.getUrls();
    }

    private CSWOperationGetRecords createGetRecords(CSWCapabilitiesAnalyzer capabilitiesAnalyzer) {
        CSWOperationGetRecords getRecords = new CSWOperationGetRecords();
        getRecords.setMaxRecords(100);
        getRecords.setStartPosition(1);
        getRecords.setResultType(CSW.VOCABULARY.HITS);
        getRecords.setResultType(CSW.VOCABULARY.RESULTS);

        CSWQuery query = new CSWQuery();
        query.addTypename("gmd:MD_Metadata");
        getRecords.addQuery(query);

        if (capabilitiesAnalyzer.constraintLanguages.contains("FILTER")) {
            getRecords.setConstraintLanguage("FILTER");

            OGCFilter filter = new OGCFilter();
            OGCFilterAnd and = new OGCFilterAnd();
            filter.addExpression(and);

            if (capabilitiesAnalyzer.isoQueryables.containsKey("Type")) {
                OGCFilterValueReference valueReference = new OGCFilterValueReference(
                        capabilitiesAnalyzer.isoQueryables.get("Type"));
                OGCFilterLiteral literal = new OGCFilterLiteral("service");
                OGCFilterPropertyIsEqualTo isEqualTo = new OGCFilterPropertyIsEqualTo(valueReference, literal);
                and.addOperand(isEqualTo);
            }
            if (capabilitiesAnalyzer.isoQueryables.containsKey("Type")
                    && capabilitiesAnalyzer.isoQueryables.containsKey("serviceType")) {
                OGCFilterValueReference valueReference = new OGCFilterValueReference(
                        capabilitiesAnalyzer.isoQueryables.get("serviceType"));
                OGCFilterLiteral literal = new OGCFilterLiteral("%download%");
                OGCFilterPropertyIsLike isLike = new OGCFilterPropertyIsLike(valueReference, literal);
                and.addOperand(isLike);
            }
            /*if (capabilitiesAnalyzer.isoQueryables.containsKey("Type") && capabilitiesAnalyzer.isoQueryables.containsKey("serviceType") && capabilitiesAnalyzer.isoQueryables.containsKey("serviceTypeVersion")) {
            OGCFilterValueReference valueReference = new OGCFilterValueReference(capabilitiesAnalyzer.isoQueryables.get("serviceTypeVersion"));
            OGCFilterLiteral literal = new OGCFilterLiteral("%WFS%");
            OGCFilterPropertyIsLike isLike = new OGCFilterPropertyIsLike(valueReference, literal);
            and.addOperand(isLike);
            }*/

            query.addFilter(filter);

        } else if (capabilitiesAnalyzer.constraintLanguages.contains("CQL_TEXT")) {
            getRecords.setConstraintLanguage("CQL_TEXT");

            StringBuilder constraint = new StringBuilder();

            if (capabilitiesAnalyzer.isoQueryables.containsKey("Type")) {
                constraint.append(capabilitiesAnalyzer.isoQueryables.get("Type"));
                constraint.append(" = 'service'");
            }
            if (capabilitiesAnalyzer.isoQueryables.containsKey("Type")
                    && capabilitiesAnalyzer.isoQueryables.containsKey("serviceType")) {
                constraint.append(" AND ");
                constraint.append(capabilitiesAnalyzer.isoQueryables.get("serviceType"));
                constraint.append(" LIKE '%download%'");
            }
            /*if (capabilitiesAnalyzer.isoQueryables.containsKey("Type") && capabilitiesAnalyzer.isoQueryables.containsKey("serviceType") && capabilitiesAnalyzer.isoQueryables.containsKey("serviceTypeVersion")) {
            constraint.append(" AND ");
            constraint.append(capabilitiesAnalyzer.isoQueryables.get("serviceTypeVersion"));
            constraint.append(" LIKE '%WFS%'");
            }*/

            getRecords.setConstraint(constraint.toString());

            //getRecords.setConstraint("csw:AnyText LIKE '%WFS%'");
        }

        return getRecords;
    }
}