/*
 * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 * or visit www.oracle.com if you need additional information or have any
 * questions.
 */

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.ContentHandlerFactory;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.net.URLStreamHandlerFactory;

public class Test {

    public static void main(String[] args) throws Exception {
        if (args.length > 0) {
            String fqn = args[0];

            @SuppressWarnings("unchecked")
            Class<? extends ContentHandlerFactory> c =
                    (Class<? extends ContentHandlerFactory>) Class.forName(fqn);

            ContentHandlerFactory f = c.newInstance();

            URLConnection.setContentHandlerFactory(f);
        }

        // One does not simply use a ContentHandler...
        // From an end user perspective ContentHandler is used indirectly
        // and it's more like SPI rather than API. So there's a certain amount
        // of preparations needs to be done beforehand.

        URLStreamHandlerFactory streamHandlerFactory =
                (protocol) ->
                        new URLStreamHandler() {
                            @Override
                            protected URLConnection openConnection(URL u) {
                                return newUrlConnection(u);
                            }
                        };

        URL.setURLStreamHandlerFactory(streamHandlerFactory);

        // Finally
        Object content = new URL("whatever:").getContent();

        System.out.println("Content class is: " + content.getClass());
    }

    private static URLConnection newUrlConnection(URL u) {
        return new URLConnection(u) {
            @Override public void connect() { }

            @Override
            public InputStream getInputStream() { return null; }

            @Override public String getContentType() { return "text/plain"; }
        };
    }
}
