atc.otn.ckan.portlets.OrganizationUploader.java Source code

Java tutorial

Introduction

Here is the source code for atc.otn.ckan.portlets.OrganizationUploader.java

Source

package atc.otn.ckan.portlets;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.PortletRequest;
import javax.portlet.PortletURL;
import javax.portlet.ProcessAction;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONArray;
import org.json.JSONObject;

import atc.otn.ckan.client.CKANClient;
import atc.otn.liferay.DM.DocumentManager;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.repository.model.Folder;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.User;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portlet.PortletURLFactoryUtil;
import com.liferay.portlet.documentlibrary.model.DLFolderConstants;
import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;
import com.liferay.util.portlet.PortletProps;

/**
 * Portlet implementation class OrganizationUploader
 */
public class OrganizationUploader extends MVCPortlet {

    private static String ROOT_FOLDER_NAME = PortletProps.get("fileupload.folder.name");
    private static long PARENT_FOLDER_ID = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID;

    private static final Log logger = LogFactory.getLog(Uploader.class);

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

        //********************** Variables **********************

        //json array holding the user receivers with their roles and units
        JSONArray licenses = new JSONArray();

        CKANClient client;
        ThemeDisplay themeDisplay = (ThemeDisplay) renderRequest.getAttribute(WebKeys.THEME_DISPLAY);
        String url = "";

        //********************** Action **********************

