Skip to content

Commit

Permalink
Fix #528
Browse files Browse the repository at this point in the history
  • Loading branch information
failys committed May 18, 2020
1 parent 580634a commit 173abdb
Show file tree
Hide file tree
Showing 16 changed files with 177 additions and 22 deletions.
2 changes: 1 addition & 1 deletion cairis/bin/cexport.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def file_export(modelFormat = 'all', outputFile = None, persona = None, task = N
msgStr = ''
if (modelFormat == 'all'):
msgStr += exportModel(outputFile,session_id)
if (modelFormat == 'package'):
elif (modelFormat == 'package'):
msgStr += exportPackage(outputFile,session_id)
elif (modelFormat == 'scenarios'):
msgStr += exportRedmineScenarios(outputFile,session_id)
Expand Down
5 changes: 4 additions & 1 deletion cairis/config/cairis_model.dtd
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,7 @@
<!ATTLIST task_characteristic modal_qualifier CDATA #REQUIRED>

<!ELEMENT dataflows (dataflow*,trust_boundary*)>
<!ELEMENT dataflow (dataflow_asset+)>
<!ELEMENT dataflow (dataflow_asset+,dataflow_obstacle*)>
<!ATTLIST dataflow name CDATA #REQUIRED>
<!ATTLIST dataflow environment CDATA #REQUIRED>
<!ATTLIST dataflow from_name CDATA #REQUIRED>
Expand All @@ -448,6 +448,9 @@
<!ELEMENT dataflow_asset EMPTY>
<!ATTLIST dataflow_asset name CDATA #REQUIRED>

<!ELEMENT dataflow_obstacle EMPTY>
<!ATTLIST dataflow_obstacle name CDATA #REQUIRED>

<!ELEMENT trust_boundary (description,trust_boundary_environment+)>
<!ATTLIST trust_boundary name CDATA #REQUIRED>
<!ATTLIST trust_boundary privilege CDATA #IMPLIED>
Expand Down
5 changes: 4 additions & 1 deletion cairis/config/dataflow.dtd
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

<!ELEMENT dataflows (dataflow*,trust_boundary*)>

<!ELEMENT dataflow (dataflow_asset+)>
<!ELEMENT dataflow (dataflow_asset+,dataflow_obstacle*)>
<!ATTLIST dataflow name CDATA #REQUIRED>
<!ATTLIST dataflow environment CDATA #REQUIRED>
<!ATTLIST dataflow from_name CDATA #REQUIRED>
Expand All @@ -32,6 +32,9 @@
<!ELEMENT dataflow_asset EMPTY>
<!ATTLIST dataflow_asset name CDATA #REQUIRED>

<!ELEMENT dataflow_obstacle EMPTY>
<!ATTLIST dataflow_obstacle name CDATA #REQUIRED>

<!ELEMENT trust_boundary (description,trust_boundary_environment+)>
<!ATTLIST trust_boundary name CDATA #REQUIRED>
<!ELEMENT description (#PCDATA)>
Expand Down
4 changes: 3 additions & 1 deletion cairis/core/DataFlow.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@
__author__ = 'Shamal Faily'

class DataFlow:
def __init__(self,dfName,envName,fromName,fromType,toName,toType,dfAssets):
def __init__(self,dfName,envName,fromName,fromType,toName,toType,dfAssets,dfObs = []):
self.theName = dfName
self.theEnvironmentName = envName
self.theFromName = fromName
self.theFromType = fromType
self.theToName = toName
self.theToType = toType
self.theAssets = dfAssets
self.theObstacles = dfObs

def name(self): return self.theName
def environment(self): return self.theEnvironmentName
Expand All @@ -34,3 +35,4 @@ def fromType(self): return self.theFromType
def toName(self): return self.theToName
def toType(self): return self.theToType
def assets(self): return self.theAssets
def obstacles(self): return self.theObstacles
4 changes: 3 additions & 1 deletion cairis/core/DataFlowParameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
__author__ = 'Shamal Faily'

class DataFlowParameters(ObjectCreationParameters):
def __init__(self,dfName,envName,fromName,fromType,toName,toType,dfAssets):
def __init__(self,dfName,envName,fromName,fromType,toName,toType,dfAssets,dfObs = []):
ObjectCreationParameters.__init__(self)
self.theName = dfName
self.theEnvironmentName = envName
Expand All @@ -29,6 +29,7 @@ def __init__(self,dfName,envName,fromName,fromType,toName,toType,dfAssets):
self.theToName = toName
self.theToType = toType
self.theAssets = dfAssets
self.theObstacles = dfObs

def name(self): return self.theName
def environment(self): return self.theEnvironmentName
Expand All @@ -37,3 +38,4 @@ def fromType(self): return self.theFromType
def toName(self): return self.theToName
def toType(self): return self.theToType
def assets(self): return self.theAssets
def obstacles(self): return self.theObstacles
17 changes: 16 additions & 1 deletion cairis/core/MySQLDatabaseProxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -4653,14 +4653,19 @@ def getDataFlows(self,dfName='',envName=''):
dataFlows = []
for dfName,envName,fromName,fromType,toName,toType in dfRows:
dfAssets = self.getDataFlowAssets(dfName,envName)
parameters = DataFlowParameters(dfName,envName,fromName,fromType,toName,toType,dfAssets)
dfObs = self.getDataFlowObstacles(dfName,envName)
parameters = DataFlowParameters(dfName,envName,fromName,fromType,toName,toType,dfAssets,dfObs)
df = ObjectFactory.build(-1,parameters)
dataFlows.append(df)
return dataFlows

def getDataFlowAssets(self,dfName,envName):
return self.responseList('call getDataFlowAssets(:df,:env)',{'df':dfName,'env':envName},'MySQL error getting assets for data flow ' + dfName)

def getDataFlowObstacles(self,dfName,envName):
return self.responseList('call getDataFlowObstacles(:df,:env)',{'df':dfName,'env':envName},'MySQL error getting obstacles for data flow ' + dfName)


def addDataFlow(self,parameters):
dfName = parameters.name()
envName = parameters.environment()
Expand All @@ -4669,13 +4674,19 @@ def addDataFlow(self,parameters):
toName = parameters.toName()
toType = parameters.toType()
dfAssets = parameters.assets()
dfObs = parameters.obstacles()
self.updateDatabase('call addDataFlow(:df,:env,:fName,:fType,:tName,:tType)',{'df':dfName,'env':envName,'fName':fromName,'fType':fromType,'tName':toName,'tType':toType},'MySQL error adding data flow')
for dfAsset in dfAssets:
self.addDataFlowAsset(dfName,envName,fromType,fromName,toType,toName,dfAsset)
for dfOb in dfObs:
self.addDataFlowObstacle(dfName,envName,fromType,fromName,toType,toName,dfOb)

def addDataFlowAsset(self,dfName,envName,fromType,fromName,toType,toName,dfAsset):
self.updateDatabase('call addDataFlowAsset(:df,:env,:fromType,:fromName,:toType,:toName,:ass)',{'df':dfName,'env':envName,'fromType':fromType,'fromName':fromName,'toType':toType,'toName':toName,'ass':dfAsset},'MySQL error adding data flow asset')

def addDataFlowObstacle(self,dfName,envName,fromType,fromName,toType,toName,dfOb):
self.updateDatabase('call addDataFlowObstacle(:df,:env,:fromType,:fromName,:toType,:toName,:ob)',{'df':dfName,'env':envName,'fromType':fromType,'fromName':fromName,'toType':toType,'toName':toName,'ob':dfOb},'MySQL error adding data flow obstacle')

def updateDataFlow(self,oldDfName,oldEnvName,parameters):
dfName = parameters.name()
envName = parameters.environment()
Expand All @@ -4684,10 +4695,14 @@ def updateDataFlow(self,oldDfName,oldEnvName,parameters):
toName = parameters.toName()
toType = parameters.toType()
dfAssets = parameters.assets()
dfObs = parameters.obstacles()
session = self.updateDatabase('call deleteDataFlowAssets(:df,:env)',{'df':oldDfName,'env':oldEnvName},'MySQL error deleting data flow assets',None,False)
self.updateDatabase('call deleteDataFlowObstacles(:df,:env)',{'df':oldDfName,'env':oldEnvName},'MySQL error deleting data flow obstacles',session,False)
self.updateDatabase('call updateDataFlow(:oDf,:nDf,:oEnv,:nEnv,:fName,:fType,:tName,:tType)',{'oDf':oldDfName,'nDf':dfName,'oEnv':oldEnvName,'nEnv':envName,'fName':fromName,'fType':fromType,'tName':toName,'tType':toType},'MySQL error updating data flow',session)
for dfAsset in dfAssets:
self.addDataFlowAsset(dfName,envName,fromType,fromName,toType,toName,dfAsset)
for dfOb in dfObs:
self.addDataFlowObstacle(dfName,envName,fromType,fromName,toType,toName,dfOb)

def deleteDataFlow(self,dfName,envName):
self.updateDatabase('call deleteDataFlow(:df,:env)',{'df':dfName,'env':envName},'MySQL Error deleting data flow')
Expand Down
2 changes: 1 addition & 1 deletion cairis/core/ObjectFactory.py
Original file line number Diff line number Diff line change
Expand Up @@ -174,5 +174,5 @@ def build(objtId,p):
if (p.__class__.__name__ == 'LocationsParameters'):
return Locations(objtId,p.name(),p.diagram(),p.locations(),p.links())
if (p.__class__.__name__ == 'DataFlowParameters'):
return DataFlow(p.name(),p.environment(),p.fromName(),p.fromType(),p.toName(),p.toType(),p.assets())
return DataFlow(p.name(),p.environment(),p.fromName(),p.fromType(),p.toName(),p.toType(),p.assets(),p.obstacles())
else: raise UnknownParameterClass(str(objtId))
6 changes: 4 additions & 2 deletions cairis/data/DataFlowDAO.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ def add_object(self, dataflow):
fromType=dataflow.fromType(),
toName=dataflow.toName(),
toType=dataflow.toType(),
dfAssets=dataflow.assets()
dfAssets=dataflow.assets(),
dfObs=dataflow.obstacles()
)

try:
Expand All @@ -87,7 +88,8 @@ def update_object(self, dataflow, old_dataflow_name,old_environment_name):
fromType=dataflow.fromType(),
toName=dataflow.toName(),
toType=dataflow.toType(),
dfAssets=dataflow.assets()
dfAssets=dataflow.assets(),
dfObs=dataflow.obstacles()
)

