/*
 * Created on 26.10.2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
import java.io.File;
import java.io.FileInputStream;

import org.apache.xindice.client.xmldb.services.CollectionManagementServiceImpl;
import org.apache.xindice.xml.dom.DOMParser;
import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.Database;
import org.xmldb.api.base.ResourceIterator;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.base.XMLDBException;
import org.xmldb.api.modules.BinaryResource;
import org.xmldb.api.modules.XMLResource;
import org.xmldb.api.modules.XPathQueryService;

/**
 * @author Mig-O
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
public class EmbeddedXindiceTests {

	static Collection rootCollection = null;
	static Collection newCollection = null;
	static Database database;
	static CollectionManagementServiceImpl colMgmtService;

	public static void makeQuery() throws Exception {
	
		XPathQueryService service =
			(XPathQueryService) newCollection.getService("XPathQueryService", "1.0");
		ResourceSet resultSet = service.query("/sdpConcept");
		ResourceIterator results = resultSet.getIterator();
		int collectionSize = newCollection.getResourceCount();
		int resultCount = 0;
		while( results.hasMoreResources() ) {
			results.nextResource();
			resultCount++;			
		}
		System.out.println("Query returned "+resultCount+" out of "+collectionSize+" documents.");
		
	}
	public static void insertDocuments() throws Exception {
		
        String moduleXML = readFileToString("C:\\Projekte\\InPULSE\\InPULSE-CVS\\AuthorModuleDef\\Observer.xml");
        byte[] imageBinary = readFileToByteArray("C:\\Projekte\\InPULSE\\InPULSE-CVS\\AuthorModuleDef\\pics\\miezen.jpg");
        byte[] umlXmiBinary = readFileToByteArray("C:\\Projekte\\InPULSE\\InPULSE-CVS\\AuthorModuleDef\\xmi\\OAdapter.xml");
        
        XMLResource document1 = (XMLResource) newCollection.createResource(null, "XMLResource");
        document1.setContent(moduleXML);
        newCollection.storeResource(document1);
        System.out.println("Document AuthorModuleDefObserver.xml inserted as " + document1.getId());
		
        BinaryResource document2 = (BinaryResource) newCollection.createResource(null, "BinaryResource");
        document2.setContent(imageBinary);
        newCollection.storeResource(document2);
        System.out.println("Document miezen.jpg inserted as " + document2.getId());
		
        BinaryResource document3 = (BinaryResource) newCollection.createResource(null, "BinaryResource");
        document3.setContent(umlXmiBinary);
        newCollection.storeResource(document3);
        System.out.println("Document OAdapter.xml inserted as " + document3.getId());
		
		
	}
	
	public static void main(String args[]) {
		System.out.println("EMBEDDED DB TEST V0.1");
		try {
			System.out.println("----- INITIALISING DB --- BEGIN -----");
			openDatabase();
			System.out.println("----- INITIALISING DB ---- END ------");
			System.out.println("--- INSERTING DOCUMENTS - BEGIN -----");
			insertDocuments();
			System.out.println("--- INSERTING DOCUMENTS -- END ------");
			System.out.println("------- QUERYING DB ----- BEGIN -----");
			makeQuery();
			System.out.println("------- QUERYING DB ------ END ------");
			
		} catch (XMLDBException e) {
			System.out.println("Exception: " + e.errorCode);
			e.printStackTrace();
		} catch (Exception e) {
			System.out.println("Exception: " + e);
			e.printStackTrace();
		}
	}
	
	/* -------------- FINISHED ----------------- */

	public static void openDatabase() throws Exception {
		rootCollection = null;
		String driver = "org.apache.xindice.client.xmldb.DatabaseImpl";
		Class c = Class.forName(driver);

		database = (Database) c.newInstance();
		database.setProperty("db-home","./Xindice Data for Embedded Database Tests");
		database.setProperty("use-metadata","on");
		database.setProperty("configuration","./server.xml");
		DatabaseManager.registerDatabase(database);
		String uri = "xmldb:xindice-embed:///db/";
		rootCollection = DatabaseManager.getCollection(uri);

		String collectionName = "emilea-stat-ModuleFrames";
		CollectionManagementServiceImpl service = 
			(CollectionManagementServiceImpl) rootCollection
				.getService("CollectionManager", "1.0");

		// Build up the Collection XML configuration.
		String collectionConfig = "<collection compressed=\"true\" "
				+ "            name=\""
				+ collectionName
				+ "\" inline-metadata=\"true\">"
				+ "   <filer class=\"org.apache.xindice.core.filer.BTreeFiler\"/>"
				+ "</collection>";
        try {
        	newCollection = service.createCollection(collectionName, DOMParser
				.toDocument(collectionConfig));
    		System.out.println("Collection " + collectionName + " created.");
        } catch( XMLDBException e ) {
        	System.out.println("Konnte Collection nicht anlegen: "+e);
        	newCollection = DatabaseManager.getCollection("xmldb:xindice-embed:///db/emilea-stat-ModuleFrames");
    		System.out.println("Using existing collection " + collectionName + ".");
        }
	}

    public static String readFileToString(String fileName) throws Exception {
        return new String(readFileToByteArray(fileName));
    }

    public static byte[] readFileToByteArray(String fileName) throws Exception {
        File file = new File(fileName);
        FileInputStream insr = new FileInputStream(file);
        byte[] fileBuffer = new byte[(int) file.length()];
        insr.read(fileBuffer);
        insr.close();
        return fileBuffer;
    }

}