/*
 *  eXist Open Source Native XML Database
 *  Copyright (C) 2001-04 The eXist Project
 *  http://exist-db.org
 *  
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public License
 *  as published by the Free Software Foundation; either version 2
 *  of the License, or (at your option) any later version.
 *  
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *  
 *  You should have received a copy of the GNU Lesser General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *  
 *  $Id: ValueAppendAction.java 4481 2006-10-04 14:54:50Z wolfgang_m $
 */
package org.exist.xmldb.test.concurrent.action;

import junit.framework.Assert;

import org.xmldb.api.DatabaseManager;
import org.xmldb.api.base.Collection;
import org.xmldb.api.base.ResourceSet;
import org.xmldb.api.base.XMLDBException;
import org.xmldb.api.modules.XPathQueryService;
import org.xmldb.api.modules.XUpdateQueryService;

/**
 * @author wolf
 */
public class ValueAppendAction extends Action {

    private static final String REMOVE =
        "<xu:modifications xmlns:xu=\"http://www.xmldb.org/xupdate\" version=\"1.0\">"
        + "<xu:remove select=\"//item[last()]\">"
        + "</xu:remove>"
        + "</xu:modifications>";
    
    public ValueAppendAction(String collectionPath, String resourceName) {
		super(collectionPath, resourceName);
	}
    
    /* (non-Javadoc)
     * @see org.exist.xmldb.test.concurrent.Action#execute()
     */
    public boolean execute() throws Exception {
        Collection col = DatabaseManager.getCollection(collectionPath, "admin", null);
		XUpdateQueryService service = (XUpdateQueryService)
			col.getService("XUpdateQueryService", "1.0");
		XPathQueryService query = (XPathQueryService)
    		col.getService("XPathQueryService", "1.0");
		append(service);
		query(query);
        remove(service);
        return false;
    }

    private void remove(XUpdateQueryService service) throws XMLDBException {
		System.out.println(Thread.currentThread().getName() + ": removing elements ...");
		for(int i = 0; i < 10; i++)
			service.update(REMOVE);
	}
    
    private void append(XUpdateQueryService service) throws Exception {
		final String updateOpen =
			"<xu:modifications xmlns:xu=\"http://www.xmldb.org/xupdate\" version=\"1.0\">" +
			"<xu:append select=\"/items\" child=\"1\">";
		final String updateClose =
			"</xu:append>" +
			"</xu:modifications>";
		System.out.println(Thread.currentThread().getName() + ": inserting elements ...");
		for (int i = 0; i < 10; i++) {
			String update = updateOpen +
				"<item id=\"" + i + "\"><name>abcdefg</name>" +
				"<value>" + (44.53 + i) + "</value></item>"
				+ updateClose;
			service.update(update);
		}
	}
    
    private void query(XPathQueryService service) throws Exception {
        ResourceSet result = service.queryResource(resourceName, "/items/item[value = 44.53]");
        Assert.assertEquals(1, result.getSize());
        result = service.queryResource(resourceName, "/items/item[@id=1]/name[.='abcdefg']/text()");
        Assert.assertEquals(1, result.getSize());
        Assert.assertEquals("abcdefg", result.getResource(0).getContent().toString());
        
    }
}