try:
Expand Down
6 changes: 5 additions & 1 deletion cairis/mio/DataflowsContentHandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ def resetDataFlowAttributes(self):
self.theToName = ''
self.theToType = ''
self.theAssets = []
self.theObstacles = []

def resetTrustBoundaryAttributes(self):
self.inDescription = 0
Expand All @@ -67,6 +68,9 @@ def startElement(self,name,attrs):
elif name == 'dataflow_asset':
dfAsset = attrs['name']
self.theAssets.append(dfAsset)
elif name == 'dataflow_obstacle':
dfObs = attrs['name']
self.theObstacles.append(dfObs)
elif name == 'trust_boundary':
self.theName = attrs['name']
elif name == 'description':
Expand All @@ -87,7 +91,7 @@ def characters(self,data):

def endElement(self,name):
if name == 'dataflow':
self.theDataFlows.append(DataFlowParameters(self.theName,self.theEnvironmentName,self.theFromName,self.theFromType,self.theToName,self.theToType,self.theAssets))
self.theDataFlows.append(DataFlowParameters(self.theName,self.theEnvironmentName,self.theFromName,self.theFromType,self.theToName,self.theToType,self.theAssets,self.theObstacles))
self.resetDataFlowAttributes()
elif name == 'trust_boundary_environment':
self.theEnvironmentComponents[self.theEnvironmentName] = self.theComponents
Expand Down
6 changes: 3 additions & 3 deletions cairis/misc/DocumentBuilder.py
Original file line number Diff line number Diff line change
Expand Up @@ -2016,15 +2016,15 @@ def dataflows(p,docDir,fileSuffix = 'svg'):
envDict = {}
for d in dfs:
if d.environment() not in envDict:
envDict[d.environment()] = [(d.name(),d.fromName(),d.fromType(),d.toName(),d.toType(),listToItems(d.assets()))]
envDict[d.environment()] = [(d.name(),d.fromName(),d.fromType(),d.toName(),d.toType(),listToItems(d.assets()),listToItems(d.obstacles()))]
else:
envDict[d.environment()].append((d.name(),d.fromName(),d.fromType(),d.toName(),d.toType(),listToItems(d.assets())))
envDict[d.environment()].append((d.name(),d.fromName(),d.fromType(),d.toName(),d.toType(),listToItems(d.assets()),listToItems(d.obstacles())))
envList = list(envDict.keys())
envList.sort()
for envName in envList:
chapterTxt += """
<section id=\'""" + envName.replace(" ","_") + "_Dataflows\' ><title>" + envName + "</title>"
chapterTxt += buildTable(envName + '_' + 'DataFlows'.replace(" ","_"),'Data Flows',['Name','From','Type','To','Type','Assets'],envDict[envName],0)
chapterTxt += buildTable(envName + '_' + 'DataFlows'.replace(" ","_"),'Data Flows',['Name','From','Type','To','Type','Assets','Obstacles'],envDict[envName],0)