        try {

            url = PortalUtil.getLayoutURL(themeDisplay.getLayout(), themeDisplay);
            String city = "";

            if (url.contains("/web/antwerp")) {
                city = "antwerp";
            } else if (url.contains("/web/birmingham")) {
                city = "birmingham";
            } else if (url.contains("/web/issy")) {
                city = "issy";
            } else if (url.contains("/web/liberec")) {
                city = "liberec";
            } else {
                city = "guest";
            }

            renderRequest.setAttribute("city", city);

            //init CKAN client
            client = new CKANClient();

            licenses = client.getLicenses();

            //return list to jsp
            renderRequest.setAttribute("licenses", licenses);

            super.doView(renderRequest, renderResponse);

        } catch (Exception e) {

            e.printStackTrace();
        }

    }//end doView()

    @ProcessAction(name = "orgDocument")
    public void orgDocument(ActionRequest actionRequest, ActionResponse actionResponse)
            throws IOException, PortletException, PortalException, SystemException {

        //********************** Variables **********************

        ThemeDisplay themeDisplay = (ThemeDisplay) actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
        User user = themeDisplay.getUser();

        DocumentManager dm = new DocumentManager();

        Folder folder;

        UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(actionRequest);

        File file;

        String fileName;

        Folder parentFolder;

        long repositoryId;

        String mimeType;

        String fileURL = "";

        CKANClient client;

        JSONObject datasetData = new JSONObject(), resource = new JSONObject(), dTankresource = new JSONObject();

        JSONArray resources = new JSONArray(), extras = new JSONArray(), tags = new JSONArray(),
                dTankresources = new JSONArray();

        String[] tagsStr;

        String datasetURL = "";

        String dTankDatasetURL = "";

        String organizationId;

        InputStream in = null;
        Properties p = new Properties();

        //get the repository id
        repositoryId = themeDisplay.getScopeGroupId();

        //get the CKAN folder
        parentFolder = DLAppServiceUtil.getFolder(repositoryId, PARENT_FOLDER_ID, ROOT_FOLDER_NAME);

        //init CKAN client
        client = new CKANClient();

        long now = new Date().getTime();

        //********************** Action **********************

        try {

            in = this.getClass().getResourceAsStream("/portlet.properties");
            p.load(in);

            organizationId = p.getProperty("CKAN.organizationID");

            logger.info("uploading document....");

            //get the file uploaded
            file = uploadPortletRequest.getFile("fileInput");

            //if file was given after all
            if (uploadPortletRequest.getFile("fileInput") != null && file.exists()) {

                fileName = uploadPortletRequest.getFileName("fileInput");

                mimeType = uploadPortletRequest.getContentType("fileInput");

                //folder = dm.createUserFolder(actionRequest, themeDisplay); 

                fileURL = dm.uploadFile(themeDisplay, actionRequest, parentFolder, file, fileName, mimeType);

                file.delete();

            } else if (ParamUtil.getString(uploadPortletRequest, "link") != null) {

                fileURL = ParamUtil.getString(uploadPortletRequest, "link");

            }

            tagsStr = ParamUtil.getString(uploadPortletRequest, "tags").split(",");

            logger.info(ParamUtil.getString(uploadPortletRequest, "tags"));

            //create json objects as ckan requires them
            resource.put("url", fileURL);

            /* Give the resource the same name as the package */
            resource.put("name", ParamUtil.getString(uploadPortletRequest, "dstitle"));
            //resource.put("name", ParamUtil.getString(uploadPortletRequest,"dname"));
            //resource.put("description", ParamUtil.getString(uploadPortletRequest,"description"));
            resource.put("format", ParamUtil.getString(uploadPortletRequest, "format"));

            resources.put(resource);

            /* Don't upload to CKAN xlxs,xls and csv files */
            if (!resource.getString("format").equals("XLSX") && !resource.getString("format").equals("XLS")
                    && !resource.getString("format").equals("CSV")) {

                for (String tag : tagsStr) {

                    if (!tag.isEmpty()) {
                        tags.put(new JSONObject().put("name", tag));
                    }
                }

                //convert title of dataset to ascii characters for the url to be valid
                String stringName = ParamUtil.getString(uploadPortletRequest, "dstitle").toLowerCase().replace(" ",
                        "-");
                String nameForUrl = java.net.URLEncoder.encode(stringName.toString(), "ascii").replace("%", "-")
                        .toLowerCase();

                datasetData.put("title", ParamUtil.getString(uploadPortletRequest, "dstitle"));
                datasetData.put("name", nameForUrl + now);
                datasetData.put("owner_org", organizationId);
                datasetData.put("notes", ParamUtil.getString(uploadPortletRequest, "notes"));
                datasetData.put("url", ParamUtil.getString(uploadPortletRequest, "source"));
                datasetData.put("version", ParamUtil.getString(uploadPortletRequest, "version"));
                datasetData.put("author", ParamUtil.getString(uploadPortletRequest, "author"));
                datasetData.put("license_id", ParamUtil.getString(uploadPortletRequest, "license"));

                datasetData.put("resources", resources);

                if (tags.length() > 0) {
                    datasetData.put("tags", tags);
                }

                //Store dataset in CKAN
                datasetURL = client.addOrganizationDataset(user.getUserId(), datasetData);

                if (!datasetURL.startsWith("http")) {
                    actionRequest.setAttribute("ckanerror", datasetURL);
                    SessionErrors.add(actionRequest, "ckanerror");
                } else {
                    SessionMessages.add(actionRequest, "ckansuccess");
                    System.out.println("uploaded to CKAN " + datasetURL);
                }

            } // End CKAN UPload
            else {// Upload to Datatank

                if (!fileURL.equals("")) {
                    JSONObject dtankData = new JSONObject();

                    /*Remove everything after the .xls*/
                    int ext = 0;
                    if ((ext = fileURL.indexOf(".xls/")) > 0) {
                        fileURL = fileURL.substring(0, ext + 4);
                    } else if ((ext = fileURL.indexOf(".xlsx/")) > 0) {
                        fileURL = fileURL.substring(0, ext + 5);
                    } else if ((ext = fileURL.indexOf(".csv")) > 0) {
                        fileURL = fileURL.substring(0, ext + 4);
                    }
                    System.out.println("Datatank resource url: " + fileURL);

                    String dTankformat = ParamUtil.getString(uploadPortletRequest, "format").toLowerCase();
                    if (dTankformat.equals("xlsx")) {
                        dTankformat = "xls";
                    }
                    dtankData.put("description", ParamUtil.getString(uploadPortletRequest, "notes"));
                    dtankData.put("uri", fileURL);
                    dtankData.put("type", dTankformat);
                    dtankData.put("title", ParamUtil.getString(uploadPortletRequest, "dstitle"));

                    dTankDatasetURL = client.addToDataTank(dtankData, dTankformat,
                            ParamUtil.getString(uploadPortletRequest, "dstitle").toLowerCase().replace(" ", "_")
                                    + now);

                    if (dTankDatasetURL.startsWith("http:")) {
                        logger.info("uploaded to Datatank: " + dTankDatasetURL);
                        if (client.getDatatankTransform(dTankDatasetURL)) {
                            /*Now store the file back in CKAN*/
                            dTankresource.put("url", dTankDatasetURL + ".geojson");

                            /* Give the resource the same name as the package */
                            dTankresource.put("name", ParamUtil.getString(uploadPortletRequest, "dstitle"));
                            //resource.put("name", ParamUtil.getString(uploadPortletRequest,"dname"));
                            //resource.put("description", ParamUtil.getString(uploadPortletRequest,"description"));
                            dTankresource.put("format", "geojson");

                            dTankresources.put(dTankresource);

                            for (String tag : tagsStr) {

                                if (!tag.isEmpty()) {
                                    tags.put(new JSONObject().put("name", tag));
                                }
                            }
                            datasetData.put("title", ParamUtil.getString(uploadPortletRequest, "dstitle"));
                            datasetData.put("name", ParamUtil.getString(uploadPortletRequest, "dstitle")
                                    .toLowerCase().replace(" ", "-") + now);
                            datasetData.put("owner_org", organizationId);
                            datasetData.put("notes", ParamUtil.getString(uploadPortletRequest, "notes"));
                            datasetData.put("url", ParamUtil.getString(uploadPortletRequest, "source"));
                            datasetData.put("version", ParamUtil.getString(uploadPortletRequest, "version"));
                            datasetData.put("author", ParamUtil.getString(uploadPortletRequest, "author"));
                            datasetData.put("license_id", ParamUtil.getString(uploadPortletRequest, "license"));

                            //if uploaded file format is xls or csv
                            if (ParamUtil.getString(uploadPortletRequest, "format").toLowerCase().equals("csv")
                                    || ParamUtil.getString(uploadPortletRequest, "format").toLowerCase()
                                            .equals("xls")
                                    || ParamUtil.getString(uploadPortletRequest, "format").toLowerCase()
                                            .equals("xlsx")) {

                                client = new CKANClient();
                                //get the bbox value from geojson coming from Datatank
                                extras = client.getExtent(dTankDatasetURL);

                                //prepare the jsonArray from service to insert it as a custom field in CKAN
                                String extrStr = extras.toString().replaceAll("[\\[\\]]", "");
                                List<HashMap<String, String>> extraDictionaries = new ArrayList<HashMap<String, String>>();
                                HashMap<String, String> extraDictionary = new HashMap<String, String>();
                                extraDictionary.put("value", extrStr);
                                extraDictionary.put("key", "extent");
                                extraDictionaries.add(extraDictionary);

                                datasetData.put("extras", extraDictionaries);
                            }

                            datasetData.put("resources", dTankresources);

                            if (tags.length() > 0) {
                                datasetData.put("tags", tags);
                            }

                            //Store dataset in CKAN
                            datasetURL = client.addOrganizationDataset(user.getUserId(), datasetData);

                            if (!datasetURL.startsWith("http")) {
                                actionRequest.setAttribute("ckanerror", datasetURL);
                                SessionErrors.add(actionRequest, "ckanerror");
                            }
                            //actionRequest.setAttribute("dTanksuccess", dTankDatasetURL +".geojson");
                            actionRequest.setAttribute("dTanksuccess",
                                    "Your dataset is succefully transformed into geojson.<br /> Go to <a href='/my-datasets'>My Datasets</a> to view it!");
                            SessionMessages.add(actionRequest, "dTanksuccess");
                            logger.info("Dtank transofrmed succesfully stored in CKAN: " + datasetURL);
                        } else {
                            actionRequest.setAttribute("dTankerror",
                                    "Your file could not be transformed into geojson format.<br /> Please check if it has column headers and if the records contain coordinates. For excel files, the system will try to transform data found in the first sheet which should be named 'sheet1'");
                            SessionErrors.add(actionRequest, "dTankerror");
                        }
                    } else {
                        actionRequest.setAttribute("dTankerror",
                                "Your file could not be transformed into geojson format");
                        SessionErrors.add(actionRequest, "dTankerror");
                    }
                }
            }
            PortletURL actionUrl = PortletURLFactoryUtil.create(actionRequest,
                    themeDisplay.getPortletDisplay().getId(), themeDisplay.getPlid(), PortletRequest.ACTION_PHASE);
            String redirectUrl = actionUrl.toString().replaceAll("upload-organization-dataset",
                    "organization-datasets");
            actionResponse.sendRedirect(redirectUrl);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }//end uploadDocument()

}//end class