improve metadataservice

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/jenkins.build.config.xml b/jenkins.build.config.xml
index 61f739b..67f9d51 100644
--- a/jenkins.build.config.xml
+++ b/jenkins.build.config.xml
@@ -42,7 +42,6 @@
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.report</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.signal</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.statemachine</jenkins.build.dependency>
-                <jenkins.build.dependency>org.eclipse.osbp.xtext.strategy</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.table</jenkins.build.dependency>
                 <jenkins.build.dependency>org.eclipse.osbp.xtext.topology</jenkins.build.dependency>
         </jenkins.build.dependencies>
diff --git a/org.eclipse.osbp.dsl.metadata.service.feature/feature.xml b/org.eclipse.osbp.dsl.metadata.service.feature/feature.xml
index 12c2839..5a4f6be 100644
--- a/org.eclipse.osbp.dsl.metadata.service.feature/feature.xml
+++ b/org.eclipse.osbp.dsl.metadata.service.feature/feature.xml
@@ -17,7 +17,7 @@
         label="%featureName"
         version="0.9.0.qualifier"
         provider-name="%providerName"
-		plugin="org.eclipse.osbp.dsl.metadata.service">
+		plugin="org.eclipse.osbp.license">
         
     <description>
         %description
diff --git a/org.eclipse.osbp.dsl.metadata.service/META-INF/MANIFEST.MF b/org.eclipse.osbp.dsl.metadata.service/META-INF/MANIFEST.MF
index 5fe8fba..5073672 100644
--- a/org.eclipse.osbp.dsl.metadata.service/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.dsl.metadata.service/META-INF/MANIFEST.MF
@@ -43,7 +43,6 @@
  org.eclipse.osbp.xtext.cubedsl;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.topologydsl;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.entitymock;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.xtext.strategy;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.dialogdsl;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.perspective;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.blip;bundle-version="[0.9.0,0.10.0)",
@@ -51,7 +50,8 @@
  org.eclipse.osbp.xtext.statemachine;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.menu;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.xtext.signal;bundle-version="[0.9.0,0.10.0)",
- org.eclipse.osbp.preferences;bundle-version="0.9.0"
+ org.eclipse.osbp.preferences;bundle-version="0.9.0",
+ org.eclipse.osbp.dsl.datatype.lib
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Import-Package: javax.validation.constraints,
diff --git a/org.eclipse.osbp.dsl.metadata.service/build.properties b/org.eclipse.osbp.dsl.metadata.service/build.properties
index 3289c0e..a0f474b 100644
--- a/org.eclipse.osbp.dsl.metadata.service/build.properties
+++ b/org.eclipse.osbp.dsl.metadata.service/build.properties
@@ -1,9 +1,12 @@
 source.. = src/
-output.. = bin/
-bin.includes = about.properties,  about.mappings,  about.ini,  about.html,  META-INF/,\
+bin.includes = about.properties,\
+               about.mappings,\
+               about.ini,\
+               about.html,\
+               META-INF/,\
                .,\
                epl-2.0.html,\
                license.html,\
-               OSGI-INF/org.eclipse.osbp.dsl.metadata.service.DSLBuilderParticipant.xml
+               OSGI-INF/
 src.includes = about.properties,  about.mappings,  about.ini,  about.html,  epl-2.0.html,\
                license.html
diff --git a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
index d0bd2bb..1f43803 100644
--- a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
+++ b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
@@ -25,6 +25,7 @@
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -41,20 +42,28 @@
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.osbp.dsl.common.datatypes.IDto;
 import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage;
 import org.eclipse.osbp.dsl.semantic.dto.LDto;
 import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.xtext.types.bundles.BundleSpaceTypeProvider;
+import org.eclipse.osbp.ecview.dsl.extensions.SuperTypeCollector;
+import org.eclipse.osbp.ecview.semantic.uimodel.UiBeanSlot;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiIDEView;
 import org.eclipse.osbp.ecview.semantic.uimodel.UiModelPackage;
 import org.eclipse.osbp.preferences.ProductConfiguration;
 import org.eclipse.osbp.runtime.common.extender.IExtenderConstants;
 import org.eclipse.osbp.ui.api.metadata.IDSLMetadataService;
 import org.eclipse.osbp.ui.api.perspective.IPerspectiveProvider;
