org.eclipse.jetty.util.resource.ResourceCollection Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of ehcache Show documentation
Show all versions of ehcache Show documentation
Ehcache is an open source, standards-based cache used to boost performance,
offload the database and simplify scalability. Ehcache is robust, proven and full-featured and
this has made it the most widely-used Java-based cache.
//
// ========================================================================
// Copyright (c) 1995-2013 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.util.resource;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.StringTokenizer;
import org.eclipse.jetty.util.URIUtil;
/**
* A collection of resources (dirs).
* Allows webapps to have multiple (static) sources.
* The first resource in the collection is the main resource.
* If a resource is not found in the main resource, it looks it up in
* the order the resources were constructed.
*
*
*
*/
public class ResourceCollection extends Resource
{
private Resource[] _resources;
/* ------------------------------------------------------------ */
/**
* Instantiates an empty resource collection.
*
* This constructor is used when configuring jetty-maven-plugin.
*/
public ResourceCollection()
{
_resources = new Resource[0];
}
/* ------------------------------------------------------------ */
/**
* Instantiates a new resource collection.
*
* @param resources the resources to be added to collection
*/
public ResourceCollection(Resource... resources)
{
List list = new ArrayList();
for (Resource r : resources)
{
if (r==null)
continue;
if (r instanceof ResourceCollection)
{
for (Resource r2 : ((ResourceCollection)r).getResources())
list.add(r2);
}
else
list.add(r);
}
_resources = list.toArray(new Resource[list.size()]);
for(Resource r : _resources)
{
if(!r.exists() || !r.isDirectory())
throw new IllegalArgumentException(r + " is not an existing directory.");
}
}
/* ------------------------------------------------------------ */
/**
* Instantiates a new resource collection.
*
* @param resources the resource strings to be added to collection
*/
public ResourceCollection(String[] resources)
{
_resources = new Resource[resources.length];
try
{
for(int i=0; i resources = null;
int i=0;
for(; i<_resources.length; i++)
{
resource = _resources[i].addPath(path);
if (resource.exists())
{
if (resource.isDirectory())
break;
return resource;
}
}
for(i++; i<_resources.length; i++)
{
Resource r = _resources[i].addPath(path);
if (r.exists() && r.isDirectory())
{
if (resource!=null)
{
resources = new ArrayList();
resources.add(resource);
resource=null;
}
resources.add(r);
}
}
if (resource!=null)
return resource;
if (resources!=null)
return new ResourceCollection(resources.toArray(new Resource[resources.size()]));
return null;
}
/* ------------------------------------------------------------ */
/**
* @param path
* @return the resource(file) if found, returns a list of resource dirs if its a dir, else null.
* @throws IOException
* @throws MalformedURLException
*/
protected Object findResource(String path) throws IOException, MalformedURLException
{
Resource resource=null;
ArrayList resources = null;
int i=0;
for(; i<_resources.length; i++)
{
resource = _resources[i].addPath(path);
if (resource.exists())
{
if (resource.isDirectory())
break;
return resource;
}
}
for(i++; i<_resources.length; i++)
{
Resource r = _resources[i].addPath(path);
if (r.exists() && r.isDirectory())
{
if (resource!=null)
{
resources = new ArrayList();
resources.add(resource);
}
resources.add(r);
}
}
if (resource!=null)
return resource;
if (resources!=null)
return resources;
return null;
}
/* ------------------------------------------------------------ */
@Override
public boolean delete() throws SecurityException
{
throw new UnsupportedOperationException();
}
/* ------------------------------------------------------------ */
@Override
public boolean exists()
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
return true;
}
/* ------------------------------------------------------------ */
@Override
public File getFile() throws IOException
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
for(Resource r : _resources)
{
File f = r.getFile();
if(f!=null)
return f;
}
return null;
}
/* ------------------------------------------------------------ */
@Override
public InputStream getInputStream() throws IOException
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
for(Resource r : _resources)
{
InputStream is = r.getInputStream();
if(is!=null)
return is;
}
return null;
}
/* ------------------------------------------------------------ */
@Override
public String getName()
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
for(Resource r : _resources)
{
String name = r.getName();
if(name!=null)
return name;
}
return null;
}
/* ------------------------------------------------------------ */
@Override
public OutputStream getOutputStream() throws IOException, SecurityException
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
for(Resource r : _resources)
{
OutputStream os = r.getOutputStream();
if(os!=null)
return os;
}
return null;
}
/* ------------------------------------------------------------ */
@Override
public URL getURL()
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
for(Resource r : _resources)
{
URL url = r.getURL();
if(url!=null)
return url;
}
return null;
}
/* ------------------------------------------------------------ */
@Override
public boolean isDirectory()
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
return true;
}
/* ------------------------------------------------------------ */
@Override
public long lastModified()
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
for(Resource r : _resources)
{
long lm = r.lastModified();
if (lm!=-1)
return lm;
}
return -1;
}
/* ------------------------------------------------------------ */
@Override
public long length()
{
return -1;
}
/* ------------------------------------------------------------ */
/**
* @return The list of resource names(merged) contained in the collection of resources.
*/
@Override
public String[] list()
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
HashSet set = new HashSet();
for(Resource r : _resources)
{
for(String s : r.list())
set.add(s);
}
String[] result=set.toArray(new String[set.size()]);
Arrays.sort(result);
return result;
}
/* ------------------------------------------------------------ */
@Override
public void release()
{
if(_resources==null)
throw new IllegalStateException("*resources* not set.");
for(Resource r : _resources)
r.release();
}
/* ------------------------------------------------------------ */
@Override
public boolean renameTo(Resource dest) throws SecurityException
{
throw new UnsupportedOperationException();
}
/* ------------------------------------------------------------ */
@Override
public void copyTo(File destination)
throws IOException
{
for (int r=_resources.length;r-->0;)
_resources[r].copyTo(destination);
}
/* ------------------------------------------------------------ */
/**
* @return the list of resources separated by a path separator
*/
@Override
public String toString()
{
if(_resources==null)
return "[]";
return String.valueOf(Arrays.asList(_resources));
}
/* ------------------------------------------------------------ */
@Override
public boolean isContainedIn(Resource r) throws MalformedURLException
{
// TODO could look at implementing the semantic of is this collection a subset of the Resource r?
return false;
}
}