| /* |
| * 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.web3.impl; |
| |
| import java.util.Enumeration; |
| import java.util.Hashtable; |
| |
| import org.apache.avalon.framework.activity.Disposable; |
| 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.logger.AbstractLogEnabled; |
| import org.apache.avalon.framework.service.ServiceException; |
| import org.apache.avalon.framework.service.ServiceManager; |
| import org.apache.avalon.framework.service.ServiceSelector; |
| import org.apache.avalon.framework.service.Serviceable; |
| import org.apache.avalon.framework.thread.ThreadSafe; |
| |
| import org.apache.cocoon.components.LifecycleHelper; |
| import org.apache.cocoon.components.web3.Web3DataSource; |
| import org.apache.cocoon.util.ClassUtils; |
| |
| import EDU.oswego.cs.dl.util.concurrent.Mutex; |
| |
| /** |
| * TBD |
| * |
| * @author <a href="mailto:michael.gerzabek@at.efp.cc">Michael Gerzabek</a> |
| * @since 2.1 |
| * @version CVS $Id$ |
| */ |
| public class Web3DataSourceSelectorImpl |
| extends AbstractLogEnabled |
| implements ServiceSelector, Disposable, Serviceable, Configurable, ThreadSafe { |
| |
| /** The service manager instance */ |
| protected ServiceManager manager; |
| protected Configuration configuration; |
| private static final Hashtable pools = new Hashtable(); |
| private static final Mutex lock = new Mutex(); |
| |
| /** |
| * Set the current <code>ServiceManager</code> instance used by this |
| * <code>Serviceable</code>. |
| */ |
| public void service(ServiceManager manager) throws ServiceException { |
| this.manager = manager; |
| } |
| |
| public void configure(Configuration configuration) |
| throws ConfigurationException { |
| if (null != configuration) { |
| this.configuration = configuration; |
| } else { |
| getLogger().error( |
| "Couldn't configure Web3DataSourceSelector." |
| + " No configuration provided!"); |
| } |
| } |
| |
| public boolean isSelectable(Object obj) { |
| return Web3DataSourceSelectorImpl.pools.containsKey(obj); |
| } |
| |
| public Object select(Object obj) throws ServiceException { |
| Web3DataSource pool = null; |
| try { |
| Web3DataSourceSelectorImpl.lock.acquire(); |
| if (null != obj) { |
| if (Web3DataSourceSelectorImpl.pools.containsKey(obj)) { |
| pool = (Web3DataSource)Web3DataSourceSelectorImpl.pools.get(obj); |
| } else { |
| Configuration a[] = this.configuration.getChildren("backend"); |
| Configuration c = null; |
| |
| if (null != a) |
| for (int i = 0; i < a.length; i++) { |
| try { |
| String s = a[i].getAttribute("name"); |
| if (null != s && s.equals(obj.toString())) { |
| // a backend with a name can be defined only once |
| c = a[i]; |
| break; |
| } |
| } catch (ConfigurationException x) { |
| // this configuration element has no mandatory |
| //attribute name |
| } |
| } |
| // No configuration for this backend-id found! |
| if (null == c) { |
| return null; |
| } |
| Class theClass = |
| Class.forName( |
| c.getChild("class").getValue( |
| "org.apache.cocoon.components.web3.impl.Web3DataSourceImpl"), |
| true, |
| ClassUtils.getClassLoader()); |
| pool = (Web3DataSource) theClass.newInstance(); |
| LifecycleHelper.setupComponent(pool, getLogger(), null, this.manager, c); |
| Web3DataSourceSelectorImpl.pools.put(obj, pool); |
| } |
| } |
| } catch (Exception ex) { |
| getLogger().error(ex.getMessage(), ex); |
| throw new ServiceException(null, ex.getMessage()); |
| } finally { |
| Web3DataSourceSelectorImpl.lock.release(); |
| } |
| getLogger().debug("Returning Web3DataSource[" + pool + "]"); |
| return pool; |
| } |
| |
| public void release(Object object) { |
| } |
| |
| /** Dispose properly of the pool */ |
| public void dispose() { |
| this.manager = null; |
| try { |
| Web3DataSourceSelectorImpl.lock.acquire(); |
| String sid = null; |
| Web3DataSource pool; |
| for (Enumeration enumeration = Web3DataSourceSelectorImpl.pools.keys(); |
| enumeration.hasMoreElements(); |
| ) { |
| sid = (String) enumeration.nextElement(); |
| pool = (Web3DataSource) Web3DataSourceSelectorImpl.pools.get(sid); |
| pool.dispose(); |
| } |
| Web3DataSourceSelectorImpl.pools.clear(); |
| } catch (Exception ex) { |
| } finally { |
| Web3DataSourceSelectorImpl.lock.release(); |
| } |
| } |
| |
| } |