eu.prestoprime.p4gui.connection.AccessConnection.java Source code

Java tutorial

Introduction

Here is the source code for eu.prestoprime.p4gui.connection.AccessConnection.java

Source

/**
 * AccessConnection.java
 * Author: Francesco Rosso (rosso@eurix.it)
 * Contributors: Philip Kahle (philip.kahle@uibk.ac.at)
 * 
 * This file is part of PrestoPRIME Preservation Platform (P4).
 * 
 * Copyright (C) 2009-2012 EURIX Srl, Torino, Italy
 *  
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program 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 for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package eu.prestoprime.p4gui.connection;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.parsers.DocumentBuilderFactory;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import eu.prestoprime.p4gui.model.Event;
import eu.prestoprime.p4gui.model.P4Service;
import eu.prestoprime.p4gui.model.oais.DIP;
import eu.prestoprime.p4gui.util.parse.DCField;
import eu.prestoprime.p4gui.util.parse.Frame;
import eu.prestoprime.p4gui.util.parse.Preview;

public abstract class AccessConnection {

    private static final Logger logger = LoggerFactory.getLogger(AccessConnection.class);

    public static DIP getDIP(P4Service service, String id) {
        try {
            String path = service.getURL() + "/access/dip/" + id;
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = entity.getContent();
                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                dbf.setNamespaceAware(true);
                Node dom = dbf.newDocumentBuilder().parse(is);
                is.close();

                return new DIP(id, dom);
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static boolean checkIdentifier(P4Service service, String identifier) {
        try {
            String path = service.getURL() + "/access/dip/checkdcid/" + identifier;
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpEntity entity = client.executeRequest(request).getEntity();
            if (entity != null) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
                String line;
                if ((line = reader.readLine()) != null) {
                    if (line.equals("available")) {
                        return true;
                    } else {
                        return false;
                    }
                }
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    public static ArrayList<DCField> getDCFields(P4Service service, String id) {
        ArrayList<DCField> dc_fields = new ArrayList<DCField>();
        try {
            String path = service.getURL() + "/access/dip/" + id + "/info";
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
                String line;
                while ((line = reader.readLine()) != null) {
                    String[] fields = line.split("\\t");
                    for (int i = 1; i < fields.length; i++)
                        dc_fields.add(new DCField(fields[0], fields[i]));
                }
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dc_fields;
    }

    public static List<Event> getEvents(P4Service service, String id) {
        final String PREMIS_NS = "http://www.loc.gov/standards/premis/v1";

        DIP dip = AccessConnection.getDIP(service, id);
        NodeList eventNodes = ((Document) dip.getContent()).getDocumentElement().getElementsByTagNameNS(PREMIS_NS,
                "event");
        logger.debug("Found " + eventNodes.getLength() + " PREMIS events...");

        List<Event> events = new ArrayList<>();
        for (int i = 0; i < eventNodes.getLength(); i++) {
            Node eventNode = eventNodes.item(i);
            do {
                if (eventNode instanceof Element) {
                    Node typeNode = ((Element) eventNode).getElementsByTagNameNS(PREMIS_NS, "eventType").item(0);
                    Node dateTimeNode = ((Element) eventNode).getElementsByTagNameNS(PREMIS_NS, "eventDateTime")
                            .item(0);
                    Node detailNode = ((Element) eventNode).getElementsByTagNameNS(PREMIS_NS, "eventDetail")
                            .item(0);

                    String type = typeNode.getTextContent();
                    Calendar dateTime;
                    try {
                        dateTime = DatatypeFactory.newInstance()
                                .newXMLGregorianCalendar(dateTimeNode.getTextContent()).toGregorianCalendar();
                    } catch (Exception e) {
                        dateTime = new GregorianCalendar();
                    }
                    String detail = detailNode.getTextContent();

                    logger.debug("Found event " + type + "...");

                    Event event = new Event(type, dateTime, detail);
                    events.add(event);
                }
            } while ((eventNode = eventNode.getNextSibling()) != null);
        }
        return events;
    }

    public static ArrayList<Preview> getPreviewsPath(P4Service service, String id) {
        ArrayList<Preview> previews = new ArrayList<Preview>();
        try {
            String path = service.getURL() + "/access/dip/" + id + "/preview";
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                String line;
                while ((line = reader.readLine()) != null) {
                    String[] fields = line.split("\t");
                    previews.add(new Preview(fields[0], fields[1]));
                }
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return previews;
    }

    public static String getThumbPath(P4Service service, String id) {
        String thumb_path = null;
        try {
            String path = service.getURL() + "/access/dip/" + id + "/thumb";
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            // If no image is found for some reason, the Tomcat 404 page was
            // injected into the page. So I made this check. Philip
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    InputStream is = entity.getContent();
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                    String line;
                    if ((line = reader.readLine()) != null) {
                        thumb_path = line;
                    }
                }
                EntityUtils.consume(entity);
            } else {
                logger.debug("Thumbnail could not be found!");
                thumb_path = "/p4gui/resources/access/image-missing.svg";
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return thumb_path;
    }

    public static ArrayList<Frame> getFrames(P4Service service, String id) {
        ArrayList<Frame> frames = new ArrayList<Frame>();
        try {
            String path = service.getURL() + "/access/dip/" + id + "/frames";
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                String line;
                while ((line = reader.readLine()) != null) {
                    try {
                        String[] fields = line.substring(line.lastIndexOf("/") + 1, line.lastIndexOf("."))
                                .split("F");
                        int frame = Integer.parseInt(fields[0]);
                        int frameRate = Integer.parseInt(fields[1]);
                        frames.add(new Frame(frame, line, frameRate));
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return frames;
    }

    public static String getGraphPath(P4Service service, String id) {
        String graph_path = null;
        try {
            String path = service.getURL() + "/access/dip/" + id + "/rights/graph";
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                String line;
                if ((line = reader.readLine()) != null) {
                    graph_path = line;
                }
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return graph_path;
    }

    public static String getContainer(P4Service service, String id) {
        String container = null;
        try {
            String path = service.getURL() + "/access/dip/" + id + "/info/container";
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                String line;
                if ((line = reader.readLine()) != null) {
                    container = line;
                }
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return container;
    }

    public static String getDracmaURN(P4Service service, String id) {
        String UMID = null;
        try {
            String path = service.getURL() + "/access/dip/" + id + "/info/dracma";
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                InputStream is = entity.getContent();
                BufferedReader reader = new BufferedReader(new InputStreamReader(is));

                String line;
                if ((line = reader.readLine()) != null) {
                    UMID = line;
                }
            }
            EntityUtils.consume(entity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("UMID: " + UMID);
        return UMID;
    }

    public static Date checkDataTypeAvailability(P4Service service, String id, String dataType) {
        String path = service.getURL() + "/access/dip/" + id + "/" + dataType;

        try {
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                String line;
                BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
                if ((line = reader.readLine()) != null) {
                    XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(line.trim());
                    return cal.toGregorianCalendar().getTime();
                }
            }
        } catch (Exception e) {
            logger.error("Unable to parse the date...");
        }
        return null;
    }

    public static List<String> getDataTypeResult(P4Service service, String id, String dataType) {
        List<String> results = new ArrayList<>();

        String path = service.getURL() + "/access/dip/" + id + "/" + dataType + "/result";

        try {
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                String line;
                BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
                while ((line = reader.readLine()) != null) {
                    results.add(line.trim());
                }
            }
        } catch (Exception e) {
            logger.error("Unable to get the datatype result...");
        }
        return results;
    }

    public static String getResource(P4Service service, URL url) {
        String path = url.toString();

        try {
            P4HttpClient client = new P4HttpClient(service.getUserID());
            HttpRequestBase request = new HttpGet(path);
            HttpResponse response = client.executeRequest(request);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                String line;
                StringBuffer sb = new StringBuffer();
                BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
                while ((line = reader.readLine()) != null) {
                    sb.append(line.trim());
                }

                return sb.toString();
            }
        } catch (Exception e) {
            logger.error("Unable to get the result...");
        }

        return null;
    }
}