package com.hcsc.itf.osgi.samples.bp_sdm_jpa.itests.jpa;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.ops4j.pax.exam.CoreOptions.bootDelegationPackages;
import static org.ops4j.pax.exam.CoreOptions.equinox;
import static org.ops4j.pax.exam.CoreOptions.options;
import static org.ops4j.pax.exam.CoreOptions.systemProperty;
import static org.ops4j.pax.exam.container.def.PaxRunnerOptions.vmOption;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.naming.InitialContext;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.ops4j.pax.exam.Option;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.osgi.framework.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.hcsc.itf.osgi.samples.bp_sdm_jpa.api.persistence.Author;
import com.hcsc.itf.osgi.samples.bp_sdm_jpa.api.persistence.BlogPersistenceService;
import com.hcsc.itf.osgi.samples.bp_sdm_jpa.itests.AbstractIntegrationTest;

/**
 *
 */
@RunWith(JUnit4TestRunner.class)
public class BpJpaJndiLookUpITest extends AbstractIntegrationTest {
	private static Logger _log = LoggerFactory.getLogger(BpJpaJndiLookUpITest.class);


	@Test
	public void testPeristence() throws Exception {
		InitialContext ic = new InitialContext();

		BlogPersistenceService jpaService = (BlogPersistenceService) ic.lookup("osgi:service/"
				+ "com.hcsc.itf.osgi.samples.bp_sdm_jpa.api.persistence.BlogPersistenceService");

		_log.info("\n\n\n\n\n\n");
		_log.info("========================================================================");
		_log.info("Successfully looked up BlogPersistenceService with JNDI-Name: osgi.jndi.service.name=persistence/bpJPAPersistenceService");
		_log.info("========================================================================");
		_log.info("\n\n\n\n\n\n");

		Date dateOfBirth = new SimpleDateFormat("yyyy-MM-dd")
				.parse("1964-07-15");
		jpaService.createAuthor("matt@yahoo.com", dateOfBirth,
				"Matt G Madhavan", "mattmadhavan", "Nice Guy");

		dateOfBirth = new SimpleDateFormat("yyyy-MM-dd").parse("1954-07-15");
		jpaService.createAuthor("julie@yahoo.com", dateOfBirth, "Julie Salek",
				"juliesalek", "Bad Bad");

		List<? extends Author> authors = jpaService.getAllAuthors();

		assertEquals(2, authors.size());

		_log.info("\n\n\n\n\n\n");
		_log.info("========================================================================");
		_log.info("Successfully tested persistence (BluePrint Based DataSource........)");
		_log.info("========================================================================");
		_log.info("\n\n\n\n\n\n");

	}

