/*
* JBoss, Home of Professional Open Source.
*
* See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing.
*
* See the AUTHORS.txt file distributed with this work for a full listing of individual contributors.
*/
package org.teiid.designer.vdb.ui.util;
import static org.teiid.designer.metamodels.relational.extension.RestModelExtensionConstants.NAMESPACE_PROVIDER;
import java.util.Collection;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.IPath;
import org.eclipse.emf.ecore.EObject;
import org.teiid.core.designer.util.CoreStringUtil;
import org.teiid.designer.core.ModelerCore;
import org.teiid.designer.core.metamodel.aspect.sql.SqlAspectHelper;
import org.teiid.designer.core.workspace.ModelObjectAnnotationHelper;
import org.teiid.designer.core.workspace.ModelResource;
import org.teiid.designer.extension.ExtensionPlugin;
import org.teiid.designer.extension.definition.ModelObjectExtensionAssistant;
import org.teiid.designer.metamodels.relational.Procedure;
import org.teiid.designer.metamodels.relational.extension.RestModelExtensionConstants;
import org.teiid.designer.ui.viewsupport.ModelIdentifier;
import org.teiid.designer.vdb.Vdb;
import org.teiid.designer.vdb.VdbEntry;
import org.teiid.designer.vdb.VdbModelEntry;
import org.teiid.designer.vdb.XmiVdb;
/**
* Validation for REST based VDB
*
* @since 8.5
*/
public class RestVdbUtil {
public static final String VDB_EXTENSION = "vdb"; //$NON-NLS-1$
private static final ModelObjectAnnotationHelper ANNOTATION_HELPER = new ModelObjectAnnotationHelper();
/**
* @param vdbFile
* @return is the given file a rest war vdb
* @throws Exception
*/
public static boolean isRestWarVdb(IFile vdbFile) throws Exception {
if (! isVdb(vdbFile))
return false;
boolean result = false;
try {
Vdb vdb = new XmiVdb(vdbFile);
Set<VdbModelEntry> modelEntrySet = vdb.getModelEntries();
for (VdbEntry vdbModelEntry : modelEntrySet) {
final ModelResource modelResource = ModelerCore.getModelWorkspace().findModelResource(vdbModelEntry.getPath());
if (! ModelIdentifier.isVirtualModelType(modelResource))
continue;
result = hasRestProcedures(modelResource);
if (result) {
break;
}
}
} catch (Exception ex) {
new RuntimeException(ex);
}
return result;
}
/**
* @param result
* @param obj
* @return
*/
private static boolean isVdb(Object obj) {
if (obj == null)
return false;
if (! (obj instanceof IFile))
return false;
return VDB_EXTENSION.equals(((IFile) obj).getFileExtension());
}
/**
* @param eObjectList
* @return boolean true if model contains a REST procedure
*/
private static boolean hasRestProcedures(ModelResource modelResource) throws Exception {
Collection<EObject> eObjectList = modelResource.getEObjects();
boolean result = false;
for (EObject eObject : eObjectList) {
if (SqlAspectHelper.isProcedure(eObject)) {
IPath path = ModelerCore.getModelEditor().getModelRelativePathIncludingModel(eObject);
final StringBuffer sb = new StringBuffer();
final String[] segments = path.segments();
for (int i = 0; i < segments.length; i++) {
if (i != 0) {
sb.append('.');
}
final String segment = segments[i];
sb.append(segment);
Procedure procedure = (Procedure)eObject;
String restMethod = getRestMethod(procedure);
String uri = null;
if (restMethod != null) {
uri = getUri(procedure);
}
if (uri != null && restMethod != null){
result = true;
break;
}
}
}
}
return result;
}
/**
* @param procedure the procedure
* @return String uri value
*/
public static String getUri( Procedure procedure ) {
String uri = null;
try {
// try new way first
ModelObjectExtensionAssistant assistant = (ModelObjectExtensionAssistant)ExtensionPlugin.getInstance()
.getRegistry()
.getModelExtensionAssistant(NAMESPACE_PROVIDER.getNamespacePrefix());
uri = assistant.getPropertyValue(procedure, RestModelExtensionConstants.PropertyIds.URI);
if (CoreStringUtil.isEmpty(uri)) {
uri = (String)ANNOTATION_HELPER.getPropertyValueAnyCase(procedure,
ModelObjectAnnotationHelper.EXTENDED_PROPERTY_NAMESPACE
+ "URI"); //$NON-NLS-1$
}
} catch (Exception e) {
ModelerCore.Util.log(e);
}
return uri;
}
/**
* @param procedure the procedure
* @return String rest method
*/
public static String getRestMethod( Procedure procedure ) {
String restMethod = null;
try {
// try new way first
ModelObjectExtensionAssistant assistant = (ModelObjectExtensionAssistant)ExtensionPlugin.getInstance()
.getRegistry()
.getModelExtensionAssistant(NAMESPACE_PROVIDER.getNamespacePrefix());
restMethod = assistant.getPropertyValue(procedure, RestModelExtensionConstants.PropertyIds.REST_METHOD);
if (CoreStringUtil.isEmpty(restMethod.trim())) {
// try old way
restMethod = (String)ANNOTATION_HELPER.getPropertyValueAnyCase(procedure,
ModelObjectAnnotationHelper.EXTENDED_PROPERTY_NAMESPACE
+ "REST-METHOD"); //$NON-NLS-1$
}
} catch (Exception e) {
ModelerCore.Util.log(e);
}
return restMethod;
}
}