YANGTOOLS-706: split out rfc8040-model-api
[yangtools.git] / yang / yang-parser-impl / src / main / java / org / opendaylight / yangtools / yang / parser / stmt / rfc6020 / effective / UnknownEffectiveStatementImpl.java
1 /*
2  * Copyright (c) 2015 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective;
10
11 import java.util.Objects;
12 import javax.annotation.Nonnull;
13 import org.opendaylight.yangtools.yang.common.QName;
14 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
15 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
16 import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement;
17 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
18 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
19
20 public final class UnknownEffectiveStatementImpl
21         extends UnknownEffectiveStatementBase<String, UnknownStatement<String>> {
22
23     private final QName maybeQNameArgument;
24     private final SchemaPath path;
25
26     public UnknownEffectiveStatementImpl(final StmtContext<String, UnknownStatement<String>, ?> ctx) {
27         super(ctx);
28
29         // FIXME: Remove following section after fixing 4380
30         final UnknownSchemaNode original = (UnknownSchemaNode) ctx.getOriginalCtx().map(StmtContext::buildEffective)
31                 .orElse(null);
32         if (original != null) {
33             this.maybeQNameArgument = original.getQName();
34         } else {
35             QName maybeQNameArgumentInit = null;
36             try {
37                 maybeQNameArgumentInit = StmtContextUtils.qnameFromArgument(ctx, argument());
38             } catch (IllegalArgumentException e) {
39                 maybeQNameArgumentInit = getNodeType();
40             }
41             this.maybeQNameArgument = maybeQNameArgumentInit;
42         }
43         path = ctx.getParentContext().getSchemaPath().get().createChild(maybeQNameArgument);
44     }
45
46     @Nonnull
47     @Override
48     public QName getQName() {
49         return maybeQNameArgument;
50     }
51
52     @Nonnull
53     @Override
54     public SchemaPath getPath() {
55         return path;
56     }
57
58     @Override
59     public int hashCode() {
60         final int prime = 31;
61         int result = 1;
62         result = prime * result + Objects.hashCode(maybeQNameArgument);
63         result = prime * result + Objects.hashCode(path);
64         result = prime * result + Objects.hashCode(getNodeType());
65         result = prime * result + Objects.hashCode(getNodeParameter());
66         return result;
67     }
68
69     @Override
70     public boolean equals(final Object obj) {
71         if (this == obj) {
72             return true;
73         }
74         if (!(obj instanceof UnknownEffectiveStatementImpl)) {
75             return false;
76         }
77         UnknownEffectiveStatementImpl other = (UnknownEffectiveStatementImpl) obj;
78         return Objects.equals(maybeQNameArgument, other.maybeQNameArgument) && Objects.equals(path, other.path)
79                 && Objects.equals(getNodeType(), other.getNodeType())
80                 && Objects.equals(getNodeParameter(), other.getNodeParameter());
81     }
82 }