package org.apache.cocoon.components.source.impl;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Map;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
import org.apache.avalon.framework.context.Context;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.Contextualizable;
import org.apache.avalon.framework.logger.AbstractLogEnabled;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceManager;
import org.apache.avalon.framework.service.Serviceable;
import org.apache.avalon.framework.thread.ThreadSafe;
import org.apache.cocoon.components.ContextHelper;
import org.apache.cocoon.environment.Request;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceException;
import org.apache.excalibur.source.SourceFactory;
import org.apache.excalibur.source.SourceResolver;
//import org.apache.lenya.cms.publication.DocumentIdentityMap;
//import org.apache.lenya.cms.publication.PageEnvelope;
//import org.apache.lenya.cms.publication.PageEnvelopeException;
//import org.apache.lenya.cms.publication.PageEnvelopeFactory;
//import org.apache.lenya.cms.publication.Publication;
/*
import org.apache.lenya.transaction.IdentityMap;
import org.apache.lenya.transaction.UnitOfWork;
*/
import org.wyona.yarep.core.RepositoryFactory;
/**
* A factory for the "yarep" scheme (virtual protocol), which is used to resolve any src="yarep:..."
* attributes in sitemaps. This implementation constructs the path to the source document from the
* page envelope and delegates any further resolving to the "context" source resolver of Cocoon.
*/
public class YarepSourceFactory extends AbstractLogEnabled implements SourceFactory, ThreadSafe,
Contextualizable, Serviceable, Configurable {
protected static final String SCHEME = "yarep";
protected RepositoryFactory repoFactory;
/** fallback if no configuration is available */
protected static final String DEFAULT_DELEGATION_SCHEME = "context:";
//protected static final String DEFAULT_DELEGATION_PREFIX = "/" + Publication.PUBLICATION_PREFIX_URI;
private Context context;
private ServiceManager manager;
private String delegationScheme;
//private String delegationPrefix;
/**
* Used for resolving the object model.
* @see org.apache.avalon.framework.context.Contextualizable#contextualize(org.apache.avalon.framework.context.Context)
*/
public void contextualize(Context _context) throws ContextException {
this.context = _context;
}
/**
* @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
*/
public void service(ServiceManager _manager) throws ServiceException {
this.manager = _manager;
}
/**
* @see org.apache.avalon.framework.configuration.Configurable#configure(org.apache.avalon.framework.configuration.Configuration)
*/
public void configure(Configuration configuration) throws ConfigurationException {
this.delegationScheme = configuration.getAttribute("scheme", DEFAULT_DELEGATION_SCHEME);
//this.delegationPrefix = configuration.getAttribute("prefix", DEFAULT_DELEGATION_PREFIX);
try {
repoFactory = new RepositoryFactory();
getLogger().info("Initialize Repository Factory: " + repoFactory.toString());
} catch(Exception e) {
getLogger().error(e.getMessage(), e);
}
}
/**
* @see org.apache.excalibur.source.SourceFactory#getSource(java.lang.String, java.util.Map)
*/
public Source getSource(String src, Map parameters) throws MalformedURLException, IOException {
SourceResolver sourceResolver = null;
try {
sourceResolver = (SourceResolver) this.manager
.lookup(org.apache.excalibur.source.SourceResolver.ROLE);
String path = src.substring(SCHEME.length() + 1);
getLogger().debug("src = " + src);
if (!path.startsWith("//")) {
Map objectModel = ContextHelper.getObjectModel(this.context);
}
while (path.startsWith("/")) {
path = path.substring(1);
}
//IdentityMap map = null;
Request request = ContextHelper.getRequest(this.context);
if (getLogger().isDebugEnabled()) {
getLogger().debug("Creating repository source for URI [" + src + "]");
}
getLogger().debug("Creating repository source for URI [" + src + "]");
try {
return new YarepSource(src, repoFactory);
} catch (Exception e) {
getLogger().error(e.getMessage(), e);
throw new IOException(e.getMessage());
}
//return sourceResolver.resolveURI(path);
} catch (final ServiceException e) {
throw new SourceException(e.getMessage(), e);
} finally {
this.manager.release(sourceResolver);
}
}
/**
* Does nothing because the delegated factory does this.
* @see org.apache.excalibur.source.SourceFactory#release(org.apache.excalibur.source.Source)
*/
public void release(Source source) {
// do nothing
}
}