From 75ec3145e6d9124a4a654759b76ffe5ac18fb0d1 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 21 Oct 2016 11:00:15 +0200 Subject: [PATCH] BUG-6522: share instances of Config(Effective)Statement Config statement has low cardinality, use specialized classes for its representation. Change-Id: I7b5dc7e7069e5e7cfa4808d44a95f147f6b7073d Signed-off-by: Robert Varga (cherry picked from commit 2ad7b79d5a61b540afca3ce37ab81738bbb699b7) --- .../stmt/rfc6020/ConfigStatementImpl.java | 17 +++- .../EmptyConfigEffectiveStatement.java | 68 +++++++++++++ .../stmt/rfc6020/EmptyConfigStatement.java | 99 +++++++++++++++++++ .../stmt/rfc6020/EmptyMandatoryStatement.java | 4 +- .../effective/ConfigEffectiveStatement.java | 15 +++ .../ConfigEffectiveStatementImpl.java | 3 +- .../DeviateEffectiveStatementImpl.java | 6 +- 7 files changed, 204 insertions(+), 8 deletions(-) create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyConfigEffectiveStatement.java create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyConfigStatement.java create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConfigEffectiveStatement.java diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java index af1d8dd428..886099e8eb 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java @@ -39,13 +39,26 @@ public class ConfigStatementImpl extends AbstractDeclaredStatement impl @Override public ConfigStatement createDeclared(final StmtContext ctx) { - return new ConfigStatementImpl(ctx); + final ConfigStatement ret = new ConfigStatementImpl(ctx); + + if (EmptyConfigStatement.FALSE.equals(ret)) { + return EmptyConfigStatement.FALSE; + } else if (EmptyConfigStatement.TRUE.equals(ret)) { + return EmptyConfigStatement.TRUE; + } else { + return ret; + } } @Override public EffectiveStatement createEffective( final StmtContext> ctx) { - return new ConfigEffectiveStatementImpl(ctx); + final EffectiveStatement ret = new ConfigEffectiveStatementImpl(ctx); + final ConfigStatement declared = ret.getDeclared(); + if (declared instanceof EmptyConfigStatement && ret.effectiveSubstatements().isEmpty()) { + return ((EmptyConfigStatement)declared).toEffective(); + } + return ret; } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyConfigEffectiveStatement.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyConfigEffectiveStatement.java new file mode 100644 index 0000000000..d5e30e8c2e --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyConfigEffectiveStatement.java @@ -0,0 +1,68 @@ +/** + * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; + +import com.google.common.collect.ImmutableList; +import java.util.Collection; +import java.util.Map; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; +import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; +import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ConfigEffectiveStatement; + +abstract class EmptyConfigEffectiveStatement implements ConfigEffectiveStatement { + static final EmptyConfigEffectiveStatement FALSE = new EmptyConfigEffectiveStatement() { + @Override + public ConfigStatement getDeclared() { + return EmptyConfigStatement.FALSE; + } + }; + + static final EmptyConfigEffectiveStatement TRUE = new EmptyConfigEffectiveStatement() { + @Override + public ConfigStatement getDeclared() { + return EmptyConfigStatement.TRUE; + } + }; + + private EmptyConfigEffectiveStatement() { + // Hidden + } + + @Override + public final StatementDefinition statementDefinition() { + return getDeclared().statementDefinition(); + } + + @Override + public final Boolean argument() { + return getDeclared().argument(); + } + + @Override + public final StatementSource getStatementSource() { + return getDeclared().getStatementSource(); + } + + @Override + public final > V get(final Class namespace, final K identifier) { + throw new UnsupportedOperationException("Not implemented yet."); + } + + @Override + public final > Map getAll(final Class namespace) { + throw new UnsupportedOperationException("Not implemented yet."); + } + + @Override + public final Collection> effectiveSubstatements() { + return ImmutableList.of(); + } +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyConfigStatement.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyConfigStatement.java new file mode 100644 index 0000000000..19d0dc2d7f --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyConfigStatement.java @@ -0,0 +1,99 @@ +/** + * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; + +import com.google.common.collect.ImmutableList; +import java.util.Collection; +import java.util.Objects; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; +import org.opendaylight.yangtools.yang.model.api.meta.StatementSource; +import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; + +abstract class EmptyConfigStatement implements ConfigStatement { + static final ConfigStatement FALSE = new EmptyConfigStatement() { + @Override + public boolean getValue() { + return false; + } + + @Override + EffectiveStatement toEffective() { + return EmptyConfigEffectiveStatement.FALSE; + } + }; + + static final ConfigStatement TRUE = new EmptyConfigStatement() { + @Override + public boolean getValue() { + return true; + } + + @Override + EffectiveStatement toEffective() { + return EmptyConfigEffectiveStatement.TRUE; + } + }; + + private EmptyConfigStatement() { + // Invisible on purpose + } + + abstract EffectiveStatement toEffective(); + + @Override + public final Collection> declaredSubstatements() { + return ImmutableList.of(); + } + + @Override + public final StatementDefinition statementDefinition() { + return Rfc6020Mapping.CONFIG; + } + + @Override + public final String rawArgument() { + return Boolean.toString(getValue()); + } + + @Override + public final Boolean argument() { + return Boolean.valueOf(getValue()); + } + + @Override + public final StatementSource getStatementSource() { + return StatementSource.DECLARATION; + } + + @Override + public final int hashCode() { + return Objects.hash(statementDefinition(), getStatementSource(), argument(), + rawArgument(), declaredSubstatements(), getValue()); + } + + @Override + public final boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof ConfigStatement)) { + return false; + } + + final ConfigStatement other = (ConfigStatement) obj; + + return getValue() == other.getValue() && argument().equals(other.argument()) && + rawArgument().equals(other.rawArgument()) && + statementDefinition().equals(other.statementDefinition()) && + getStatementSource().equals(other.getStatementSource()) && + declaredSubstatements().equals(other.declaredSubstatements()); + } +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyMandatoryStatement.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyMandatoryStatement.java index b83dbd8a28..ff2621c2bf 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyMandatoryStatement.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EmptyMandatoryStatement.java @@ -7,8 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import com.google.common.collect.ImmutableList; import java.util.Collection; -import java.util.Collections; import java.util.Objects; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; @@ -50,7 +50,7 @@ abstract class EmptyMandatoryStatement implements MandatoryStatement { @Override public final Collection> declaredSubstatements() { - return Collections.emptyList(); + return ImmutableList.of(); } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConfigEffectiveStatement.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConfigEffectiveStatement.java new file mode 100644 index 0000000000..7f58ddf4ee --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConfigEffectiveStatement.java @@ -0,0 +1,15 @@ +/* + * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective; + +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; + +public interface ConfigEffectiveStatement extends EffectiveStatement { + +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConfigEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConfigEffectiveStatementImpl.java index 2667dd5fe2..0de76b721e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConfigEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/ConfigEffectiveStatementImpl.java @@ -10,7 +10,8 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective; import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -public final class ConfigEffectiveStatementImpl extends DeclaredEffectiveStatementBase { +public final class ConfigEffectiveStatementImpl extends DeclaredEffectiveStatementBase + implements ConfigEffectiveStatement { public ConfigEffectiveStatementImpl(final StmtContext ctx) { super(ctx); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/DeviateEffectiveStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/DeviateEffectiveStatementImpl.java index c56f146c01..40cc4263cb 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/DeviateEffectiveStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/effective/DeviateEffectiveStatementImpl.java @@ -42,7 +42,7 @@ public final class DeviateEffectiveStatementImpl this.deviateType = argument(); - final ConfigEffectiveStatementImpl configStmt = firstEffective(ConfigEffectiveStatementImpl.class); + final ConfigEffectiveStatement configStmt = firstEffective(ConfigEffectiveStatement.class); this.deviatedConfig = configStmt == null ? null : configStmt.argument(); final DefaultEffectiveStatementImpl defaultStmt = firstEffective(DefaultEffectiveStatementImpl.class); this.deviatedDefault = defaultStmt == null ? null : defaultStmt.argument(); @@ -112,7 +112,7 @@ public final class DeviateEffectiveStatementImpl } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } @@ -140,4 +140,4 @@ public final class DeviateEffectiveStatementImpl return Objects.hash(deviateType, deviatedConfig, deviatedDefault, deviatedMandatory, deviatedMaxElements, deviatedMinElements, deviatedMustDefinitions, deviatedType, deviatedUniqueConstraints, deviatedUnits); } -} \ No newline at end of file +} -- 2.36.6