PedroGeoGISdev wiki
  • Home
  • Linux OS
    • Linux: concepts
    • Linux: basic concepts
    • Linux: Bash
    • Linux: su and sudo
    • Linux: pipes
    • Linux: File System
    • Linux: Virtual Machines

    • Linux: distros
    • Linux Distros: Ubuntu
    • Linux Distros: Mint
    • Linux Distros: Debian
    • Linux Distros: openSuse
    • Linux Distros: Manjaro
    • Linux Distros: Red Hat Enterprise

    • Linux: laboratories
    • Linux Lab#LI01-1: Choose Linux
    • Linux Lab#LI01-2: Install at least three distributions
    • Linux Lab#LI01-3: Adjust user permissions
    • Linux Lab#LI02-1: Export env user with grep and pipe
    • Linux Lab#LI03-1: Manage users and groups
    • Linux Lab#LI03-2: Manage files
    • Linux Lab#LI03-3: Manage software
    • Linux Lab#LI03-4: Manage hardware
    • Linux Lab#LI04-1: Bash scripting, qtool
    • Linux Lab#LI04-2: Bash scripts as terminal tool
    • Linux Lab#LI04-3: Distribute the terminal app

    • Linux readings
    • Linux Resources
  • DevOps
    • What is DevOps
    • DevOps: Introduction
    • DevOps: Agile and Microservices
    • Infrastructure as code (IaC)
    • Immutable Infrastructure
    • Software Lifecycle

    • Documentation
    • How to document: Quarto and Obsidian

    • Network protocols
    • Network: Basics
    • Network: Client-server
    • Network Protocols
    • Network: DNS
    • Network: API Rest
    • Network: gRPC
    • Network: Websocket
    • Network: SMTP
    • Network: Ping
    • Network: UDP
    • Network: webhook
    • Network: SOAP
    • Network: graphQL

    • Version Control
    • Git
    • GitHub
    • Idea and GitHub 2023
    • Git and GitHub 2023 CLI

    • IDEs
    • IDE: Visual Code
    • IDE: IntellJIdea

    • DevOps tools
    • Amazon Web Services AWS
    • Docker
    • Jenkins pipelines
    • Kubernetes k8s
    • Digital Ocean
    • Nagios
    • Ansible

    • DevOps Laboratories
    • Lab 1: chat App
    • Lab 2: Spring Boot AWS AEB manually
    • Lab 3: Spring Boot and AWS S3 publisher
    • Lab 4: Spring Boot Docker/Jenkins
    • Lab 5: k8s on Digital Ocean
    • Lab 6: Spring Boot AWS codecommit

    • DevOps readings
    • DevOps Resources
  • MarkUp
    • MarkUp Languages
    • Introduction Markup
    • HTML Markup
    • Markdown Markup
    • Markdown and HTML working together, good idea?

    • Quarto Markdown
    • Quarto Markdown: basics
    • Quarto Markdown: creating
    • Quarto Markdown: publishing
    • Quarto Markdown: code & data
    • Quarto Markdown: api rest call
    • Quarto Markdown: OJS Cells
    • Quarto Markdown: cheat-sheet

    • Styling: CSS
    • Cascade Style Sheet
    • Cascade Style Sheet: Box Model and Containers
    • CSS: W3.css

    • MarkUp Languages Laboratories
    • Lab#MD01-1: Create and publish by Quarto

    • MarkUp Languages readings
    • MarkUp Languages Resources
  • Java SE
    • What is Java SE
    • Java Standard Edition: Basics
    • Java Standard Edition: Principles
    • Java MOOC Helsinki
    • Java MOOC Helsinki Syllabus

    • Java Create Project
    • Java SE: Maven
    • Java SE: Create Maven Project
    • Java SE: Project push GitHub
    • Java SE: JUnit and TDD

    • Java Concepts
    • Java SE: Class and Objects
    • Java SE: Scope
    • Java SE: static modifier
    • Java SE: Coupling and DDD
    • Java SE: Packages
    • Java SE: Abstract/Interface
    • Java SE: Java 8

    • Java Principles
    • Java SE: Encapsulation
    • Java SE: Abstraction
    • Java SE: Inherence
    • Java SE: Polymorphism

    • Java Design Patterns
    • Java Patterns: UML
    • Java Patterns: Types
    • Singleton
    • Factory
    • Abstract Factory
    • Builder
    • Facade
    • Bridge
    • Decorator
    • Composite
    • Observer
    • Strategy
    • State
    • Commander

    • Java SE Laboratories
    • Lab#SE00-1: Maven Person
    • Lab#SE00-2: Maven Clinic
    • Lab#SE00-3: Library Model
    • Lab#SE00-4: Abstract/Interface Human
    • Lab#SE01-1: Maven/Gradle Person and Account
    • Lab#SE01-2: Maven/Gradle Person and Account stored in JSON
    • Lab#SE02-1: Movie/Review, Model
    • Lab#SE02-2: Movie/Review, CRUD Operations
    • Lab#SE02-3: Movie/Review, factory
    • Lab#SE02-4: Movie/Review, interactivity and coupling
    • Lab#SE02-5: Movie/Review, simulate interactivity by console
    • Lab#SE03-1: Library/Book, Core-Model
    • Lab#SE03-2: Library/Book, Sprint Zero
    • Lab#SE03-3: Library/Book, Expand Model
    • Lab#SE04-1: healthyFood Restaurant, Core Model

    • Java SE readings
    • Java SE Resources
  • Python
    • Python Basics
    • Python: Basic Concepts
    • Python: Tips
  • JavaScript
    • JavaScript Basics
    • JavaScript: Basic Concepts
    • JavaScript: Tips
  • Spring
    • Spring Legacy
    • Spring Framework
    • Spring MVC
    • Springs Servlets

    • Spring Boot Basics
    • Spring Boot: fundamentals
    • Spring Boot: create a Project
    • Spring Boot: H2 DB and Thymeleaf
    • Spring Boot: cycle

    • Spring Boot Concepts
    • Spring Boot: Dependency Injection
    • Spring Boot: Annotations
    • Spring Boot: Controller
    • Spring Boot: View
    • Spring Boot: Thymeleaf
    • Spring Boot: Vaadin Flow
    • Spring Boot: Vaadin Hilla
    • Spring Boot: Model
    • Spring Boot: Rest
    • Spring Boot: Data & DB
    • Spring Boot: JPA & DI
    • Spring Boot: JPA Mappings
    • Spring Boot: JPA Relationships
    • Spring Boot: JPA Queries
    • Spring Boot: JPA Inherence
    • Spring Boot: Scaling

    • Spring Boot Laboratories
    • Lab#SB00-1: Library UML
    • Lab#SB00-2: CRUD User
    • Lab#SB00-3: LibraryManagement
    • Lab#SB00-4: API Rest
    • Lab#SB00-5: Rest & JPA-H2
    • Lab#SB00-6: Rest & MongoDB
    • Lab#SB00-7: Styling
    • Lab#SB01-1: DataBase
    • Lab#SB02-1: JPA Relationships
    • Lab#SB03-1: APIs & cloud
    • Lab#SB04-1: JPA Inherence
    • Lab#SB05-1: API Rest
    • Lab#SB06-1: employeeCourse
    • Lab#SB07-1: monitor Book
    • Lab#SB08-1: Restaurant UML
    • Lab#SB08-2: Vaadin
    • Lab#SB08-3: H2 and API Rest
    • Lab#SB08-4: JPA
    • Lab#SB08-5: Test API Rest
    • Lab#SB09-1: SpringIO Conference

    • Spring Boot readings
    • Spring Boot Resources
  • ReactJS
    • ReactJS: Principles
    • React JS: Introduction
    • React JS: render virtual DOM
    • React JS: Create a React project
    • React JS: Components
    • React JS: JSX
    • React JS: props and state

    • JavaScript: web scripting
    • JavaScript: basics
    • JavaScript: functions
    • JavaScript: objects
    • JavaScript: variables
    • JavaScript: flux control

    • ES6: ECMAScript 6
    • React JS ES6: arrow functions
    • React JS ES6: import modules
    • React JS ES6: array, data and key
    • React JS ES6: destructuring
    • React JS ES6: spread operator

    • ReacJS 18: Hooks
    • React JS: Rules of Hooks
    • ReactJS: useState
    • React JS: useReducer
    • React JS: useRef
    • React JS: useEffect
    • React JS: useContext
    • ReactJS: useMemo
    • ReactJS: custom hooks

    • ReactJS: Designing an App
    • React JS App: async
    • React JS App: events
    • React JS App: router
    • React JS App: conditional render
    • React JS App: styling

    • React JS: Laboratories
    • Lab#RE01-1: API Rest Axios
    • Lab#RE02-1: Router & Hooks
    • Lab#RE03-1: to-do app
    • Lab#RE03-2: HighCharts
    • Lab#RE03-3: API Rest Mono
    • Lab#RE03-4: API Rest Domains
    • Lab#RE03-5: data management
    • Lab#RE04-1: todo & server
    • Lab#RE04-2: Spring Boot & ReactJS
    • Lab#RE05-1: chat & websockets
    • Lab#RE05-2: chat: backend
    • Lab#RE05-3: chat & AWS
    • Lab#RE05-4: chat: test ws AWS
    • Lab#RE05-5: chat & front
    • Lab#RE05-6: chat & ws: front
    • Lab#RE06-1: healthyFood Restaurant
    • Lab#RE06-1-PR: create a pull request
    • Lab#RE07-1: traffic lights simulation

    • React JS readings
    • ReactJS Resources
  • Learning
    • Vocabulary
    • General Vocabulary
    • SCRUM Vocabulary
    • DevOps Vocabulary
    • Java SE Vocabulay
    • Spring Boot Vocabulary
    • DataBase Vocabulary
    • ReactJS Vocabulary
    • Web Vocabulary

    • Learning
    • Useful Questions
    • Learning: tips
    • Writing
    • Taking Notes
    • Comments
    • Document
    • Auto-Evaluate

    • Books & Articles
    • Books
    • Articles

    • What is SCRUM
    • SCRUM Agile Methodology
    • Agile Manifesto & Values
    • SCRUM Guide

    • Scrum Steps
    • Meetings, Impediments and Iterations
    • User stories, Tasks and Habits
    • Delivering Value & Communication
    • ScrumMaster, how it works
    • Mindset, the key to everything
    • Product Owner, how it works
    • Managing Time & Mind
    • Team & the Specialist
    • Albertus’ Dilemma
    • Before SCRUM
    • Team Dynamics
    • Emotions and Thoughts
    • Decision Making and Intuition
    • Beyond SCRUM
    • Balances, atmosphere and tools

    • Resources
    • SCRUM Resources
  • QGIS
    • QGIS basics
    • QGIS: basic concepts

    • QGIS laboratories
    • QGIS Laboratory 1: Introduction to Open Source GIS
  • ArcGIS Pro
    • ArcGIS Pro basics
    • ArcGIS Pro: basic concepts

    • ArcGIS Pro laboratories
    • ArcGIS Pro Laboratory 1: Getting Started
  • Bookmarks
    • Online Resources
    • Online Resources
  • About
    • About me and this site
    • About me
    • About this site
    • About images credit
  • Email
  • GitHub
  • LinkedIn
  1. Java SE Laboratories
  2. Lab#SE01-1: Maven/Gradle Person and Account
  • Java Standard Edition

  • What is Java SE
    • Java Standard Edition: Basics
    • Java Standard Edition: Principles
    • Java MOOC Helsinki
    • Java MOOC Helsinki Syllabus

  • Java Create Project
    • Java SE: Maven
    • Java SE: Create Maven Project
    • Java SE: Project push GitHub
    • Java SE: JUnit and TDD

  • Java Concepts
    • Java SE: Class and Objects
    • Java SE: Scope
    • Java SE: static modifier
    • Java SE: Coupling and DDD
    • Java SE: Packages
    • Java SE: Abstract/Interface
    • Java SE: Java 8

  • Java Principles
    • Java SE: Encapsulation
    • Java SE: Abstraction
    • Java SE: Inherence
    • Java SE: Polymorphism

  • Java Design Patterns
    • Java Patterns: UML
    • Java Patterns: Types
    • Creational
    • Singleton
    • Factory
    • Abstract Factory
    • Builder
    • Structural
    • Facade
    • Bridge
    • Decorator
    • Composite
    • Behavioral
    • Observer
    • Strategy
    • State
    • Commander

  • Java SE Laboratories
    • Lab#SE00-1: Maven Person
    • Lab#SE00-2: Maven Clinic
    • Lab#SE00-3: Library Model
    • Lab#SE00-4: Abstract/Interface Human

    • Lab#SE01-1: Maven/Gradle Person and Account
    • Lab#SE01-2: Maven/Gradle Person and Account stored in JSON

    • Lab#SE02-1: Movie/Review, Model
    • Lab#SE02-2: Movie/Review, CRUD Operations
    • Lab#SE02-3: Movie/Review, factory
    • Lab#SE02-4: Movie/Review, interactivity and coupling
    • Lab#SE02-5: Movie/Review, simulate interactivity by console

    • Lab#SE03-1: Library/Book, Core-Model
    • Lab#SE03-2: Library/Book, Sprint Zero
    • Lab#SE03-3: Library/Book, Expand Model

    • Lab#SE04-1: healthyFood Restaurant, Core Model

  • Java SE readings
    • Java SE Resources

