public static PropertyDescriptor findAnnotatedProperty(Class<?> connectorClass, Class<? extends Annotation> annotationClass) { BeanWrapper connectorBean = new BeanWrapperImpl(connectorClass); return findAnnotatedProperty(connectorBean, annotationClass); }
public static PropertyDescriptor findAnnotatedProperty(BeanWrapper connectorBean, Class<? extends Annotation> annotationClass) { for (PropertyDescriptor prop: connectorBean.getPropertyDescriptors()) { if (hasAnnotation(prop, annotationClass)) { return prop; } } return null; }
private ConnectorStruct createConnectorStruct(Class connectorClass, ManagedConnector annotation) throws ObjectNotFoundException, SchemaException { ConnectorStruct struct = new ConnectorStruct(); struct.connectorClass = connectorClass; ConnectorType connectorType = new ConnectorType(); String bundleName = connectorClass.getPackage().getName(); String type = annotation.type(); if (type == null || type.isEmpty()) { type = connectorClass.getSimpleName(); } String version = annotation.version(); UcfUtil.addConnectorNames(connectorType, "Built-in", bundleName, type, version, null); connectorType.setConnectorBundle(bundleName); connectorType.setConnectorType(type); connectorType.setVersion(version); connectorType.setFramework(SchemaConstants.UCF_FRAMEWORK_URI_BUILTIN); String namespace = CONFIGURATION_NAMESPACE_PREFIX + bundleName + "/" + type; connectorType.setNamespace(namespace); struct.connectorObject = connectorType; PrismSchema connectorSchema = generateConnectorConfigurationSchema(struct); if (connectorSchema != null) { LOGGER.trace("Generated connector schema for {}: {} definitions", connectorType, connectorSchema.getDefinitions().size()); UcfUtil.setConnectorSchema(connectorType, connectorSchema); struct.connectorConfigurationSchema = connectorSchema; } else { LOGGER.warn("No connector schema generated for {}", connectorType); } return struct; }
private PrismSchema generateConnectorConfigurationSchema(ConnectorStruct struct) { Class<? extends ConnectorInstance> connectorClass = struct.connectorClass; PropertyDescriptor connectorConfigurationProp = UcfUtil.findAnnotatedProperty(connectorClass, ManagedConnectorConfiguration.class); MutablePrismSchema connectorSchema = prismContext.schemaFactory().createPrismSchema(struct.connectorObject.getNamespace()); // Create configuration type - the type used by the "configuration" element MutablePrismContainerDefinition<?> configurationContainerDef = connectorSchema.createPropertyContainerDefinition( ResourceType.F_CONNECTOR_CONFIGURATION.getLocalPart(), SchemaConstants.CONNECTOR_SCHEMA_CONFIGURATION_TYPE_LOCAL_NAME); Class<?> configurationClass = connectorConfigurationProp.getPropertyType(); BeanWrapper configurationClassBean = new BeanWrapperImpl(configurationClass); for (PropertyDescriptor prop: configurationClassBean.getPropertyDescriptors()) { if (!UcfUtil.hasAnnotation(prop, ConfigurationProperty.class)) { continue; } ItemDefinition<?> itemDef = createPropertyDefinition(configurationContainerDef, prop); LOGGER.trace("Configuration item definition for {}: {}", prop.getName(), itemDef); } return connectorSchema; }
PrismSchema connectorSchema = UcfUtil.getConnectorSchema(connectorType, prismContext); if (connectorSchema == null) { connectorSchema = generateConnectorConfigurationSchema(cinfo, connectorType);
ConnectorType connectorType = new ConnectorType(); ConnectorKey key = cinfo.getConnectorKey(); UcfUtil.addConnectorNames(connectorType, "ConnId", key.getBundleName(), key.getConnectorName(), key.getBundleVersion(), hostType); String stringID = keyToNamespaceSuffix(key); connectorType.setFramework(SchemaConstants.ICF_FRAMEWORK_URI); LOGGER.trace("Generated connector schema for {}: {} definitions", connectorType, connectorSchema.getDefinitions().size()); UcfUtil.setConnectorSchema(connectorType, connectorSchema);
private void applyConfigurationToConfigurationClass(PrismContainerValue<?> configurationContainer) throws ConfigurationException { BeanWrapper connectorBean = new BeanWrapperImpl(this); PropertyDescriptor connectorConfigurationProp = UcfUtil.findAnnotatedProperty(connectorBean, ManagedConnectorConfiguration.class); if (connectorConfigurationProp == null) { return; } Class<?> configurationClass = connectorConfigurationProp.getPropertyType(); Object configurationObject; try { configurationObject = configurationClass.newInstance(); } catch (InstantiationException | IllegalAccessException e) { throw new ConfigurationException("Cannot instantiate configuration "+configurationClass); } BeanWrapper configurationClassBean = new BeanWrapperImpl(configurationObject); for (Item<?, ?> configurationItem: configurationContainer.getItems()) { if (! (configurationItem instanceof PrismProperty<?>)) { throw new ConfigurationException("Only properties are supported for now"); } PrismProperty<?> configurationProperty = (PrismProperty<?>)configurationItem; Object realValue = configurationProperty.getRealValue(); configurationClassBean.setPropertyValue(configurationProperty.getElementName().getLocalPart(), realValue); } connectorBean.setPropertyValue(connectorConfigurationProp.getName(), configurationObject); } }