/**
* 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;
}
}