On this page

  • 1 Overview
    • 1.1 Context
    • 1.2 Goal
    • 1.3 Tasks
    • 1.4 Optional
  • 2 Solving discussion
    • 2.1 Base Classes
    • 2.2 Person has Account
    • 2.3 Approach #1: Singleton
    • 2.4 Approach #2: all static-methods AccountManager
    • 2.5 Approach 3: Singleton, any static-method
    • 2.6 Test: AccountManagerTest
  • 3 Step-by-step
  • Edit this page
  • Report an issue
  1. Java SE Laboratories
  2. Lab#SE01-1: Maven/Gradle Person and Account

Lab#SE01-1: Maven/Gradle Person and Account

Java SE Lab

javase
lab
composition
singleton
Java SE Lab 01
Author

albertprofe

Published

Tuesday, June 1, 2021

Modified

Sunday, August 10, 2025

1 Overview

Create a Maven/Gradle Java SE Project with three classes and Junit to test objects and operations.

1.1 Context

  • In order to complete this project, you will need to have a basic understanding of the Java programming language, as well as some familiarity with Maven or Gradle for managing dependencies and building the project.
  • You will need to have a basic understanding of the Java programming language, as well as some familiarity with Maven or Gradle for managing dependencies and building the project.
  • Overall, this project will provide an opportunity for you to learn and apply the basics of Java programming, as well as gain experience with Maven or Gradle, JUnit, user input via the console and some discussion about composition and how classes work.
  • Additionally, you will need to have in mind that this project would center around a banking point of view.
  • By completing this project, you will have a starting foundation in these technologies and be able to build more complex and sophisticated Java applications in the future. You may go to Lab 2 (go Lab#SE01-2)

1.2 Goal

  • The goal of this project is to create three classes in Java (Person, Account and Manager) that implement different algorithms or data structures, and to test them using JUnit.
  • These classes could include, for example, creating new objects, a data structure for storing and manipulating data (List), or a utility class for performing common operations (static).

1.3 Tasks

The tasks involved in this project include: - Decide where your project will weight: Person or Account. - Creating a new Maven or Gradle project and setting up the project structure. - Modifying the project’s pom.xml or build.gradle file to import the necessary dependencies, including JUnit for testing. - Implementing the three required classes in Java, using appropriate algorithms and data structures. - Implementing as well two basic pattern-designs: singleton and composition. - Writing JUnit tests to verify that the classes work as expected. - You may attach the JUnit Test HTML results to documentation.

1.4 Optional

  • As an optional task, you could also consider allowing the user to input data via the console, rather than using hard-coded test data in your JUnit tests. This would allow you to test the classes with a variety of different input data, and to interact with the classes in a more dynamic way.
  • After implementing two basic pattern-designs: singleton, composition you may think about factory.

2 Solving discussion

2.1 Base Classes

Here, the Person class represents a person with a name, address and others. In the same way, Account class is a bank account. The AccountManager class contains static methods to perform withdrawal, transfer, and change pin operations on a Person and Account object.

public class Person {
  private String name;
  private String address;
  // Other properties for a Person...

  public Person(String name, String address) {
    this.name = name;
    this.address = address;
  }

  // Getters and setters for Person properties...
}

public class Account {
  private String accountNumber;
  private String pin;
  private double balance;
  // Other properties for an Account...

  public Account(String accountNumber, String pin, double balance) {
    this.accountNumber = accountNumber;
    this.pin = pin;
    this.balance = balance;
  }

  // Getters and setters for Account properties...
}
public class AccountManager {
    public static boolean withdrawal(Person person, double amount) {
        if (amount > 0 && amount <= person.getBalance()) {
            person.setBalance(person.getBalance() - amount);
            return true;
        }
        return false;
    }

    public static boolean transfer(Person sender, Person receiver, double amount) {
        if (amount > 0 && amount <= sender.getBalance()) {
            sender.setBalance(sender.getBalance() - amount);
            receiver.setBalance(receiver.getBalance() + amount);
            return true;
        }
        return false;
    }

    public static boolean changePin(Person person, String oldPin, String newPin) {
        if (person.getPin().equals(oldPin)) {
            person.setPin(newPin);
            return true;
        }
        return false;
    }
}

2.2 Person has Account

public class Person {
  private String name;
  private String surname;
  private int age;
  private Account account;

  public Person(String name, String surname, int age, Account account) {
    this.name = name;
    this.surname = surname;
    this.age = age;
    this.account = account;
  }

  public Account getAccount() {
    return this.account;
  }

  public void setAccount(Account account) {
    this.account = account;
  }
   // Getters and setters for Account properties...
}

classDiagram

class Person {
  -name: String
  -surname: String
  -age: int
  -account: Account
}

class Account {
  -accountNumber: String
  -pin: int
  -balance: double
}

Person *-- Account

sequenceDiagram

participant AccountManager as AccountManager
participant Account as Account
participant Person as Person

AccountManager->>Person: transfer(amount, sender, receiver)
Person->>Account: updateBalance(-amount, sender)
Person->>Account: updateBalance(-amount, receiver)
Account-->>Person: transferDone(receipt)
Person-->>AccountManager: transferDone(receipt)

2.3 Approach #1: Singleton

To use the Singleton design pattern with a Person and Account class, you could create a singleton AccountManager class that manages the creation and operations of the Person and Account objects.

The AccountManager class would have a private constructor, to prevent multiple instances from being created, and a static getInstance method that returns the singleton instance of the class.

The AccountManager class would then have methods for performing various operations on the Person and Account objects, such as transferring money between accounts, withdrawing money from an account, or changing the PIN for an account.

These methods would be implemented using the Person and Account classes, and would be accessible to other classes through the singleton AccountManager instance.

For example, you could define the AccountManager, Person, and Account classes as follows:

public class AccountManager {
  private static AccountManager instance;
  private Person person;
  private Account account;

  private AccountManager() {
    // Private constructor to prevent multiple instances
  }

  public static AccountManager getInstance() {
    if (instance == null) {
      instance = new AccountManager();
    }
    return instance;
  }

  public void transfer(Account from, Account to, double amount) {
    // Transfer money from one account to another
  }

  public void withdraw(Account account, double amount) {
    // Withdraw money from an account
  }

  public void changePin(Account account, String newPin) {
    // Change the PIN for an account
  }

  // Other methods for managing Person and Account objects...
}

To use the AccountManager class, other classes would simply need to call the getInstance method to obtain the singleton instance of the class, and then use the instance’s methods to perform operations on the Person and Account objects. For example:

// Create a new Person and Account
// be careful: where will these four Person objects go? 
AccountManager manager = AccountManager.getInstance();
manager.person = new Person("John Doe", "123 Main St.");
manager.person = new Person("Carla Jameson", "323 Main St.");
manager.person = new Person("Rafael Martin", "3 Glorious St.");
manager.person = new Person("Pau Vila", "63 Sesamo St.");

But maybe, this is not the best approach for several reasons …

2.4 Approach #2: all static-methods AccountManager

It may work as follows. In fact, if we want to manage accounts (as a banking-centered problem, not a person-centered one), it could be better that Account has Person:

classDiagram

class Person {
  -name: String
  -surname: String
  -age: int
}

class Account {
  -accountNumber: String
  -pin: int
  -balance: double
  -person: Person
}

Account *-- Person

public class Account {
  private Person person;
  //other fields

  public Account(Person person) {
    this.person = person;
  }

  public Person getPerson() {
    return this.person;
  }

  public void setPerson(Person person) {
    this.person = person;
    
    //constructor, getters, setters and methods
  }
}

So, in this case, we could use a List object to save all the Account objects with the list:

import java.util.List;
import java.util.ArrayList;

public class AccountManager {
  private List<Account> accounts;

  private AccountManager() {
    this.accounts = new ArrayList<>();
  }

  public List<Account> getAccounts() {
    return this.accounts;
  }

  // we should manage how to add/remove accounts to/from accounts list

  public static void deposit(Account account, double amount) {
    // Code to deposit the specified amount to the account
  }

  public static void changePin(Account account, int newPin) {
    // Code to change the PIN of the specified account
  }

  public static void transfer(Account fromAccount, Account toAccount, double amount) {
    // Code to transfer the specified amount from the fromAccount to the toAccount
  }
  
  public static void withdrawal(Account account, double amount) {
    // Code to withdraw the specified amount from the given account
  }
}

2.5 Approach 3: Singleton, any static-method

In this approach:

  • Account has Person
  • AccountManager is Singleton and there is no static-methods anywhere
  • and we create just one object form AccountManager to manage accounts
import java.util.List;
import java.util.ArrayList;

public class AccountManager {
  private static AccountManager manager = new AccountManager();
  private List<Account> accounts;

  // we should manage how to add/remove accounts to/from accounts list

  private AccountManager() {
    this.accounts = new ArrayList<>();
  }

  public static AccountManager getInstance() {
    return manager;
  }

  public List<Account> getAccounts() {
    return this.accounts;
  }

  public  void deposit(Account account, double amount) {
    // Code to deposit the specified amount to the account
  }

  public  void changePin(Account account, int newPin) {
    // Code to change the PIN of the specified account
  }

  public  void transfer(Account fromAccount, Account toAccount, double amount) {
    // Code to transfer the specified amount from the fromAccount to the toAccount
  }
  
  public  void withdrawal(Account account, double amount) {
    // Code to withdraw the specified amount from the given account
  }
}

2.6 Test: AccountManagerTest

AccountManagerTest could be like this:

  • with AccountManager all static-methods no-singleton
  • Account has Person
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class AccountManagerTest {
  @Test
  public void testDeposit() {
    Account account = new Account(new Person("John Doe"));
    double initialBalance = account.getBalance();
    double depositAmount = 100.00;

    AccountManager.deposit(account, depositAmount);
    double finalBalance = account.getBalance();

    assertEquals(initialBalance + depositAmount, finalBalance);
  }

  @Test
  public void testChangePin() {
    Account account = new Account(new Person("John Doe"));
    int initialPin = account.getPin();
    int newPin = 1234;

    AccountManager.changePin(account, newPin);
    int finalPin = account.getPin();

    assertEquals(newPin, finalPin);
  }

  @Test
  public void testTransfer() {
    Account fromAccount = new Account(new Person("John Doe"));
    Account toAccount = new Account(new Person("Jane Doe"));
    double initialFromAccountBalance = fromAccount.getBalance();
    double initialToAccountBalance = toAccount.getBalance();
    double transferAmount = 100.00;

    AccountManager.transfer(fromAccount, toAccount, transferAmount);
    double finalFromAccountBalance = fromAccount.getBalance();
    double finalToAccountBalance = toAccount.getBalance();

    assertEquals(initialFromAccountBalance - transferAmount, finalFromAccountBalance);
    assertEquals(initialToAccountBalance + transferAmount, finalToAccountBalance);
  }
  
  @Test
  public void testWithdrawal() {
    Account fromAccount = new Account(new Person("John Doe"));
    Account toAccount = new Account(new Person("Jane Doe"));
    double initialFromAccountBalance = fromAccount.getBalance();
    double withdrawalAmount = 100.00;

    AccountManager.withdrawal(fromAccount, withdrawalAmount);
    double finalFromAccountBalance = fromAccount.getBalance();

    assertEquals(initialFromAccountBalance - withdrawalAmount, finalFromAccountBalance);
  }
}

3 Step-by-step

  1. Create Maven Project with JUnit
  2. Create Person class
  3. Create Account class
  4. Test Person and Account objects
  5. Write operations (withdrawal, transfer,change pin) as a static methods in AccountManager
  6. Test Person and Account objects and features
  7. Add singleton pattern to AccountManager class
  8. Test AccountManager class
Back to top
Lab#SE01-2: Maven/Gradle Person and Account stored in JSON

This website is built with Quarto.

Difficulties are just things to overcome, after all. Ernest Shackleton

  • Edit this page
  • Report an issue