X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fblueprint%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fblueprint%2Fext%2FDataStoreAppConfigMetadata.java;h=5b20827c7fdadd217219ee660a89df6fd5bda919;hb=e84f63ee098fff5b02cbce1281ca0d1208f966fa;hp=15e696225af3fb4a5c963ec40192fe375736a412;hpb=821944277049bbb3949021626844ef7a80101f70;p=controller.git diff --git a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/DataStoreAppConfigMetadata.java b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/DataStoreAppConfigMetadata.java index 15e696225a..5b20827c7f 100644 --- a/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/DataStoreAppConfigMetadata.java +++ b/opendaylight/blueprint/src/main/java/org/opendaylight/controller/blueprint/ext/DataStoreAppConfigMetadata.java @@ -7,40 +7,41 @@ */ package org.opendaylight.controller.blueprint.ext; -import com.google.common.base.Optional; -import com.google.common.util.concurrent.CheckedFuture; +import com.google.common.util.concurrent.FluentFuture; import com.google.common.util.concurrent.FutureCallback; -import com.google.common.util.concurrent.Futures; +import com.google.common.util.concurrent.MoreExecutors; import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; import java.util.Collection; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.atomic.AtomicBoolean; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.stream.XMLStreamException; import org.apache.aries.blueprint.services.ExtendedBlueprintContainer; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.controller.blueprint.ext.DataStoreAppConfigDefaultXMLReader.ConfigURLProvider; -import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener; -import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.DataObjectModification; -import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType; -import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier; -import org.opendaylight.controller.md.sal.binding.api.DataTreeModification; -import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.sal.core.api.model.SchemaService; +import org.opendaylight.mdsal.binding.api.ClusteredDataTreeChangeListener; +import org.opendaylight.mdsal.binding.api.DataBroker; +import org.opendaylight.mdsal.binding.api.DataObjectModification; +import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType; +import org.opendaylight.mdsal.binding.api.DataTreeIdentifier; +import org.opendaylight.mdsal.binding.api.DataTreeModification; +import org.opendaylight.mdsal.binding.api.ReadTransaction; import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer; +import org.opendaylight.mdsal.common.api.LogicalDatastoreType; +import org.opendaylight.mdsal.dom.api.DOMSchemaService; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.codec.xml.XmlUtils; -import org.opendaylight.yangtools.yang.data.impl.schema.transform.dom.parser.DomToNormalizedNodeParserFactory; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; +import org.opendaylight.yangtools.yang.model.api.SchemaTreeInference; import org.osgi.service.blueprint.container.ComponentDefinitionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.Element; +import org.xml.sax.SAXException; /** * Factory metadata corresponding to the "clustered-app-config" element that obtains an application's @@ -77,9 +78,9 @@ public class DataStoreAppConfigMetadata extends AbstractDependentComponentFactor // project are still used - conversion to the mdsal binding classes hasn't occurred yet. private volatile BindingNormalizedNodeSerializer bindingSerializer; - public DataStoreAppConfigMetadata(@Nonnull final String id, @Nonnull final String appConfigBindingClassName, - @Nullable final String appConfigListKeyValue, @Nullable final String defaultAppConfigFileName, - @Nonnull final UpdateStrategy updateStrategyValue, @Nullable final Element defaultAppConfigElement) { + public DataStoreAppConfigMetadata(final String id, final @NonNull String appConfigBindingClassName, + final @Nullable String appConfigListKeyValue, final @Nullable String defaultAppConfigFileName, + final @NonNull UpdateStrategy updateStrategyValue, final @Nullable Element defaultAppConfigElement) { super(id); this.defaultAppConfigElement = defaultAppConfigElement; this.defaultAppConfigFileName = defaultAppConfigFileName; @@ -103,7 +104,7 @@ public class DataStoreAppConfigMetadata extends AbstractDependentComponentFactor } appConfigBindingClass = (Class) bindingClass; - } catch (ClassNotFoundException e) { + } catch (final ClassNotFoundException e) { throw new ComponentDefinitionException(String.format("%s: Error loading app config binding class %s", logName(), appConfigBindingClassName), e); } @@ -147,32 +148,31 @@ public class DataStoreAppConfigMetadata extends AbstractDependentComponentFactor // the data isn't present, we won't get an initial DTCN update so the read will indicate the data // isn't present. - DataTreeIdentifier dataTreeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, + DataTreeIdentifier dataTreeId = DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, bindingContext.appConfigPath); appConfigChangeListenerReg = dataBroker.registerDataTreeChangeListener(dataTreeId, - (ClusteredDataTreeChangeListener) changes -> onAppConfigChanged(changes)); + (ClusteredDataTreeChangeListener) this::onAppConfigChanged); readInitialAppConfig(dataBroker); } private void readInitialAppConfig(final DataBroker dataBroker) { - final ReadOnlyTransaction readOnlyTx = dataBroker.newReadOnlyTransaction(); - CheckedFuture, ReadFailedException> future = readOnlyTx.read( - LogicalDatastoreType.CONFIGURATION, bindingContext.appConfigPath); - Futures.addCallback(future, new FutureCallback>() { + final FluentFuture> future; + try (ReadTransaction readOnlyTx = dataBroker.newReadOnlyTransaction()) { + future = readOnlyTx.read(LogicalDatastoreType.CONFIGURATION, bindingContext.appConfigPath); + } + + future.addCallback(new FutureCallback>() { @Override public void onSuccess(final Optional possibleAppConfig) { LOG.debug("{}: Read of app config {} succeeded: {}", logName(), bindingContext .appConfigBindingClass.getName(), possibleAppConfig); - readOnlyTx.close(); setInitialAppConfig(possibleAppConfig); } @Override public void onFailure(final Throwable failure) { - readOnlyTx.close(); - // We may have gotten the app config via the data tree change listener so only retry if not. if (readingInitialAppConfig.get()) { LOG.warn("{}: Read of app config {} failed - retrying", logName(), @@ -181,7 +181,7 @@ public class DataStoreAppConfigMetadata extends AbstractDependentComponentFactor readInitialAppConfig(dataBroker); } } - }); + }, MoreExecutors.directExecutor()); } private void onAppConfigChanged(final Collection> changes) { @@ -239,14 +239,13 @@ public class DataStoreAppConfigMetadata extends AbstractDependentComponentFactor private DataObject createDefaultInstance() { try { - @SuppressWarnings("resource") ConfigURLProvider inputStreamProvider = appConfigFileName -> { File appConfigFile = new File(DEFAULT_APP_CONFIG_FILE_PATH, appConfigFileName); LOG.debug("{}: parsePossibleDefaultAppConfigXMLFile looking for file {}", logName(), appConfigFile.getAbsolutePath()); if (!appConfigFile.exists()) { - return Optional.absent(); + return Optional.empty(); } LOG.debug("{}: Found file {}", logName(), appConfigFile.getAbsolutePath()); @@ -254,12 +253,12 @@ public class DataStoreAppConfigMetadata extends AbstractDependentComponentFactor return Optional.of(appConfigFile.toURI().toURL()); }; - DataStoreAppConfigDefaultXMLReader reader = new DataStoreAppConfigDefaultXMLReader(logName(), - defaultAppConfigFileName, getOSGiService(SchemaService.class), bindingSerializer, bindingContext, + DataStoreAppConfigDefaultXMLReader reader = new DataStoreAppConfigDefaultXMLReader<>(logName(), + defaultAppConfigFileName, getOSGiService(DOMSchemaService.class), bindingSerializer, bindingContext, inputStreamProvider); - return reader.createDefaultInstance((schemaContext, dataSchema) -> { + return reader.createDefaultInstance(dataSchema -> { // Fallback if file cannot be read, try XML from Config - NormalizedNode dataNode = parsePossibleDefaultAppConfigElement(schemaContext, dataSchema); + NormalizedNode dataNode = parsePossibleDefaultAppConfigElement(dataSchema); if (dataNode == null) { // or, as last resort, defaults from the model return bindingContext.newDefaultNode(dataSchema); @@ -268,7 +267,8 @@ public class DataStoreAppConfigMetadata extends AbstractDependentComponentFactor } }); - } catch (ConfigXMLReaderException e) { + } catch (final ConfigXMLReaderException | IOException | SAXException | XMLStreamException + | ParserConfigurationException | URISyntaxException e) { if (e.getCause() == null) { setFailureMessage(e.getMessage()); } else { @@ -278,23 +278,17 @@ public class DataStoreAppConfigMetadata extends AbstractDependentComponentFactor } } - @Nullable - private NormalizedNode parsePossibleDefaultAppConfigElement(final SchemaContext schemaContext, - final DataSchemaNode dataSchema) { + private @Nullable NormalizedNode parsePossibleDefaultAppConfigElement(final SchemaTreeInference dataSchema) + throws URISyntaxException, IOException, ParserConfigurationException, SAXException, XMLStreamException { if (defaultAppConfigElement == null) { return null; } LOG.debug("{}: parsePossibleDefaultAppConfigElement for {}", logName(), bindingContext.bindingQName); - DomToNormalizedNodeParserFactory parserFactory = DomToNormalizedNodeParserFactory.getInstance( - XmlUtils.DEFAULT_XML_CODEC_PROVIDER, schemaContext); - - LOG.debug("{}: Got app config schema: {}", logName(), dataSchema); - NormalizedNode dataNode = bindingContext.parseDataElement(defaultAppConfigElement, dataSchema, - parserFactory); + NormalizedNode dataNode = bindingContext.parseDataElement(defaultAppConfigElement, dataSchema); LOG.debug("{}: Parsed data node: {}", logName(), dataNode);