/* * Copyright 2000-2013 Enonic AS * http://www.enonic.com/license */ package com.enonic.cms.core.portal.datasource.executor; import java.util.Map; import org.jdom.Document; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.google.common.collect.Maps; import com.enonic.cms.core.portal.datasource.DataSourceException; import com.enonic.cms.core.portal.datasource.handler.DataSourceHandler; import com.enonic.cms.core.portal.datasource.handler.DataSourceRequest; @Component public final class DataSourceInvokerImpl implements DataSourceInvoker { private final Map<String, DataSourceHandler> handlers; public DataSourceInvokerImpl() { this.handlers = Maps.newHashMap(); } public Document execute( final DataSourceRequest req ) throws DataSourceException { final DataSourceHandler handler = getHandler( req.getName() ); try { return handler.handle( req ); } catch ( final DataSourceException e ) { throw e; } catch ( final Exception e ) { throw new DataSourceException( "Error invoking data source {0} on: {1} ", req.getName(), (req.getPortalInstanceKey() == null) ? "NULL" : req.getPortalInstanceKey() ).withCause( e ); } } private DataSourceHandler getHandler( final String name ) { final DataSourceHandler handler = this.handlers.get( name ); if ( handler != null ) { return handler; } throw new DataSourceException( "Unknown data source by name [{0}]", name ); } @Autowired public void setHandlers( final DataSourceHandler... handlers ) { for ( final DataSourceHandler handler : handlers ) { this.handlers.put( handler.getName(), handler ); } } }