/*
 * Copyright (C) 2009 eXo Platform SAS.
 *
 * 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.exoplatform.services.jcr.integration;

import junit.framework.TestCase;

import org.hsqldb.DatabaseManager;

import java.io.File;
import java.io.FileFilter;
import java.sql.Connection;
import java.sql.DriverManager;

/**
 * "Test case" that makes sure that the test repository is properly initialized for the JCR API
 * tests.
 */
public class PrepareTestRepository extends TestCase
{

   /** The encoding for the test resource */
   private static final String ENCODING = "UTF-8";

   class LockFilter implements FileFilter
   {
      public boolean accept(File pathname)
      {
         return pathname.getName().endsWith(".lck");
      }
   }

   @Override
   protected void setUp() throws Exception
   {
      shutdownHsqldb();

      super.setUp();
   }

   @Override
   protected void tearDown() throws Exception
   {
      try
      {
         super.tearDown();
      }
      finally
      {
         shutdownHsqldb();
      }
   }

   private void shutdownHsqldb()
   {
      for (Object uri : DatabaseManager.getDatabaseURIs())
      {
         System.out.print("Shutdown\t" + uri.toString());
         try
         {
            Connection c = DriverManager.getConnection("jdbc:hsqldb:" + uri.toString(), "sa", "");
            c.createStatement().execute("SHUTDOWN");
            System.out.println("\t\t\t[ok]");
         }
         catch (Throwable e)
         {
            System.out.println("\t\t\t[error]");
            e.printStackTrace();
         }
      }
   }

   public void testname() throws Exception
   {

   }