+import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.Action;
+import org.eclipse.osbp.ui.api.useraccess.AbstractAuthorization.Group;
+import org.eclipse.osbp.ui.api.useraccess.IUserAccessService;
 import org.eclipse.osbp.xtext.action.ActionPackage;
 import org.eclipse.osbp.xtext.action.ActionToolbar;
 import org.eclipse.osbp.xtext.authorizationdsl.AuthorizationPackage;
 import org.eclipse.osbp.xtext.authorizationdsl.Role;
+import org.eclipse.osbp.xtext.blip.Blip;
+import org.eclipse.osbp.xtext.blip.BlipPackage;
 import org.eclipse.osbp.xtext.builder.metadata.services.AbstractBuilderParticipant;
 import org.eclipse.osbp.xtext.builder.metadata.services.IBuilderParticipant;
 import org.eclipse.osbp.xtext.builder.metadata.services.IMetadataBuilderService;
@@ -62,11 +71,19 @@
 import org.eclipse.osbp.xtext.chart.Chart;
 import org.eclipse.osbp.xtext.chart.ChartDSLPackage;
 import org.eclipse.osbp.xtext.chart.ChartPackage;
+import org.eclipse.osbp.xtext.cubedsl.CubeDimensionUsage;
+import org.eclipse.osbp.xtext.cubedsl.CubeHierarchy;
+import org.eclipse.osbp.xtext.cubedsl.CubeType;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchange;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage;
+import org.eclipse.osbp.xtext.datamartdsl.DatamartCube;
 import org.eclipse.osbp.xtext.datamartdsl.DatamartDSLPackage;
 import org.eclipse.osbp.xtext.datamartdsl.DatamartDefinition;
 import org.eclipse.osbp.xtext.datamartdsl.DatamartEntity;
 import org.eclipse.osbp.xtext.datamartdsl.DatamartPackage;
+import org.eclipse.osbp.xtext.datamartdsl.DatamartTask;
 import org.eclipse.osbp.xtext.dialogdsl.Dialog;
 import org.eclipse.osbp.xtext.dialogdsl.DialogDSLPackage;
 import org.eclipse.osbp.xtext.dialogdsl.DialogPackage;
@@ -76,12 +93,41 @@
 import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryDialogHook;
 import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryPackage;
 import org.eclipse.osbp.xtext.i18n.I18NKeyGenerator;
+import org.eclipse.osbp.xtext.menu.MenuCategory;
+import org.eclipse.osbp.xtext.menu.MenuDslPackage;
+import org.eclipse.osbp.xtext.menu.MenuEntry;
+import org.eclipse.osbp.xtext.menu.MenuTree;
 import org.eclipse.osbp.xtext.organizationdsl.Organization;
 import org.eclipse.osbp.xtext.perspective.Perspective;
+import org.eclipse.osbp.xtext.perspective.PerspectiveBPMN;
+import org.eclipse.osbp.xtext.perspective.PerspectiveBrowser;
+import org.eclipse.osbp.xtext.perspective.PerspectiveChart;
+import org.eclipse.osbp.xtext.perspective.PerspectiveDashboard;
+import org.eclipse.osbp.xtext.perspective.PerspectiveDataInterchange;
+import org.eclipse.osbp.xtext.perspective.PerspectiveDialog;
 import org.eclipse.osbp.xtext.perspective.PerspectiveDslPackage;
+import org.eclipse.osbp.xtext.perspective.PerspectiveElement;
+import org.eclipse.osbp.xtext.perspective.PerspectiveGrid;
+import org.eclipse.osbp.xtext.perspective.PerspectiveKanban;
+import org.eclipse.osbp.xtext.perspective.PerspectiveOrganization;
 import org.eclipse.osbp.xtext.perspective.PerspectivePackage;
