Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PAYARA-1625 fixed data-source from application.xml in JPA #1575

Merged
merged 1 commit into from
May 7, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,16 @@
* only if the new code is made subject to such option by the copyright
* holder.
*/
// Portions Copyright [2016] [Payara Foundation]
// Portions Copyright [2016-2017] [Payara Foundation and/or its affiliates]

package org.glassfish.jdbc.deployer;

import static java.util.logging.Level.FINE;
import static java.util.logging.Level.WARNING;
import static org.glassfish.deployment.common.JavaEEResourceType.DSD;
import static org.glassfish.deployment.common.JavaEEResourceType.DSDPOOL;
import static org.glassfish.resourcebase.resources.api.ResourceConstants.JAVA_APP_SCOPE_PREFIX;
import static org.glassfish.resourcebase.resources.api.ResourceConstants.JAVA_GLOBAL_SCOPE_PREFIX;

import java.beans.PropertyVetoException;
import java.util.ArrayList;
Expand All @@ -58,14 +63,12 @@
import javax.naming.NamingException;

import org.glassfish.deployment.common.Descriptor;
import org.glassfish.deployment.common.JavaEEResourceType;
import org.glassfish.deployment.common.RootDeploymentDescriptor;
import org.glassfish.javaee.services.CommonResourceProxy;
import org.glassfish.jdbc.config.JdbcConnectionPool;
import org.glassfish.jdbc.config.JdbcResource;
import org.glassfish.jdbc.util.LoggerFactory;
import org.glassfish.resourcebase.resources.api.ResourceConflictException;
import org.glassfish.resourcebase.resources.api.ResourceConstants;
import org.glassfish.resourcebase.resources.api.ResourceDeployer;
import org.glassfish.resourcebase.resources.api.ResourceDeployerInfo;
import org.glassfish.resourcebase.resources.api.ResourceInfo;
Expand Down Expand Up @@ -111,6 +114,7 @@ public class DataSourceDefinitionDeployer implements ResourceDeployer {
public void deployResource(Object resource, String applicationName, String moduleName) throws Exception {
//TODO ASR
}

@Override
public void deployResource(Object resource) throws Exception {

Expand Down Expand Up @@ -139,12 +143,7 @@ public void deployResource(Object resource) throws Exception {
*/
@Override
public boolean canDeploy(boolean postApplicationDeployment, Collection<Resource> allResources, Resource resource){
if(handles(resource)){
if(!postApplicationDeployment){
return true;
}
}
return false;
return handles(resource) && !postApplicationDeployment;
}

/**
Expand All @@ -158,7 +157,6 @@ public void validatePreservedResource(com.sun.enterprise.config.serverbeans.Appl
//do nothing.
}


private ResourceDeployer getDeployer(Object resource) {
return resourceManagerFactoryProvider.get().getResourceDeployer(resource);
}
Expand All @@ -167,16 +165,20 @@ private DataSourceProperty convertProperty(String name, String value) {
return new DataSourceProperty(name, value);
}


public void registerDataSourceDefinitions(com.sun.enterprise.deployment.Application application) {
String appName = application.getAppName();
Set<BundleDescriptor> bundles = application.getBundleDescriptors();
for (BundleDescriptor bundle : bundles) {

// Register data source definitions defined in application.xml
registerDataSourceDefinitions(appName, application);

// Register data source definition defined in web.xml and ejb-jar.xml
for (BundleDescriptor bundle : application.getBundleDescriptors()) {
registerDataSourceDefinitions(appName, bundle);
Collection<RootDeploymentDescriptor> dds = bundle.getExtensionsDescriptors();
if(dds != null){
for(RootDeploymentDescriptor dd : dds){
registerDataSourceDefinitions(appName, dd);

Collection<RootDeploymentDescriptor> descriptors = bundle.getExtensionsDescriptors();
if (descriptors != null) {
for (Descriptor descriptor : descriptors) {
registerDataSourceDefinitions(appName, descriptor);
}
}
}
Expand All @@ -186,65 +188,61 @@ private void registerDataSourceDefinitions(String appName, Descriptor descriptor

if (descriptor instanceof JndiNameEnvironment) {
JndiNameEnvironment env = (JndiNameEnvironment) descriptor;
for (Descriptor dsd : env.getResourceDescriptors(JavaEEResourceType.DSD)) {
for (Descriptor dsd : env.getResourceDescriptors(DSD)) {
registerDSDReferredByApplication(appName,(DataSourceDefinitionDescriptor) dsd);
}
}

//ejb descriptor
// EJB descriptor
if (descriptor instanceof EjbBundleDescriptor) {
EjbBundleDescriptor ejbDesc = (EjbBundleDescriptor) descriptor;
Set<? extends EjbDescriptor> ejbDescriptors = ejbDesc.getEjbs();
for (EjbDescriptor ejbDescriptor : ejbDescriptors) {
for (Descriptor dsd : ejbDescriptor.getResourceDescriptors(JavaEEResourceType.DSD)) {

for (EjbDescriptor ejbDescriptor : ejbDesc.getEjbs()) {
for (Descriptor dsd : ejbDescriptor.getResourceDescriptors(DSD)) {
registerDSDReferredByApplication(appName,(DataSourceDefinitionDescriptor) dsd);
}
}
//ejb interceptors
Set<EjbInterceptor> ejbInterceptors = ejbDesc.getInterceptors();
for (EjbInterceptor ejbInterceptor : ejbInterceptors) {
for (Descriptor dsd : ejbInterceptor.getResourceDescriptors(JavaEEResourceType.DSD)) {

// EJB interceptors
for (EjbInterceptor ejbInterceptor : ejbDesc.getInterceptors()) {
for (Descriptor dsd : ejbInterceptor.getResourceDescriptors(DSD)) {
registerDSDReferredByApplication(appName,(DataSourceDefinitionDescriptor) dsd);
}
}
}

if(descriptor instanceof BundleDescriptor){
if (descriptor instanceof BundleDescriptor){
// managed bean descriptors
Set<ManagedBeanDescriptor> managedBeanDescriptors = ((BundleDescriptor)descriptor).getManagedBeans();
for (ManagedBeanDescriptor mbd : managedBeanDescriptors) {
for (Descriptor dsd : mbd.getResourceDescriptors(JavaEEResourceType.DSD)) {
for (Descriptor dsd : mbd.getResourceDescriptors(DSD)) {
registerDSDReferredByApplication(appName, (DataSourceDefinitionDescriptor)dsd);
}
}
}
}


private void unregisterDSDReferredByApplication(String appName, DataSourceDefinitionDescriptor dsd){
try{
if(dsd.isDeployed()){
if (dsd.isDeployed()){
undeployResource(dsd);

// unbind from JNDI
ResourceNamingService resourceNamingService = resourceNamingServiceProvider.get();
String dsdName = dsd.getName();

if(dsdName.startsWith(ResourceConstants.JAVA_GLOBAL_SCOPE_PREFIX)
/*|| next.getName().startsWith("java:module/")*/
|| dsdName.startsWith(ResourceConstants.JAVA_APP_SCOPE_PREFIX)){
if (dsdName.startsWith(JAVA_GLOBAL_SCOPE_PREFIX) || dsdName.startsWith(JAVA_APP_SCOPE_PREFIX)) {
ResourceInfo resourceInfo = new ResourceInfo(dsdName, appName, null);
try {
resourceNamingService.unpublishObject(resourceInfo, dsdName);
dsd.setDeployed(false);
} catch (NamingException e) {
Object params[] = new Object[]{appName, dsdName, e};
_logger.log(Level.WARNING, "dsd.unregistration.failed", params);
_logger.log(WARNING, "dsd.unregistration.failed", new Object[]{appName, dsdName, e});
}
}
}
}catch(Exception e){
_logger.log(Level.WARNING, "exception while unregistering DSD [ "+dsd.getName()+" ]", e);
} catch(Exception e) {
_logger.log(WARNING, "exception while unregistering DSD [ "+dsd.getName()+" ]", e);
}
}