	@org.ops4j.pax.exam.junit.Configuration
	public static Option[] configuration() {
		Option[] options = options(
				bootDelegationPackages("javax.transaction",
						"javax.transaction.*"),
				vmOption("-Dorg.osgi.framework.system.packages=javax.accessibility,javax.activation,javax.activity,javax.annotation,javax.annotation.processing,javax.crypto,javax.crypto.interfaces,javax.crypto.spec,javax.imageio,javax.imageio.event,javax.imageio.metadata,javax.imageio.plugins.bmp,javax.imageio.plugins.jpeg,javax.imageio.spi,javax.imageio.stream,javax.jws,javax.jws.soap,javax.lang.model,javax.lang.model.element,javax.lang.model.type,javax.lang.model.util,javax.management,javax.management.loading,javax.management.modelmbean,javax.management.monitor,javax.management.openmbean,javax.management.relation,javax.management.remote,javax.management.remote.rmi,javax.management.timer,javax.naming,javax.naming.directory,javax.naming.event,javax.naming.ldap,javax.naming.spi,javax.net,javax.net.ssl,javax.print,javax.print.attribute,javax.print.attribute.standard,javax.print.event,javax.rmi,javax.rmi.CORBA,javax.rmi.ssl,javax.script,javax.security.auth,javax.security.auth.callback,javax.security.auth.kerberos,javax.security.auth.login,javax.security.auth.spi,javax.security.auth.x500,javax.security.cert,javax.security.sasl,javax.sound.midi,javax.sound.midi.spi,javax.sound.sampled,javax.sound.sampled.spi,javax.sql,javax.sql.rowset,javax.sql.rowset.serial,javax.sql.rowset.spi,javax.swing,javax.swing.border,javax.swing.colorchooser,javax.swing.event,javax.swing.filechooser,javax.swing.plaf,javax.swing.plaf.basic,javax.swing.plaf.metal,javax.swing.plaf.multi,javax.swing.plaf.synth,javax.swing.table,javax.swing.text,javax.swing.text.html,javax.swing.text.html.parser,javax.swing.text.rtf,javax.swing.tree,javax.swing.undo,javax.tools,javax.xml,javax.xml.bind,javax.xml.bind.annotation,javax.xml.bind.annotation.adapters,javax.xml.bind.attachment,javax.xml.bind.helpers,javax.xml.bind.util,javax.xml.crypto,javax.xml.crypto.dom,javax.xml.crypto.dsig,javax.xml.crypto.dsig.dom,javax.xml.crypto.dsig.keyinfo,javax.xml.crypto.dsig.spec,javax.xml.datatype,javax.xml.namespace,javax.xml.parsers,javax.xml.soap,javax.xml.stream,javax.xml.stream.events,javax.xml.stream.util,javax.xml.transform,javax.xml.transform.dom,javax.xml.transform.sax,javax.xml.transform.stax,javax.xml.transform.stream,javax.xml.validation,javax.xml.ws,javax.xml.ws.handler,javax.xml.ws.handler.soap,javax.xml.ws.http,javax.xml.ws.soap,javax.xml.ws.spi,javax.xml.xpath,org.ietf.jgss,org.omg.CORBA,org.omg.CORBA.DynAnyPackage,org.omg.CORBA.ORBPackage,org.omg.CORBA.TypeCodePackage,org.omg.CORBA.portable,org.omg.CORBA_2_3,org.omg.CORBA_2_3.portable,org.omg.CosNaming,org.omg.CosNaming.NamingContextExtPackage,org.omg.CosNaming.NamingContextPackage,org.omg.Dynamic,org.omg.DynamicAny,org.omg.DynamicAny.DynAnyFactoryPackage,org.omg.DynamicAny.DynAnyPackage,org.omg.IOP,org.omg.IOP.CodecFactoryPackage,org.omg.IOP.CodecPackage,org.omg.Messaging,org.omg.PortableInterceptor,org.omg.PortableInterceptor.ORBInitInfoPackage,org.omg.PortableServer,org.omg.PortableServer.CurrentPackage,org.omg.PortableServer.POAManagerPackage,org.omg.PortableServer.POAPackage,org.omg.PortableServer.ServantLocatorPackage,org.omg.PortableServer.portable,org.omg.SendingContext,org.omg.stub.java.rmi,org.w3c.dom,org.w3c.dom.bootstrap,org.w3c.dom.css,org.w3c.dom.events,org.w3c.dom.html,org.w3c.dom.ls,org.w3c.dom.ranges,org.w3c.dom.stylesheets,org.w3c.dom.traversal,org.w3c.dom.views,org.xml.sax,org.xml.sax.ext,org.xml.sax.helpers,javax.transaction;partial=true;mandatory:=partial,javax.transaction.xa;partial=true;mandatory:=partial"),
				// Log
				mavenBundle("org.ops4j.pax.logging", "pax-logging-api"),
				mavenBundle("org.ops4j.pax.logging", "pax-logging-service"),
				// Felix mvn url handler - do we need this?
				mavenBundle("org.ops4j.pax.url", "pax-url-mvn"),

				// this is how you set the default log level when using pax
				// logging (logProfile)
				systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level")
						.value("DEBUG"),

				// Bundles
				mavenBundle("org.eclipse.equinox", "cm"),
				mavenBundle("org.eclipse.osgi", "services"),

				mavenBundle("org.ops4j.pax.web", "pax-web-extender-war"),
				mavenBundle("org.ops4j.pax.web", "pax-web-jetty-bundle"),
				mavenBundle("org.ops4j.pax.web", "pax-web-jsp"),
				mavenBundle("org.apache.derby", "derby"),
				mavenBundle("org.apache.geronimo.specs",
						"geronimo-jpa_2.0_spec"),

				mavenBundle("org.apache.geronimo.specs",
						"geronimo-jta_1.1_spec"),
				mavenBundle("org.apache.geronimo.specs",
						"geronimo-j2ee-connector_1.5_spec"),
				mavenBundle("org.apache.geronimo.specs",
						"geronimo-j2ee-connector_1.5_spec"),
				mavenBundle("org.apache.geronimo.specs",
						"geronimo-servlet_2.5_spec"),
				mavenBundle("org.apache.geronimo.components",
						"geronimo-transaction"),
				mavenBundle("org.apache.openjpa", "openjpa"),
				mavenBundle("commons-lang", "commons-lang"),
				mavenBundle("commons-collections", "commons-collections"),
				mavenBundle("commons-pool", "commons-pool"),
				mavenBundle("org.apache.servicemix.bundles",
						"org.apache.servicemix.bundles.serp"),
				mavenBundle("org.apache.aries.blueprint",
						"org.apache.aries.blueprint"),
				mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy"),
				mavenBundle("org.apache.aries", "org.apache.aries.util"),
				mavenBundle("org.apache.aries.jndi", "org.apache.aries.jndi"),
				mavenBundle("org.apache.felix",
						"org.apache.felix.bundlerepository"),
				mavenBundle("org.apache.felix", "org.apache.felix.fileinstall"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.resolver.obr"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.install"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.api"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.management"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.runtime"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.utils"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.modeller"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.default.local.platform"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.noop.platform.repo"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.noop.postresolve.process"),
				mavenBundle("org.apache.aries.application",
						"org.apache.aries.application.deployment.management"),
				mavenBundle("org.apache.aries.jpa", "org.apache.aries.jpa.api"),
				mavenBundle("org.apache.aries.jpa",
						"org.apache.aries.jpa.container"),
				mavenBundle("org.apache.aries.jpa",
						"org.apache.aries.jpa.blueprint.aries"),
				mavenBundle("org.apache.aries.jpa",
						"org.apache.aries.jpa.container.context"),
				mavenBundle("org.apache.aries.transaction",
						"org.apache.aries.transaction.manager"),
				mavenBundle("org.apache.aries.transaction",
						"org.apache.aries.transaction.blueprint"),
				mavenBundle("org.apache.aries.transaction",
						"org.apache.aries.transaction.wrappers"),
				mavenBundle("com.hcsc.itf.osgi.samples.bp_sdm_jpa",
						"com.hcsc.itf.osgi.samples.bp_sdm_jpa.datasource"),
				mavenBundle("com.hcsc.itf.osgi.samples.bp_sdm_jpa",
						"com.hcsc.itf.osgi.samples.bp_sdm_jpa.api"),
				mavenBundle("com.hcsc.itf.osgi.samples.bp_sdm_jpa",
						"com.hcsc.itf.osgi.samples.bp_sdm_jpa.jpa"),
				mavenBundle("asm", "asm-all"), equinox().version("3.5.0"));
		options = updateOptions(options);
		return options;
	}
}
