Skip to content

Commit

Permalink
DOL runtime nodes vs. generics and cleanup
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 Sep 18, 2022
1 parent d8ab2bd commit 9ab1219
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 176 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
public class RuntimeDescriptorFactory {

private static final Logger LOG = DOLUtils.getDefaultLogger();
private static Map<String, Class<?>> descriptorClasses;
private static Map<String, Class<? extends Descriptor>> descriptorClasses;

static {
initMapping();
Expand Down Expand Up @@ -73,19 +73,35 @@ private static void initMapping() {


/**
* register a new descriptor class handling a particular XPATH in the DTD.
* Register a new descriptor class handling a particular XPATH in the DTD.
*
* @param xmlElement XML element name
* @param xmlElement XML element
* @param clazz the descriptor class to use
*/
public static void register(final XMLElement xmlElement, final Class<?> clazz) {
if (LOG.isLoggable(Level.FINE)) {
LOG.log(Level.FINE, "Register {0} to handle {1}", new Object[] {clazz, xmlElement.getQName()});
}
public static void register(final XMLElement xmlElement, final Class<? extends Descriptor> clazz) {
LOG.log(Level.CONFIG, "Registering {0} to handle xml path {1}", new Object[] {clazz, xmlElement});
descriptorClasses.put(xmlElement.getQName(), clazz);
}


/**
* @param xmlPath
* @param <T> expected descriptor type
* @return a new instance of a registered descriptor class for the supplied XPath
*/
public static <T extends Descriptor> T getDescriptor(String xmlPath) {
try {
Class<T> c = getDescriptorClass(xmlPath);
if (c == null) {
return null;
}
return c.getDeclaredConstructor().newInstance();
} catch (Exception e) {
throw new IllegalStateException("Could not create a descriptor instance for " + xmlPath, e);
}
}


/**
* @param xmlPath
* @param <T> expected {@link Descriptor} class
Expand All @@ -94,7 +110,8 @@ public static void register(final XMLElement xmlElement, final Class<?> clazz) {
public static <T extends Descriptor> Class<T> getDescriptorClass(final String xmlPath) {
String xpathPart = xmlPath;
do {
LOG.log(Level.FINER, "getDescriptorClass for {0}", xpathPart);
LOG.log(Level.FINEST, "Looking descriptor class for {0}", xpathPart);
// unchecked - clazz x xmlPath must be unique.
@SuppressWarnings("unchecked")
Class<T> clazz = (Class<T>) descriptorClasses.get(xpathPart);
if (clazz != null) {
Expand All @@ -107,25 +124,6 @@ public static <T extends Descriptor> Class<T> getDescriptorClass(final String xm
}
} while (xpathPart != null);

LOG.log(Level.FINE, "No descriptor registered for {0}", xmlPath);
return null;
}


/**
* @param xmlPath
* @param <T>
* @return a new instance of a registered descriptor class for the supplied XPath
*/
public static <T extends Descriptor> T getDescriptor(String xmlPath) {
try {
Class<T> c = getDescriptorClass(xmlPath);
if (c != null) {
return c.getDeclaredConstructor().newInstance();
}
} catch (Throwable t) {
Logger.getAnonymousLogger().log(Level.WARNING, "Error occurred, I'm returning null descriptor.", t);
}
return null;
throw new IllegalStateException("No descriptor registered for " + xmlPath);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@
/**
* Superclass for all the runtime descriptor nodes
*
* @author Jerome Dochez
* @version
* @author Jerome Dochez
*/
public class RuntimeDescriptorNode<T extends Descriptor> extends DeploymentDescriptorNode<T> {

Expand All @@ -54,7 +53,7 @@ public T getDescriptor() {
return (T) getParentNode().getDescriptor();
}
}
return (T) abstractDescriptor;
return abstractDescriptor;
}


Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/*
* Copyright (c) 2022 Contributors to the Eclipse Foundation
* Copyright (c) 2011, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
Expand Down Expand Up @@ -32,13 +33,11 @@
/**
* This node handles resource-description in weblogic.xml
*
* @author Shing Wai Chan
* @author Shing Wai Chan
*/
public class ResourceDescriptionNode extends RuntimeDescriptorNode<ResourceReferenceDescriptor> {
private ResourceReferenceDescriptor descriptor;

public ResourceDescriptionNode() {
}
private ResourceReferenceDescriptor descriptor;

@Override
public ResourceReferenceDescriptor getDescriptor() {
Expand All @@ -48,27 +47,23 @@ public ResourceReferenceDescriptor getDescriptor() {
return descriptor;
}

/**
* all sub-implementation of this class can use a dispatch table to map xml element to
* method name on the descriptor class for setting the element value.
*
* @return the map with the element name as a key, the setter method as a value
*/

@Override
protected Map getDispatchTable() {
Map table = super.getDispatchTable();
protected Map<String, String> getDispatchTable() {
Map<String, String> table = super.getDispatchTable();
table.put(RuntimeTagNames.JNDI_NAME, "setJndiName");
return table;
}


@Override
public void setElementValue(XMLElement element, String value) {
if (TagNames.RESOURCE_REFERENCE_NAME.equals(element.getQName())) {
Object parentDesc = getParentNode().getDescriptor();
if (parentDesc instanceof ResourceReferenceContainer) {
try {
descriptor = ((ResourceReferenceContainer)parentDesc).getResourceReferenceByName(value);
} catch(IllegalArgumentException iae) {
descriptor = ((ResourceReferenceContainer) parentDesc).getResourceReferenceByName(value);
} catch (IllegalArgumentException iae) {
DOLUtils.getDefaultLogger().warning(iae.getMessage());
}
}
Expand All @@ -77,48 +72,27 @@ public void setElementValue(XMLElement element, String value) {
}
}

/**
* write the descriptor class to a DOM tree and return it
*
* @param parent node for the DOM tree
* @param nodeName node name
* @param descriptor the descriptor to write
* @return the DOM tree top node
*/
@Override
public Node writeDescriptor(Node parent, String nodeName, ResourceReferenceDescriptor descriptor) {
Node refNode = appendChild(parent, nodeName);
appendTextChild(refNode, TagNames.RESOURCE_REFERENCE_NAME, descriptor.getName());
appendTextChild(refNode, RuntimeTagNames.JNDI_NAME, descriptor.getJndiName());
return refNode;
}

/**
* write all occurrences of the descriptor corresponding to the current
* node from the parent descriptor to an JAXP DOM node and return it
*
* This API will be invoked by the parent node when the parent node
* writes out a mix of statically and dynamically registered sub nodes.
*
* This method should be overriden by the sub classes if it
* needs to be called by the parent node.
*
* @param parent node in the DOM tree
* @param nodeName the name of the node
* @param parentDesc parent descriptor of the descriptor to be written
* @return the JAXP DOM node
*/
@Override
public Node writeDescriptors(Node parent, String nodeName, Descriptor parentDesc) {
if (parentDesc instanceof ResourceReferenceContainer) {
ResourceReferenceContainer resourceReferenceContainer = (ResourceReferenceContainer)parentDesc;
ResourceReferenceContainer resourceReferenceContainer = (ResourceReferenceContainer) parentDesc;
// resource-reference-description*
Set<ResourceReferenceDescriptor> resourceReferenceDescriptors =
resourceReferenceContainer.getResourceReferenceDescriptors();
Set<ResourceReferenceDescriptor> resourceReferenceDescriptors = resourceReferenceContainer
.getResourceReferenceDescriptors();
for (ResourceReferenceDescriptor resourceReferenceDescriptor : resourceReferenceDescriptors) {
writeDescriptor(parent, nodeName, resourceReferenceDescriptor);
}
}
return parent;
}


@Override
public Node writeDescriptor(Node parent, String nodeName, ResourceReferenceDescriptor reference) {
Node refNode = appendChild(parent, nodeName);
appendTextChild(refNode, TagNames.RESOURCE_REFERENCE_NAME, reference.getName());
appendTextChild(refNode, RuntimeTagNames.JNDI_NAME, reference.getJndiName());
return parent;
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
/*
* Copyright (c) 2022 Contributors to the Eclipse Foundation
* Copyright (c) 2011, 2018 Oracle and/or its affiliates. All rights reserved.
*
* This program and the accompanying materials are made available under the
Expand All @@ -23,22 +24,21 @@
import com.sun.enterprise.deployment.util.DOLUtils;
import com.sun.enterprise.deployment.xml.RuntimeTagNames;
import com.sun.enterprise.deployment.xml.TagNames;
import org.glassfish.deployment.common.Descriptor;
import org.w3c.dom.Node;

import java.util.Map;
import java.util.Set;

import org.glassfish.deployment.common.Descriptor;
import org.w3c.dom.Node;

/**
* This node handles resource-env-description in weblogic.xml
*
* @author Shing Wai Chan
*/
public class ResourceEnvDescriptionNode extends RuntimeDescriptorNode<ResourceEnvReferenceDescriptor> {
private ResourceEnvReferenceDescriptor descriptor = null;

public ResourceEnvDescriptionNode() {
}
private ResourceEnvReferenceDescriptor descriptor;

@Override
public ResourceEnvReferenceDescriptor getDescriptor() {
Expand All @@ -48,26 +48,22 @@ public ResourceEnvReferenceDescriptor getDescriptor() {
return descriptor;
}

/**
* all sub-implementation of this class can use a dispatch table to map xml element to
* method name on the descriptor class for setting the element value.
*
* @return the map with the element name as a key, the setter method as a value
*/

@Override
protected Map getDispatchTable() {
Map table = super.getDispatchTable();
protected Map<String, String> getDispatchTable() {
Map<String, String> table = super.getDispatchTable();
table.put(RuntimeTagNames.JNDI_NAME, "setJndiName");
return table;
}


@Override
public void setElementValue(XMLElement element, String value) {
if (TagNames.RESOURCE_ENV_REFERENCE_NAME.equals(element.getQName())) {
Object parentDesc = getParentNode().getDescriptor();
if (parentDesc instanceof ResourceEnvReferenceContainer) {
try {
descriptor = ((ResourceEnvReferenceContainer)parentDesc).getResourceEnvReferenceByName(value);
descriptor = ((ResourceEnvReferenceContainer) parentDesc).getResourceEnvReferenceByName(value);
} catch (IllegalArgumentException iae) {
DOLUtils.getDefaultLogger().warning(iae.getMessage());
}
Expand All @@ -77,50 +73,27 @@ public void setElementValue(XMLElement element, String value) {
}
}

/**
* write the descriptor class to a DOM tree and return it
*
* @param parent node for the DOM tree
* @param nodeName node name
* @param descriptor the descriptor to write
* @return the DOM tree top node
*/
@Override
public Node writeDescriptor(Node parent, String nodeName, ResourceEnvReferenceDescriptor descriptor) {
Node refNode = appendChild(parent, nodeName);
appendTextChild(refNode, TagNames.RESOURCE_ENV_REFERENCE_NAME, descriptor.getName());
appendTextChild(refNode, RuntimeTagNames.JNDI_NAME, descriptor.getJndiName());
return refNode;
}

/**
* write all occurrences of the descriptor corresponding to the current
* node from the parent descriptor to an JAXP DOM node and return it
*
* This API will be invoked by the parent node when the parent node
* writes out a mix of statically and dynamically registered sub nodes.
*
* This method should be overriden by the sub classes if it
* needs to be called by the parent node.
*
* @param parent node in the DOM tree
* @param nodeName the name of the node
* @param parentDesc parent descriptor of the descriptor to be written
* @return the JAXP DOM node
*/
@Override
public Node writeDescriptors(Node parent, String nodeName, Descriptor parentDesc) {
if (parentDesc instanceof ResourceEnvReferenceContainer) {
ResourceEnvReferenceContainer resourceEnvReferenceContainer =
(ResourceEnvReferenceContainer)parentDesc;
ResourceEnvReferenceContainer resourceEnvReferenceContainer = (ResourceEnvReferenceContainer) parentDesc;
// resource-env-description*
Set<ResourceEnvReferenceDescriptor> resourceEnvReferenceDescriptors =
resourceEnvReferenceContainer.getResourceEnvReferenceDescriptors();
for (ResourceEnvReferenceDescriptor resourceEnvReferenceDescriptor :
resourceEnvReferenceDescriptors) {
Set<ResourceEnvReferenceDescriptor> resourceEnvReferenceDescriptors = resourceEnvReferenceContainer
.getResourceEnvReferenceDescriptors();
for (ResourceEnvReferenceDescriptor resourceEnvReferenceDescriptor : resourceEnvReferenceDescriptors) {
writeDescriptor(parent, nodeName, resourceEnvReferenceDescriptor);
}
}
return parent;
}


@Override
public Node writeDescriptor(Node parent, String nodeName, ResourceEnvReferenceDescriptor descriptor) {
Node refNode = appendChild(parent, nodeName);
appendTextChild(refNode, TagNames.RESOURCE_ENV_REFERENCE_NAME, descriptor.getName());
appendTextChild(refNode, RuntimeTagNames.JNDI_NAME, descriptor.getJndiName());
return refNode;
}
}

0 comments on commit 9ab1219

Please sign in to comment.