return serverResourceType;
}
private ResourceType parseServiceDescriptor(ServiceDescriptor serviceDescriptor, ResourceType parentType,
String parentSourcePlugin) throws InvalidPluginDescriptorException {
ResourceType serviceResourceType;
String sourcePlugin = serviceDescriptor.getSourcePlugin();
// Fallback to using the source plugin of your parent if you don't override.
if (sourcePlugin == null) {
sourcePlugin = parentSourcePlugin;
}
sourcePlugin = (sourcePlugin != null) ? sourcePlugin.trim() : "";
String sourceType = serviceDescriptor.getSourceType();
sourceType = (sourceType != null) ? sourceType.trim() : "";
if (sourcePlugin.isEmpty() && sourceType.isEmpty()) {
// not using Embedded extension model
serviceResourceType = new ResourceType(serviceDescriptor.getName(), pluginDescriptor.getName(),
ResourceCategory.SERVICE, parentType);
serviceResourceType.setDescription(serviceDescriptor.getDescription());
serviceResourceType.setSubCategory(serviceDescriptor.getSubCategory());
serviceResourceType.setCreationDataType(convertCreationDataType(serviceDescriptor.getCreationDataType()));
serviceResourceType.setCreateDeletePolicy(convertCreateDeletePolicy(serviceDescriptor
.getCreateDeletePolicy()));
serviceResourceType.setSingleton(serviceDescriptor.isSingleton());
parseResourceDescriptor(serviceDescriptor, serviceResourceType, null, null, null);
LOG.debug("Parsed service Resource type: " + serviceResourceType);
if ((serviceResourceType.getProcessScans() != null) && (serviceResourceType.getProcessScans().size() > 0)) {
LOG.warn("Child services are not auto-discovered via process scans. "
+ "The <process-scan> elements will be ignored in resource type: " + serviceResourceType);
}
} else {
// Using Embedded extension model - the defined type is actually a copy of another plugin's service or server type.
LOG.debug("Parsing embedded service type {" + pluginDescriptor.getName() + "}"
+ serviceDescriptor.getName() + ", which extends type {" + sourcePlugin + "}" + sourceType + "...");
ResourceDescriptor sourceTypeDescriptor;
if (sourceType.isEmpty()) {
sourceTypeDescriptor = serviceDescriptor;
} else {
Map<String, ServiceDescriptor> pluginServiceDescriptors = getPluginServiceDescriptors(sourcePlugin);
sourceTypeDescriptor = pluginServiceDescriptors.get(sourceType);
if (sourceTypeDescriptor == null) {
Map<String, ServerDescriptor> pluginServerDescriptors = getPluginServerDescriptors(sourcePlugin);
sourceTypeDescriptor = pluginServerDescriptors.get(sourceType);
}
}
if (sourceTypeDescriptor == null) {
LOG.warn("There is no service or server type named [" + sourceType + "] from a plugin named ["
+ sourcePlugin + "]. This is probably because that plugin is missing. Resource Type [{"
+ pluginDescriptor.getName() + "}" + serviceDescriptor.getName() + "] will be ignored.");
return null;
}
serviceResourceType = new ResourceType(serviceDescriptor.getName(), pluginDescriptor.getName(),
ResourceCategory.SERVICE, parentType);
// Let the plugin writer override these, or if not, parseResourceDescriptor() will pick up the source type's
// values.
serviceResourceType.setDescription(serviceDescriptor.getDescription());
serviceResourceType.setSubCategory(serviceDescriptor.getSubCategory());
serviceResourceType.setCreationDataType(convertCreationDataType(serviceDescriptor.getCreationDataType()));
serviceResourceType.setCreateDeletePolicy(convertCreateDeletePolicy(serviceDescriptor
.getCreateDeletePolicy()));
serviceResourceType.setSingleton(serviceDescriptor.isSingleton());
serviceResourceType.setSupportsMissingAvailabilityType(serviceDescriptor
.isSupportsMissingAvailabilityType());
String discoveryClass;
if (serviceDescriptor.getDiscovery() != null) {
discoveryClass = getFullyQualifiedComponentClassName(getPluginPackage(sourcePlugin), serviceDescriptor
.getDiscovery());
} else {
discoveryClass = getFullyQualifiedComponentClassName(getPluginPackage(sourcePlugin),
sourceTypeDescriptor.getDiscovery());
}
String componentClass;
if (serviceDescriptor.getClazz() != null) {
componentClass = getFullyQualifiedComponentClassName(getPluginPackage(sourcePlugin), serviceDescriptor
.getClazz());
} else {
componentClass = getFullyQualifiedComponentClassName(getPluginPackage(sourcePlugin),
sourceTypeDescriptor.getClazz());
}
parseResourceDescriptor(sourceTypeDescriptor, serviceResourceType, discoveryClass, componentClass,
sourcePlugin);
}
serviceResourceType.setSupportsManualAdd(serviceDescriptor.isSupportsManualAdd());
serviceResourceType.setSupportsMissingAvailabilityType(serviceDescriptor.isSupportsMissingAvailabilityType());
// now see if we are using the Injection extension model
// if so, we need to inject the new resource type as a child to the parent plugin's types
// note that the Injection model only allows for root-level services to be injected
if (parentType == null) {
RunsInsideType runsInside = serviceDescriptor.getRunsInside();
if (runsInside != null) {
List<ParentResourceType> parentTypesDescriptor = runsInside.getParentResourceType();
for (ParentResourceType parentTypeDescriptor : parentTypesDescriptor) {
String parentTypeName = parentTypeDescriptor.getName();
String parentTypePlugin = parentTypeDescriptor.getPlugin();
ResourceType parentTypeToInjectInto = getResourceTypeFromPlugin(parentTypeName, parentTypePlugin);
if (parentTypeToInjectInto != null) {
// inject our new server resource type as a child type to the parent plugin's type
parentTypeToInjectInto.addChildResourceType(serviceResourceType);
} else {
// The parent plugin owning the resource that this resource can run inside of does not exist.
// We will ignore this runs-inside declaration, thus allowing optional plugins to be missing.
LOG.warn("There is no resource type named [" + parentTypeName + "] from a plugin named ["
+ parentTypePlugin