Systems

The IT System concept in the Townplanner is borrowed from the C4 Model. In Archimate it would be an Application Component. Contrary to the C4 Model though, the IT System is not the highest level of abstraction in the Townplanner model. That would be the IT Platform.

val bcms: ItSystem = 
    ea describes ItSystem(title = "BatCave Management System") 
      as { it =>
        it has Description("A custom Lair Management System, designed and built by Lucius Fox")
        it realizes buildingBlocks.lairManagement
    }

Properties

Description

A system can have 0 or more descriptions.

val bcms: ItSystem =
  ea describes ItSystem(title = "BatCave Management System")
    as { it =>
      it has Description("A custom Lair Management System.")
      it has Description("It was designed and built by Lucius Fox")
      ...
    }

Architecture Verdict

The architecture verdict uses the Gartner TIME model to categorize applications, determining whether to Terminate, Invest, Migrate or Tolerate them.

The architecture verdict property can appear only once on a concept. The value of the property can optionally contain a description, usually the reason why this concept was given this architecture verdict.

...
    it should BeInvestedIn()
    it should BeTolerated()
    it should BeMigrated()
    it should BeEliminated("option description: the reason why this should be eliminated")
...

Criticality

The criticality of a system describes the impact on the business if that system would fail or be unavailable. The possible values are:

The criticality property can appear only once on a concept. The value of the property can optionally contain a description, usually the reason why this concept has this criticality level.

...
    it ratesFailureAs Catastrophic("with an optional description of why it would be catastrophic")
    it ratesFailureAs Hazardous()
    it ratesFailureAs Major()
    it ratesFailureAs Minor()
    it ratesFailureAs NoEffect()
    it ratesFailureAs UnknownCriticality  
...

Resilience Measures

A resilience measure property is simply a description of what has been provided in the system to deal with failures.

A system can have 0 or more resilience measures.

...
it provides ResilienceMeasure("circuit breaker")
it provides ResilienceMeasure("fallback scenario")
...
val bcms: ItSystem =
  ea describes ItSystem(title = "BatCave Management System")
    as { it =>
      ...
      it has Website("https://wayne.com/bcms")
      it has Wiki("https://dc.fandom.com/wiki/BCMS")
      it has ApiDocumentation("https://api.wayne.com/bcms")
      it has FunctionalDocumentations(url = "https://docs.wayne.com/bcms", title = "Functional Documentation")
      it has TechnicalDocumentation("https://reference.wayne.com/bcms")
      it has ArchitectureDocumentation(url = "https://wayne.com/architecture/bcms", title = "The BCMS in the Wayne Enterprises Town Plan")
      it has ProductionUrl("https://bcms.wayne.com")
      it has PreProductionUrl("https://staging.bcms.wayne.com")
      it has DevelopmentUrl("https://dev.bcms.wayne.com")
      it has SourceCodeRepository("https://github.com/wayne/bcms")  
      ...
}

External ID

An external ID is a reference to the description, documentation, implementation or anything else in some external system, for example in another EA tool, or in a cloud platform.

val bcms: ItSystem =
  ea describes ItSystem(title = "BatCave Management System")
    as { it =>
      ...
      it isIdentifiedAs "{42a5e9d4-188d-4509-8145-eaac65ab86b8}" on "Sparx EA"
      ...
}

SWOT

A system can have strengths, weaknesses, opportunities and threats.

val bcms: ItSystem =
  ea describes ItSystem(title = "BatCave Management System")
    as { it =>
      ...
      it has Strength("Lucius Fox built it")
      it has Strength("Many screens")
      it has Weakness("The screens seem to be of poor quality, possibly due to the humidity in the BatCave")
      it has Threat(
        "Throwing a chair in one of the screens seems to explode the whole system"
      )
      he has Opportunity(
        "Bringing it to the cloud might make it less vulnerable to super villains"
      )
      ...
  }

Father Time

Life events can be assigned to a system, indicating the various stages in its lifetime:

Depending on the lifecycle, a system will be visible or not in a view. System Container Views for example are time-sensitive and will not show systems that were decommissioned or are not yet in production.

val batCaveDestructionDay: Day = Day(2027, 10, 31)

val bcms: ItSystem =
  ea describes ItSystem(title = "BatCave Management System")
    as { it =>
      ...
      it has StartedDevelopment(description =
        "Ra's al Ghul came to town"
      ) on Day(2003, 1, 1)
      it has GoneToProduction(description =
        "Just in time for the Joker"
      ) on Day(2005, 1, 1)
      it is Decommissioned(description =
        "The Batcave is destroyed"
      ) on batCaveDestructionDay
      ...
  }

Relationships

Flow

A system can be both the source and the target of a flow relationship. A flow relationship can be defined on the elements on either side.

val bcms: ItSystem = ea describes ItSystem(title = "BatCave Management System") as { it =>
    it isUsedBy actors.bruceWayne
    it uses systems.otherSystem
}
val bcms: ItSystem = ea describes ItSystem(title = "BatCave Management System") as { it =>
    it isBeingUsedBy actors.bruceWayne and { that =>
      that has Description("Bruce likes to stare at this intensely")
    }
    it isUsing systems.otherSystem and { that =>
      that isImplementedBy technologyRadar.rest
      that isImplementedBy technologyRadar.tls12
    }
}

Deliver

The delivery relationship indicates that a system, service, project, ... is delivered by a team, an organization or even an individual. A business actor can be the source of a delivery relationship.

val bruceWayne: Person = ea describes Person(title = "Bruce Wayne") as { he =>
  ...
  he delivers systems.bcms
  ...
}
val bruceWayne: Person = ea describes Person(title = "Bruce Wayne") as { he =>
  ...
  he isDelivering systems.bcms and { that =>
    that has Description("Admittedly, he needed Lucius Fox")
  }
  ...
}
val bcms: ItSystem = ea describes ItSystem(title = "BatCave Management System") as { it =>
    it isBeingDeliveredBy actors.bruceWayne and { that =>
      that has Description("Admittedly, he needed Lucius Fox")
    }
}
val bcms: ItSystem = ea describes ItSystem(title = "BatCave Management System") as { it =>
    it isDeliveredBy actors.bruceWayne
}

Realization

A system can realize an architecture building block. As an example, suppose we have the architecture building block called Content Management System, then systems like Strapi, Wordpress and Contentful would realize it. This relationship is typically used to visualize multiple systems doing the same thing within a company, as an input for a rationalisation exercise.

  val cms: ArchitectureBuildingBlock =
    ea describes ArchitectureBuildingBlock(title = "Content Management System") as { it =>
      it realizes capabilities.manageChannelContent
      it serves enterprises.wayneCorp
    }
    
  val strapi: ItSystem = ea describes ItSystem(title = "Strapi") as { it =>
    it realizes cms
  }

  val contentful: ItSystem = ea describes ItSystem(title = "Contentful") as { it =>
    it realizes cms
  }

Composition

A system can be part of a platform. It can also be composed of containers, such as microservices and databases, but that relationship is specified on the container side.

val strapi: ItSystem = ea describes ItSystem(title = "Strapi") as { it =>
    it isPartOf platforms.wayneMarketingPlatform
}

Impact

A system can be impacted by a decision or a project or project milestone. This relationship however is added on the side of the decision, project or milestone.

Knowledge

A system can be known by a person or a team. This relationship appears in the documentation and can be very helpful when there are problems with the system.

val strapi: ItSystem = ea describes ItSystem(title = "Strapi") as { it =>
  it isKnownBy actors.diana
  it isKnownBy(target = actors.bruceWayne, level = Expert)
}