/*
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jcr.impl.storage.value;
import org.exoplatform.commons.utils.ClassLoading;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.RepositoryEntry;
import org.exoplatform.services.jcr.config.SimpleParameterEntry;
import org.exoplatform.services.jcr.config.ValueStorageEntry;
import org.exoplatform.services.jcr.config.ValueStorageFilterEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.datamodel.PropertyData;
import org.exoplatform.services.jcr.impl.util.io.FileCleaner;
import org.exoplatform.services.jcr.impl.util.io.FileCleanerHolder;
import org.exoplatform.services.jcr.storage.WorkspaceStorageConnection;
import org.exoplatform.services.jcr.storage.value.ValueIOChannel;
import org.exoplatform.services.jcr.storage.value.ValuePluginFilter;
import org.exoplatform.services.jcr.storage.value.ValueStoragePlugin;
import org.exoplatform.services.jcr.storage.value.ValueStoragePluginProvider;
import org.exoplatform.services.jcr.storage.value.ValueStorageURLConnection;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import javax.jcr.PropertyType;
/**
* Created by The eXo Platform SAS. Per-workspace factory object for ValueStoragePlugin
*
* @author <a href="mailto:gennady.azarenkov@exoplatform.com">Gennady Azarenkov</a>
* @version $Id: StandaloneStoragePluginProvider.java 13463 2007-03-16 09:17:29Z geaz $
*/
public class StandaloneStoragePluginProvider extends ArrayList<ValueStoragePlugin> implements
ValueStoragePluginProvider
{
private static final long serialVersionUID = 4537116106932443262L;
/**
* Logger.
*/
private static Log log = ExoLogger.getLogger("exo.jcr.component.core.StandaloneStoragePluginProvider");
/**
* Value storage enabling parameter. For internal usage only and testing purpose.
*/
public static final String VALUE_STORAGE_ENABLED_PARAM = "enabled";
/**
* ValueData resources holder (Files etc). It's singleton feature.
*/
private final ValueDataResourceHolder resorcesHolder;
public StandaloneStoragePluginProvider(RepositoryEntry repoConfig, WorkspaceEntry wsConfig, FileCleanerHolder holder)
throws RepositoryConfigurationException, IOException
{
this.resorcesHolder = new ValueDataResourceHolder();
List<ValueStorageEntry> storages = wsConfig.getContainer().getValueStorages();
if (storages != null)
{
for (ValueStorageEntry storageEntry : storages)
{
if (storageEntry.getParameterBoolean(VALUE_STORAGE_ENABLED_PARAM, true))
{
// can be only one storage with given id
for (ValueStoragePlugin vsp : this)
{
if (vsp.getId().equals(storageEntry.getId()))
{
throw new RepositoryConfigurationException("Value storage with ID '" + storageEntry.getId()
+ "' already exists");
}
}
Object o = null;
try
{
o =
ClassLoading.forName(storageEntry.getType(), this).getConstructor(FileCleaner.class)
.newInstance(holder.getFileCleaner());
}
catch (InstantiationException e)
{
log.error("Value Storage Plugin instantiation FAILED. ", e);
continue;
}
catch (IllegalArgumentException e)
{
log.error("Value Storage Plugin instantiation FAILED. ", e);
continue;
}
catch (SecurityException e)
{
log.error("Value Storage Plugin instantiation FAILED. ", e);
continue;
}
catch (IllegalAccessException e)
{
log.error("Value Storage Plugin instantiation FAILED. ", e);
continue;
}
catch (InvocationTargetException e)
{
log.error("Value Storage Plugin instantiation FAILED. ", e);
continue;
}
catch (NoSuchMethodException e)
{
log.error("Value Storage Plugin instantiation FAILED. ", e);
continue;
}
catch (ClassNotFoundException e)
{
log.error("Value Storage Plugin instantiation FAILED. ", e);
continue;
}
if (!(o instanceof ValueStoragePlugin))
{
log.error("Not a ValueStoragePlugin object IGNORED: " + o);
continue;
}
ValueStoragePlugin plugin = (ValueStoragePlugin)o;
// init filters
ArrayList<ValuePluginFilter> filters = new ArrayList<ValuePluginFilter>();
List<ValueStorageFilterEntry> filterEntries = storageEntry.getFilters();
for (ValueStorageFilterEntry filterEntry : filterEntries)
{
ValuePluginFilter filter =
new ValuePluginFilter(PropertyType.valueFromName(filterEntry.getPropertyType()), null, null,
filterEntry.getMinValueSize());
filters.add(filter);
}
// init properties
Properties props = new Properties();
Collection<SimpleParameterEntry> paramEntries = storageEntry.getParameters();
for (SimpleParameterEntry paramEntry : paramEntries)
{
props.setProperty(paramEntry.getName(), paramEntry.getValue());
}
plugin.setId(storageEntry.getId());
plugin.setRepository(repoConfig.getName());
plugin.setWorkspace(wsConfig.getName());
plugin.init(props, resorcesHolder);
plugin.setFilters(filters);
add(plugin);
}
}
}
}
/**
* {@inheritDoc}
*/
public ValueIOChannel getApplicableChannel(PropertyData property, int valueOrderNumer) throws IOException
{
Iterator<ValueStoragePlugin> plugins = iterator();
while (plugins.hasNext())
{
ValueStoragePlugin plugin = plugins.next();
List<ValuePluginFilter> filters = plugin.getFilters();
for (ValuePluginFilter filter : filters)
{
if (filter.match(property, valueOrderNumer))
{
return plugin.openIOChannel();
}
}
}
return null;
}
/**
* {@inheritDoc}
*/
public void checkConsistency(WorkspaceStorageConnection dataConnection)
{
Iterator<ValueStoragePlugin> plugins = iterator();
while (plugins.hasNext())
{
ValueStoragePlugin plugin = plugins.next();
plugin.checkConsistency(dataConnection);
}
}
/**
* {@inheritDoc}
*/
public ValueIOChannel getChannel(String storageId) throws IOException, ValueStorageNotFoundException
{
Iterator<ValueStoragePlugin> plugins = iterator();
while (plugins.hasNext())
{
ValueStoragePlugin plugin = plugins.next();
if (plugin.isSame(storageId))
{
return plugin.openIOChannel();
}
}
throw new ValueStorageNotFoundException("No value storage found with id " + storageId);
}
/**
* {@inheritDoc}
*/
public ValueStorageURLConnection createURLConnection(String storageId, URL url) throws ValueStorageNotFoundException, IOException
{
Iterator<ValueStoragePlugin> plugins = iterator();
while (plugins.hasNext())
{
ValueStoragePlugin plugin = plugins.next();
if (plugin.isSame(storageId))
{
return plugin.createURLConnection(url);
}
}
throw new ValueStorageNotFoundException("No value storage found with id " + storageId);
}
}