Expand All @@ -253,8 +251,8 @@ public void unRegisterDataSourceDefinitions(com.sun.enterprise.deployment.Applic
for (BundleDescriptor bundle : bundles) {
unRegisterDataSourceDefinitions(application.getName(),bundle);
Collection<RootDeploymentDescriptor> dds = bundle.getExtensionsDescriptors();
if(dds != null){
for(RootDeploymentDescriptor dd : dds){
if (dds != null){
for (RootDeploymentDescriptor dd : dds){
unRegisterDataSourceDefinitions(application.getName(), dd);
}
}
Expand All @@ -264,34 +262,34 @@ public void unRegisterDataSourceDefinitions(com.sun.enterprise.deployment.Applic
private void unRegisterDataSourceDefinitions(String appName, Descriptor descriptor) {
if (descriptor instanceof JndiNameEnvironment) {
JndiNameEnvironment env = (JndiNameEnvironment) descriptor;
for (Descriptor dsd : env.getResourceDescriptors(JavaEEResourceType.DSD)) {
for (Descriptor dsd : env.getResourceDescriptors(DSD)) {
unregisterDSDReferredByApplication(appName, (DataSourceDefinitionDescriptor)dsd);
}
}

//ejb descriptor
// EJB descriptor
if (descriptor instanceof EjbBundleDescriptor) {
EjbBundleDescriptor ejbDesc = (EjbBundleDescriptor) descriptor;
Set<? extends EjbDescriptor> ejbDescriptors = ejbDesc.getEjbs();
for (EjbDescriptor ejbDescriptor : ejbDescriptors) {
for (Descriptor dsd : ejbDescriptor.getResourceDescriptors(JavaEEResourceType.DSD)) {

for (EjbDescriptor ejbDescriptor : ejbDesc.getEjbs()) {
for (Descriptor dsd : ejbDescriptor.getResourceDescriptors(DSD)) {
unregisterDSDReferredByApplication(appName, (DataSourceDefinitionDescriptor)dsd);
}
}
//ejb interceptors
Set<EjbInterceptor> ejbInterceptors = ejbDesc.getInterceptors();
for (EjbInterceptor ejbInterceptor : ejbInterceptors) {
for (Descriptor dsd : ejbInterceptor.getResourceDescriptors(JavaEEResourceType.DSD)) {

// EJB interceptors
for (EjbInterceptor ejbInterceptor : ejbDesc.getInterceptors()) {
for (Descriptor dsd : ejbInterceptor.getResourceDescriptors(DSD)) {
unregisterDSDReferredByApplication(appName, (DataSourceDefinitionDescriptor)dsd);
}
}
}

// managed bean descriptors
if(descriptor instanceof BundleDescriptor){
// Managed bean descriptors
if (descriptor instanceof BundleDescriptor){
Set<ManagedBeanDescriptor> managedBeanDescriptors = ((BundleDescriptor)descriptor).getManagedBeans();
for (ManagedBeanDescriptor mbd : managedBeanDescriptors) {
for (Descriptor dsd : mbd.getResourceDescriptors(JavaEEResourceType.DSD)) {
for (Descriptor dsd : mbd.getResourceDescriptors(DSD)) {
unregisterDSDReferredByApplication(appName, (DataSourceDefinitionDescriptor)dsd);
}
}
Expand All @@ -303,27 +301,23 @@ private void registerDSDReferredByApplication(String appName,
// It is possible that JPA might call this method multiple times in a single deployment,
// when there are multiple PUs eg: one PU in each of war, ejb-jar. Make sure that
// DSD is bound to JNDI only when it is not already deployed.
if(!dsd.isDeployed()){
if (!dsd.isDeployed()){
CommonResourceProxy proxy = dataSourceDefinitionProxyProvider.get();
ResourceNamingService resourceNamingService = resourceNamingServiceProvider.get();
proxy.setDescriptor(dsd);

//String appName = application.getAppName();
String dsdName = dsd.getName();
if(dsdName.startsWith(ResourceConstants.JAVA_APP_SCOPE_PREFIX)){
if (dsdName.startsWith(JAVA_APP_SCOPE_PREFIX)){
dsd.setResourceId(appName);
}

if(dsdName.startsWith(ResourceConstants.JAVA_GLOBAL_SCOPE_PREFIX)
/*|| next.getName().startsWith("java:module/")*/
|| dsdName.startsWith(ResourceConstants.JAVA_APP_SCOPE_PREFIX)){
if (dsdName.startsWith(JAVA_GLOBAL_SCOPE_PREFIX) || dsdName.startsWith(JAVA_APP_SCOPE_PREFIX)){
ResourceInfo resourceInfo = new ResourceInfo(dsdName, appName, null);
try {
resourceNamingService.publishObject(resourceInfo, proxy, true);
dsd.setDeployed(true);
} catch (NamingException e) {
Object params[] = new Object[]{appName, dsdName, e};
_logger.log(Level.WARNING, "dsd.registration.failed", params);
_logger.log(Level.WARNING, "dsd.registration.failed", new Object[]{appName, dsdName, e});
}
}
}
Expand All @@ -342,16 +336,16 @@ public void undeployResource(Object resource) throws Exception {
String poolName = ConnectorsUtil.deriveResourceName(desc.getResourceId(), desc.getName(), DSDPOOL);
String resourceName = ConnectorsUtil.deriveResourceName(desc.getResourceId(), desc.getName(),desc.getResourceType());

if(_logger.isLoggable(Level.FINE)) {
_logger.log(Level.FINE, "DataSourceDefinitionDeployer.undeployResource() : pool-name ["+poolName+"], " +
if(_logger.isLoggable(FINE)) {
_logger.log(FINE, "DataSourceDefinitionDeployer.undeployResource() : pool-name ["+poolName+"], " +
" resource-name ["+resourceName+"]");
}

//undeploy resource
// Undeploy resource
JdbcResource jdbcResource = new MyJdbcResource(poolName, resourceName);
getDeployer(jdbcResource).undeployResource(jdbcResource);

//undeploy pool
// Undeploy pool
JdbcConnectionPool jdbcCp = new MyJdbcConnectionPool(desc, poolName);
getDeployer(jdbcCp).undeployResource(jdbcCp);

Expand Down