view src/de/mpiwg/itgroup/eSciDoc/echoObjects/ECHORessource.java @ 8:a844f6948dd8

?nderungen im Walker tools f?r pubman
author dwinter
date Mon, 14 May 2012 09:58:45 +0200
parents 58b52df9763c
children b6cf6462d709
line wrap: on
line source

package de.mpiwg.itgroup.eSciDoc.echoObjects;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


import org.apache.commons.codec.binary.Hex;
import org.apache.http.Header;
import org.apache.http.HttpException;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.ExecutionContext;
import org.apache.http.protocol.HttpContext;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;


import com.sun.org.apache.xalan.internal.xsltc.dom.DOMWSFilter;
import com.sun.org.apache.xerces.internal.parsers.SAXParser;

import de.mpiwg.itgroup.eSciDoc.Tools.EScidocBasicHandler;
import de.mpiwg.itgroup.eSciDoc.Tools.EScidocTools;
import de.mpiwg.itgroup.eSciDoc.utils.eSciDocXmlObject;
import de.mpiwg.itgroup.metadataManager.pid.DCTransformer;

public class ECHORessource  extends ECHOObject{

	
	public String archivePath;
	public String metaData ="";
	public String fullText ="";
	private String textServletUrl;
	private String dirInfoUrl;
	public String link;
	
	public String indexMetaMD5stored;
	

	public ECHORessource() throws IOException{
		super();
		CMM ="/cmm/content-model/escidoc:11003";
		Properties echoProperties = new Properties();
		echoProperties.load(getClass().getResourceAsStream("/de/mpiwg/itgroup/eSciDoc/config/echo.properties"));
		
		textServletUrl = (String) echoProperties.get("textServletUrl");
		dirInfoUrl = (String) echoProperties.get("dirInfoUrl");
		
	}

	
	public ECHORessource(String name, String archivePath, String echoUrl) throws IOException {
		this();
		CMM ="/cmm/content-model/escidoc:11003";
		this.name = name;
		this.archivePath = archivePath;
		this.echoUrl = echoUrl;
		this.link = getLinkFromUrl(echoUrl);
		
		
	}

	/** Holt die URL auf die das ECHO Objekt redirected
	 * @param echoUrl
	 * @return
	 */
	private String getLinkFromUrl(String echoUrl) {
		if (echoUrl==null)
			return null;
		HttpContext localContext = new BasicHttpContext();
		HttpClient hc = new DefaultHttpClient();
		HttpGet get = new HttpGet(echoUrl);
		HttpResponse response;
		HttpUriRequest req;
		HttpHost target;
		
		try {
			response = hc.execute(get,localContext);
			req = (HttpUriRequest) localContext.getAttribute(
			        ExecutionContext.HTTP_REQUEST);
			target = (HttpHost) localContext.getAttribute(
			        ExecutionContext.HTTP_TARGET_HOST);


		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "";
		}
		URI ret = req.getURI();
		
		return target.toString()+ret.toString();
	}


	public String toString(){
		String format="NAME: %s; archivePAth: %s; metaData: %s; fullText %s; url %s";
		
		return String.format(format, name,archivePath,metaData,fullText,echoUrl);
		
	}
	

	/**
	 * Baue Metadatalink um, dass er auf das Servlet zeigt.
	 * @param ml
	 * @return
	 */
	public String correctML(String ml) {
		Pattern p = Pattern.compile("experimental/(.*)");
		Matcher m = p.matcher(ml);
		String pf;
		if (m.find())
			pf = "experimental/" + m.group(1);
		else {
			p = Pattern.compile("permanent/(.*)");
			m = p.matcher(ml);
			if (m.find())
				pf = "permanent/" + m.group(1);
			else
				return ml;
		}
		return textServletUrl + pf;
	}

