view src/main/java/org/mpi/openmind/repository/utils/OM4StreamWriter.java @ 1:615d27dce9b3

(none)
author jurzua
date Wed, 29 Oct 2014 13:28:45 +0000
parents
children 5786aa6caeb3
line wrap: on
line source

package org.mpi.openmind.repository.utils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javolution.xml.stream.XMLOutputFactory;
import javolution.xml.stream.XMLStreamException;
import javolution.xml.stream.XMLStreamWriter;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.mpi.openmind.repository.bo.Attribute;
import org.mpi.openmind.repository.bo.Entity;
import org.mpi.openmind.repository.bo.Node;
import org.mpi.openmind.repository.bo.Relation;
import org.mpi.openmind.repository.services.PersistenceService;
import org.mpi.openmind.scheduling.utils.Scheduling;

public class OM4StreamWriter {

	private static Logger logger = Logger.getLogger(OM4StreamWriter.class);
	
	private static int itemsPerPage = 500;
	
	public static void backupEntities(String fileName, PersistenceService ps){
		generateEntities(fileName, ps, Node.TYPE_ABOX);
	}

	public static void backupDefinitions(String fileName, PersistenceService ps){
		generateEntities(fileName, ps, Node.TYPE_TBOX);
	}
	
	private static void generateEntities(String fileName, PersistenceService ps, String type) {
		OutputStreamWriter out;
		try {
			FileOutputStream fileOut = new FileOutputStream (fileName);
			out = new OutputStreamWriter (fileOut, "UTF-8");
			
			XMLOutputFactory factory = XMLOutputFactory.newInstance();
		    factory.setProperty(XMLOutputFactory.INDENTATION, "\t");

			XMLStreamWriter xmlStreamWriter = factory.createXMLStreamWriter(out);
			
			int entitiesCount = 0;
			
			xmlStreamWriter.writeStartDocument("UTF-8", "1.0");
			
			if(type.equals(Node.TYPE_ABOX)){
				xmlStreamWriter.writeStartElement(XMLUtil.OPENMIND_DATA);
				entitiesCount = ps.getEntityCount(null).intValue();
			}else{
				xmlStreamWriter.writeStartElement(XMLUtil.META_DATA);
				entitiesCount = ps.getEntityCount(Node.TYPE_TBOX).intValue();
			}
			
			int numberOfPages = entitiesCount / itemsPerPage;
			int counter = 0;
			long start = System.currentTimeMillis();
			DecimalFormat df = new DecimalFormat("#.##");
			
			List<Relation> relList = new ArrayList<Relation>();
			
			//(type.equals(Node.TYPE_TBOX)) ? "" : ""
			
			xmlStreamWriter.writeStartElement((type.equals(Node.TYPE_TBOX)) ? XMLUtil.DEFINITIONS : XMLUtil.ENTITIES);
			for(int currentPage = 0; currentPage <= numberOfPages; currentPage++){
				int startRecord = currentPage * itemsPerPage;
				List<Entity> entities;
				
				if(type.equals(Node.TYPE_ABOX)){
					entities = ps.getEntityPage(null, startRecord, itemsPerPage);
				}else{
					entities = ps.getEntityPage(Node.TYPE_TBOX, startRecord, itemsPerPage);
				}
				
				for(Entity ent : entities){
					insertEntity(ent, xmlStreamWriter, ps);
					relList.addAll(ent.getSourceRelations());
					counter++;
					if ((counter % 50) == 0) {
						System.out.print("*");
					}
				}
				long diff = System.currentTimeMillis() - start;
				double min = (double) diff / (double) (60 * 1000);
				double percent = ((double) counter / (double) entitiesCount) * 100.0;
				System.out.print("\n(" + df.format(percent) + "%) \t[" + counter + "/" + entitiesCount + "]\t");
				logger.info("Speed[ents/min]: " + (double) counter / min);
				xmlStreamWriter.flush();
			}
			xmlStreamWriter.writeEndElement();
			
			xmlStreamWriter.writeStartElement(XMLUtil.RELATIONS);
			for(Relation rel : relList){
				insertRelation(rel, xmlStreamWriter);
			}
			xmlStreamWriter.writeEndElement();
			
						
			//end file.
			xmlStreamWriter.writeEndElement();
			
			xmlStreamWriter.flush();
			xmlStreamWriter.close();
			
			logger.info("END Stream Writer");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (XMLStreamException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	private static void insertRelation(Relation rel, XMLStreamWriter writer) throws XMLStreamException{
		writer.writeStartElement(XMLUtil.RELATION);
		
		if(rel.getId() != null)
    		writer.writeAttribute(XMLUtil.ID, rel.getId().toString());
        if(StringUtils.isNotEmpty(rel.getOwnValue()))
        	writer.writeAttribute(XMLUtil.OWN_VALUE, rel.getOwnValue());
        if(StringUtils.isNotEmpty(rel.getObjectClass()))
        	writer.writeAttribute(XMLUtil.OBJECT_CLASS, rel.getObjectClass());
        if(StringUtils.isNotEmpty(rel.getContentType()))
        	writer.writeAttribute(XMLUtil.CONTENT_TYPE, rel.getContentType());
        if(rel.getSourceId() != null)
        	writer.writeAttribute(XMLUtil.RELATION_SOURCE_ID, rel.getSourceId().toString());
        if(rel.getTargetId() != null)
        	writer.writeAttribute(XMLUtil.RELATION_TARGET_ID, rel.getTargetId().toString());
        if(rel.getVersion() != null)
        	writer.writeAttribute(XMLUtil.VERSION, rel.getVersion().toString());
        if(rel.getModificationTime() != null)
        	writer.writeAttribute(XMLUtil.MODIFICATION_TIME, rel.getModificationTime().toString());
        
		writer.writeEndElement();
	}
	
	private static void insertEntity(Entity entity, XMLStreamWriter writer, PersistenceService ps) throws XMLStreamException{
		
		writer.writeStartElement((entity.getType().equals(Node.TYPE_TBOX)) ? XMLUtil.DEFINITION : XMLUtil.ENTITY);
		
		if(entity.isLightweight()){
			entity = ps.getEntityContent(entity);
		}

		if(StringUtils.isNotEmpty(entity.getObjectClass()))
        	writer.writeAttribute(XMLUtil.OBJECT_CLASS, entity.getObjectClass());
        if(entity.getId() != null)
    		writer.writeAttribute(XMLUtil.ID, entity.getId().toString());
        if(StringUtils.isNotEmpty(entity.getOwnValue()))
    		writer.writeAttribute(XMLUtil.OWN_VALUE, entity.getOwnValue());
        if(StringUtils.isNotEmpty(entity.getContentType()))
        	writer.writeAttribute(XMLUtil.CONTENT_TYPE, entity.getContentType());
        if(entity.getVersion() != null)
        	writer.writeAttribute(XMLUtil.VERSION, entity.getVersion().toString());
        if(entity.getModificationTime() != null)
        	writer.writeAttribute(XMLUtil.MODIFICATION_TIME, entity.getModificationTime().toString());

		
		if(entity.getAttributes().size() > 0){
			writer.writeStartElement(XMLUtil.ATTRIBUTES);
			for(Attribute att : entity.getAttributes()){
				insertEntity(att, writer);
			}	
			writer.writeEndElement();
		}
		
		writer.writeEndElement();
	}
	
	private static void insertEntity(Attribute att, XMLStreamWriter writer) throws XMLStreamException{
		writer.writeStartElement(XMLUtil.ATTRIBUTE);
        
        if(StringUtils.isNotEmpty(att.getName()))
        	writer.writeAttribute(XMLUtil.ATTRIBUTE_NAME, att.getName());
		if(att.getId() != null)
    		writer.writeAttribute(XMLUtil.ID, att.getId().toString());
        if(StringUtils.isNotEmpty(att.getValue()))
        	writer.writeAttribute(XMLUtil.ATTRIBUTE_VALUE, att.getValue());
        if(StringUtils.isNotEmpty(att.getContentType()))
        	writer.writeAttribute(XMLUtil.CONTENT_TYPE, att.getContentType());
        if(att.getVersion() != null)
        	writer.writeAttribute(XMLUtil.VERSION, att.getVersion().toString());
        if(att.getModificationTime() != null)
        	writer.writeAttribute(XMLUtil.MODIFICATION_TIME, att.getModificationTime().toString());
        
		writer.writeEndElement();
	}
	
	
	
	public static void main(String[] args) {
		//ServiceRegistry srvReg = new ServiceRegistry();
		//OM4StreamWriter.backupEntities("/Users/jurzua/ent.xml", srvReg.getPersistenceService());
		logger.info(DateFormat.getInstance().format(new Date()));
	}
}