+import org.eclipse.osbp.xtext.perspective.PerspectivePart;
+import org.eclipse.osbp.xtext.perspective.PerspectivePartStack;
+import org.eclipse.osbp.xtext.perspective.PerspectiveReport;
+import org.eclipse.osbp.xtext.perspective.PerspectiveSashContainer;
+import org.eclipse.osbp.xtext.perspective.PerspectiveSaiku;
+import org.eclipse.osbp.xtext.perspective.PerspectiveSearch;
+import org.eclipse.osbp.xtext.perspective.PerspectiveSelection;
+import org.eclipse.osbp.xtext.perspective.PerspectiveTable;
+import org.eclipse.osbp.xtext.perspective.PerspectiveTitle;
+import org.eclipse.osbp.xtext.perspective.PerspectiveTopology;
+import org.eclipse.osbp.xtext.perspective.PerspectiveView;
+import org.eclipse.osbp.xtext.perspective.PerspectiveWelcome;
+import org.eclipse.osbp.xtext.reportdsl.DatamartContainer;
+import org.eclipse.osbp.xtext.reportdsl.Element;
 import org.eclipse.osbp.xtext.reportdsl.Report;
 import org.eclipse.osbp.xtext.reportdsl.ReportDSLPackage;
+import org.eclipse.osbp.xtext.reportdsl.ReportDesignTemplate;
 import org.eclipse.osbp.xtext.reportdsl.ReportPackage;
 import org.eclipse.osbp.xtext.signal.SignalDSLPackage;
 import org.eclipse.osbp.xtext.signal.SignalDefinition;
@@ -91,6 +137,7 @@
 import org.eclipse.osbp.xtext.table.TableDSLPackage;
 import org.eclipse.osbp.xtext.table.TableGrid;
 import org.eclipse.osbp.xtext.table.TablePackage;
+import org.eclipse.osbp.xtext.table.TableTable;
 import org.eclipse.osbp.xtext.topologydsl.Topology;
 import org.eclipse.osbp.xtext.topologydsl.TopologyDSLPackage;
 import org.eclipse.osbp.xtext.topologydsl.TopologyPackage;
@@ -100,6 +147,7 @@
 import org.eclipse.persistence.jpa.Archive;
 import org.eclipse.persistence.jpa.PersistenceProvider;
 import org.eclipse.xtext.common.types.JvmDeclaredType;
+import org.eclipse.xtext.common.types.JvmTypeReference;
 import org.eclipse.xtext.resource.IEObjectDescription;
 import org.eclipse.xtext.util.Pair;
 import org.eclipse.xtext.util.Tuples;
@@ -979,6 +1027,251 @@
 			}
 			return null;
 		}
