/**
* The Abiquo Platform
* Cloud management application for hybrid clouds
* Copyright (C) 2008 - Abiquo Holdings S.L.
*
* This application 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 under
* version 3 of the License
*
* 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 v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
package com.abiquo.ssm.plugin;
import java.lang.reflect.Method;
import com.abiquo.ssm.exception.InvalidPluginException;
import com.abiquo.ssm.model.metadata.StoragePluginMetadata;
import com.abiquo.ssm.plugin.annotations.Plugin;
import com.abiquo.ssm.plugin.annotations.Provides;
import com.abiquo.ssm.plugin.annotations.UnsupportedOp;
/**
* Base class for all storage plugins.
*
* @author Ignasi Barrera
*/
public abstract class AbstractStoragePlugin implements StoragePlugin
{
@Override
public StoragePluginMetadata getPluginMetadata()
{
if (!this.getClass().isAnnotationPresent(Plugin.class))
{
throw new InvalidPluginException("Missing @Plugin annotation in "
+ this.getClass().getName());
}
Plugin pluginInfo = this.getClass().getAnnotation(Plugin.class);
if (pluginInfo.type() == null)
{
throw new InvalidPluginException("Plugin type can not be null in "
+ this.getClass().getName());
}
StoragePluginMetadata metadata = new StoragePluginMetadata();
metadata.setDefaultServicePort(pluginInfo.defaultServicePort());
metadata.setDefaultManagementPort(pluginInfo.defaultManagementPort());
metadata.setRequiresAuthentication(pluginInfo.requiresAuthentication());
metadata.setType(pluginInfo.type());
try
{
Method[] methods = StoragePlugin.class.getMethods();
for (Method methodDefinition : methods)
{
if (methodDefinition.isAnnotationPresent(Provides.class))
{
Method implMethod =
this.getClass().getMethod(methodDefinition.getName(),
methodDefinition.getParameterTypes());
if (!implMethod.isAnnotationPresent(UnsupportedOp.class))
{
Provides provides = methodDefinition.getAnnotation(Provides.class);
metadata.getSupportedOperations().add(provides.value());
}
}
}
}
catch (Exception ex)
{
throw new InvalidPluginException("Could not get the list of supported operations for plugin: "
+ this.getClass().getName());
}
return metadata;
}
}