/*

   Derby - Class org.apache.derbyTesting.functionTests.util.DbFile

   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.

 */

package org.apache.derbyTesting.functionTests.util;

import org.apache.derby.shared.common.error.StandardException;
import org.apache.derby.iapi.store.access.FileResource;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.lang.StringBuffer;
import java.net.URL;

/**
  Utility class for testing files stored in the database.
  */ 
public class DbFile
{
	/**
	  Read the current generation of a file stored in the
	  database we are connected to and return a 1 line string
	  representation of the file.

	  Sample usage
	  values org.apache.derbyTesting.functionTests.util.DbFile::readAsString('S1','J1');
	  @exception Exception Oops.
	  */
/*	
CANT USE JarAccess - not a public API (actually it's gone!)
public static String
	readAsString(String schemaName, String sqlName)
		 throws Exception
	{
		InputStream is = JarAccess.getAsStream(schemaName,
											sqlName,
 											FileResource.CURRENT_GENERATION_ID);
		return stringFromFile(is);
	}
*/
	/**
	  Create a string that contains a representation of the content of
	  a file for testing.
	  @exception Exception Oops.
	  */
	public static String
	stringFromFile(InputStream is)
		 throws Exception
	{
		InputStreamReader isr = new InputStreamReader(is);
		BufferedReader br =
			new BufferedReader(isr);
		StringBuffer sb = new StringBuffer();
		String l;
		while((l = br.readLine()) != null) {
			sb.append(l);
			sb.append("<CR>");
		}
		is.close();
		return sb.toString();
	}

	/**
	  Get the URL for a resource.

	  @param packageName the name of the resource package
	  @param name the name of the resourse.
	  */
	public static URL
	getResourceURL(String packageName, String name)
	{
		String resourceName =
			"/"+
			packageName.replace('.','/')+
			"/"+
			name;
		//
		//We need a class to get our URL. Since we give a
		//fully qualified name for the URL, any class will
		//do.
		Class c = resourceName.getClass();
		URL url = c.getResource(resourceName);
		return url;
	}

	/**
	  Get an InputStream for reading a resource.

	  @param packageName the name of the resource package
	  @param name the name of the resourse.
	  @exception Exception Oops.
	  */
	public static InputStream
	getResourceAsStream(String packageName, String name)
	{
		String resourceName =
			"/"+
			packageName.replace('.','/')+
			"/"+
			name;
		//
		//We need a class to get our URL. Since we give a
		//fully qualified name for the URL, any class will
		//do.
		Class c = resourceName.getClass();
		InputStream result = c.getResourceAsStream(resourceName);
		return result;
	}

	public	static	boolean	deleteFile( String outputFileName )
		 throws Exception
	{
		File f = new File( outputFileName );

		return f.delete();
	}

	public static String mkFileFromResource
	(String packageName, String resourceName)
		 throws Exception
	{
		return mkFileFromResource( packageName, resourceName, resourceName );
	}

	public static String mkFileFromResource
	( String packageName, String resourceName, String outputFileName )
		 throws Exception
	{
		File f = new File( outputFileName );
		InputStream is = getResourceAsStream(packageName,resourceName);
		BufferedInputStream bis = new BufferedInputStream(is);
		OutputStream os = new FileOutputStream(f);
		byte[]buf=new byte[4096];
		int readThisTime = 0;
		while((readThisTime = bis.read(buf)) != -1)
			os.write(buf,0,readThisTime);
		os.close();
		return f.getAbsolutePath();
	}
}
 
