package org.teiid.designer.roles.ui.wizard; import java.util.ArrayList; import java.util.Collection; import java.util.StringTokenizer; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Path; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; import org.teiid.core.designer.util.CoreStringUtil; import org.teiid.core.designer.util.StringUtilities; import org.teiid.designer.core.ModelerCore; import org.teiid.designer.core.container.Container; import org.teiid.designer.roles.DataRole; import org.teiid.designer.roles.Permission; /** * @since 8.0 */ public class DataRoleResolver { private static final char DELIM = CoreStringUtil.Constants.DOT_CHAR; private static final char B_SLASH = '/'; private static final String DQUOTE_STR = "\""; //$NON-NLS-1$ private static final char DQUOTE_CHAR = '"'; private static final String SYS_TABLE_TARGET = "sys"; //$NON-NLS-1$ private static final String PG_CATALOG_TARGET = "pg_catalog"; //$NON-NLS-1$ private Container tempContainer; public DataRoleResolver(Container tempContainer) { super(); this.tempContainer = tempContainer; } /** * * @param originalDataRole * @return */ public DataRole resolveDataRole(DataRole originalDataRole) { DataRole changedRole = null; Collection<Permission> keepPerms = new ArrayList<Permission>(); boolean changedPerms = false; for( Permission perm : originalDataRole.getPermissions() ) { String targetName = perm.getTargetName(); if( targetName.equals(SYS_TABLE_TARGET) || targetName.equals(PG_CATALOG_TARGET)) { keepPerms.add(perm); continue; } IPath targetPath = new Path(getTargetNamePath(targetName)); if( targetStillExists(targetPath) ) { keepPerms.add(perm); } else { changedPerms = true; } } if( changedPerms ) { changedRole = new DataRole(originalDataRole.getName()); changedRole.setDescription(originalDataRole.getDescription()); if( !originalDataRole.getRoleNames().isEmpty() ) { changedRole.setRoleNames(originalDataRole.getRoleNames()); } changedRole.setPermissions(keepPerms); changedRole.setAnyAuthenticated(originalDataRole.isAnyAuthenticated()); } return changedRole; } private String getTargetNamePath(String dotPath) { if( dotPath.contains(DQUOTE_STR) ) { StringBuilder sb = new StringBuilder(); boolean betweenDQuotes = false; for( char nextChar : dotPath.toCharArray() ) { if( nextChar == DQUOTE_CHAR) { if( !betweenDQuotes) { betweenDQuotes = true; } else { betweenDQuotes = false; } sb.append(nextChar); } else if( nextChar == DELIM ) { if( !betweenDQuotes ) { sb.append(B_SLASH); } else { sb.append(nextChar); } } else { sb.append(nextChar); } } return sb.toString(); } else { return dotPath.replace(DELIM, B_SLASH); } } private boolean targetStillExists(IPath path) { if( path.segmentCount() == 1 ) { return true; } Resource resource = null; for( Resource res : tempContainer.getResources() ) { String modelName = res.getURI().lastSegment(); if( modelName.equalsIgnoreCase(path.segment(0) + ".xmi")) { //$NON-NLS-1$ resource = res; break; } } EObject obj = null; if( resource != null ) { // Build object path in model IPath fragmentPath = new Path(""); //$NON-NLS-1$ int nSegs = path.segmentCount(); for(int i=1; i< nSegs; i++) { fragmentPath = fragmentPath.append(path.segment(i)); } obj = ModelerCore.getModelEditor().findObjectByPath(resource, fragmentPath); } if( obj == null ) { return false; } return true; } }