view software/mpdl-services/mpiwg-mpdl-cms/src/de/mpg/mpiwg/berlin/mpdl/cms/confmanager/ConfManager.java @ 23:e845310098ba

diverse Korrekturen
author Josef Willenborg <jwillenborg@mpiwg-berlin.mpg.de>
date Tue, 27 Nov 2012 12:35:19 +0100
parents
children
line wrap: on
line source

package de.mpg.mpiwg.berlin.mpdl.cms.confmanager;

import java.io.File;
import java.io.FileOutputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPathExpressionException;

import de.mpg.mpiwg.berlin.mpdl.cms.harvester.PathExtractor;

import de.mpg.mpiwg.berlin.mpdl.xml.xquery.XQueryEvaluator;

import de.mpg.mpiwg.berlin.mpdl.cms.general.Constants;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.sun.org.apache.xml.internal.serialize.XMLSerializer;

public class ConfManager {
  private ConfManagerResultWrapper cmrw;
  private HashMap<String, ConfManagerResultWrapper> wrapperContainer;
  private static ConfManager confManager;

  private ConfManager() {
    wrapperContainer = new HashMap<String, ConfManagerResultWrapper>();
    try {
      checkCollectionConfFiles();
    } catch (XPathExpressionException e) {
      e.printStackTrace();
    }
  }

  public static ConfManager getInstance(){
    if(confManager == null)
      confManager = new ConfManager();
    return confManager;
  }
  
  /**
   * checks if an update of a project is necessary by checking configuration
   * file
   * 
   * @throws XPathExpressionException
   */
  private void checkCollectionConfFiles() throws XPathExpressionException {
    System.out.println("---------------");
    System.out.println("checking configuration files...");
    // holt alle Konfiguratiuonsdateien aus dem konf-Ordner
    PathExtractor ext = new PathExtractor();
    List<String> configsList = ext.extractPathLocally(Constants.getInstance().getConfDir());
    System.out.println("Anzahl der Konfigurationsdateien : " + configsList.size());
    try {
      File configFile = null;
      // Ueberprueft alle Konf-dateien auf update und fuehrt es bei Bedarf aus
      for (String configXml : configsList) {
        System.out.println("checking : " + configXml);
        XQueryEvaluator xQueryEvaluator = new XQueryEvaluator();
        configFile = new File(configXml);
        URL srcUrl = configFile.toURI().toURL();
        String update = xQueryEvaluator.evaluateAsString(srcUrl, "//collection/update/text()");
        if (update != null && update.equals("true")) {
          System.out.println("update tag is set on : " + update);
          cmrw = new ConfManagerResultWrapper();
          String collectionId = xQueryEvaluator.evaluateAsString(srcUrl, "//collectionId/text()");
          if (collectionId != null) {
            cmrw.setCollectionId(collectionId);
          }
          String mainLanguage = xQueryEvaluator.evaluateAsString(srcUrl, "//mainLanguage/text()");
          if (mainLanguage != null) {
            cmrw.setMainLanguage(mainLanguage);
          }
          String name = xQueryEvaluator.evaluateAsString(srcUrl, "//name/text()");
          if (name != null) {
            cmrw.setCollectionName(name);
          }
          String fieldsStr = xQueryEvaluator.evaluateAsStringValueJoined(srcUrl, "//field");
          ArrayList<String> fields = new ArrayList<String>();
          if (fields != null) {
            fieldsStr = fieldsStr.trim();
            String[] fieldsArray = fieldsStr.split(" ");
            for (int i=0; i<fieldsArray.length; i++) {
              String field = fieldsArray[i];
              fields.add(field);
            }
            cmrw.setFields(fields);
          }
          String collectionDataUrl = xQueryEvaluator.evaluateAsString(srcUrl, "//specifyUrl/collectionDataUrl/text()");
          if (collectionDataUrl != null) {
            cmrw.setCollectionDataUrl(collectionDataUrl);
            String excludesStr = xQueryEvaluator.evaluateAsStringValueJoined(srcUrl, "//specifyUrl/exclude");
            if(collectionDataUrl.endsWith("/"))
              extractUrlsFromCollections(collectionDataUrl, cmrw, excludesStr);
            else{
              List<String> collectionUrls = new ArrayList<String>();
              collectionUrls.add(collectionDataUrl);
              cmrw.setCollectionUrls(collectionUrls);
            }
            // flag im Konfigurations-File auf false setzen durch serialisierung in das File
            DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = docFactory.newDocumentBuilder();
            Document configFileDocument = builder.parse(configFile);
            NodeList updateNodeList = configFileDocument.getElementsByTagName("update");
            Node n = updateNodeList.item(0);
            n.setTextContent("false");
            FileOutputStream os = new FileOutputStream(configFile);
            XMLSerializer ser = new XMLSerializer(os, null);
            ser.serialize(configFileDocument);  //  Vorsicht: wenn es auf true ist: es wird alles neu indexiert
          }
          wrapperContainer.put(collectionId, cmrw);
        }
      }
    } catch(Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * der Extractor holt alle Projekt zugehoerigen Urls
   */
  private void extractUrlsFromCollections(String collectionDataUrl, ConfManagerResultWrapper cmrw, String excludesStr) {
    System.out.println("collecting urls of resources that need update...");
    if(!collectionDataUrl.equals("")){
      PathExtractor extractor = new PathExtractor();
      List<String> collectionUrls = extractor.initExtractor(collectionDataUrl, excludesStr);
      cmrw.setCollectionUrls(collectionUrls);
    }
  }

  public ConfManagerResultWrapper getResultWrapper(String collectionId) {
    ConfManagerResultWrapper cmrw = wrapperContainer.get(collectionId);
    return cmrw;
  }
}