java.net.URL или старый конь борозды не испортит

от автора

Первое что мы сразу вспоминаем когда видим класс java.net.URL, что он такой же матерый как и первая версия java (@since JDK1.0).
Второе что он встречается почти во всех java программах.
Третье что чаще всего в нем используют протоколы file, jar и http.

А можно ли с помощью java.net.URL получить данные по протоколу CIFS/SMB, SCP, из HDFS — файловой системы хадупа или из maven репозитария?
А получить изображение с веб камеры одной строчкой new URL(‘camel:/webcam:spycam?resolution=HD720‘).openStream()?

Для особо любопытных сразу скажу что это легко сделать с помощью UniversalURLStreamHandlerFactory. Надо лишь использовать groovy-grape-aether-2.4.5.4.jar для запуска груви, где он уже включен по-умолчанию.
В java же прийдется добавить зависимость com.github.igor-suhorukov:mvn-classloader:1.6 в проект и написать чуть больше кода для инициализации.

Начнем с простых примеров, а треш и угар оставим на финал публикации.

Очень просто захватить кадр с вебкамеры с помощью camel webcam component и сохранить в файл snap.png

webcam_to_file.groovy в одну строчку:

com.github.igorsuhorukov.codehaus.plexus.util.IOUtil.copy(new URL('camel:/webcam:spycam?resolution=HD720').openStream(), new FileOutputStream('snap.png')) 

java -jar groovy-grape-aether-2.4.5.4.jar webcam_to_file.groovy

Немного сложнее захватить кадр с веб камеры и показать его в окне. Результат работы этого скрипта вы уже видели в фотографии к статье.

webcam_to_screen.groovy

import groovy.swing.SwingBuilder  import javax.imageio.ImageIO import javax.swing.*  def swing = new SwingBuilder() swing.edt {     frame(title: 'Webcam protocol', defaultCloseOperation: JFrame.EXIT_ON_CLOSE, pack: true, show: true) {         vbox {             swing.panel() {                 def webcamStream = new URL('camel:/webcam:spycam?resolution=HD720').openStream()                 label(new JLabel(new ImageIcon(ImageIO.read(webcamStream))))             }         }     } } 

java -jar groovy-grape-aether-2.4.5.4.jar webcam_to_screen.groovy

Итак, вся эта магия доступна благодаря UniversalURLStreamHandlerFactory — обработчику URL для подгружаемых реализаций протоколов. Подгружает он их из maven репозитария либо использует локальные кеш репозитария.

Сейчас для URL поддерживаются протоколы:

Зарегистрировать универсальный обработчик в java программе просто — лишь добавить инициализацию перед использованием таких экзотических адресов в URL:

java.net.URL.setURLStreamHandlerFactory(new com.github.igorsuhorukov.url.handler.UniversalURLStreamHandlerFactory()); 

Но надо помнить об ограничении стандартной библиотеки java, что вызывать java.net.URL.setURLStreamHandlerFactory можно только один раз за все время работы программы.

Разработать UniversalURLStreamHandlerFactory вдохновила идея из проекта paxurl и его предшественника hansa. PaxUrl — отлично работает в OSGI контейнерах, а решение из статьи в standalone jvm приложениях.

Да, кстати синтаксис отлично работает и для получения groovy скриптов с помощью сотен протоколов!!!
java -jar groovy-grape-aether-2.4.5.4.jar mvn:/:[:[:]]:[?custom_repository_URL]

java -jar groovy-grape-aether-2.4.5.4.jar vfs:/sftp://myusername:mypassword@somehost/pub/downloads/my_script.groovy (либо с аутентификацией по ssh ключу)

Удачи вам с новым использованием давно знакомой технологии!

ссылка на оригинал статьи https://habrahabr.ru/post/276719/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *