blob: ec89fb294d642ebcad7f910adb703070ec8470af [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.cocoon.components.source.impl;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceValidity;
import org.apache.excalibur.source.SourceNotFoundException;
import org.apache.cocoon.servlet.multipart.Part;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import java.net.MalformedURLException;
import java.util.Map;
import java.io.IOException;
import java.io.InputStream;
/**
* Implementation of a {@link Source} that gets its content
* from a PartOnDisk or PartInMemory held in the Request when
* a file is uploaded.
*
* @author <a href="mailto:paul.crabtree@dna.co.uk">Paul Crabtree</a>
* @version CVS $Id$
*/
public class PartSource implements Source
{
/* hold a private ref to the protocol used to call the Source */
private String protocol;
/* hold a private ref to the full uri */
private String uri;
/* hold a private ref to the Part which has been uploaded. */
private Part part;
/**
* Builds a PartSource given an URI.
* @param uri e.g., upload://formField1
* @throws SourceException
* @throws MalformedURLException
*/
public PartSource(String uri, Map objectModel) throws MalformedURLException, SourceException
{
// set the uri for use in getURI()
this.uri = uri;
int position = uri.indexOf(':') + 1;
if (position != 0)
{
// set the protocol for use in getScheme()
this.protocol = uri.substring(0, position-1);
}
else
{
// if the URI is not correctly formatted then throw an excpetion
throw new MalformedURLException("No protocol found for part source in " + uri);
}
// get the request parameter name: the bit after ://
String location = uri.substring(position + 2);
// get the cocoon request from the object model.
Request request = ObjectModelHelper.getRequest(objectModel);
// try and cast the request object to a Part
Object obj = request.get(location);
if (obj instanceof Part)
{
part = (Part) obj;
}
else
{
throw new SourceException("Request object " + location + " is not an uploaded Part");
}
}
/**
* @see org.apache.excalibur.source.Source#getInputStream()
*/
public InputStream getInputStream() throws IOException, SourceNotFoundException
{
try
{
return part.getInputStream();
}
catch (Exception ex)
{
throw new SourceNotFoundException("The part source can not be found.");
}
}
/**
* @see org.apache.excalibur.source.Source#getMimeType()
*/
public String getMimeType()
{
return part.getMimeType();
}
/**
* @return true if the resource exists.
*/
public boolean exists()
{
return part != null;
}
/*
* @see org.apache.excalibur.source.Source#getURI()
*/
public String getURI()
{
return uri;
}
/*
* @see org.apache.excalibur.source.Source#getScheme()
*/
public String getScheme()
{
return this.protocol;
}
/*
* Not used, Parts are not cacheable.
*/
public SourceValidity getValidity()
{
// not sure what happens here.
return null;
}
/**
* @see org.apache.excalibur.source.Source#refresh()
*/
public void refresh()
{
}
/**
* @see org.apache.excalibur.source.Source#getContentLength()
*/
public long getContentLength()
{
return part.getSize();
}
/**
* @see org.apache.excalibur.source.Source#getLastModified()
*/
public long getLastModified()
{
return 0;
}
public Part getPart() {
return this.part;
}
}