chapterTxt += """
</section>"""
Expand Down
8 changes: 8 additions & 0 deletions cairis/sql/init.sql
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ DROP TABLE IF EXISTS dataflow_process_entity;
DROP TABLE IF EXISTS dataflow_process_datastore;
DROP TABLE IF EXISTS dataflow_datastore_process;
DROP TABLE IF EXISTS dataflow_asset;
DROP TABLE IF EXISTS dataflow_obstacle;
DROP TABLE IF EXISTS dataflow;
DROP TABLE IF EXISTS persona_instance;
DROP TABLE IF EXISTS asset_instance;
Expand Down Expand Up @@ -3328,6 +3329,13 @@ CREATE TABLE dataflow_asset (
FOREIGN KEY(asset_id) REFERENCES asset(id)
) ENGINE=INNODB;

CREATE TABLE dataflow_obstacle (
dataflow_id INT NOT NULL,
obstacle_id INT NOT NULL,
PRIMARY KEY(dataflow_id,obstacle_id),
FOREIGN KEY(obstacle_id) REFERENCES obstacle(id)
) ENGINE=INNODB;

CREATE TABLE dataflow_process_process (
dataflow_id INT NOT NULL,
from_id INT NOT NULL,
Expand Down
Loading

0 comments on commit 173abdb

Please sign in to comment.