b7308c1fbae67d8f29267e69b2d6921ade172483
[controller.git] / opendaylight / md-sal / sal-rest-connector / src / main / java / org / opendaylight / controller / md / sal / rest / schema / SchemaRetrievalServiceImpl.java
1 /*
2  * Copyright (c) 2014 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 package org.opendaylight.controller.md.sal.rest.schema;
9
10 import com.google.common.base.Splitter;
11 import com.google.common.collect.Iterables;
12 import java.text.ParseException;
13 import java.util.Date;
14 import java.util.Iterator;
15 import org.opendaylight.controller.md.sal.rest.common.RestconfValidationUtils;
16 import org.opendaylight.controller.sal.restconf.impl.ControllerContext;
17 import org.opendaylight.controller.sal.restconf.impl.InstanceIdentifierContext;
18 import org.opendaylight.controller.sal.restconf.impl.RestconfDocumentedException;
19 import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorTag;
20 import org.opendaylight.controller.sal.restconf.impl.RestconfError.ErrorType;
21 import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil;
22 import org.opendaylight.yangtools.yang.model.api.Module;
23 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
24
25 public class SchemaRetrievalServiceImpl implements SchemaRetrievalService {
26
27     private final ControllerContext salContext;
28
29     private static final Splitter SLASH_SPLITTER = Splitter.on("/");
30     private static final Splitter AT_SPLITTER = Splitter.on("@");
31     private static final String MOUNT_ARG = ControllerContext.MOUNT;
32
33     public SchemaRetrievalServiceImpl(final ControllerContext controllerContext) {
34         salContext = controllerContext;
35     }
36
37
38     @Override
39     public SchemaExportContext getSchema(final String mountAndModule) {
40         final SchemaContext schemaContext;
41         final Iterable<String> pathComponents = SLASH_SPLITTER.split(mountAndModule);
42         final Iterator<String> componentIter = pathComponents.iterator();
43         if(!Iterables.contains(pathComponents, MOUNT_ARG)) {
44             schemaContext = salContext.getGlobalSchema();
45         } else {
46             final StringBuilder pathBuilder = new StringBuilder();
47             while(componentIter.hasNext()) {
48                 final String current = componentIter.next();
49                 // It is argument, not last element.
50                 if(pathBuilder.length() != 0) {
51                         pathBuilder.append("/");
52                 }
53                 pathBuilder.append(current);
54                 if(MOUNT_ARG.equals(current)) {
55                     // We stop right at mountpoint, last two arguments should
56                     // be module name and revision
57                     break;
58                 }
59             }
60             schemaContext = getMountSchemaContext(pathBuilder.toString());
61
62         }
63
64         RestconfValidationUtils.checkDocumentedError(componentIter.hasNext(),
65                 ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, "Module name must be supplied.");
66         final String moduleName = componentIter.next();
67         RestconfValidationUtils.checkDocumentedError(componentIter.hasNext(),
68                 ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, "Revision date must be supplied.");
69         final String revisionString = componentIter.next();
70         return getExportUsingNameAndRevision(schemaContext, moduleName, revisionString);
71     }
72
73     private SchemaExportContext getExportUsingNameAndRevision(final SchemaContext schemaContext, final String moduleName,
74             final String revisionStr) {
75         try {
76             final Date revision = SimpleDateFormatUtil.getRevisionFormat().parse(revisionStr);
77             final Module module = schemaContext.findModuleByName(moduleName, revision);
78             return new SchemaExportContext(schemaContext, RestconfValidationUtils.checkNotNullDocumented(module, moduleName));
79         } catch (final ParseException e) {
80             throw new RestconfDocumentedException("Supplied revision is not in expected date format YYYY-mm-dd", e);
81         }
82     }
83
84     private SchemaContext getMountSchemaContext(final String identifier) {
85         final InstanceIdentifierContext mountContext = salContext.toMountPointIdentifier(identifier);
86         return mountContext.getSchemaContext();
87     }
88
89
90
91 }
92