	static public String correct(String ml){
		Pattern p = Pattern.compile("experimental/(.*)");
		Matcher m = p.matcher(ml);
		String pf;
		if (m.find())
			pf = "experimental/" + m.group(1);
		else {
			p = Pattern.compile("permanent/(.*)");
			m = p.matcher(ml);
			if (m.find())
				pf = "permanent/" + m.group(1);
			else
				return ml;
		}
		return pf;
	}
	
	
	public String getImageFolderPath() {
		DCTransformer trans = new DCTransformer(metaData);
		String path = trans.getImagePathFromIndexMeta();
		if (path==null || path.equals("")){
			path=archivePath+"/pageimg";
		} else {
			path=archivePath+"/"+path;
		}
		
		String testPath=correct(path); // get rid of everything before eperimental or permanent
		if(testPath(testPath))
			return path;
		
		return null;
	}


	private boolean testPath(String path) {
		HttpClient client = new DefaultHttpClient();
		HttpGet get;
		try {
		get = new HttpGet(dirInfoUrl+path);
		} catch (RuntimeException e){
			e.printStackTrace();
			return false;
		}
		
		try {
			HttpResponse response = client.execute(get);
			String body = EScidocBasicHandler.convertStreamToString(response.getEntity().getContent());;
			
			Pattern p = Pattern.compile("<dir>(.*)</dir>",Pattern.DOTALL);
			Matcher m = p.matcher(body);
			if (m.find()){ // dir body leer
				if (m.group(1).equals(""))
					return false;
				else
					return true;
			}
			
	
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		return false;
	}


	public String getIndexMetaMD5onServer() {
		String digest="";
		try {
			URL url = new URL(metaData);
			InputStream is = url.openStream();
			MessageDigest md = MessageDigest.getInstance("MD5");
			digest = getDigest(is, md, 2048);
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return digest;
	}

	public static String getDigest(InputStream is, MessageDigest md, int byteArraySize)
	throws NoSuchAlgorithmException, IOException {

		md.reset();
		byte[] bytes = new byte[byteArraySize];
		int numBytes;
		while ((numBytes = is.read(bytes)) != -1) {
			md.update(bytes, 0, numBytes);
		}
		byte[] digest = md.digest();
		String result = new String(Hex.encodeHex(digest));
		return result;
		}


	public String getIndexMetaMD5stored() {
		return indexMetaMD5stored;
	}
	
	public String getEScidocId() {
		return eScidocId;
	}


	//  schreibe die escidoc:id in die index.meta
	
	public void writeEsciDocIDToIndexMeta(eSciDocXmlObject eSciDocXmlObject) {
		String txt;
		try {
			txt = eSciDocXmlObject.getESciDocObjId();
			writeEsciDocIDToIndexMeta(txt);
		} catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public void writeEsciDocIDToIndexMeta(String objid) {
		String driType="escidoc-test";
		String txt;
		Element result;
		try {
			txt = objid;
			
			URL url = new URL(metaData);
			InputStream is = url.openStream();
			Document doc = new SAXBuilder().build(is);
			XPath xp = XPath.newInstance("//meta/dri[@type=\""+driType+"\"]");
			result = (Element)xp.selectSingleNode(doc);
			
			if (result!=null){
				result.setText(txt);
			} else {
				XPath xpMeta = XPath.newInstance("//meta");
				Element metaTag = (Element)xpMeta.selectSingleNode(doc);
				
				if (metaTag==null){
					return;
				} else {
					
					Element dri = new Element("dri");
					dri.setAttribute("type",driType);
					dri.setText(txt);
					metaTag.addContent(dri);
				}
			}
			
			XMLOutputter xo = new XMLOutputter();
			
			
			
			//String outpath ="/tmp/out/"+archivePath;
			String outpath =archivePath;
			//File parent = new File(outpath);
			//parent.mkdirs();
			
			File oldFile = new File(outpath+"/index.meta");
			boolean f = oldFile.renameTo(new File(outpath+"/index.meta.old"));
			if (!f){
				Logger lg = Logger.getLogger("transformerLogger");
				lg.error("cannot: write "+outpath+"/index.meta.old");
				lg.error("cannot: but will proceed to write new index.meta");
				
			}
			FileOutputStream out = new FileOutputStream(outpath+"/index.meta");
			xo.output(doc, out);
			
			Logger lg = Logger.getLogger("transformerLogger");
			lg.info("changed:"+outpath+" -- added escidoc: "+txt);
			out.close();
			
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JDOMException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	
	}

	}