/**
*
* 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.airavata.registry.core.app.catalog.impl;
import org.apache.airavata.model.appcatalog.appdeployment.ApplicationModule;
import org.apache.airavata.model.appcatalog.appinterface.ApplicationInterfaceDescription;
import org.apache.airavata.model.appcatalog.appinterface.application_interface_modelConstants;
import org.apache.airavata.model.application.io.InputDataObjectType;
import org.apache.airavata.model.application.io.OutputDataObjectType;
import org.apache.airavata.registry.core.app.catalog.resources.*;
import org.apache.airavata.registry.core.app.catalog.util.AppCatalogThriftConversion;
import org.apache.airavata.registry.core.app.catalog.util.AppCatalogUtils;
import org.apache.airavata.registry.cpi.AppCatalogException;
import org.apache.airavata.registry.cpi.ApplicationInterface;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ApplicationInterfaceImpl implements ApplicationInterface {
private final static Logger logger = LoggerFactory.getLogger(ApplicationInterfaceImpl.class);
@Override
public String addApplicationModule(ApplicationModule applicationModule, String gatewayId) throws AppCatalogException {
try {
AppModuleResource moduleResource = new AppModuleResource();
moduleResource.setModuleName(applicationModule.getAppModuleName());
moduleResource.setGatewayId(gatewayId);
if (!applicationModule.getAppModuleId().equals("") && !applicationModule.getAppModuleId().equals(application_interface_modelConstants.DEFAULT_ID)){
moduleResource.setModuleId(applicationModule.getAppModuleId());
}else {
moduleResource.setModuleId(AppCatalogUtils.getID(applicationModule.getAppModuleName()));
}
moduleResource.setModuleDesc(applicationModule.getAppModuleDescription());
moduleResource.setModuleVersion(applicationModule.getAppModuleVersion());
moduleResource.save();
applicationModule.setAppModuleId(moduleResource.getModuleId());
return moduleResource.getModuleId();
}catch (Exception e) {
logger.error("Error while adding application module "+applicationModule.getAppModuleName()+" ["+applicationModule.getAppModuleVersion()+"]", e);
throw new AppCatalogException(e);
}
}
@Override
public String addApplicationInterface(ApplicationInterfaceDescription applicationInterfaceDescription, String gatewayId) throws AppCatalogException {
try {
AppInterfaceResource resource = new AppInterfaceResource();
resource.setAppName(applicationInterfaceDescription.getApplicationName());
if (!applicationInterfaceDescription.getApplicationInterfaceId().equals("") && !applicationInterfaceDescription.getApplicationInterfaceId().equals(application_interface_modelConstants.DEFAULT_ID)){
resource.setInterfaceId(applicationInterfaceDescription.getApplicationInterfaceId());
}else {
resource.setInterfaceId(AppCatalogUtils.getID(applicationInterfaceDescription.getApplicationName()));
}
resource.setAppDescription(applicationInterfaceDescription.getApplicationDescription());
resource.setGatewayId(gatewayId);
resource.setArchiveWorkingDirectory(applicationInterfaceDescription.isArchiveWorkingDirectory());
resource.setHasOptionalFileInputs(applicationInterfaceDescription.isHasOptionalFileInputs());
resource.save();
applicationInterfaceDescription.setApplicationInterfaceId(resource.getInterfaceId());
List<String> applicationModules = applicationInterfaceDescription.getApplicationModules();
if (applicationModules != null && !applicationModules.isEmpty()){
for (String moduleId : applicationModules){
AppModuleResource appModuleResource = new AppModuleResource();
AppModuleMappingAppCatalogResourceAppCat moduleMappingResource = new AppModuleMappingAppCatalogResourceAppCat();
moduleMappingResource.setInterfaceId(resource.getInterfaceId());
moduleMappingResource.setModuleId(moduleId);
moduleMappingResource.setModuleResource((AppModuleResource)appModuleResource.get(moduleId));
moduleMappingResource.setAppInterfaceResource(resource);
moduleMappingResource.save();
}
}
List<InputDataObjectType> applicationInputs = applicationInterfaceDescription.getApplicationInputs();
if (applicationInputs != null && !applicationInputs.isEmpty()){
for (InputDataObjectType input : applicationInputs){
ApplicationInputResource inputResource = new ApplicationInputResource();
inputResource.setAppInterfaceResource(resource);
inputResource.setInterfaceID(resource.getInterfaceId());
inputResource.setUserFriendlyDesc(input.getUserFriendlyDescription());
inputResource.setInputKey(input.getName());
inputResource.setInputVal(input.getValue());
inputResource.setDataType(input.getType().toString());
inputResource.setMetadata(input.getMetaData());
inputResource.setStandardInput(input.isStandardInput());
inputResource.setAppArgument(input.getApplicationArgument());
inputResource.setInputOrder(input.getInputOrder());
inputResource.setRequired(input.isIsRequired());
inputResource.setRequiredToCMD(input.isRequiredToAddedToCommandLine());
inputResource.save();
}
}
List<OutputDataObjectType> applicationOutputs = applicationInterfaceDescription.getApplicationOutputs();
if (applicationOutputs != null && !applicationOutputs.isEmpty()) {
for (OutputDataObjectType output : applicationOutputs) {
ApplicationOutputResource outputResource = new ApplicationOutputResource();
outputResource.setInterfaceID(resource.getInterfaceId());
outputResource.setAppInterfaceResource(resource);
outputResource.setOutputKey(output.getName());
outputResource.setOutputVal(output.getValue());
outputResource.setDataType(output.getType().toString());
outputResource.setRequired(output.isIsRequired());
outputResource.setRequiredToCMD(output.isRequiredToAddedToCommandLine());
outputResource.setDataMovement(output.isDataMovement());
outputResource.setDataNameLocation(output.getLocation());
outputResource.setAppArgument(output.getApplicationArgument());
outputResource.setSearchQuery(output.getSearchQuery());
outputResource.setOutputStreaming(output.isOutputStreaming());
outputResource.save();
}
}
return resource.getInterfaceId();
}catch (Exception e) {
logger.error("Error while adding application interface "+applicationInterfaceDescription.getApplicationName(), e);
throw new AppCatalogException(e);
}
}
@Override
public void addApplicationModuleMapping(String moduleId, String interfaceId) throws AppCatalogException {
try {
AppModuleResource appModuleResource = new AppModuleResource();
AppInterfaceResource interfaceResource = new AppInterfaceResource();
AppModuleMappingAppCatalogResourceAppCat moduleMappingResource = new AppModuleMappingAppCatalogResourceAppCat();
moduleMappingResource.setInterfaceId(interfaceId);
moduleMappingResource.setModuleId(moduleId);
moduleMappingResource.setModuleResource((AppModuleResource)appModuleResource.get(moduleId));
moduleMappingResource.setAppInterfaceResource((AppInterfaceResource)interfaceResource.get(interfaceId));
moduleMappingResource.save();
}catch (Exception e) {
logger.error("Error while saving application module mapping "+moduleId, e);
throw new AppCatalogException(e);
}
}
@Override
public void updateApplicationModule(String moduleId, ApplicationModule updatedModule) throws AppCatalogException {
try {
AppModuleResource moduleResource = new AppModuleResource();
AppModuleResource existingModule = (AppModuleResource)moduleResource.get(moduleId);
existingModule.setModuleName(updatedModule.getAppModuleName());
existingModule.setModuleDesc(updatedModule.getAppModuleDescription());
existingModule.setModuleVersion(updatedModule.getAppModuleVersion());
existingModule.save();
}catch (Exception e) {
logger.error("Error while updating application module "+moduleId, e);
throw new AppCatalogException(e);
}
}
@Override
public void updateApplicationInterface(String interfaceId, ApplicationInterfaceDescription updatedInterface) throws AppCatalogException {
try {
AppInterfaceResource resource = new AppInterfaceResource();
AppInterfaceResource existingInterface = (AppInterfaceResource) resource.get(interfaceId);
existingInterface.setAppName(updatedInterface.getApplicationName());
existingInterface.setAppDescription(updatedInterface.getApplicationDescription());
existingInterface.setHasOptionalFileInputs(updatedInterface.isHasOptionalFileInputs());
existingInterface.setArchiveWorkingDirectory(updatedInterface.isArchiveWorkingDirectory());
existingInterface.save();
// remove existing modules before adding
Map<String, String> ids = new HashMap<String, String>();
ids.put(AppCatAbstractResource.AppModuleMappingConstants.INTERFACE_ID, interfaceId);
AppModuleMappingAppCatalogResourceAppCat moduleMappingResource = new AppModuleMappingAppCatalogResourceAppCat();
moduleMappingResource.remove(ids);
List<String> applicationModules = updatedInterface.getApplicationModules();
if (applicationModules != null && !applicationModules.isEmpty()) {
for (String moduleId : applicationModules) {
AppModuleResource appModuleResource = new AppModuleResource();
moduleMappingResource = new AppModuleMappingAppCatalogResourceAppCat();
ids = new HashMap<String, String>();
ids.put(AppCatAbstractResource.AppModuleMappingConstants.MODULE_ID, moduleId);
ids.put(AppCatAbstractResource.AppModuleMappingConstants.INTERFACE_ID, interfaceId);
AppModuleMappingAppCatalogResourceAppCat existingMapping;
if (!moduleMappingResource.isExists(ids)) {
existingMapping = new AppModuleMappingAppCatalogResourceAppCat();
} else {
existingMapping = (AppModuleMappingAppCatalogResourceAppCat) moduleMappingResource.get(ids);
}
existingMapping.setInterfaceId(interfaceId);
existingMapping.setModuleId(moduleId);
existingMapping.setModuleResource((AppModuleResource) appModuleResource.get(moduleId));
existingMapping.setAppInterfaceResource(existingInterface);
existingMapping.save();
}
}
// remove existing application inputs
ApplicationInputResource inputResource = new ApplicationInputResource();
ids = new HashMap<String, String>();
ids.put(AppCatAbstractResource.AppInputConstants.INTERFACE_ID, interfaceId);
inputResource.remove(ids);
List<InputDataObjectType> applicationInputs = updatedInterface.getApplicationInputs();
if (applicationInputs != null && !applicationInputs.isEmpty()) {
for (InputDataObjectType input : applicationInputs) {
inputResource = new ApplicationInputResource();
ids = new HashMap<String, String>();
ids.put(AppCatAbstractResource.AppInputConstants.INTERFACE_ID, interfaceId);
ids.put(AppCatAbstractResource.AppInputConstants.INPUT_KEY, input.getName());
if (inputResource.isExists(ids)) {
inputResource = (ApplicationInputResource) inputResource.get(ids);
}
inputResource.setAppInterfaceResource(existingInterface);
inputResource.setInterfaceID(interfaceId);
inputResource.setUserFriendlyDesc(input.getUserFriendlyDescription());
inputResource.setInputKey(input.getName());
inputResource.setInputVal(input.getValue());
inputResource.setDataType(input.getType().toString());
inputResource.setMetadata(input.getMetaData());
inputResource.setStandardInput(input.isStandardInput());
inputResource.setAppArgument(input.getApplicationArgument());
inputResource.setInputOrder(input.getInputOrder());
inputResource.setRequired(input.isIsRequired());
inputResource.setRequiredToCMD(input.isRequiredToAddedToCommandLine());
inputResource.setDataStaged(input.isDataStaged());
inputResource.setIsReadOnly(input.isIsReadOnly());
inputResource.save();
}
}
// remove existing app outputs before adding
ApplicationOutputResource outputResource = new ApplicationOutputResource();
ids = new HashMap<String, String>();
ids.put(AppCatAbstractResource.AppOutputConstants.INTERFACE_ID, interfaceId);
outputResource.remove(ids);
List<OutputDataObjectType> applicationOutputs = updatedInterface.getApplicationOutputs();
if (applicationOutputs != null && !applicationOutputs.isEmpty()) {
for (OutputDataObjectType output : applicationOutputs) {
outputResource = new ApplicationOutputResource();
ids = new HashMap<String, String>();
ids.put(AppCatAbstractResource.AppOutputConstants.INTERFACE_ID, interfaceId);
ids.put(AppCatAbstractResource.AppOutputConstants.OUTPUT_KEY, output.getName());
if (outputResource.isExists(ids)) {
outputResource = (ApplicationOutputResource) outputResource.get(ids);
}
outputResource.setInterfaceID(interfaceId);
outputResource.setAppInterfaceResource(existingInterface);
outputResource.setOutputKey(output.getName());
outputResource.setOutputVal(output.getValue());
outputResource.setDataType(output.getType().toString());
outputResource.setRequired(output.isIsRequired());
outputResource.setRequiredToCMD(output.isRequiredToAddedToCommandLine());
outputResource.setDataMovement(output.isDataMovement());
outputResource.setDataNameLocation(output.getLocation());
outputResource.setAppArgument(output.getApplicationArgument());
outputResource.setSearchQuery(output.getSearchQuery());
outputResource.setOutputStreaming(output.isOutputStreaming());
outputResource.save();
}
}
} catch (Exception e) {
logger.error("Error while updating application interface " + interfaceId, e);
throw new AppCatalogException(e);
}
}
@Override
public ApplicationModule getApplicationModule(String moduleId) throws AppCatalogException {
try {
AppModuleResource appModuleResource = new AppModuleResource();
return AppCatalogThriftConversion.getApplicationModuleDesc((AppModuleResource) appModuleResource.get(moduleId));
}catch (Exception e) {
logger.error("Error while retrieving application module "+moduleId, e);
throw new AppCatalogException(e);
}
}
@Override
public ApplicationInterfaceDescription getApplicationInterface(String interfaceId) throws AppCatalogException {
try {
AppInterfaceResource interfaceResource = new AppInterfaceResource();
return AppCatalogThriftConversion.getApplicationInterfaceDescription((AppInterfaceResource)interfaceResource.get(interfaceId));
}catch (Exception e) {
logger.error("Error while retrieving application interface '"+interfaceId, e);
throw new AppCatalogException(e);
}
}
@Override
public List<ApplicationModule> getApplicationModules(Map<String, String> filters) throws AppCatalogException {
List<ApplicationModule> modules = new ArrayList<ApplicationModule>();
try {
AppModuleResource resource = new AppModuleResource();
for (String fieldName : filters.keySet() ){
if (fieldName.equals(AppCatAbstractResource.ApplicationModuleConstants.MODULE_NAME)){
List<AppCatalogResource> resources = resource.get(AppCatAbstractResource.ApplicationModuleConstants.MODULE_NAME, filters.get(fieldName));
if (resources != null && !resources.isEmpty()){
modules = AppCatalogThriftConversion.getAppModules(resources);
}
}else {
logger.error("Unsupported field name for app module.", new IllegalArgumentException());
throw new IllegalArgumentException("Unsupported field name for app module.");
}
}
}catch (Exception e){
logger.error("Error while retrieving app module list...", e);
throw new AppCatalogException(e);
}
return modules;
}
@Override
public List<ApplicationModule> getAllApplicationModules(String gatewayId) throws AppCatalogException {
List<ApplicationModule> applicationModules = new ArrayList<ApplicationModule>();
try {
AppModuleResource resource = new AppModuleResource();
resource.setGatewayId(gatewayId);
List<AppCatalogResource> resources = resource.getAll();
if (resources != null && !resources.isEmpty()){
applicationModules = AppCatalogThriftConversion.getAppModules(resources);
}
}catch (Exception e){
logger.error("Error while retrieving compute resource list...", e);
throw new AppCatalogException(e);
}
return applicationModules;
}
@Override
public List<ApplicationInterfaceDescription> getApplicationInterfaces(Map<String, String> filters) throws AppCatalogException {
List<ApplicationInterfaceDescription> appInterfaces = new ArrayList<ApplicationInterfaceDescription>();
try {
AppInterfaceResource resource = new AppInterfaceResource();
for (String fieldName : filters.keySet() ){
if (fieldName.equals(AppCatAbstractResource.ApplicationInterfaceConstants.APPLICATION_NAME)){
List<AppCatalogResource> resources = resource.get(AppCatAbstractResource.ApplicationInterfaceConstants.APPLICATION_NAME, filters.get(fieldName));
appInterfaces = AppCatalogThriftConversion.getAppInterfaceDescList(resources);
}else {
logger.error("Unsupported field name for app interface.", new IllegalArgumentException());
throw new IllegalArgumentException("Unsupported field name '"+fieldName+"' for app interface.");
}
}
}catch (Exception e){
logger.error("Error while retrieving app interface list...", e);
throw new AppCatalogException(e);
}
return appInterfaces;
}
@Override
public List<ApplicationInterfaceDescription> getAllApplicationInterfaces(String gatewayId) throws AppCatalogException {
try {
AppInterfaceResource resource = new AppInterfaceResource();
resource.setGatewayId(gatewayId);
List<AppCatalogResource> resources = resource.getAll();
return AppCatalogThriftConversion.getAppInterfaceDescList(resources);
}catch (Exception e){
logger.error("Error while retrieving app interface list...", e);
throw new AppCatalogException(e);
}
}
@Override
public List<String> getAllApplicationInterfaceIds() throws AppCatalogException {
try {
AppInterfaceResource resource = new AppInterfaceResource();
return resource.getAllIds();
}catch (Exception e){
logger.error("Error while retrieving app interface list...", e);
throw new AppCatalogException(e);
}
}
@Override
public boolean removeApplicationInterface(String interfaceId) throws AppCatalogException {
try {
AppInterfaceResource resource = new AppInterfaceResource();
resource.remove(interfaceId);
return true;
}catch (Exception e){
logger.error("Error while removing app interface "+interfaceId, e);
throw new AppCatalogException(e);
}
}
@Override
public boolean removeApplicationModule(String moduleId) throws AppCatalogException {
try {
AppModuleResource resource = new AppModuleResource();
resource.remove(moduleId);
return true;
}catch (Exception e){
logger.error("Error while removing app module "+moduleId, e);
throw new AppCatalogException(e);
}
}
@Override
public boolean isApplicationInterfaceExists(String interfaceId) throws AppCatalogException {
try {
AppInterfaceResource resource = new AppInterfaceResource();
return resource.isExists(interfaceId);
}catch (Exception e){
logger.error("Error while checking app interface existence "+interfaceId, e);
throw new AppCatalogException(e);
}
}
@Override
public boolean isApplicationModuleExists(String moduleId) throws AppCatalogException {
try {
AppModuleResource resource = new AppModuleResource();
return resource.isExists(moduleId);
}catch (Exception e){
logger.error("Error while checking app module existence "+moduleId, e);
throw new AppCatalogException(e);
}
}
@Override
public List<InputDataObjectType> getApplicationInputs(String interfaceId) throws AppCatalogException {
try {
ApplicationInputResource resource = new ApplicationInputResource();
List<AppCatalogResource> resources = resource.get(AppCatAbstractResource.AppInputConstants.INTERFACE_ID, interfaceId);
return AppCatalogThriftConversion.getAppInputs(resources);
}catch (Exception e){
logger.error("Error while retrieving app inputs for application "+interfaceId, e);
throw new AppCatalogException(e);
}
}
@Override
public List<OutputDataObjectType> getApplicationOutputs(String interfaceId) throws AppCatalogException {
try {
ApplicationOutputResource resource = new ApplicationOutputResource();
List<AppCatalogResource> resources = resource.get(AppCatAbstractResource.AppOutputConstants.INTERFACE_ID, interfaceId);
return AppCatalogThriftConversion.getAppOutputs(resources);
}catch (Exception e){
logger.error("Error while retrieving app outputs for application "+interfaceId, e);
throw new AppCatalogException(e);
}
}
}