   //   public void testPrepareTestRepository() throws RepositoryException, IOException
   //   {
   //      NodeTypeManagerImpl manager = (NodeTypeManagerImpl)superuser.getWorkspace().getNodeTypeManager();
   //
   //      // if (!manager.hasNodeType("test:versionable")) {
   //      // InputStream xml = getClass().getResourceAsStream("test-nodetypes.xml");
   //      // try {
   //      // manager.registerNodeTypes(xml, JackrabbitNodeTypeManager.TEXT_XML);
   //      // } finally {
   //      // xml.close();
   //      // }
   //      // }
   //
   //      Node data = getOrAddNode(superuser.getRootNode(), "testdata");
   //      addPropertyTestData(getOrAddNode(data, "property"));
   //      addQueryTestData(getOrAddNode(data, "query"));
   //      addNodeTestData(getOrAddNode(data, "node"));
   //      addExportTestData(getOrAddNode(data, "docViewTest"));
   //      superuser.save();
   //   }
   //
   //   private Node getOrAddNode(Node node, String name) throws RepositoryException
   //   {
   //      try
   //      {
   //         return node.getNode(name);
   //      }
   //      catch (PathNotFoundException e)
   //      {
   //         return node.addNode(name);
   //      }
   //   }
   //
   //   /**
   //    * Creates a test node at {@link #TEST_DATA_PATH} with a boolean, double, long, calendar and a
   //    * path property.
   //    */
   //   private void addPropertyTestData(Node node) throws RepositoryException
   //   {
   //      node.setProperty("boolean", true);
   //      node.setProperty("double", Math.PI);
   //      node.setProperty("long", 90834953485278298l);
   //      Calendar c = Calendar.getInstance();
   //      c.set(2005, 6, 18, 17, 30);
   //      node.setProperty("calendar", c);
   //      ValueFactory factory = node.getSession().getValueFactory();
   //      node.setProperty("path", factory.createValue("/", PropertyType.PATH));
   //      node.setProperty("multi", new String[]{"one", "two", "three"});
   //   }
   //
   //   /**
   //    * Creates four nodes under the given node. Each node has a String property named "prop1" with
   //    * some content set.
   //    */
   //   private void addQueryTestData(Node node) throws RepositoryException
   //   {
   //      while (node.hasNode("node1"))
   //      {
   //         node.getNode("node1").remove();
   //      }
   //      getOrAddNode(node, "node1").setProperty("prop1", "You can have it good, cheap, or fast. Any two.");
   //      getOrAddNode(node, "node1").setProperty("prop1", "foo bar");
   //      getOrAddNode(node, "node1").setProperty("prop1", "Hello world!");
   //      getOrAddNode(node, "node2").setProperty("prop1", "Apache Jackrabbit");
   //   }
   //
   //   /**
   //    * Creates three nodes under the given node: one of type nt:resource and the other nodes
   //    * referencing it.
   //    */
   //   private void addNodeTestData(Node node) throws RepositoryException, IOException
   //   {
   //      if (node.hasNode("multiReference"))
   //      {
   //         node.getNode("multiReference").remove();
   //      }
   //      if (node.hasNode("resReference"))
   //      {
   //         node.getNode("resReference").remove();
   //      }
   //      if (node.hasNode("myResource"))
   //      {
   //         node.getNode("myResource").remove();
   //      }
   //
   //      Node resource = node.addNode("myResource", "nt:resource");
   //      resource.setProperty("jcr:encoding", ENCODING);
   //      resource.setProperty("jcr:mimeType", "text/plain");
   //      resource.setProperty("jcr:data", new ByteArrayInputStream("Hello w\u00F6rld.".getBytes(ENCODING)));
   //      resource.setProperty("jcr:lastModified", Calendar.getInstance());
   //
   //      Node resReference = getOrAddNode(node, "reference");
   //      resReference.setProperty("ref", resource);
   //      // make this node itself referenceable
   //      resReference.addMixin("mix:referenceable");
   //
   //      Node multiReference = node.addNode("multiReference");
   //      ValueFactory factory = node.getSession().getValueFactory();
   //      multiReference.setProperty("ref", new Value[]{factory.createValue(resource), factory.createValue(resReference)});
   //   }
   //
   //   private void addExportTestData(Node node) throws RepositoryException, IOException
   //   {
   //      getOrAddNode(node, "invalidXmlName").setProperty("propName", "some text");
   //
   //      // three nodes which should be serialized as xml text in docView export
   //      // separated with spaces
   //      getOrAddNode(node, "jcr:xmltext").setProperty("jcr:xmlcharacters", "A text without any special character.");
   //      getOrAddNode(node, "some-element");
   //      getOrAddNode(node, "jcr:xmltext").setProperty("jcr:xmlcharacters",
   //         " The entity reference characters: <, ', ,&, >,  \" should" + " be escaped in xml export. ");
   //      getOrAddNode(node, "some-element");
   //      getOrAddNode(node, "jcr:xmltext").setProperty("jcr:xmlcharacters", "A text without any special character.");
   //
   //      Node big = getOrAddNode(node, "bigNode");
   //      big.setProperty("propName0", "SGVsbG8gd8O2cmxkLg==;SGVsbG8gd8O2cmxkLg==".split(";"), PropertyType.BINARY);
   //      big.setProperty("propName1", "text 1");
   //      big.setProperty("propName2", "multival text 1;multival text 2;multival text 3".split(";"));
   //      big.setProperty("propName3", "text 1");
   //
   //      addExportValues(node, "propName");
   //      addExportValues(node, "Prop<>prop");
   //   }
   //
   //   /**
   //    * create nodes with following properties binary & single binary & multival notbinary & single
   //    * notbinary & multival
   //    */
   //   private void addExportValues(Node node, String name) throws RepositoryException, IOException
   //   {
   //      String prefix = "valid";
   //      if (name.indexOf('<') != -1)
   //      {
   //         prefix = "invalid";
   //      }
   //      node = getOrAddNode(node, prefix + "Names");
   //
   //      String[] texts = new String[]{"multival text 1", "multival text 2", "multival text 3"};
   //      getOrAddNode(node, prefix + "MultiNoBin").setProperty(name, texts);
   //
   //      Node resource = getOrAddNode(node, prefix + "MultiBin");
   //      resource.setProperty("jcr:encoding", ENCODING);
   //      resource.setProperty("jcr:mimeType", "text/plain");
   //      String[] values = new String[]{"SGVsbG8gd8O2cmxkLg==", "SGVsbG8gd8O2cmxkLg=="};
   //      resource.setProperty(name, values, PropertyType.BINARY);
   //      resource.setProperty("jcr:lastModified", Calendar.getInstance());
   //
   //      getOrAddNode(node, prefix + "NoBin").setProperty(name, "text 1");
   //
   //      resource = getOrAddNode(node, "invalidBin");
   //      resource.setProperty("jcr:encoding", ENCODING);
   //      resource.setProperty("jcr:mimeType", "text/plain");
   //      byte[] bytes = "Hello w\u00F6rld.".getBytes(ENCODING);
   //      resource.setProperty(name, new ByteArrayInputStream(bytes));
   //      resource.setProperty("jcr:lastModified", Calendar.getInstance());
   //   }

}
