blob: 61b645582cdf3c2f2586087418898450b3a2b5e8 [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.connect;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLStreamHandler;
import java.util.Enumeration;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
class JarRevision implements Revision
{
private final long m_lastModified;
private final JarFile m_jar;
private final URL m_url;
private final String m_urlString;
private final String m_prefix;
public JarRevision(JarFile jar, URL url, String prefix, long lastModified)
{
m_jar = jar;
m_url = url;
m_urlString = m_url.toExternalForm();
m_prefix = prefix;
if (lastModified > 0)
{
m_lastModified = lastModified;
}
else
{
m_lastModified = System.currentTimeMillis();
}
}
@Override
public long getLastModified()
{
return m_lastModified;
}
public Enumeration<String> getEntries()
{
return new EntriesEnumeration(m_jar.entries(), m_prefix);
}
@Override
public URL getEntry(String entryName)
{
try
{
if ("/".equals(entryName) || "".equals(entryName) || " ".equals(entryName))
{
return new URL("jar:" + m_urlString + "!/" + ((m_prefix == null) ? "" : m_prefix));
}
if (entryName != null)
{
final String target = ((entryName.startsWith("/")) ? entryName.substring(1) : entryName);
final JarEntry entry = m_jar.getJarEntry(((m_prefix == null) ? "" : m_prefix) + target);
if (entry != null)
{
URL result = new URL(null, "jar:" + m_urlString + "!/" + ((m_prefix == null) ? "" : m_prefix) + target, new URLStreamHandler()
{
protected URLConnection openConnection(final URL u) throws IOException
{
return new java.net.JarURLConnection(u)
{
public JarFile getJarFile()
{
return m_jar;
}
public void connect() throws IOException
{
}
public InputStream getInputStream() throws IOException
{
String extF = u.toExternalForm();
JarEntry targetEntry = entry;
if (!extF.endsWith(target))
{
extF = extF.substring(extF.indexOf('!') + 2);
if (m_prefix != null)
{
if (!extF.startsWith(m_prefix))
{
extF = m_prefix + extF;
}
}
targetEntry = m_jar.getJarEntry(extF);
}
return m_jar.getInputStream(targetEntry);
}
};
}
});
return result;
}
else
{
if (entryName.endsWith("/"))
{
return new URL("jar:" + m_urlString + "!/" + ((m_prefix == null) ? "" : m_prefix) + target);
}
}
}
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
}