blob: 1272e3678402b5d13a3ab221c4d5f1530bf6deaf [file] [log] [blame]
/*
-----------------------------------------------------------------------
-- CHESS core plugin --
-- --
-- Copyright (C) 2016 --
-- University of Padova, ITALY --
-- --
-- Authors: Alessandro Zovi azovi@math.unipd.it --
-- Laura Baracchi laura.baracchi@intecs.it --
-- Stefano Puri stefano.puri@intecs.it --
-- --
-- All rights reserved. This program and the accompanying materials --
-- are made available under the terms of the Eclipse Public License --
-- v1.0 which accompanies this distribution, and is available at --
-- http://www.eclipse.org/legal/epl-v20.html --
-----------------------------------------------------------------------
*/
package org.polarsys.chess.core.internal.views;
import static org.polarsys.chess.core.internal.views.permissions.EntryId.ANY;
import static org.polarsys.chess.core.internal.views.permissions.EntryId.NONE;
import static org.polarsys.chess.core.internal.views.permissions.EntryId.anyEntry;
import java.io.File;
import java.net.URI;
import java.net.URL;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.polarsys.chess.chessmlprofile.Core.Domain;
import org.polarsys.chess.core.Activator;
import org.polarsys.chess.core.internal.views.permissions.EntryId;
import org.polarsys.chess.core.internal.views.permissions.PermissionEntry;
import org.polarsys.chess.core.internal.views.permissions.PermissionList;
import org.polarsys.chess.core.profiles.CHESSProfileManager;
import org.polarsys.chess.core.util.CHESSProjectSupport;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
/**
* This class parses the permissions.xml file and create the permissions structure.
*/
public class ViewPermissions {
/** The permissions. */
public static HashMap<String, HashMap<String, PermissionList>> permissions = new HashMap<String, HashMap<String, PermissionList>>();
/** The component view PL. */
static PermissionList componentViewPL;
/** The extra functional view PL. */
static PermissionList extraFunctionalViewPL;
/** The deployment view PL. */
static PermissionList deploymentViewPL;
/** The analysis view PL. */
static PermissionList analysisViewPL;
/** The requirement view PL. */
static PermissionList requirementViewPL;
/** The RT analysis view view PL. */
static PermissionList RTAnalysisViewViewPL;
/** The Dependability analysis view PL. */
static PermissionList DependabilityAnalysisViewPL;
/** The Dependability view PL. */
static PermissionList DependabilityViewPL;
/** The System view PL. */
static PermissionList SystemViewPL;
/** The PSM view. */
static PermissionList PSMView;
/** The allow all. */
static PermissionEntry allowAll = new PermissionEntry(anyEntry, false, true, true, Domain.CROSS_DOMAIN);
/**
* Initialize lists.
*/
public static void initializeLists(){
/*componentViewPL = new PermissionList();
extraFunctionalViewPL = new PermissionList();
deploymentViewPL = new PermissionList();
analysisViewPL = new PermissionList();
requirementViewPL = new PermissionList();
RTAnalysisViewViewPL = new PermissionList();
DependabilityAnalysisViewPL = new PermissionList();
DependabilityViewPL = new PermissionList();
SystemViewPL = new PermissionList();
PSMView = new PermissionList();*/
// permissions.put(CHESSProfileManager.COMPONENT_VIEW,
// ViewPermissions.componentViewPL);
// permissions.put(CHESSProfileManager.EXTRAFUNCTIONAL_VIEW,
// ViewPermissions.extraFunctionalViewPL);
// permissions.put(CHESSProfileManager.ANALYSIS_VIEW,
// ViewPermissions.analysisViewPL);
// permissions.put(CHESSProfileManager.DEPLOYMENT_VIEW,
// ViewPermissions.deploymentViewPL);
// permissions.put(CHESSProfileManager.REQUIREMENT_VIEW,
// ViewPermissions.requirementViewPL);
// permissions.put(CHESSProfileManager.RT_ANALYSIS_VIEW,
// ViewPermissions.RTAnalysisViewViewPL);
// permissions.put(CHESSProfileManager.DEPENDABILITY_ANALYSIS_VIEW,
// ViewPermissions.DependabilityAnalysisViewPL);
permissions.put(CHESSProfileManager.COMPONENT_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.EXTRAFUNCTIONAL_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.ANALYSIS_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.DEPLOYMENT_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.REQUIREMENT_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.RT_ANALYSIS_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.DEPENDABILITY_ANALYSIS_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.DEPENDABILITY_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.RAILWAY_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.SYSTEM_VIEW,
new HashMap<String, PermissionList>());
permissions.put(CHESSProfileManager.PSM_VIEW,
new HashMap<String, PermissionList>());
}
static{
initializeLists();
CHESSProjectSupport.printlnToCHESSConsole("Load permissions...");
readXMLPermissions();
CHESSProjectSupport.printlnToCHESSConsole("Permissions loaded.");
// //The allowAll policy should last until a list of actual permission is specified
// componentViewPL.add(allowAll);
// extraFunctionalViewPL.add(allowAll);
// deploymentViewPL.add(allowAll);
// analysisViewPL.add(allowAll);
// requirementViewPL.add(allowAll);
// RTAnalysisViewViewPL.add(allowAll);
// DependabilityAnalysisViewPL.add(allowAll);
//
// //Examples
// componentViewPL.add(new PermissionEntry(new EntryId("Package", ANY, ANY), true, true, true));
// componentViewPL.add(new PermissionEntry(new EntryId(ANY, ANY, ANY), true, true, true));
// componentViewPL.add(new PermissionEntry(new EntryId(ANY, ANY, "Operation"), true, true, true));
// componentViewPL.add(new PermissionEntry(new EntryId(ANY, ANY, "Property"), true, true, true));
// componentViewPL.add(new PermissionEntry( new EntryId(ANY, "CHRtSpecification", "relativePriority"), true, false, true));
}
/**
* Read XML permissions.
*/
public static void readXMLPermissions(){
try {
URL url = FileLocator.find(Activator.getDefault().getBundle(), new Path("permissions.xml"), null);
url = FileLocator.toFileURL(url);
URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), null);
DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
Document doc = docBuilder.parse (new File(uri));
// normalize text representation
doc.getDocumentElement ().normalize ();
NodeList listOfViews = doc.getElementsByTagName("view");
for(int s=0; s<listOfViews.getLength() ; s++){
Node view = listOfViews.item(s);
if(view.getNodeType() == Node.ELEMENT_NODE){
parseViewNode(view);
}
}
} catch (SAXParseException err) {
System.out.println("** Parsing error" + ", line "
+ err.getLineNumber() + ", uri " + err.getSystemId());
System.out.println(' ' + err.getMessage());
CHESSProjectSupport.printlnToCHESSConsole("** Parsing error" + ", line "
+ err.getLineNumber() + ", uri " + err.getSystemId());
CHESSProjectSupport.printlnToCHESSConsole(' ' + err.getMessage());
} catch (SAXException e) {
Exception x = e.getException();
((x == null) ? e : x).printStackTrace(CHESSProjectSupport.CHESS_CONSOLE_STREAM);
((x == null) ? e : x).printStackTrace();
} catch (Throwable t) {
t.printStackTrace(CHESSProjectSupport.CHESS_CONSOLE_STREAM);
t.printStackTrace();
}
}
/**
* Parses the view node.
*
* @param view the view
*/
private static void parseViewNode(Node view) {
NodeList permList = ((Element)view).getElementsByTagName("diagram");
String viewName = ((Element)view).getAttribute("name");
for (int i=0; i<permList.getLength(); i++){
Node dg = permList.item(i);
if(dg.getNodeType() == Node.ELEMENT_NODE){
PermissionList list = parseDiagramNode(dg);
// PermissionEntry p = createPermission((Element) perm);
// permissions.get(((Element)view).getAttribute("name")).add(p);
String dgName = ((Element)dg).getAttribute("name");
addDiagramPermissions(viewName, dgName, list);
}
}
// NodeList permList = ((Element)view).getElementsByTagName("perm");
// for (int i=0; i<permList.getLength(); i++){
// Node perm = permList.item(i);
// if(perm.getNodeType() == Node.ELEMENT_NODE){
// PermissionEntry p = createPermission((Element) perm);
// permissions.get(((Element)view).getAttribute("name")).add(p);
// }
// }
}
/**
* Adds the diagram permissions.
*
* @param view the view
* @param dg the dg
* @param list the list
*/
private static void addDiagramPermissions(String view, String dg,
PermissionList list) {
permissions.get(view).put(dg, list);
}
/**
* Parses the diagram node.
*
* @param dg the dg
* @return the permission list
*/
private static PermissionList parseDiagramNode(Node dg) {
NodeList permList = ((Element)dg).getElementsByTagName("perm");
PermissionList list = new PermissionList();
for (int i=0; i<permList.getLength(); i++){
Node perm = permList.item(i);
if(perm.getNodeType() == Node.ELEMENT_NODE){
PermissionEntry p = createPermission((Element) perm);
list.add(p);
// permissions.get(((Element)view).getAttribute("name")).add(p);
}
}
return list;
}
/**
* Creates the permission.
*
* @param perm the perm
* @return the permission entry
*/
private static PermissionEntry createPermission(Element perm) {
String id1 = parseIdValue(perm.getAttribute(EntryId.TYPE_ATR));
String id2 = parseIdValue(perm.getAttribute(EntryId.STEREOTYPE_ATR));
String id3 = parseIdValue(perm.getAttribute(EntryId.FEATURE_ATR));
EntryId id = new EntryId(id1, id2, id3);
boolean o = parsePermissionRight(perm.getAttribute(PermissionEntry.OWNER_ATR));
boolean w = parsePermissionRight(perm.getAttribute(PermissionEntry.WRITE_ATR));
boolean v = parsePermissionRight(perm.getAttribute(PermissionEntry.VISIBLE_ATR));
Domain d = parseDomain(perm.getAttribute(PermissionEntry.DOMAIN_ATR));
return new PermissionEntry(id, o, w, v, d);
}
/**
* Parses the permission right.
*
* @param attr the attr
* @return true, if successful
*/
private static boolean parsePermissionRight(String attr) {
if (attr.equalsIgnoreCase("true"))
return true;
// if (attr.isEmpty() || attr.equalsIgnoreCase("false"))
return false;
}
/**
* Parses the domain.
*
* @param attr the attr
* @return the domain
*/
private static Domain parseDomain(String attr) {
if (attr.equalsIgnoreCase(Domain.AUTOMOTIVE.getName()))
return Domain.AUTOMOTIVE;
if (attr.equalsIgnoreCase(Domain.AVIONICS.getName()))
return Domain.AVIONICS;
if (attr.equalsIgnoreCase(Domain.CROSS_DOMAIN.getName()))
return Domain.CROSS_DOMAIN;
if (attr.equalsIgnoreCase(Domain.MEDICAL.getName()))
return Domain.MEDICAL;
if (attr.equalsIgnoreCase(Domain.PETROLEUM.getName()))
return Domain.PETROLEUM;
if (attr.equalsIgnoreCase(Domain.SPACE.getName()))
return Domain.SPACE;
if (attr.equalsIgnoreCase(Domain.TELECOM.getName()))
return Domain.TELECOM;
// Default domain is CROSS_DOMAIN
return Domain.CROSS_DOMAIN;
}
/**
* Parses the id value.
*
* @param attr the attr
* @return the string
*/
private static String parseIdValue(String attr) {
if (attr.equals("-"))
return NONE;
if (attr.isEmpty() || attr.equals("*"))
return ANY;
return attr;
}
}