org.politaktiv.map.app.PolitaktivMapPortlet.java Source code

Java tutorial

Introduction

Here is the source code for org.politaktiv.map.app.PolitaktivMapPortlet.java

Source

/**
 * 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.
 */

package org.politaktiv.map.app;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

import javax.activation.MimetypesFileTypeMap;
import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletPreferences;
import javax.portlet.PortletRequest;
import javax.portlet.ReadOnlyException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.ValidatorException;
import javax.xml.bind.ValidationException;

import org.politaktiv.infrastructure.liferay.PAParamUtil;
import org.politaktiv.map.domain.MapViewPreferences;
import org.politaktiv.map.domain.PolitaktivMapFactory;
import org.politaktiv.map.domain.PolitaktivMapRepository;
import org.politaktiv.map.domain.UserAction;
import org.politaktiv.map.infrastructure.model.Background;
import org.politaktiv.map.infrastructure.model.Marker;
import org.politaktiv.map.infrastructure.model.Picture;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.security.auth.PrincipalException;
import com.liferay.portal.service.ServiceContext;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;

public class PolitaktivMapPortlet extends MVCPortlet {

    private static Log _log = LogFactoryUtil.getLog(PolitaktivMapPortlet.class);
    PolitaktivMapRepository repository = new PolitaktivMapRepository();
    PolitaktivMapFactory factory = new PolitaktivMapFactory();
    PAParamUtil PaParamUtil = new PAParamUtil();

