com.liferay.flickr.item.selector.web.FlickrItemSelectorView.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.flickr.item.selector.web.FlickrItemSelectorView.java

Source

/**
 * Copyright (c) 2000-present Liferay, Inc. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 *
 * This library 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 Lesser General Public License for more
 * details.
 */

package com.liferay.flickr.item.selector.web;

import aQute.bnd.annotation.metatype.Configurable;

import com.flickr4java.flickr.Flickr;
import com.flickr4java.flickr.FlickrException;
import com.flickr4java.flickr.REST;
import com.flickr4java.flickr.interestingness.InterestingnessInterface;
import com.flickr4java.flickr.people.User;
import com.flickr4java.flickr.photos.Extras;
import com.flickr4java.flickr.photos.Photo;
import com.flickr4java.flickr.photos.PhotoList;
import com.flickr4java.flickr.photos.PhotosInterface;
import com.flickr4java.flickr.photos.SearchParameters;
import com.flickr4java.flickr.photos.Size;

import com.liferay.flickr.item.selector.web.configuration.FlickrItemSelectorConfiguration;
import com.liferay.item.selector.ItemSelectorReturnType;
import com.liferay.item.selector.ItemSelectorView;
import com.liferay.item.selector.criteria.URLItemSelectorReturnType;
import com.liferay.item.selector.criteria.image.criterion.ImageItemSelectorCriterion;
import com.liferay.portal.kernel.dao.search.SearchContainer;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.ResourceBundleUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.theme.ThemeDisplay;

import java.io.IOException;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
import java.util.GregorianCalendar;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.Set;

import javax.portlet.PortletURL;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Modified;
import org.osgi.service.component.annotations.Reference;

/**
 * @author Sergio Gonzlez
 */
@Component(configurationPid = "com.liferay.flickr.item.selector.web.configuration.FlickrItemSelectorConfiguration", immediate = true, service = ItemSelectorView.class)
public class FlickrItemSelectorView implements ItemSelectorView<ImageItemSelectorCriterion> {

    @Override
    public Class<ImageItemSelectorCriterion> getItemSelectorCriterionClass() {
        return ImageItemSelectorCriterion.class;
    }

    public ServletContext getServletContext() {
        return _servletContext;
    }

    @Override
    public List<ItemSelectorReturnType> getSupportedItemSelectorReturnTypes() {
        return _supportedItemSelectorReturnTypes;
    }

    @Override
    public String getTitle(Locale locale) {
        return getLanguageKey(locale, "flickr");
    }

    @Override
    public boolean isShowSearch() {
        return true;
    }

    @Override
    public boolean isVisible(ThemeDisplay themeDisplay) {
        if (Validator.isNull(_flickrItemSelectorConfiguration.apiKey())
                || Validator.isNull(_flickrItemSelectorConfiguration.sharedSecret())) {

            _log.error("Please configure Flickr Api Key and Shared Secret");

            return false;
        }

        return true;
    }

    @Override
    public void renderHTML(ServletRequest request, ServletResponse response,
            ImageItemSelectorCriterion imageItemSelectorCriterion, PortletURL portletURL,
            String itemSelectedEventName, boolean search) throws IOException, ServletException {

        ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);

        List<FlickrPhoto> flickrPhotos = new ArrayList<>();

        PhotoList<Photo> photoList = null;

        int delta = GetterUtil.getInteger(request.getParameter(SearchContainer.DEFAULT_DELTA_PARAM),
                SearchContainer.DEFAULT_DELTA);
        int cur = GetterUtil.getInteger(request.getParameter(SearchContainer.DEFAULT_CUR_PARAM),
                SearchContainer.DEFAULT_CUR);

        Set<String> extras = new HashSet<>();

        extras.add(Extras.OWNER_NAME);

        Flickr flickr = new Flickr(_flickrItemSelectorConfiguration.apiKey(),
                _flickrItemSelectorConfiguration.sharedSecret(), new REST());

        try {
            if (search) {
                String keywords = GetterUtil.getString(request.getParameter("keywords"));

                photoList = getSearchPhotoList(flickr, keywords, delta, cur);
            } else {
                photoList = getInterestingPhotoList(flickr, delta, cur);
            }

            populateFlickrPhotos(flickr, photoList, themeDisplay.getLocale(), flickrPhotos);
        } catch (FlickrException e) {
            e.printStackTrace();
        }

        request.setAttribute("total", photoList.getTotal());
        request.setAttribute("flickrPhotos", flickrPhotos);
        request.setAttribute("portletURL", portletURL);
        request.setAttribute("itemSelectedEventName", itemSelectedEventName);

