/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.aries.subsystem.core.internal;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.aries.subsystem.core.archive.SubsystemSymbolicNameHeader;
import org.apache.aries.subsystem.core.archive.SubsystemVersionHeader;
import org.osgi.framework.Version;
import org.osgi.service.subsystem.SubsystemConstants;
public class SubsystemUri {
private static final String REGEXP = "([^=]*)=([^&]*)&?";
private static final Pattern PATTERN = Pattern.compile(REGEXP);
private final String symbolicName;
private final URL url;
private final Version version;
public SubsystemUri(String location) throws URISyntaxException, MalformedURLException {
if (!location.startsWith("subsystem://"))
throw new IllegalArgumentException(location);
URI uri = new URI(location);
if (uri.getAuthority() != null)
url = new URL(uri.getAuthority());
else
url = null;
Matcher matcher = PATTERN.matcher(uri.getQuery());
String symbolicName = null;
Version version = Version.emptyVersion;
while (matcher.find()) {
String name = matcher.group(1);
if (SubsystemSymbolicNameHeader.NAME.equals(name))
symbolicName = new SubsystemSymbolicNameHeader(matcher.group(2)).getValue();
else if (SubsystemVersionHeader.NAME.equals(name))
version = Version.parseVersion(matcher.group(2));
else
throw new IllegalArgumentException("Unsupported subsystem URI parameter: " + name);
}
this.symbolicName = symbolicName;
this.version = version;
}
public SubsystemUri(String symbolicName, Version version, URL url) {
// TODO symbolicName should conform to OSGi grammar.
if (symbolicName == null || symbolicName.length() == 0)
throw new IllegalArgumentException(
"Missing required parameter: symbolicName");
this.symbolicName = symbolicName;
this.version = version;
this.url = url;
}
public String getSymbolicName() {
return symbolicName;
}
public URL getURL() {
return url;
}
public Version getVersion() {
return version;
}
@SuppressWarnings("deprecation")
public String toString() {
StringBuilder builder = new StringBuilder("subsystem://");
if (url != null) {
try {
builder.append(URLEncoder.encode(url.toString(), "UTF-8"));
} catch (UnsupportedEncodingException e) {
builder.append(URLEncoder.encode(url.toString()));
}
}
builder.append('?').append(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME)
.append('=').append(symbolicName);
if (version != null)
builder.append('&').append(SubsystemConstants.SUBSYSTEM_VERSION)
.append('=').append(version);
return builder.toString();
}
}