/******************************************************************************* * Copyright (c) 1998, 2015 Oracle and/or its affiliates. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * dclarke - Dynamic Persistence * http://wiki.eclipse.org/EclipseLink/Development/Dynamic * (https://bugs.eclipse.org/bugs/show_bug.cgi?id=200045) * mnorman - tweaks to work from Ant command-line, * get database properties from System, etc. * ******************************************************************************/ package org.eclipse.persistence.testing.tests.dynamic.sessionsxml; //javase imports import java.util.Map; import org.w3c.dom.Document; //JUnit4 imports import org.junit.BeforeClass; import org.junit.Test; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; //EclipseLink imports import org.eclipse.persistence.descriptors.ClassDescriptor; import org.eclipse.persistence.dynamic.DynamicClassLoader; import org.eclipse.persistence.dynamic.DynamicEntity; import org.eclipse.persistence.dynamic.DynamicTypeBuilder; import org.eclipse.persistence.internal.sessions.AbstractSession; import org.eclipse.persistence.internal.sessions.factories.SessionsFactory; import org.eclipse.persistence.internal.sessions.factories.XMLSessionConfigProject_11_1_1; import org.eclipse.persistence.internal.sessions.factories.model.SessionConfigs; import org.eclipse.persistence.internal.sessions.factories.model.login.LoginConfig; import org.eclipse.persistence.internal.sessions.factories.model.project.ProjectConfig; import org.eclipse.persistence.internal.sessions.factories.model.session.SessionConfig; import org.eclipse.persistence.logging.SessionLog; import org.eclipse.persistence.oxm.XMLContext; import org.eclipse.persistence.oxm.XMLUnmarshaller; import org.eclipse.persistence.sessions.DatabaseSession; import org.eclipse.persistence.sessions.Login; import org.eclipse.persistence.sessions.Project; import org.eclipse.persistence.sessions.Session; import org.eclipse.persistence.sessions.factories.SessionManager; import org.eclipse.persistence.sessions.factories.XMLSessionConfigLoader; //domain-specific (testing) imports import static org.eclipse.persistence.testing.tests.dynamic.DynamicTestingHelper.createLogin; import static org.eclipse.persistence.testing.tests.dynamic.DynamicTestingHelper.logLevel; public class ComicsConfigTestSuite { public static final String PACKAGE_PATH = ComicsConfigTestSuite.class.getPackage().getName().replace('.', '/'); public static final String COMICS_SESSION_XML = PACKAGE_PATH + "/sessions.xml"; public static final String COMICS_SESSION_NAME = "dynamic-comics"; // test fixtures static DatabaseSession session = null; @BeforeClass public static void setUp() { session = buildComicsSession(); assertNotNull(session); } public static DatabaseSession buildComicsSession() { DynamicClassLoader dcl = new DynamicClassLoader(ComicsConfigTestSuite.class.getClassLoader()); new DynamicTypeBuilder(dcl.createDynamicClass("model.Issue"), null); new DynamicTypeBuilder(dcl.createDynamicClass("model.Publisher"), null); new DynamicTypeBuilder(dcl.createDynamicClass("model.Title"), null); XMLSessionConfigLoader loader = new XMLSessionConfigLoader(COMICS_SESSION_XML) { @SuppressWarnings("unchecked") public boolean load(SessionManager sessionManager, ClassLoader loader) { Document document = loadDocument(loader); if(getExceptionStore().isEmpty()){ if (document.getDocumentElement().getTagName().equals("sessions")) { XMLContext context = new XMLContext(new XMLSessionConfigProject_11_1_1()); XMLUnmarshaller unmarshaller = context.createUnmarshaller(); SessionConfigs configs = (SessionConfigs)unmarshaller.unmarshal(document); SessionsFactory factory = new SessionsFactory() { @Override protected Project loadProjectConfig(ProjectConfig projectConfig) { if (projectConfig.isProjectXMLConfig()) { projectConfig.setProjectString(PACKAGE_PATH + "/" + projectConfig.getProjectString()); } return super.loadProjectConfig(projectConfig); } @Override protected Login buildLogin(LoginConfig loginConfig) { return createLogin(); } @Override protected AbstractSession buildSession(SessionConfig sessionConfig) { AbstractSession s = super.buildSession(sessionConfig); if (SessionLog.OFF == logLevel) { s.dontLogMessages(); } else { s.setLogLevel(logLevel); } return s; } }; Map<String, Session> sessions = factory.buildSessionConfigs(configs, loader); for (Map.Entry<String, Session> entry : sessions.entrySet()) { if (!sessionManager.getSessions().containsKey(entry.getKey())) { sessionManager.addSession(entry.getKey(), entry.getValue()); } } return true; } } return false; } }; loader.setClassLoader(dcl); loader.setSessionName(COMICS_SESSION_NAME); return (DatabaseSession)SessionManager.getManager().getSession(loader); } @Test public void verifyDescriptorClasses() { ClassDescriptor descriptor = session.getClassDescriptorForAlias("Issue"); assertNotNull(descriptor); assertTrue(DynamicEntity.class.isAssignableFrom(descriptor.getJavaClass())); descriptor = session.getClassDescriptorForAlias("Publisher"); assertNotNull(descriptor); assertTrue(DynamicEntity.class.isAssignableFrom(descriptor.getJavaClass())); descriptor = session.getClassDescriptorForAlias("Title"); assertNotNull(descriptor); assertTrue(DynamicEntity.class.isAssignableFrom(descriptor.getJavaClass())); } }