2 * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved.
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
8 package org.opendaylight.restconf.restful.services.impl;
10 import com.google.common.base.Optional;
11 import com.google.common.base.Preconditions;
12 import javax.ws.rs.core.Response;
13 import javax.ws.rs.core.UriInfo;
14 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
15 import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction;
16 import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint;
17 import org.opendaylight.netconf.sal.restconf.impl.InstanceIdentifierContext;
18 import org.opendaylight.netconf.sal.restconf.impl.NormalizedNodeContext;
19 import org.opendaylight.netconf.sal.restconf.impl.PATCHContext;
20 import org.opendaylight.netconf.sal.restconf.impl.PATCHStatusContext;
21 import org.opendaylight.netconf.sal.restconf.impl.RestconfDocumentedException;
22 import org.opendaylight.restconf.common.references.SchemaContextRef;
23 import org.opendaylight.restconf.handlers.SchemaContextHandler;
24 import org.opendaylight.restconf.handlers.TransactionChainHandler;
25 import org.opendaylight.restconf.restful.services.api.RestconfDataService;
26 import org.opendaylight.restconf.restful.transaction.TransactionVarsWrapper;
27 import org.opendaylight.restconf.restful.utils.DeleteDataTransactionUtil;
28 import org.opendaylight.restconf.restful.utils.PatchDataTransactionUtil;
29 import org.opendaylight.restconf.restful.utils.PostDataTransactionUtil;
30 import org.opendaylight.restconf.restful.utils.PutDataTransactionUtil;
31 import org.opendaylight.restconf.restful.utils.ReadDataTransactionUtil;
32 import org.opendaylight.restconf.restful.utils.RestconfDataServiceConstant;
33 import org.opendaylight.restconf.utils.parser.ParserIdentifier;
34 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
35 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
36 import org.slf4j.Logger;
37 import org.slf4j.LoggerFactory;
40 * Implementation of {@link RestconfDataService}
42 public class RestconfDataServiceImpl implements RestconfDataService {
44 private final static Logger LOG = LoggerFactory.getLogger(RestconfDataServiceImpl.class);
46 private final SchemaContextHandler schemaContextHandler;
47 private final TransactionChainHandler transactionChainHandler;
49 public RestconfDataServiceImpl(final SchemaContextHandler schemaContextHandler,
50 final TransactionChainHandler transactionChainHandler) {
51 this.schemaContextHandler = schemaContextHandler;
52 this.transactionChainHandler = transactionChainHandler;
56 public NormalizedNodeContext readData(final String identifier, final UriInfo uriInfo) {
57 Preconditions.checkNotNull(identifier);
58 final SchemaContextRef schemaContextRef = new SchemaContextRef(this.schemaContextHandler.get());
60 final InstanceIdentifierContext<?> instanceIdentifier = ParserIdentifier.toInstanceIdentifier(identifier, schemaContextRef.get());
61 final DOMMountPoint mountPoint = instanceIdentifier.getMountPoint();
62 final String value = uriInfo.getQueryParameters().getFirst(RestconfDataServiceConstant.CONTENT);
64 DOMDataReadWriteTransaction transaction = null;
65 if (mountPoint == null) {
66 transaction = this.transactionChainHandler.get().newReadWriteTransaction();
68 transaction = transactionOfMountPoint(mountPoint);
70 final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper(instanceIdentifier, mountPoint,
72 final NormalizedNode<?, ?> node = ReadDataTransactionUtil.readData(value, transactionNode);
74 return new NormalizedNodeContext(instanceIdentifier, node);
78 public Response putData(final String identifier, final NormalizedNodeContext payload) {
79 Preconditions.checkNotNull(identifier);
80 Preconditions.checkNotNull(payload);
82 final InstanceIdentifierContext<? extends SchemaNode> iid = payload
83 .getInstanceIdentifierContext();
85 PutDataTransactionUtil.validInputData(iid.getSchemaNode(), payload);
86 PutDataTransactionUtil.validTopLevelNodeName(iid.getInstanceIdentifier(), payload);
87 PutDataTransactionUtil.validateListKeysEqualityInPayloadAndUri(payload);
89 final DOMMountPoint mountPoint = payload.getInstanceIdentifierContext().getMountPoint();
90 DOMDataReadWriteTransaction transaction = null;
91 SchemaContextRef ref = null;
92 if (mountPoint == null) {
93 transaction = this.transactionChainHandler.get().newReadWriteTransaction();
94 ref = new SchemaContextRef(this.schemaContextHandler.get());
96 transaction = transactionOfMountPoint(mountPoint);
97 ref = new SchemaContextRef(mountPoint.getSchemaContext());
100 final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper(
101 payload.getInstanceIdentifierContext(), mountPoint, transaction);
102 return PutDataTransactionUtil.putData(payload, ref, transactionNode);
106 public Response postData(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) {
107 return postData(payload, uriInfo);
111 public Response postData(final NormalizedNodeContext payload, final UriInfo uriInfo) {
112 Preconditions.checkNotNull(payload);
114 final DOMMountPoint mountPoint = payload.getInstanceIdentifierContext().getMountPoint();
115 DOMDataReadWriteTransaction transaction = null;
116 SchemaContextRef ref = null;
117 if (mountPoint == null) {
118 transaction = this.transactionChainHandler.get().newReadWriteTransaction();
119 ref = new SchemaContextRef(this.schemaContextHandler.get());
121 transaction = transactionOfMountPoint(mountPoint);
122 ref = new SchemaContextRef(mountPoint.getSchemaContext());
124 final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper(
125 payload.getInstanceIdentifierContext(), mountPoint, transaction);
126 return PostDataTransactionUtil.postData(uriInfo, payload, transactionNode, ref);
130 public Response deleteData(final String identifier) {
131 final SchemaContextRef schemaContextRef = new SchemaContextRef(this.schemaContextHandler.get());
132 final InstanceIdentifierContext<?> instanceIdentifier = ParserIdentifier.toInstanceIdentifier(identifier,
133 schemaContextRef.get());
135 final DOMMountPoint mountPoint = instanceIdentifier.getMountPoint();
136 DOMDataReadWriteTransaction transaction = null;
137 if (mountPoint == null) {
138 transaction = this.transactionChainHandler.get().newReadWriteTransaction();
140 transaction = transactionOfMountPoint(mountPoint);
143 final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper(instanceIdentifier, mountPoint,
145 return DeleteDataTransactionUtil.deleteData(transactionNode);
149 public PATCHStatusContext patchData(final String identifier, final PATCHContext context, final UriInfo uriInfo) {
150 Preconditions.checkNotNull(identifier);
151 return patchData(context, uriInfo);
155 public PATCHStatusContext patchData(final PATCHContext context, final UriInfo uriInfo) {
156 Preconditions.checkNotNull(context);
157 final DOMMountPoint mountPoint = context.getInstanceIdentifierContext().getMountPoint();
159 final DOMDataReadWriteTransaction transaction;
160 final SchemaContextRef ref;
161 if (mountPoint == null) {
162 transaction = this.transactionChainHandler.get().newReadWriteTransaction();
163 ref = new SchemaContextRef(this.schemaContextHandler.get());
165 transaction = transactionOfMountPoint(mountPoint);
166 ref = new SchemaContextRef(mountPoint.getSchemaContext());
169 final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper(
170 context.getInstanceIdentifierContext(), mountPoint, transaction);
172 return PatchDataTransactionUtil.patchData(context, transactionNode, ref);
176 * Prepare transaction to read data of mount point, if these data are
179 * @return {@link DOMDataReadWriteTransaction}
181 private static DOMDataReadWriteTransaction transactionOfMountPoint(final DOMMountPoint mountPoint) {
182 final Optional<DOMDataBroker> domDataBrokerService = mountPoint.getService(DOMDataBroker.class);
183 if (domDataBrokerService.isPresent()) {
184 return domDataBrokerService.get().newReadWriteTransaction();
186 final String errMsg = "DOM data broker service isn't available for mount point "
187 + mountPoint.getIdentifier();
189 throw new RestconfDocumentedException(errMsg);