    @Override
    public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
            throws IOException, PortletException {

        String uploadFolderName = getInitParameter("uploadFolder");

        long repositoryId = DLFolderConstants.getDataRepositoryId(this.getCurrentGroupId(renderRequest),
                DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);

        // TODO:      verschieben oder eigene methode
        ServiceContext serviceContext = new ServiceContext();
        serviceContext.setAddGroupPermissions(true);
        serviceContext.setAddGuestPermissions(true);
        ThemeDisplay themeDisplay = (ThemeDisplay) renderRequest.getAttribute(WebKeys.THEME_DISPLAY);

        long currentCompanyId = this.getCurrentCompanyId(renderRequest);
        long currentGroupId = this.getCurrentGroupId(renderRequest);
        long backgroundId = Long.parseLong(renderRequest.getPreferences().getValue("background_id", "0"));

        Folder pictureFolder;

        try {

            //if no background is set (initial) create a default map background
            //TODO: doInit() anschauen
            if (backgroundId == 0) {
                Background initBackground = repository.createInitialBackground(currentCompanyId, currentGroupId);
                MapViewPreferences mapViewPrefs = factory.generateMapViewPreferences(0, //initial values
                        0, 1, initBackground.getBackgroundId());
                mapViewPrefs.valide();

                PortletPreferences prefs = renderRequest.getPreferences();
                repository.storeMapViewPreferences(mapViewPrefs, prefs);
                backgroundId = initBackground.getBackgroundId();
            }

            //background
            //TODO: in DoView genutzt?
            List<Background> backgroundList = repository.findBackgroundsFromCompanyAndGroupId(currentCompanyId,
                    currentGroupId);
            renderRequest.setAttribute("backgroundList", backgroundList);

            //Marker
            List<Marker> backgroundMarkerList = repository.findMarkerByBackgroundId(backgroundId);
            renderRequest.setAttribute("backgroundMarkerList", backgroundMarkerList);

            //Picture
            //TODO: in DoView genutzt?
            List<Picture> backgroundPictureList = repository.findPicureByBackgroundId(backgroundId);
            renderRequest.setAttribute("backgroundPictureList", backgroundPictureList);

            //picture folder
            createFolderIfItDoesNotExistWithName(uploadFolderName, serviceContext, repositoryId);
            pictureFolder = DLAppServiceUtil.getFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
                    uploadFolderName);
            List<FileEntry> portletFolderFiles = DLAppServiceUtil.getFileEntries(repositoryId,
                    pictureFolder.getFolderId());
            renderRequest.setAttribute("portletFolderFiles", portletFolderFiles);
            renderRequest.setAttribute("pictureFolderId", pictureFolder.getFolderId());

            //first picture in folder
            String firstFolderFileUuid;
            if (portletFolderFiles.size() >= 1) {
                firstFolderFileUuid = portletFolderFiles.get(0).getUuid();
            } else {
                firstFolderFileUuid = "0"; //if no picture exists
            }
            renderRequest.setAttribute("firstFolderFileUuid", firstFolderFileUuid);

            super.doView(renderRequest, renderResponse);
        } catch (SystemException e) {
            _log.error(e);
        } catch (PortalException e) {
            _log.error(e);
        }
    }

    @Override
    public void doEdit(RenderRequest renderRequest, RenderResponse renderResponse)
            throws PortletException, IOException {

        ServiceContext serviceContext = new ServiceContext();
        serviceContext.setAddGroupPermissions(true);
        serviceContext.setAddGuestPermissions(true);

        String uploadFolderName = getInitParameter("uploadFolder");
        long currentCompanyId = this.getCurrentCompanyId(renderRequest);
        long currentGroupId = this.getCurrentGroupId(renderRequest);

        long repositoryId = DLFolderConstants.getDataRepositoryId(this.getCurrentGroupId(renderRequest),
                DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);

        Folder pictureFolder;
        try {

            //background
            List<Background> backgroundList = repository.findBackgroundsFromCompanyAndGroupId(currentCompanyId,
                    currentGroupId);
            renderRequest.setAttribute("backgroundList", backgroundList);

            //picture folder
            createFolderIfItDoesNotExistWithName(uploadFolderName, serviceContext, repositoryId);
            pictureFolder = DLAppServiceUtil.getFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
                    uploadFolderName);
            List<FileEntry> portletFolderFiles = DLAppServiceUtil.getFileEntries(repositoryId,
                    pictureFolder.getFolderId());
            renderRequest.setAttribute("portletFolderFiles", portletFolderFiles);
            renderRequest.setAttribute("pictureFolderId", pictureFolder.getFolderId());

            include(editTemplate, renderRequest, renderResponse);

        } catch (SystemException e) {
            _log.error(e);
        } catch (PortalException e) {
            _log.error(e);
        }

    }

    public void createNewBackground(ActionRequest request, ActionResponse response)
            throws SystemException, ValidationException, PrincipalException {
        try {
            String backgroundImageUuid = PaParamUtil.getNotEmptyString(request, "background_uuid");
            String backgroundName = PaParamUtil.getNotEmptyString(request, "background_name");

            long currentCompanyId = this.getCurrentCompanyId(request);
            long currentGroupId = this.getCurrentGroupId(request);
            long currentUserId = this.getCurrentUserId(request);

            //TODO nothing? hm..was was the todo for
            Background newBackground = factory.generateBackground(backgroundImageUuid, backgroundName,
                    currentCompanyId, currentGroupId, currentUserId);
            repository.storeBackground(newBackground, this.getCurrentGroupId(request));

        } catch (ValidatorException e) {
            //TODO reaction
            _log.error(e);
        }
    }

    /**
     * saves a new center in map in edit mode
     * @throws ValidatorException 
     * @throws IOException 
     * @throws PortletException 
     * @throws SystemException 
     */

    @Override
    public void serveResource(ResourceRequest request, ResourceResponse response)
            throws IOException, PortletException {

        //clear response
        response.resetBuffer();

        try {

            //////////////////////VALIDATION ACTION
            //DATATYPES
            String action = PaParamUtil.getNotEmptyString(request, "action");
            //MODEL: UserAction
            UserAction userAction = factory.generateUserAction(action);
            userAction.validate();
            ////////////////////////END VALIDATION

            //get current scope information
            long currentUserId = this.getCurrentUserId(request);
            long currentCompanyId = this.getCurrentCompanyId(request);
            long currentGroupId = this.getCurrentGroupId(request);

            if (userAction.isAddMarker()) {
                long currentBackgroundId = Long.parseLong(request.getPreferences().getValue("background_id", ""));
                long markerId = this.addMarker(request, currentUserId, currentCompanyId, currentGroupId,
                        currentBackgroundId);
                response.getWriter().print(markerId);

            } else if (userAction.isDeleteMarker()) {
                long deleteMarkerId = PaParamUtil.getLong(request, "markerId");
                _log.info("try to delete marker withId" + deleteMarkerId);
                repository.deleteMarker(deleteMarkerId, currentUserId, currentGroupId,
                        this.getCurrentPortletId(request));
                response.getWriter().print("success");

            } else if (userAction.isAddBackground()) {
                this.addBackground(request, currentUserId, currentCompanyId, currentGroupId);

            } else if (userAction.isDeleteBackground()) {
                long deleteBackgroundId = PaParamUtil.getLong(request, "background_id_delete");
                repository.deleteBackground(currentGroupId, deleteBackgroundId);

            } else if (userAction.isSaveCenterAndZoom()) {
                this.saveCenterAndZoom(request);

            } else if (userAction.isAddPicture()) {
                long currentBackgroundId = Long.parseLong(request.getPreferences().getValue("background_id", ""));
                this.addPicture(request, currentUserId, currentCompanyId, currentGroupId, currentBackgroundId);

            } else if (userAction.isDeletePicture()) {
                long deletePictureId = PaParamUtil.getLong(request, "remove_picture_id");
                repository.deletePicture(currentGroupId, currentUserId, deletePictureId,
                        this.getCurrentPortletId(request));
            }

        } catch (ValidatorException e) {
            _log.error("Validator Exception: " + e.getMessage());
            response.getWriter().print(e.getMessage());
        } catch (SystemException e) {
        } catch (PrincipalException e) {
            _log.error("Principal Exception: " + e.getMessage());
            response.getWriter().print(e.getMessage());
        } catch (PortalException e) {
        } catch (ValidationException e) {
            _log.error("Validation Exception: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private void addPicture(ResourceRequest request, long currentUserId, long currentCompanyId, long currentGroupId,
            long backgroundId) throws ValidatorException, SystemException, PrincipalException {
        Double pictureWidth = PaParamUtil.getDouble(request, "map_picture_width");
        Double pictureHeight = PaParamUtil.getDouble(request, "map_picture_height");
        Double pictureXPos = PaParamUtil.getDouble(request, "map_picture_xpos");
        Double pictureyPos = PaParamUtil.getDouble(request, "map_picture_ypos");
        long pictureRotation = PaParamUtil.getLong(request, "map_picture_rotation");
        Double pictureResolution = PaParamUtil.getDouble(request, "map_picture_resolution");
        Double pictureOpacity = PaParamUtil.getDouble(request, "map_picture_opacity");
        String picturefileUuid = PaParamUtil.getNotEmptyString(request, "map_picture_fileuuid");
        String pictureName = PaParamUtil.getNotEmptyString(request, "map_picture_name");
        String pictureDesciption = PaParamUtil.getNotEmptyString(request, "map_picture_description");
        String pictureLink = PaParamUtil.getNotEmptyString(request, "map_picture_link");

        Picture newPicture = factory.generatePicture(currentCompanyId, currentGroupId, currentUserId, pictureWidth,
                pictureHeight, pictureXPos, pictureyPos, pictureResolution, pictureRotation, pictureOpacity,
                picturefileUuid, pictureName, pictureDesciption, pictureLink, backgroundId);

        repository.storePicture(newPicture, currentGroupId);
    }

    private void saveCenterAndZoom(ResourceRequest request)
            throws ValidatorException, SystemException, ReadOnlyException, IOException {
        double lon_center = PaParamUtil.getDouble(request, "lon_center");
        double lat_center = PaParamUtil.getDouble(request, "lat_center");
        int zoom_center = ParamUtil.getInteger(request, "zoom_center"); //TODO: use PaParamUtil
        long backround_id = PaParamUtil.getLong(request, "background_id");

        System.out.println("saveCenterAndZoom: " + lon_center + lat_center + zoom_center + backround_id);

        MapViewPreferences mapViewPrefs = factory.generateMapViewPreferences(lon_center, lat_center, zoom_center,
                backround_id);

        mapViewPrefs.valide();

        PortletPreferences prefs = request.getPreferences();
        repository.storeMapViewPreferences(mapViewPrefs, prefs);
    }

    private void addBackground(ResourceRequest request, long currentUserId, long currentCompanyId,
            long currentGroupId)
            throws ValidatorException, SystemException, ValidationException, PrincipalException {
        String background_uuid = PaParamUtil.getNotEmptyString(request, "background_uuid");
        String background_name = PaParamUtil.getNotEmptyString(request, "background_name");
        Background newBackground = factory.generateBackground(background_uuid, background_name, currentCompanyId,
                currentGroupId, currentUserId);
        repository.storeBackground(newBackground, currentGroupId);
    }

    private long addMarker(ResourceRequest request, long currentUserId, long currentCompanyId, long currentGroupId,
            long backgroundId) throws ValidatorException, SystemException, PortalException, PrincipalException {
        //////////////////////VALIDATION MAP OBJECT INPUT
        //DATATYPES
        String name = PaParamUtil.getNotEmptyString(request, "name");
        String description = PaParamUtil.getNotEmptyString(request, "description");
        String link = PaParamUtil.getNotEmptyString(request, "link");
        ////////////////////////END VALIDATION
        //MODEL validation in Repository   
        double lon = PaParamUtil.getDouble(request, "lon");
        double lat = PaParamUtil.getDouble(request, "lat");
        Marker marker = factory.generateMarker(currentGroupId, currentCompanyId, currentUserId, backgroundId, lon,
                lat, name, description, link);
        repository.storeMarker(marker, this.getCurrentGroupId(request));
        return marker.getMarkerId();

    }

    public void fileUpload(ActionRequest actionRequest, ActionResponse actionResponse)
            throws FileNotFoundException, SystemException, PortalException {

        String uploadFolderName = getInitParameter("uploadFolder");

        UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(actionRequest);
        File theFile = uploadRequest.getFile("form_file");

        String fileName = uploadRequest.getFileName("form_file");
        long fileSize = uploadRequest.getSize("form_file");

        String description = StringPool.BLANK;
        String changeLog = StringPool.BLANK;

        ServiceContext serviceContext = new ServiceContext();
        serviceContext.setAddGroupPermissions(true);
        serviceContext.setAddGuestPermissions(true);

        long repositoryId = DLFolderConstants.getDataRepositoryId(this.getCurrentGroupId(actionRequest),
                DLFolderConstants.DEFAULT_PARENT_FOLDER_ID);
        FileInputStream fis = new FileInputStream(theFile);

        createFolderIfItDoesNotExistWithName(uploadFolderName, serviceContext, repositoryId);

        //get folder
        Folder uploadFolder = DLAppServiceUtil.getFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID,
                uploadFolderName);
        long folderId = uploadFolder.getFolderId();

        //add entry

        //TODO validation inside this object?
        DLAppServiceUtil.addFileEntry(repositoryId, folderId, fileName,
                new MimetypesFileTypeMap().getContentType(theFile), //TODO: better lib? does not work
                fileName, description, changeLog, fis, fileSize, serviceContext);
    }

    private void createFolderIfItDoesNotExistWithName(String uploadFolderName, ServiceContext serviceContext,
            long repositoryId) throws SystemException, PortalException {

        //TODO: there should be a more elegant way to check if a folder does not exist
        try {
            //try to get folder
            DLAppServiceUtil.getFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, uploadFolderName);
        } catch (PortalException e) {
            //create it if does not exist
            DLAppServiceUtil.addFolder(repositoryId, DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, uploadFolderName,
                    "politaktiv map", serviceContext);
        }
    }

    private long getCurrentCompanyId(PortletRequest portletRequest) {
        ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);

        return themeDisplay.getCompanyGroupId();
    }

    private long getCurrentUserId(PortletRequest portletRequest) {
        ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);

        return themeDisplay.getUserId();
    }

    private long getCurrentGroupId(PortletRequest portletRequest) {
        ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);

        return themeDisplay.getScopeGroupId();
    }

    private String getCurrentPortletId(PortletRequest portletRequest) {
        ThemeDisplay themeDisplay = (ThemeDisplay) portletRequest.getAttribute(WebKeys.THEME_DISPLAY);
        return themeDisplay.getPortletDisplay().getId();
    }
}