+
+		@Override
+		public boolean isMenuCategoryAuthorized(String fqn, IUserAccessService userAccessService) {
+			Map<String, Boolean> authorized = new HashMap<>();
+			MenuCategory category = (MenuCategory)getMetadata(fqn, MenuDslPackage.Literals.MENU_CATEGORY);
+			for(MenuTree tree:category.getTrees()) {
+				isMenuTreeAuthorized(tree, userAccessService, authorized);
+			}
+			return getAuthorization(authorized);
+		}
+		
+		@Override
+		public boolean isMenuTreeAuthorized(String fqn, IUserAccessService userAccessService) {
+			Map<String, Boolean> authorized = new HashMap<>();
+			MenuTree tree = (MenuTree)getMetadata(fqn, MenuDslPackage.Literals.MENU_TREE);
+			isMenuTreeAuthorized(tree, userAccessService, authorized);
+			return getAuthorization(authorized);
+		}
+
+		private void isMenuTreeAuthorized(MenuTree tree, IUserAccessService userAccessService,
+				Map<String, Boolean> authorized) {
+			for(MenuEntry entry:tree.getEntries()) {
+				if(entry.isHasPerspective() && entry.getPerspective() != null) {
+					for(PerspectiveElement element:entry.getPerspective().getElements()) {
+						traverseModel(element, userAccessService, authorized);
+					}
+				} else if(entry.isHasProcess() && entry.getProcess() != null) {
+					authorized.put(entry.getProcess().getName(), userAccessService.isGranted(Group.PROCESS, Action.STARTABLE, entry.getProcess().getName()));
+				}
+			}
+		}
+		
+		@Override
+		public boolean isPerspectiveAuthorized(String fqn, IUserAccessService userAccessService) {
+			Map<String, Boolean> authorized = new HashMap<>();
+			Perspective perspective = (Perspective)getMetadata(fqn, PerspectiveDslPackage.Literals.PERSPECTIVE);
+			for(PerspectiveElement element:perspective.getElements()) {
+				traverseModel(element, userAccessService, authorized);
+			}
+			return getAuthorization(authorized);
+		}
+		
+		@Override
+		public boolean isPerspectiveElementAuthorized(EObject modelElement, IUserAccessService userAccessService) {
+			Map<String, Boolean> authorized = new HashMap<>();
+			traverseModel((PerspectiveElement)modelElement, userAccessService, authorized);
+			return getAuthorization(authorized);
+		}
+		
+		private void traverseModel(PerspectiveElement modelElement, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if (modelElement instanceof PerspectivePart) {
+				PerspectiveView view = ((PerspectivePart)modelElement).getView(); 
+				if(view != null) {
+					isViewAuthorized(view, userAccessService, authorized);
+				}
+			} else {
+				for (PerspectiveElement element : modelElement.getElements()) {
+					traverseModel(element, userAccessService, authorized);
+				}
+			}
+		}
+		
+		private boolean getAuthorization(Map<String, Boolean> authorized) {
+			int vetoCount = 0;
+			for(Entry<String, Boolean> auth:authorized.entrySet()) {
+				if(!auth.getValue()) {
+					vetoCount ++;
+				}
+			}
+			return authorized.isEmpty() || vetoCount < authorized.size();
+		}
+		
+		private void isViewAuthorized(PerspectiveView view, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if(view instanceof PerspectiveSelection) {
+				isTableAuthorized(((PerspectiveSelection)view).getRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveTable) {
+				isTableAuthorized(((PerspectiveTable)view).getRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveGrid) {
+				isTableAuthorized(((PerspectiveGrid)view).getRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveChart) {
+				isChartAuthorized(((PerspectiveChart)view).getRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveReport) {
+				isReportAuthorized(((PerspectiveReport)view).getRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveDialog) {
+				isDialogAuthorized(((PerspectiveDialog)view).getRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveKanban) {
+				isDtoAuthorized(((PerspectiveKanban)view).getDtoRef(), userAccessService, authorized);
+				isDialogAuthorized(((PerspectiveKanban)view).getCardRef(), userAccessService, authorized);
+				isDialogAuthorized(((PerspectiveKanban)view).getDialogRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveSearch) {
+				isDtoAuthorized(((PerspectiveSearch)view).getDtoRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveDataInterchange) {
+				isDatainterchangeGroupAuthorized(((PerspectiveDataInterchange)view).getRef(), userAccessService, authorized);
+			} else if(view instanceof PerspectiveOrganization) {
+				authorized.put(view.toString(), true);
+			} else if(view instanceof PerspectiveTopology) {
+				authorized.put(view.toString(), true);
+			} else if(view instanceof PerspectiveBPMN) {
+				authorized.put(view.toString(), true);
+			} else if(view instanceof PerspectiveWelcome) {
+				authorized.put(view.toString(), true);
+			} else if(view instanceof PerspectiveTitle) {
+				authorized.put(view.toString(), true);
+			} else if(view instanceof PerspectiveDashboard) {
+				authorized.put(view.toString(), true);
+			} else if(view instanceof PerspectiveBrowser) {
+				authorized.put(view.toString(), true);
+			} else if(view instanceof PerspectiveSaiku) {
+				authorized.put(view.toString(), true);
+			} else {
+				throw new IllegalViewException("no such view class:"+view.toString());
+			}
+		}
+
+		private void isDatainterchangeGroupAuthorized(DataInterchangeGroup group, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			for(DataInterchange interchange:group.getDatInts()) {
+				for(DataInterchangeBean path:interchange.getPath()) {
+					isEntityAuthorized(path.getEntity(), userAccessService, authorized);
+				}
+			}
+		}
+
+		private void isReportAuthorized(Report report, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if(report != null) {
+				isDatamartAuthorized(report.getDatamartRef(), userAccessService, authorized);
+				if(report.getDesign() instanceof ReportDesignTemplate) {
+					if(((ReportDesignTemplate)report.getDesign()).getHeader() != null) {
+						for(Element element : ((ReportDesignTemplate)report.getDesign()).getHeader().getElements()) {
+							if(element instanceof DatamartContainer) {
+								isDatamartAuthorized(((DatamartContainer)element).getDatamartRef(), userAccessService, authorized);
+							}
+						}
+					}
+					if(((ReportDesignTemplate)report.getDesign()).getDetail() != null) {
+						for(Element element : ((ReportDesignTemplate)report.getDesign()).getDetail().getElements()) {
+							if(element instanceof DatamartContainer) {
+								isDatamartAuthorized(((DatamartContainer)element).getDatamartRef(), userAccessService, authorized);
+							}
+						}
+					}
+					if(((ReportDesignTemplate)report.getDesign()).getFooter() != null) {
+						for(Element element : ((ReportDesignTemplate)report.getDesign()).getFooter().getElements()) {
+							if(element instanceof DatamartContainer) {
+								isDatamartAuthorized(((DatamartContainer)element).getDatamartRef(), userAccessService, authorized);
+							}
+						}
+					}
+				}
+			}
+		}
+
+		private void isDialogAuthorized(Dialog dialog, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if(dialog != null) {
+				isDtoAuthorized(dialog.getDto(), userAccessService, authorized);
+				if(dialog.getUiView() != null) {
+					for(UiBeanSlot slot:dialog.getUiView().getBeanSlots()) {
+		    			if(hasSupertype(slot.getJvmType(), IDto.class)) {
+		    				authorized.put(slot.getJvmType().getQualifiedName(), userAccessService.isGranted(Group.DTO, Action.READABLE, slot.getJvmType().getQualifiedName()));
+						}
+					}
+				}
+			}
+		}
+
+		private void isChartAuthorized(Chart chart, IUserAccessService userAccessService,	Map<String, Boolean> authorized) {
+			if(chart != null) {
+				isDatamartAuthorized(chart.getSource().getDatamartRef(), userAccessService, authorized);
+			}
+		}
+
+		private void isTableAuthorized(Table table, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if(table != null) {
+				if(table.getTabletype() instanceof TableTable) {
+					isDatamartAuthorized(((TableTable)table.getTabletype()).getSource().getDatamartRef(), userAccessService, authorized);
+				} else if(table.getTabletype() instanceof TableGrid) {
+					isDtoAuthorized(((TableGrid)table.getTabletype()).getSource().getDtoSource(), userAccessService, authorized);
+				} else {
+					throw new IllegalViewException("no such table option:"+table.getTabletype().toString());
+				}
+			}
+		}
+
+		private void isDtoAuthorized(LDto dto, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if(dto != null) {
+				String dtoFqn = getFullyQualifiedName(dto);
+				authorized.put(dtoFqn, userAccessService.isGranted(Group.DTO, Action.READABLE, dtoFqn));
+			}
+		}
+
+		private void isDatamartAuthorized(DatamartDefinition datamart, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if(datamart != null) {
+				if(datamart.getSource() instanceof DatamartEntity) {
+					isEntityAuthorized(((DatamartEntity)datamart.getSource()).getEntityRef(), userAccessService, authorized);
+				} else if(datamart.getSource() instanceof DatamartCube) {
+					isCubeAuthorized(((DatamartCube)datamart.getSource()).getCubeRef(), userAccessService, authorized);
+				} else if(datamart.getSource() instanceof DatamartTask) {
+					authorized.put(datamart.toString(), true);
+				} else {
+					throw new IllegalViewException("no such datamart source:"+datamart.getSource().toString());
+				}
+			}
+		}
+
+		private void isCubeAuthorized(CubeType cube, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if(cube != null) {
+				LEntity cubeEntity = cube.getCubeTypeEntity().getEntityRef().getEntityValue();
+				isEntityAuthorized(cubeEntity, userAccessService, authorized);
+				for(CubeDimensionUsage dimension:cube.getCubeTypeEntity().getDimensionUsages()) {
+					for(CubeHierarchy hierarchy:dimension.getSourceValue().getHierarchies()) {
+						if(hierarchy.getCubeDimEntity() != null) {
+							if(hierarchy.getCubeDimEntity().getEntityRef() != null) {
+								isEntityAuthorized(hierarchy.getCubeDimEntity().getEntityRef().getEntityValue(), userAccessService, authorized);
+							}
+							if(hierarchy.getCubeDimEntity().getDimEntity() != null && hierarchy.getCubeDimEntity().getDimEntity().getEntityRef() != null) {
+								isEntityAuthorized(hierarchy.getCubeDimEntity().getDimEntity().getEntityRef().getEntityValue(), userAccessService, authorized);
+							}
+						}
+					}
+				}
+			}
+		}
+
+		private void isEntityAuthorized(LEntity entity, IUserAccessService userAccessService, Map<String, Boolean> authorized) {
+			if(entity != null) {
+				String entityFqn = getFullyQualifiedName(entity);
+				authorized.put(entityFqn, userAccessService.isGranted(Group.ENTITY, Action.READABLE, entityFqn));
+			}
+		}
+
+		@SuppressWarnings("deprecation")
+		@Override
+		public boolean hasSupertype(JvmTypeReference typeReference, Class<?> clz) {
+			SuperTypeCollector collector = new SuperTypeCollector();
+			Set<String> result = new LinkedHashSet<>();
+			collector.collectSuperTypes(typeReference, new SuperTypeCollector.SuperTypeAcceptor() {
+				@Override
+				public boolean accept(JvmTypeReference superType, int distance) {
+					if(superType.getQualifiedName().equals(clz.getName())) {
+						result.add(superType.getQualifiedName());
+					}
+					return true;
+				}
+			});
+			return !result.isEmpty();
+		}
 	}
 
 	/**
@@ -1057,6 +1350,8 @@
 				return getDialogGroupFQN(eObject);
 			} else if (eObject instanceof FunctionLibraryDialogHook) {
 				return getDialogHookFQN(eObject);
+			} else if (eObject instanceof Blip) {
+				return getBlipFQN(eObject);
 			}
 			throw new IllegalArgumentException(
 					IDSLMetadataService.ThrowableMessages.NAMING_LOGIC_NOT_REGISTERD + eObject);
@@ -1304,6 +1599,22 @@
 		}
 		
 		/**
+		 * Gets the blip FQN.
+		 *
+		 * @param eObject
+		 *            the e object
+		 * @return the action FQN
+		 */
+		private static String getBlipFQN(EObject eObject) {
+			Blip blip = (Blip) eObject;
+			if (blip == null) {
+				return "";
+			}
+			BlipPackage pkg = (BlipPackage) blip.eContainer();
+			return pkg.getName() + "." + blip.getName();
+		}
+		
+		/**
 		 * Gets the functionLibraryInitializationGroup FQN.
 		 *
 		 * @param eObject
diff --git a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/IllegalViewException.java b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/IllegalViewException.java
new file mode 100644
index 0000000..afdb8dc
--- /dev/null
+++ b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/IllegalViewException.java
@@ -0,0 +1,30 @@
+package org.eclipse.osbp.dsl.metadata.service;
+
+public class IllegalViewException extends RuntimeException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1L;
+
+	public IllegalViewException() {
+		super();
+	}
+
+	public IllegalViewException(String var1, Throwable var2, boolean var3, boolean var4) {
+		super(var1, var2, var3, var4);
+	}
+
+	public IllegalViewException(String var1, Throwable var2) {
+		super(var1, var2);
+	}
+
+	public IllegalViewException(String var1) {
+		super(var1);
+	}
+
+	public IllegalViewException(Throwable var1) {
+		super(var1);
+	}
+
+}
diff --git a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/StandaloneGrammarsSetup.java b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/StandaloneGrammarsSetup.java
index 332a082..6ebc14e 100644
--- a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/StandaloneGrammarsSetup.java
+++ b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/StandaloneGrammarsSetup.java
@@ -36,7 +36,6 @@
 import org.eclipse.osbp.xtext.reportdsl.ReportDSLBundleSpaceStandaloneSetup;
 import org.eclipse.osbp.xtext.signal.SignalDSLBundleSpaceStandaloneSetup;
 import org.eclipse.osbp.xtext.statemachine.StatemachineDSLBundleSpaceStandaloneSetup;
-import org.eclipse.osbp.xtext.strategy.StrategyDSLBundleSpaceStandaloneSetup;
 import org.eclipse.osbp.xtext.table.TableDSLBundleSpaceStandaloneSetup;
 import org.eclipse.osbp.xtext.topologydsl.TopologyDSLBundleSpaceStandaloneSetup;
 
@@ -72,7 +71,6 @@
 		ReportDSLBundleSpaceStandaloneSetup.doSetup();
 		SignalDSLBundleSpaceStandaloneSetup.doSetup();
 		StatemachineDSLBundleSpaceStandaloneSetup.doSetup();
-		StrategyDSLBundleSpaceStandaloneSetup.doSetup();
 		TableDSLBundleSpaceStandaloneSetup.doSetup();
 		TopologyDSLBundleSpaceStandaloneSetup.doSetup();
 	}