/*******************************************************************************
* Copyright (c) 2007, 2010 The Planets Project Partners.
*
* All rights reserved. This program and the accompanying
* materials are made available under the terms of the
* Apache License, Version 2.0 which accompanies
* this distribution, and is available at
* http://www.apache.org/licenses/LICENSE-2.0
*
*******************************************************************************/
package eu.planets_project.tb.gui.backing.data;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import eu.planets_project.ifr.core.storage.api.DataRegistry;
import eu.planets_project.ifr.core.storage.api.DataRegistryFactory;
import eu.planets_project.services.characterise.Characterise;
import eu.planets_project.services.characterise.CharacteriseResult;
import eu.planets_project.services.datatypes.DigitalObject;
import eu.planets_project.services.datatypes.Property;
import eu.planets_project.services.datatypes.ServiceDescription;
import eu.planets_project.services.identify.Identify;
import eu.planets_project.services.identify.IdentifyResult;
import eu.planets_project.tb.gui.backing.ServiceBrowser;
import eu.planets_project.tb.gui.backing.service.FormatBean;
import eu.planets_project.tb.gui.util.JSFUtil;
import eu.planets_project.tb.impl.services.wrappers.CharacteriseWrapper;
import eu.planets_project.tb.impl.services.wrappers.IdentifyWrapper;
/**
* @author AnJackson
*
*/
public class DigitalObjectInspector {
static private Log log = LogFactory.getLog(DigitalObjectInspector.class);
// The data sources are managed here:
DataRegistry dataReg = DataRegistryFactory.getDataRegistry();
private String dobUri;
/**
* @return the dobUri
*/
public String getDobUri() {
return this.dobUri;
}
/**
* -Dfile.encoding=UTF8
* @param dobUri the dobUri to set
*/
public void setDobUri(String dobUri) {
dobUri = uriEncoder(dobUri).toASCIIString();
this.dobUri = dobUri;
}
/**
* @return
*/
public DigitalObjectTreeNode getDob() {
if( this.dobUri == null ) return null;
// Create as a URI:
URI item = DigitalObjectInspector.uriEncoder(this.dobUri);
if( item == null ) return null;
// Lookup and return:
DigitalObjectTreeNode itemNode = new DigitalObjectTreeNode(item, this.dataReg );
return itemNode;
}
/**
* TODO Should be able to avoid this hack workaround.
* How to set the page encoding correctly?
* <?xml version="1.0" encoding="UTF-8"?>
* @param in
* @return
*/
/*
public static String fixBadEncoding( String in ) {
return in;
if( in == null ) return in;
try {
String out = new String( in.getBytes("ISO-8859-1"), "UTF-8" );
return out;
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return in;
}
}
*/
/**
* There are some characters that are allowed in URLs and should not be escaped as %xx
* e.g. blanks. These are not allowed in URIs.
* This method uses the URI constructor to fix those escapings.
* @param uri
* @return
*/
public static URI uriEncoder( String uri ) {
if( uri == null || uri.length() == 0 ) return null;
try {
URI nuri = new URI("planets", uri.replaceFirst("planets:", ""), null);
return nuri;
} catch (URISyntaxException e) {
e.printStackTrace();
return null;
}
}
/* -------------------- Additional code for deeper inspection --------------------- */
/**
* @return
*/
public List<SelectItem> getCharacteriseServiceList() {
log.info("IN: getCharacteriseServiceList");
ServiceBrowser sb = (ServiceBrowser)JSFUtil.getManagedObject("ServiceBrowser");
/*
String input = this.getInputFormat();
if( ! this.isInputSet() ) input = null;
String output = this.getOutputFormat();
if( ! this.isOutputSet() ) output = null;
*/
List<ServiceDescription> sdl = sb.getCharacteriseServices();
return ServiceBrowser.mapServicesToSelectList( sdl );
}
/** */
private String characteriseService;
/** */
private String identifyService;
/**
* @return the characteriseService
*/
public String getCharacteriseService() {
return this.characteriseService;
}
/**
* @param characteriseService the characteriseService to set
*/
public void setCharacteriseService(String characteriseService) {
this.characteriseService = characteriseService;
}
private CharacteriseResult runCharacteriseService() {
log.info("Looking for properties using: "+this.getCharacteriseService());
// Return nothing if no service is selected:
if( this.getCharacteriseService() == null ) return null;
// Run the service:
try {
Characterise chr = new CharacteriseWrapper(new URL(this.getCharacteriseService()));
DigitalObject dob = this.getDob().getDob();
log.info("Got digital object: "+dob);
CharacteriseResult cr = chr.characterise( dob, null);
return cr;
} catch( Exception e ) {
log.error("FAILED! "+e);
e.printStackTrace();
return null;
}
}
/**
* @return
*/
public List<Property> getCharacteriseProperties() {
List<Property> ret = new ArrayList<Property>();
CharacteriseResult cr = this.runCharacteriseService();
if( cr == null ) return null;
if( cr.getProperties() != null ) {
log.info("Got properties: "+cr.getProperties().size());
}else{
return ret;
}
//iterate over the properties and truncate when more than 500 chars
for(Property p : cr.getProperties()){
if(p.getValue().length()>500){
//add a truncated value String
ret.add(new Property(p.getUri(),p.getName(),p.getValue().substring(0, 500)+"[..]"));
}else{
//add the original result
ret.add(p);
}
}
return ret;
}
/**
* @return
*/
public String getCharacteriseServiceReport() {
CharacteriseResult cr = this.runCharacteriseService();
if( cr == null ) return null;
return ""+cr.getReport();
}
/**
* @return the identifyService
*/
public String getIdentifyService() {
return this.identifyService;
}
/**
* @param identifyService the identifyService to set
*/
public void setIdentifyService(String identifyService) {
this.identifyService = identifyService;
}
private IdentifyResult runIdentifyService() {
if( this.getIdentifyService() == null ) return null;
try {
Identify id = new IdentifyWrapper(new URL( this.getIdentifyService()));
IdentifyResult ir = id.identify(this.getDob().getDob(), null);
return ir;
} catch( Exception e ) {
log.error("FAILED! "+e);
e.printStackTrace();
return null;
}
}
/**
* @return
*/
public String getIdentifyResult() {
IdentifyResult ir = this.runIdentifyService();
if( ir == null ) return null;
String result = "";
for( URI type : ir.getTypes() ) {
result += type+" ";
}
return result;
}
/**
* @return
*/
public List<FormatBean> getIdentifyResultList() {
IdentifyResult ir = this.runIdentifyService();
if( ir == null ) return null;
List<FormatBean> fmts = new ArrayList<FormatBean>();
for( URI type : ir.getTypes() ) {
FormatBean fb = new FormatBean( ServiceBrowser.fr.getFormatForUri( type ) );
fmts.add(fb);
}
return fmts;
}
/**
* @return
*/
public String getIdentifyServiceReport() {
IdentifyResult ir = this.runIdentifyService();
if( ir == null ) return null;
return ""+ir.getReport();
}
}