@startuml skinparam class { BackgroundColor White ArrowColor Grey BorderColor Black } skinparam shadowing false package API { class ConfigurationAPI class RecommenderAPI class ProductStructureAPI } "/config/" ()-- ConfigurationAPI "/recommender/" ()-- RecommenderAPI "/product_structure/" ()-- ProductStructureAPI package Manager { class RecommendationManager } package Model{ class ConfigurationModel class PreferenceModel class ProductStructureModel } package DAO { class ConfigurationDAO class ProductStructureDAO } package Scoring { package List { class ListFunction class ListToListFunction class ListToValueFunction class Average class Product class ForEachValue } package Value { class ValueFunction class Threshold } package Rating { class RatingToListConverter class FlatToListConverter class PerUserToListConverter class PerFeatureToListConverter } class ScoringFunctionFactory{ } ScoringFunctionFactory --> ScoringFunction : builds PreferenceScoringFunction --> "1" RatingToListConverter : Stage 1 PreferenceScoringFunction --> "0..*" ListToListFunction : Stage 2 PreferenceScoringFunction --> "1" ListToValueFunction : Stage 3 PreferenceScoringFunction --> "0..*" ValueFunction : Stage 4 ScoringFunction <|-- PreferenceScoringFunction class PreferenceScoringFunction{ } ScoringFunction <|-- ConfigurationPenealty class ConfigurationPenealty{ } ScoringFunction <|-- SumScoringFunction SumScoringFunction --* "2..*" ScoringFunction class SumScoringFunction{ } abstract class RatingToListConverter { } RatingToListConverter <|-- PerFeatureToListConverter PerFeatureToListConverter --> ListToValueFunction :uses class PerFeatureToListConverter { } RatingToListConverter <|-- PerUserToListConverter PerUserToListConverter --> ListToValueFunction :uses class PerUserToListConverter { } RatingToListConverter <|-- FlatToListConverter class FlatToListConverter { } abstract class ListFunction { } ListFunction <|-- ListToListFunction abstract class ListToListFunction { } ListToListFunction <|-- ForEachValue ForEachValue --> ValueFunction:uses class ForEachValue { } ListFunction <|-- ListToValueFunction abstract class ListToValueFunction { } ListToValueFunction <|-- Average class Average { } ListToValueFunction <|-- Product class Product { } abstract class ValueFunction{ } ValueFunction <|-- Threshold class Threshold { } } RecommendationManager *-- ScoringFunction ConfigurationAPI --> ConfigurationDAO ProductStructureAPI --> ProductStructureDAO RecommenderAPI --> RecommendationManager RecommendationManager --> ProductStructureDAO RecommendationManager --> ConfigurationDAO RecommendationManager --> ScoringFunctionFactory :uses ScoringFunction --[hidden]--> ConfigurationDAO ConfigurationDAO --> ConfigurationModel ProductStructureDAO --> ProductStructureModel @enduml