        ServletContext servletContext = getServletContext();

        RequestDispatcher requestDispatcher = servletContext.getRequestDispatcher("/flickr.jsp");

        requestDispatcher.include(request, response);
    }

    @Reference(target = "(osgi.web.symbolicname=com.liferay.flickr.item.selector.web)", unbind = "-")
    public void setServletContext(ServletContext servletContext) {
        _servletContext = servletContext;
    }

    @Activate
    @Modified
    protected void activate(Map<String, Object> properties) {
        _flickrItemSelectorConfiguration = Configurable.createConfigurable(FlickrItemSelectorConfiguration.class,
                properties);
    }

    protected PhotoList<Photo> getInterestingPhotoList(Flickr flickr, int delta, int cur) throws FlickrException {

        InterestingnessInterface interestingnessInterface = flickr.getInterestingnessInterface();

        Calendar date = new GregorianCalendar();

        date.add(Calendar.DATE, -1);

        Set<String> extras = new HashSet<>();

        extras.add(Extras.OWNER_NAME);

        return interestingnessInterface.getList(date.getTime(), extras, delta, cur);
    }

    protected String getLanguageKey(Locale locale, String key) {
        ResourceBundle resourceBundle = ResourceBundleUtil.getBundle("content/Language", locale, getClass());

        return resourceBundle.getString(key);
    }

    protected String getPhotoURL(Collection<Size> sizes) {
        List<Size> sizesList = new ArrayList<>(sizes);

        Iterator<Size> sizeIterator = ListUtil.reverseIterator(sizesList);

        while (sizeIterator.hasNext()) {
            Size size = sizeIterator.next();

            if (isValidSize(size.getHeight(), size.getWidth())) {
                return size.getSource();
            }
        }

        return null;
    }

    protected PhotoList<Photo> getSearchPhotoList(Flickr flickr, String keywords, int delta, int cur)
            throws FlickrException {

        PhotosInterface photosInterface = flickr.getPhotosInterface();

        SearchParameters searchParameters = new SearchParameters();

        Set<String> extras = new HashSet<>();

        extras.add(Extras.OWNER_NAME);

        searchParameters.setExtras(extras);
        searchParameters.setText(keywords);

        return photosInterface.search(searchParameters, delta, cur);
    }

    protected boolean isValidSize(int height, int width) {
        if (_flickrItemSelectorConfiguration.minHeight() > 0) {
            if (height < _flickrItemSelectorConfiguration.minHeight()) {
                return false;
            }
        }

        if (_flickrItemSelectorConfiguration.maxHeight() > 0) {
            if (height > _flickrItemSelectorConfiguration.maxHeight()) {
                return false;
            }
        }

        if (_flickrItemSelectorConfiguration.minWidth() > 0) {
            if (width < _flickrItemSelectorConfiguration.minWidth()) {
                return false;
            }
        }

        if (_flickrItemSelectorConfiguration.maxWidth() > 0) {
            if (width > _flickrItemSelectorConfiguration.maxWidth()) {
                return false;
            }
        }

        return true;
    }

    protected void populateFlickrPhotos(Flickr flickr, PhotoList<Photo> photoList, Locale locale,
            List<FlickrPhoto> flickrPhotos) throws FlickrException {

        PhotosInterface photosInterface = flickr.getPhotosInterface();

        for (Photo photo : photoList) {
            String photoURL = getPhotoURL(photosInterface.getSizes(photo.getId()));

            if (Validator.isNull(photoURL)) {
                continue;
            }

            String photoTitle = photo.getTitle();

            if (Validator.isNull(photoTitle)) {
                photoTitle = getLanguageKey(locale, "untitled");
            }

            String userName = null;

            User owner = photo.getOwner();

            if (owner != null) {
                userName = owner.getUsername();
            }

            if (Validator.isNull(userName)) {
                userName = getLanguageKey(locale, "anonymous");
            }

            FlickrPhoto flickrPhoto = new FlickrPhoto(photoTitle, photoURL, userName, photo.getSquareLargeUrl());

            flickrPhotos.add(flickrPhoto);
        }
    }

    private static final Log _log = LogFactoryUtil.getLog(FlickrItemSelectorView.class);

    private static final List<ItemSelectorReturnType> _supportedItemSelectorReturnTypes = Collections
            .unmodifiableList(ListUtil.fromArray(new ItemSelectorReturnType[] { new URLItemSelectorReturnType() }));

    private volatile FlickrItemSelectorConfiguration _flickrItemSelectorConfiguration;
    private ServletContext _servletContext;

}