1 /*
2 (C) Copyright IBM Corp. 2006, 2009
3
4 THIS FILE IS PROVIDED UNDER THE TERMS OF THE ECLIPSE PUBLIC LICENSE
5 ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THIS FILE
6 CONSTITUTES RECIPIENTS ACCEPTANCE OF THE AGREEMENT.
7
8 You can obtain a current copy of the Eclipse Public License from
9 http://www.opensource.org/licenses/eclipse-1.0.php
10
11 @author : Endre Bak, ebak@de.ibm.com
12 *
13 * Flag Date Prog Description
14 * -------------------------------------------------------------------------------
15 * 1565892 2006-11-05 ebak Make SBLIM client JSR48 compliant
16 * 2003590 2008-06-30 blaschke-oss Change licensing from CPL to EPL
17 * 2524131 2009-01-21 raman_arora Upgrade client to JDK 1.5 (Phase 1)
18 */
19
20 package org.metricshub.wbem.sblim.cimclient.internal.uri;
21
22 /*-
23 * ╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲
24 * WBEM Java Client
25 * ჻჻჻჻჻჻
26 * Copyright 2023 - 2025 MetricsHub
27 * ჻჻჻჻჻჻
28 * Licensed under the Apache License, Version 2.0 (the "License");
29 * you may not use this file except in compliance with the License.
30 * You may obtain a copy of the License at
31 *
32 * http://www.apache.org/licenses/LICENSE-2.0
33 *
34 * Unless required by applicable law or agreed to in writing, software
35 * distributed under the License is distributed on an "AS IS" BASIS,
36 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
37 * See the License for the specific language governing permissions and
38 * limitations under the License.
39 * ╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱╲╱
40 */
41
42 import java.util.regex.Pattern;
43
44 /**
45 * <pre>
46 * namespaceHandle = ["//" authority] "/" [namespaceName]
47 * namespaceName = IDENTIFIER *("/"IDENTIFIER)
48 * </pre>
49 */
50 public class NamespaceHandle {
51
52 /**
53 * Factory method which tries to build a <code>NamespaceHandle</code> from
54 * the passed <code>pUriStr</code>
55 *
56 * @param pUriStr
57 * @return a <code>NamespaceHandle</code> or <code>null</code> in case of
58 * failure
59 */
60 public static NamespaceHandle parse(URIString pUriStr) {
61 // TODO: tracing TRC.log(uriStr.toString());
62 URIString uriStr = pUriStr.deepCopy();
63 Authority auth;
64 if (uriStr.cutStarting("//")) {
65 auth = Authority.parse(uriStr);
66 if (auth == null) return null;
67 } else {
68 auth = null;
69 }
70 if (!uriStr.cutStarting('/')) {
71 return null;
72 }
73 String nsName = parseNamespaceName(uriStr);
74 // namespaceName is optimal
75 pUriStr.set(uriStr);
76 return new NamespaceHandle(auth, nsName);
77 }
78
79 private Authority iAuth;
80
81 private String iNsName;
82
83 private NamespaceHandle(Authority pAuth, String pNsName) {
84 this.iAuth = pAuth;
85 this.iNsName = pNsName;
86 }
87
88 /**
89 * Constructs a NamespaceHandle with namespace name only.
90 *
91 * @param pNamespaceName
92 */
93 public NamespaceHandle(String pNamespaceName) {
94 this.iAuth = null;
95 this.iNsName = pNamespaceName;
96 }
97
98 /**
99 * @see java.lang.Object#toString()
100 */
101 @Override
102 public String toString() {
103 return (this.iAuth == null ? "" : "//" + this.iAuth.toString()) + "/" + (this.iNsName == null ? "" : this.iNsName);
104 }
105
106 /**
107 * getName
108 *
109 * @return String
110 */
111 public String getName() {
112 return this.iNsName;
113 }
114
115 /**
116 * getUserInfo
117 *
118 * @return String
119 */
120 public String getUserInfo() {
121 return this.iAuth == null ? null : this.iAuth.getUserInfo();
122 }
123
124 /**
125 * getHost
126 *
127 * @return String
128 */
129 public String getHost() {
130 return this.iAuth == null ? null : this.iAuth.getHost();
131 }
132
133 /**
134 * getPort
135 *
136 * @return String
137 */
138 public String getPort() {
139 return this.iAuth == null ? null : this.iAuth.getPort();
140 }
141
142 private static final String IDENTIFIER = "[A-Za-z][0-9A-Za-z\\._-]*";
143
144 private static final Pattern NAMESPACENAME_PAT = Pattern.compile("^(" + IDENTIFIER + "(/" + IDENTIFIER + ")*).*");
145
146 /**
147 * <code>IDENTIFIER *("/"IDENTIFIER)</code>
148 *
149 * @param pUriStr
150 * @return <code>String</code> containing the namespace name or
151 * <code>null</code> if failed.
152 */
153 public static String parseNamespaceName(URIString pUriStr) {
154 if (!pUriStr.matchAndCut(NAMESPACENAME_PAT, 1)) return null;
155 return pUriStr.group(1);
156 }
157 }