Skip to content

Commit

Permalink
JNDI: jdbc modules vs SimpleJndiName
Browse files Browse the repository at this point in the history
Signed-off-by: David Matějček <david.matejcek@omnifish.ee>
  • Loading branch information
dmatej committed Nov 14, 2022
1 parent 2ed44ce commit ddf6e6d
Show file tree
Hide file tree
Showing 21 changed files with 425 additions and 394 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@
import com.sun.enterprise.util.LocalStringManagerImpl;

import jakarta.resource.ResourceException;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;

import java.beans.PropertyVetoException;
import java.util.Collection;
Expand All @@ -36,6 +38,7 @@
import java.util.Properties;

import org.glassfish.api.I18n;
import org.glassfish.api.naming.SimpleJndiName;
import org.glassfish.jdbc.config.JdbcConnectionPool;
import org.glassfish.jdbc.util.JdbcResourcesUtil;
import org.glassfish.resourcebase.resources.api.ResourceStatus;
Expand Down Expand Up @@ -308,7 +311,7 @@ public void setAttributes(HashMap attrList) {
}

public ResourceStatus delete(Iterable<Server> servers, Iterable<Cluster> clusters, final Resources resources, final String cascade,
final String poolName) throws Exception {
final SimpleJndiName poolName) throws Exception {

if (poolName == null) {
String msg = localStrings.getLocalString("jdbcConnPool.resource.noJndiName",
Expand Down Expand Up @@ -364,21 +367,23 @@ public Object run(Resources param) throws PropertyVetoException, TransactionFail
return new ResourceStatus(ResourceStatus.SUCCESS, msg);
}

private boolean isResourceExists(Resources resources, String poolName) {
private boolean isResourceExists(Resources resources, SimpleJndiName poolName) {
return ConnectorsUtil.getResourceByName(resources, JdbcConnectionPool.class, poolName) != null;
}

private Object deleteAssociatedResources(final Iterable<Server> servers, final Iterable<Cluster> clusters, Resources resources,
final boolean cascade, final String poolName) throws TransactionFailure {

private Object deleteAssociatedResources(final Iterable<Server> servers, final Iterable<Cluster> clusters,
Resources resources, final boolean cascade, final SimpleJndiName poolName) throws TransactionFailure {
if (cascade) {
ConfigSupport.apply(new SingleConfigCode<Resources>() {
@Override
public Object run(Resources param) throws PropertyVetoException, TransactionFailure {
Collection<BindableResource> referringResources = JdbcResourcesUtil.getResourcesOfPool(param, poolName);
for (BindableResource referringResource : referringResources) {
// delete resource-refs
deleteServerResourceRefs(servers, referringResource.getJndiName());
deleteClusterResourceRefs(clusters, referringResource.getJndiName());
SimpleJndiName jndiName = SimpleJndiName.of(referringResource.getJndiName());
deleteServerResourceRefs(servers, jndiName);
deleteClusterResourceRefs(clusters, jndiName);
// remove the resource
param.getResources().remove(referringResource);
}
Expand All @@ -394,7 +399,7 @@ public Object run(Resources param) throws PropertyVetoException, TransactionFail
return true; //no-op
}

private void deleteServerResourceRefs(Iterable<Server> servers, final String refName)
private void deleteServerResourceRefs(Iterable<Server> servers, final SimpleJndiName refName)
throws TransactionFailure {
if(servers != null){
for (Server server : servers) {
Expand All @@ -403,7 +408,7 @@ private void deleteServerResourceRefs(Iterable<Server> servers, final String ref
}
}

private void deleteClusterResourceRefs(Iterable<Cluster> clusters, final String refName)
private void deleteClusterResourceRefs(Iterable<Cluster> clusters, final SimpleJndiName refName)
throws TransactionFailure {
if(clusters != null){
for (Cluster cluster : clusters) {
Expand All @@ -416,16 +421,15 @@ private void deleteClusterResourceRefs(Iterable<Cluster> clusters, final String
public Resource createConfigBean(Resources resources, HashMap attributes, Properties properties, boolean validate)
throws Exception {
setAttributes(attributes);
ResourceStatus status = null;
if(!validate){
status = new ResourceStatus(ResourceStatus.SUCCESS,"");
}else{
final ResourceStatus status;
if (validate) {
status = isValid(resources);
} else {
status = new ResourceStatus(ResourceStatus.SUCCESS, "");
}
if(status.getStatus() == ResourceStatus.SUCCESS){
if (status.getStatus() == ResourceStatus.SUCCESS) {
return createConfigBean(resources, properties);
}else{
throw new ResourceException(status.getMessage());
}
throw new ResourceException(status.getMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,15 @@
import jakarta.resource.ResourceException;

import java.beans.PropertyVetoException;
import java.lang.System.Logger;
import java.lang.System.Logger.Level;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.glassfish.api.I18n;
import org.glassfish.api.admin.ServerEnvironment;
import org.glassfish.api.naming.SimpleJndiName;
import org.glassfish.jdbc.config.JdbcResource;
import org.glassfish.resourcebase.resources.admin.cli.ResourceUtil;
import org.glassfish.resourcebase.resources.api.ResourceStatus;
Expand All @@ -47,6 +50,7 @@
import org.jvnet.hk2.config.TransactionFailure;
import org.jvnet.hk2.config.types.Property;

import static com.sun.enterprise.config.serverbeans.ServerTags.DESCRIPTION;
import static org.glassfish.resources.admin.cli.ResourceConstants.ENABLED;
import static org.glassfish.resources.admin.cli.ResourceConstants.JNDI_NAME;
import static org.glassfish.resources.admin.cli.ResourceConstants.POOL_NAME;
Expand All @@ -63,13 +67,12 @@
@ConfiguredBy(Resources.class)
public class JDBCResourceManager implements ResourceManager {

final private static LocalStringManagerImpl localStrings =
new LocalStringManagerImpl(JDBCResourceManager.class);
private static final String DESCRIPTION = ServerTags.DESCRIPTION;
private static final Logger LOG = System.getLogger(JDBCResourceManager.class.getName());
private static final LocalStringManagerImpl localStrings = new LocalStringManagerImpl(JDBCResourceManager.class);

private String jndiName = null;
private String description = null;
private String poolName = null;
private String jndiName;
private String description;
private String poolName;
private String enabled = Boolean.TRUE.toString();
private String enabledValueForTarget = Boolean.TRUE.toString();

Expand All @@ -83,61 +86,54 @@ public class JDBCResourceManager implements ResourceManager {
private BindableResourcesHelper resourcesHelper;

@Override
public String getResourceType () {
public String getResourceType() {
return ServerTags.JDBC_RESOURCE;
}

@Override
public ResourceStatus create(Resources resources, HashMap attributes, final Properties properties,
String target) throws Exception {

@Override
public ResourceStatus create(Resources resources, HashMap attributes, final Properties properties, String target)
throws Exception {
LOG.log(Level.DEBUG, "create(resources={0}, attributes={1}, properties={2}, target={3})", resources, attributes,
properties, target);
setAttributes(attributes, target);

ResourceStatus validationStatus = isValid(resources, true, target);
if(validationStatus.getStatus() == ResourceStatus.FAILURE){
if (validationStatus.getStatus() == ResourceStatus.FAILURE) {
return validationStatus;
}

try {
ConfigSupport.apply(new SingleConfigCode<Resources>() {

@Override
public Object run(Resources param) throws PropertyVetoException, TransactionFailure {
return createResource(param, properties);
}
}, resources);

resourceUtil.createResourceRef(jndiName, enabledValueForTarget, target);
SingleConfigCode<Resources> configCode = resrc -> createResource(resrc, properties);
ConfigSupport.apply(configCode, resources);
resourceUtil.createResourceRef(jndiName, enabledValueForTarget, target);
} catch (TransactionFailure tfe) {
String msg = localStrings.getLocalString("create.jdbc.resource.fail",
"JDBC resource {0} create failed ", jndiName) +
" " + tfe.getLocalizedMessage();
String msg = localStrings.getLocalString("create.jdbc.resource.fail", "JDBC resource {0} create failed ",
jndiName) + " " + tfe.getLocalizedMessage();
ResourceStatus status = new ResourceStatus(ResourceStatus.FAILURE, msg);
status.setException(tfe);
return status;
}
String msg = localStrings.getLocalString("create.jdbc.resource.success",
"JDBC resource {0} created successfully", jndiName);
"JDBC resource {0} created successfully", jndiName);
return new ResourceStatus(ResourceStatus.SUCCESS, msg);
}

private ResourceStatus isValid(Resources resources, boolean validateResourceRef, String target){
ResourceStatus status ;


private ResourceStatus isValid(Resources resources, boolean validateResourceRef, String target){
if (jndiName == null) {
String msg = localStrings.getLocalString("create.jdbc.resource.noJndiName",
"No JNDI name defined for JDBC resource.");
"No JNDI name defined for JDBC resource.");
return new ResourceStatus(ResourceStatus.FAILURE, msg);
}

status = resourcesHelper.validateBindableResourceForDuplicates(resources, jndiName, validateResourceRef,
target, JdbcResource.class);
if(status.getStatus() == ResourceStatus.FAILURE){
ResourceStatus status = resourcesHelper.validateBindableResourceForDuplicates(resources, jndiName,
validateResourceRef, target, JdbcResource.class);
if (status.getStatus() == ResourceStatus.FAILURE) {
return status;
}

if(ConnectorsUtil.getResourceByName(resources, ResourcePool.class, poolName) == null){
if (ConnectorsUtil.getResourceByName(resources, ResourcePool.class, SimpleJndiName.of(poolName)) == null) {
String msg = localStrings.getLocalString("create.jdbc.resource.connPoolNotFound",
"Attribute value (pool-name = {0}) is not found in list of jdbc connection pools.", poolName);
return new ResourceStatus(ResourceStatus.FAILURE, msg);
Expand All @@ -149,35 +145,37 @@ private void setAttributes(HashMap attributes, String target) {
jndiName = (String) attributes.get(JNDI_NAME);
description = (String) attributes.get(DESCRIPTION);
poolName = (String) attributes.get(POOL_NAME);
if(target != null){
enabled = resourceUtil.computeEnabledValueForResourceBasedOnTarget((String)attributes.get(ENABLED), target);
}else{
if (target == null) {
enabled = (String) attributes.get(ENABLED);
} else {
enabled = resourceUtil.computeEnabledValueForResourceBasedOnTarget((String) attributes.get(ENABLED), target);
}
enabledValueForTarget = (String) attributes.get(ENABLED);
}

private JdbcResource createResource(Resources param, Properties properties) throws PropertyVetoException,
TransactionFailure {
JdbcResource newResource = createConfigBean(param, properties);
param.getResources().add(newResource);

private JdbcResource createResource(Resources resources, Properties properties)
throws PropertyVetoException, TransactionFailure {
JdbcResource newResource = createConfigBean(resources, properties);
resources.getResources().add(newResource);
return newResource;
}

private JdbcResource createConfigBean(Resources param, Properties properties) throws PropertyVetoException,
TransactionFailure {
JdbcResource jdbcResource = param.createChild(JdbcResource.class);

private JdbcResource createConfigBean(Resources resources, Properties properties)
throws PropertyVetoException, TransactionFailure {
JdbcResource jdbcResource = resources.createChild(JdbcResource.class);
jdbcResource.setJndiName(jndiName);
if (description != null) {
jdbcResource.setDescription(description);
}
jdbcResource.setPoolName(poolName);
jdbcResource.setEnabled(enabled);
if (properties != null) {
for ( Map.Entry e : properties.entrySet()) {
for (Map.Entry e : properties.entrySet()) {
Property prop = jdbcResource.createChild(Property.class);
prop.setName((String)e.getKey());
prop.setValue((String)e.getValue());
prop.setName((String) e.getKey());
prop.setValue((String) e.getValue());
jdbcResource.getProperty().add(prop);
}
}
Expand All @@ -188,48 +186,47 @@ private JdbcResource createConfigBean(Resources param, Properties properties) th
public Resource createConfigBean(final Resources resources, HashMap attributes, final Properties properties,
boolean validate) throws Exception{
setAttributes(attributes, null);
ResourceStatus status = null;
if(!validate){
status = new ResourceStatus(ResourceStatus.SUCCESS,"");
}else{
final ResourceStatus status;
if (validate) {
status = isValid(resources, false, null);
} else {
status = new ResourceStatus(ResourceStatus.SUCCESS, "");
}
if(status.getStatus() == ResourceStatus.SUCCESS){
if (status.getStatus() == ResourceStatus.SUCCESS) {
return createConfigBean(resources, properties);
}else{
throw new ResourceException(status.getMessage());
}
throw new ResourceException(status.getMessage());
}

public ResourceStatus delete (final Resources resources, final String jndiName, final String target)
throws Exception {

public ResourceStatus delete(final Resources resources, final SimpleJndiName jndiName, final String target)
throws Exception {
LOG.log(Level.DEBUG, "delete(resources={0}, jndiName={1}, target={2})", resources, jndiName, target);
if (jndiName == null) {
String msg = localStrings.getLocalString("jdbc.resource.noJndiName",
"No JNDI name defined for JDBC resource.");
"No JNDI name defined for JDBC resource.");
return new ResourceStatus(ResourceStatus.FAILURE, msg);
}

// ensure we already have this resource
if(ConnectorsUtil.getResourceByName(resources, JdbcResource.class, jndiName) == null){
if (ConnectorsUtil.getResourceByName(resources, JdbcResource.class, jndiName) == null) {
String msg = localStrings.getLocalString("delete.jdbc.resource.notfound",
"A JDBC resource named {0} does not exist.", jndiName);
"A JDBC resource named {0} does not exist.", jndiName);
return new ResourceStatus(ResourceStatus.FAILURE, msg);
}

JdbcResource jdbcResource = ConnectorsUtil.getResourceByName(resources, JdbcResource.class, jndiName);
final JdbcResource jdbcResource = ConnectorsUtil.getResourceByName(resources, JdbcResource.class, jndiName);
// ensure we are not deleting resource of the type system-all-req
if(ResourceConstants.SYSTEM_ALL_REQ.equals(jdbcResource.getObjectType())){
if (ResourceConstants.SYSTEM_ALL_REQ.equals(jdbcResource.getObjectType())) {
String msg = localStrings.getLocalString("delete.jdbc.resource.system-all-req.object-type",
"The jdbc resource [ {0} ] cannot be deleted as it is required to be configured in the system.",
jndiName);
return new ResourceStatus(ResourceStatus.FAILURE, msg);
}

if (environment.isDas()) {

if ("domain".equals(target)) {
if (resourceUtil.getTargetsReferringResourceRef(jndiName).size() > 0) {
if (!resourceUtil.getTargetsReferringResourceRef(jndiName).isEmpty()) {
String msg = localStrings.getLocalString("delete.jdbc.resource.resource-ref.exist",
"jdbc-resource [ {0} ] is referenced in an " +
"instance/cluster target, Use delete-resource-ref on appropriate target",
Expand Down Expand Up @@ -260,20 +257,17 @@ public ResourceStatus delete (final Resources resources, final String jndiName,
resourceUtil.deleteResourceRef(jndiName, target);

// delete jdbc-resource
if (ConfigSupport.apply(new SingleConfigCode<Resources>() {
@Override
public Object run(Resources param) throws PropertyVetoException, TransactionFailure {
JdbcResource resource = ConnectorsUtil.getResourceByName(resources, JdbcResource.class, jndiName);
return param.getResources().remove(resource);
}
}, resources) == null) {
SingleConfigCode<Resources> configCode = param -> {
return param.getResources().remove(jdbcResource);
};
if (ConfigSupport.apply(configCode, resources) == null) {
String msg = localStrings.getLocalString("jdbc.resource.deletionFailed",
"JDBC resource {0} delete failed ", jndiName);
"JDBC resource {0} delete failed ", jndiName);
return new ResourceStatus(ResourceStatus.FAILURE, msg);
}
} catch(TransactionFailure tfe) {
String msg = localStrings.getLocalString("jdbc.resource.deletionFailed",
"JDBC resource {0} delete failed ", jndiName);
String msg = localStrings.getLocalString("jdbc.resource.deletionFailed", "JDBC resource {0} delete failed ",
jndiName);
ResourceStatus status = new ResourceStatus(ResourceStatus.FAILURE, msg);
status.setException(tfe);
return status;
Expand Down
Loading

0 comments on commit ddf6e6d

Please sign in to comment.