/*
 * JBoss, Home of Professional Open Source.
 * Copyright 2008, Red Hat Middleware LLC, and individual contributors
 * as indicated by the @author tags. See the copyright.txt file in the
 * distribution for a full listing of individual contributors.
 *
 * This 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.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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 software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */
package org.jboss.test.jmx.xmbean;

import java.io.File;

import javax.management.Attribute;
import javax.management.AttributeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.jboss.mx.persistence.AttributePersistenceManager;
import org.jboss.system.ServiceMBeanSupport;
import org.jboss.system.pm.XMLAttributePersistenceManager;
import org.jboss.system.server.ServerConfigLocator;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

/**
 * A test service that wraps an XMLAttributePersistenceManager
 * configured to write to a random directory containing a space
 * in its name, e.g. "./tmp/XmlApmXXXXXTest .dir"
 * 
 * @see org.jboss.test.jmx.test.MLAttributePersistenceManagerUnitTestCase
 * 
 * @author <a href="mailto:dimitris@jboss.org">Dimitris Andreadis</a>
 * @version $Revision: 91254 $
 */
public class XMLAttributePersistenceManagerTestService
   extends ServiceMBeanSupport
{
   private AttributePersistenceManager apm;
   private File storeDir;
   
   protected void startService()
      throws Exception
   {
      File tmpDir = new File(ServerConfigLocator.locate().getServerTempLocation().toURI());
      boolean result;
      
      // Get a temporary file in the server tmp dir, with a space in its name
      storeDir = File.createTempFile("XmlApm", "Test .dir", tmpDir);
      
      // Remove the tmp file
      result = storeDir.delete();

      // Recreate it as directory
      result = storeDir.mkdir();
      log.info("Created 'bad' store dir: " + storeDir + ", " + result);
      
      String dirURL = storeDir.toURL().toString();
      log.info("Dir URL: " + dirURL);      
      
      apm = new XMLAttributePersistenceManager();

      // Initialize an XMLAttributePeristenceManager and
      // configure it to point to the "bad" directory
      apm.create(null, prepareConfig(dirURL));
   }
   
   protected void stopService()
      throws Exception
   {
      if (apm != null)
      {
         apm.removeAll();
         apm.destroy();
         log.info("Destroyed AttributePersistenceManager");
      }
      if (storeDir != null)
      {
         boolean result = storeDir.delete();
         log.info("Removed: " +  storeDir + ", " + result);
      }
   }
   
   public void store(String id, AttributeList atlist) throws Exception
   {
      apm.store(id, atlist);
   }
   
   public AttributeList load(String id) throws Exception
   {
      return apm.load(id);
   }
   
   public void selftest() throws Exception
   {
      // Store some attributes under an id
      AttributeList alist = new AttributeList();
      String storeId = "bananarama";
      
      Integer anInteger = new Integer(666);
      String aString = new String("Evil Test");
      alist.add(new Attribute("Attr1", anInteger));
      alist.add(new Attribute("Attr2", aString));
      apm.store(storeId, alist);
      
      // Read them back
      AttributeList alist2 = apm.load(storeId);      
   }
   
   private Element prepareConfig(String dir) throws Exception
   {
      // build the config XML Element in memory using DOM
      DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      Document doc = builder.newDocument();

      // Create config element
      Element config = doc.createElement(XMLAttributePersistenceManager.DATA_DIR_ELEMENT);
      
      // Insert a text node with the directory name
      Node text = doc.createTextNode(dir);
      
      config.appendChild(text);
      
      // Return the config
      return config;
   }   
}
