view src/de/mpiwg/itgroup/eSciDoc/Tools/AddMPIWGIdentifiers.java @ 8:a844f6948dd8

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

package de.mpiwg.itgroup.eSciDoc.Tools;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.log4j.BasicConfigurator;
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.xpath.XPath;

import sun.util.logging.resources.logging;

import com.sun.org.apache.xerces.internal.parsers.SAXParser;

import de.mpiwg.itgroup.eSciDoc.exceptions.ESciDocXmlObjectException;
import de.mpiwg.itgroup.eSciDoc.utils.eSciDocXmlObject;

public class AddMPIWGIdentifiers {

	/**
	 * Erzeuge MPIWG identifier in den administrativen MPIWG Metadaten.
	 * Solange der Identifier nicht in den Metadaten (index.meta) steht, wird dazu der Filename genommen. 
	 * @param args
	 * @throws ESciDocXmlObjectException 
	 * @throws JDOMException 
	 * @throws IOException 
	 * @throws ClientProtocolException 
	 * @throws IllegalStateException 
	 */
	public static void main(String[] args) throws IllegalStateException, ClientProtocolException, IOException, JDOMException, ESciDocXmlObjectException {
		// TODO Auto-generated method stub
		BasicConfigurator.configure();
		Logger logger = Logger.getRootLogger();
		logger.setLevel(Level.INFO);
		EScidocBasicHandler connector = new EScidocBasicHandler(
				"escidoc-test.mpiwg-berlin.mpg.de", 8080, "dwinter", "fl0rian");

		if(args.length<2){
			System.out.println("Usage: startrecord maximumrecords");
			System.exit(-1);
		}
		String MAX_REC = args[1];
		String start = args[0];
		String objectXPath = "//escidocItem:item";

		String query = "?maximumRecords=" + String.valueOf(MAX_REC)
				+ "&startRecord=" + String.valueOf(start);
		String command = "/ir/context/escidoc:12001/resources/members";
		for (eSciDocXmlObject obj : connector.getObjectsFromFilterResult(
				command + query, objectXPath)) {

			Document doc = obj.getDocument();
			Boolean changed=false;
			XPath archivePathXP = EScidocTools.getESciDocXpath("//mpiwg:admin/mpiwg:archivePath");
			XPath mpiwgMDXP= EScidocTools.getESciDocXpath("//mpiwg:admin");
			XPath mpiwgIdentifierXP= EScidocTools.getESciDocXpath("//mpiwg:admin/mpiwg:identifier");
			
			
			Element archivePathNode = (Element) archivePathXP.selectSingleNode(doc);
			if(archivePathNode==null) // kein Treffer
				continue;
			
			Element  mpiwgIDNode = (Element) mpiwgIdentifierXP.selectSingleNode(doc);
			if(mpiwgIDNode!=null){ // kein Treffer
				System.out.println("ID already exists:"+mpiwgIDNode.getTextTrim());
				continue;
			}
			
			
			
			
			String archivePath=archivePathNode.getTextTrim();
			String[] pathElements=archivePath.split("/");
			int length=pathElements.length;
			String mpiwgID=pathElements[length-1];
			Element mpiwgMDNode= (Element) mpiwgMDXP.selectSingleNode(doc);
			
			if(mpiwgID.equals(""))
				mpiwgID=handleEmptyID(doc,mpiwgMDNode);
			
			
			
			
			mpiwgIDNode= new Element("identifier", EScidocTools.MPIWG);
			mpiwgIDNode.setText(mpiwgID);
			mpiwgMDNode.addContent(mpiwgIDNode);
			
		    //correct release number, some objecte don't have an release number, why??
			
			
			Element latestRelease = (Element)EScidocBasicHandler.getXPath(doc.getRootElement(),"//escidocItem:properties/prop:latest-release/release:number",true);
			if(latestRelease==null){
				logger.info("not released yet:"+obj.getESciDocId());
			} else {
			String rn= latestRelease.getTextTrim();
			if (rn.equals("")){
				String latestVersionNumber = ((Element)EScidocBasicHandler.getXPath(doc.getRootElement(),"//escidocItem:properties/prop:version/version:number",true)).getTextTrim();
				logger.info("have to add relase number!");
				logger.info("Will add:"+latestVersionNumber);
				
				latestRelease.setText(latestVersionNumber);
			}
			}
			System.out.println("Adding:"+mpiwgID);
			changed=true;
				
			
			//System.out.println(obj.printXML());
			if (changed){
				
				Boolean retVal = connector.updateItem(obj);
				System.out.println("Replaced:"+obj.getESciDocId());
				HttpResponse retValu = connector.submitAnObject(obj, "adding identifier");
				
				System.out.println(EScidocBasicHandler.convertStreamToString(retValu.getEntity().getContent()));
				HttpResponse resObj = connector.eScidocGet(obj.getESciDocId());
				HttpEntity ent = resObj.getEntity();
				if (ent!=null){
				obj= new eSciDocXmlObject(ent.getContent());
				} else {
					System.out.println("Can not retrieve:" + obj.getESciDocId());
					continue;
				}
				
				HttpResponse reValue2 = connector.releaseAnObject(obj, "repairing publishing info");
				System.out.println(EScidocBasicHandler.convertStreamToString(reValue2.getEntity().getContent()));

			}
		}

	}

	private static String handleEmptyID(Document doc, Element mpiwgMDNode) throws JDOMException, IOException {
		XPath xlinkXP = EScidocTools.getESciDocXpath("//escidocComponents:component[escidocComponents:properties/prop:content-category/text()='index_meta']/@xlink:href");
		
		SAXBuilder sb = new SAXBuilder();
		Object node = xlinkXP.selectSingleNode(doc);
		Attribute attr =(Attribute) node;
		String md = attr.getValue();
		
		Document doc2 = sb.build("http://escidoc-test.mpiwg-berlin.mpg.de:8080"+md+"/content");
		XPath apXP= EScidocTools.getESciDocXpath("//resource/archive-path");
		XPath imXP= EScidocTools.getESciDocXpath("//texttool/image");
		
		Element apNode = (Element)apXP.selectSingleNode(doc2);
		String ap="";
		if(apNode!=null)
		{
			ap = apNode.getTextTrim();
			XPath apNewXP= EScidocTools.getESciDocXpath(".//mpiwg:archivePath");
			Element apNewNode = (Element) apNewXP.selectSingleNode(mpiwgMDNode);
			apNewNode.setText(ap);
		}
		Element imNode = (Element)imXP.selectSingleNode(doc2);
		
		if(imNode!=null)
		{
			String im = imNode.getTextTrim();
			XPath imNewXP= EScidocTools.getESciDocXpath(".//mpiwg:imageFolder");
			Element imNewNode = (Element) imNewXP.selectSingleNode(mpiwgMDNode);
			imNewNode.setText(ap+"/"+im);
		}
		
		String[] pathElements=ap.split("/");
		int length=pathElements.length;
		return pathElements[length-1];
		
		
	}
}