blob: 63143a5db849f63aaa86fd7ac999d6339a1ea457 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.felix.mosgi.jmx.agent.mx4j.loading;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.StringTokenizer;
import javax.management.ObjectName;
/**
* Represents an MLET tag, as documented in the JMX specification.
*
* @author <a href="mailto:biorn_steedom@users.sourceforge.net">Simone Bordet</a>
* @version $Revision: 1.1.1.1 $
*/
public class MLetTag
{
private String code;
private String object;
private String archive;
private String codebase;
private ObjectName objectName;
private String version;
private ArrayList signature = new ArrayList();
private ArrayList arguments = new ArrayList();
/**
* Normalizes the codebase held by this MLetTag (specified in the MLet file) using the
* URL of the MLet file as default.
* This means that if the codebase in the MLet file is not provided or it is relative, then
* the URL of the MLet file will be taken as base for computing the normalized codebase;
* otherwise, if a full URL has been specified as codebase in the MLet file, that URL is taken
* and the URL of the MLet file is discarded.
*
* @param mletFileURL The URL of the MLet file
* @return The normalized codebase
*/
public URL normalizeCodeBase(URL mletFileURL)
{
// If the codebase specified in the MLet file is relative, or null,
// then the codebase is the one of the mletFileURL, otherwise
// the given codebase must be used.
URL codebaseURL = null;
String codebase = getCodeBase();
if (codebase != null)
{
// Try to see if it's a URL
try
{
codebaseURL = new URL(codebase);
}
catch (MalformedURLException ignored)
{
// Not a complete URL, use the mletFileURL as a base
try
{
codebaseURL = new URL(mletFileURL, codebase);
}
catch (MalformedURLException alsoIgnored)
{
}
}
}
// Either codebase not provided or failed to be created, use the mletFileURL
if (codebaseURL == null)
{
String path = mletFileURL.getPath();
int index = path.lastIndexOf('/');
try
{
codebaseURL = new URL(mletFileURL, path.substring(0, index + 1));
}
catch (MalformedURLException ignored)
{
// Cannot fail, we just remove the mlet file name from the path
// leaving the directory where it resides as a codebase
}
}
return codebaseURL;
}
/**
* Returns the jars file names specified in the ARCHIVE attribute of the MLet tag.
*/
public String[] parseArchive()
{
String archive = getArchive();
ArrayList archives = new ArrayList();
StringTokenizer tokenizer = new StringTokenizer(archive, ",");
while (tokenizer.hasMoreTokens())
{
String token = tokenizer.nextToken().trim();
if (token.length() > 0)
{
token.replace('\\', '/');
archives.add(token);
}
}
return (String[])archives.toArray(new String[0]);
}
/**
* Returns the URL for the given archive file name using the provided URL as a codebase,
* or null if the URL cannot be created.
*/
public URL createArchiveURL(URL codebase, String archive)
{
try
{
return new URL(codebase, archive);
}
catch (MalformedURLException ignored)
{
}
return null;
}
public String getVersion()
{
return version;
}
public String getCodeBase()
{
return codebase;
}
public String getArchive()
{
return archive;
}
public String getCode()
{
return code;
}
public ObjectName getObjectName()
{
return objectName;
}
public String getObject()
{
return object;
}
public String[] getSignature()
{
return signature == null ? new String[0] : (String[])signature.toArray(new String[signature.size()]);
}
public Object[] getArguments()
{
return arguments == null ? new Object[0] : (Object[])arguments.toArray(new Object[arguments.size()]);
}
//
// Setters, called by MLetParser
//
void setArchive(String archive)
{
this.archive = archive;
}
void setCode(String code)
{
this.code = code;
}
void setCodeBase(String codebase)
{
// Important that the codebase ends with a slash, see usages of getCodeBase()
codebase = codebase.replace('\\', '/');
if (!codebase.endsWith("/")) codebase += "/";
this.codebase = codebase;
}
void setName(ObjectName name)
{
objectName = name;
}
void setObject(String object)
{
this.object = object;
}
void setVersion(String version)
{
this.version = version;
}
void addArg(String type, Object value)
{
signature.add(type);
arguments.add(value);
}
}