Monday, December 8, 2025

Java programming new version coding

 

Java programming new version coding

Java programming


A) More Java versions

1) File-handling version (reads CP/SP from a CSV, writes results)

ProfitLossFileIO.java

import java.io.*;
import java.nio.file.*;
import java.util.*;

public class ProfitLossFileIO {

    public static void main(String[] args) 
throws IOException {
        Path input = Paths.get("input.csv"); 
  // format: cp,sp per line
        Path output = Paths.get("output.csv");
 // format: cp,sp,type,amount,percent

        try (BufferedReader br = 
Files.newBufferedReader(input);
             BufferedWriter bw = 
Files.newBufferedWriter(output)) {

            bw.write("cp,sp,type,
amount,percent");
            bw.newLine();

            String line;
            while ((line = br.readLine())
 != null) {
                line = line.trim();
                if (line.isEmpty()) continue;
                String[] parts = 
line.split(",");
                double cp =
 Double.parseDouble(parts[0]);
                double sp = 
Double.parseDouble(parts[1]);

                String type;
                double amount = 
Math.abs(sp - cp);
                double percent = 
cp == 0 ? 0.0 : (amount / cp) * 100.0;

                if (sp > cp) type = "profit";
                else if (cp > sp) 
type = "loss";
                else
 { type = "no-profit-no-loss"; 
amount = 0; percent = 0; }

                bw.write(String.format
(Locale.ROOT, "%.2f,%.2f,%s,%.2f,%.2f",
 cp, sp, type, amount, percent));
                bw.newLine();
            }
        } catch (NoSuchFileException e) {
            System.err.println
("Input file not found: input.csv");
        } catch (NumberFormatException e)
 {
            System.err.println
("Invalid number in CSV: " + e.getMessage());
        }
    }
}

2) Exception-handling enhanced version

ProfitLossSafe.java

import java.util.Scanner;

public class ProfitLossSafe {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        try {
            System.out.print("Enter CP: ");
            double cp = 
Double.parseDouble(sc.nextLine().trim());
            System.out.print("Enter SP: ");
            double sp = 
Double.parseDouble(sc.nextLine().trim());

            if (cp < 0 || sp < 0)
 throw new IllegalArgumentException
("Prices cannot be negative");
            if (cp == 0 && sp != 0)
 System.out.println("Warning:
 CP zero — percent calculation not 
meaningful.");

            double amount = Math.abs(sp - cp);
            double percent =
 cp == 0 ? 0.0 : (amount/cp)*100.0;
            String result = 
sp > cp ? "Profit" : cp > sp ?
 "Loss" : "No Profit No Loss";
            System.out.printf
("%s: %.2f (%.2f%%)%n", result,
 amount, percent);

        } catch (NumberFormatException e) {
            System.err.println
("Please enter valid numeric values.");
        } catch (IllegalArgumentException e)
 {
            System.err.println("Error:
 " + e.getMessage());
        } finally {
            sc.close();
        }
    }
}

3) OOP + Interface version

Trade.java (interface)

public interface Trade {
    double getCP();
    double getSP();
    Result calculate();
    class Result {
        public final String type;
        public final double amount;
        public final double percent;
        public Result(String
 type,double amount,double percent)
{this.type=type;this.amount=amount;
this.percent=percent;}
    }
}

SimpleTrade.java

public class SimpleTrade implements Trade {
    private final double cp, sp;
    public SimpleTrade(double cp,
 double sp){ this.cp=cp; this.sp=sp; }
    public double getCP(){return cp;}
    public double getSP(){return sp;}
    public Result calculate(){
        if (cp == sp) return new 
Result("no-profit-no-loss",0,0);
        boolean isProfit = sp > cp;
        double amount = Math.abs(sp-cp);
        double percent = cp==0?0:
(amount/cp)*100;
        return new Result(isProfit?
"profit":"loss", amount, percent);
    }
}

Usage in Main.java:

public class Main {
    public static void main(String[] args) {
        Trade t = new SimpleTrade(500,650);
        Trade.Result r = t.calculate();
        System.out.println(r.type +
 " " + r.amount + " " + r.percent);
    }
}

4) Improved Spring Boot REST (notes)

You already have a working Spring Boot service from before. Suggested additions:

  • Add @CrossOrigin on controllers for Android/web dev.
  • Add validation error handler @ControllerAdvice.
  • Add metrics and actuator if desired.

B) Android features (implemented / scaffolded)

I prepared an MVVM Android project earlier. Now the requested features:

1) Room database (local history)

Add to app/build.gradle:

implementation "androidx.room:
room-runtime:2.6.1"
kapt "androidx.room:room-compiler:2.6.1"
implementation "androidx.room:room-ktx:2.6.1"

Entity CalculationEntity.kt

@Entity(tableName = "calculations")
data class CalculationEntity(
  @PrimaryKey(autoGenerate = true)
 val id: Long = 0,
  val cp: Double, val sp: Double,
 val type: String, val amount:
 Double, val percent: Double, val
 createdAt: Long = System.currentTimeMillis()
)

DAO CalculationDao.kt

@Dao
interface CalculationDao {
  @Insert suspend fun insert
(calc: CalculationEntity): Long
  @Query("SELECT * FROM
 calculations ORDER BY createdAt DESC") 
fun getAll(): Flow<List<CalculationEntity>>
  @Query("DELETE FROM calculations")
 suspend fun clearAll()
}

Database AppDatabase.kt

@Database(entities = 
[CalculationEntity::class], version = 1)
abstract class AppDatabase : 
RoomDatabase() {
  abstract fun calculationDao():
 CalculationDao
}

Repository should insert API result + local DB entry. ViewModel exposes history LiveData by collecting Flow.

2) MPAndroidChart (charts)

Add:

implementation 'com.github.
PhilJay:MPAndroidChart:v3.1.0'

Create a LineChart in layout and transform stored CalculationEntity into Entry list (x=timestamp, y=amount or percent) then call LineDataSet and chart.data = LineData(set) and chart.invalidate().

3) Dark mode

Add values-night/colors.xml and use AppCompatDelegate.

setDefaultNightMode(AppCompatDelegate.

MODE_NIGHT_FOLLOW_SYSTEM) in Application.onCreate().

4) Simple authentication (local PIN)

  • Add SharedPreferences to store hashed PIN.
  • Create LoginActivity with PIN input; if not set, open SetupPinActivity.
  • After successful login navigate to main.

5) Multi-screen app (Home → Calculate → History)

  • HomeActivity: buttons to go to CalculateActivity and HistoryActivity.
  • CalculateActivity: inputs + call ViewModel (already done).
  • HistoryActivity: RecyclerView that observes DB Flow and shows entries.

I can paste full activities if you want one-by-one — tell me which screen code you want fully.

C) DevOps & Deployment

I already created Docker, docker-compose, k8s manifests, and GitHub Actions earlier. Here are additional requested items:

1) Helm Chart (minimal)

helm-chart/Chart.yaml

apiVersion: v2
name: profitloss
version: 0.1.0

helm-chart/values.yaml

replicaCount: 2
image:
  repository: your-registry/profitloss
-service
  tag: latest
service:
  type: ClusterIP
  port: 80
mysql:
  enabled: false
env:
  SPRING_DATASOURCE_URL: jdbc:mysql:
//mysql:3306/profitlossdb?useSSL=
false&serverTimezone=UTC

helm-chart/templates/deployment.

yaml (templated image/env)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ include "profitloss.fullname" . }}
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    spec:
      containers:
        - name: app
          image: "{{ .Values.image.
repository }}:{{ .Values.image.tag }}"
          env:
            - name: SPRING_DATASOURCE_URL
              value: {{ .
Values.env.SPRING_DATASOURCE_URL | quote }}

(You can expand with Secrets, Service, HPA templates.)

2) Terraform (AWS ECS Fargate example stub)

main.tf (very high-level)

provider "aws" { region = "us-east-1" }
resource "aws_ecs_cluster" "profitloss"
 { name = "profitloss-cluster" }
# define task, service, load balancer, 
and ECR repo — this is a stub; I'll
 expand if you want.

3) Jenkins pipeline (Jenkinsfile)

pipeline {
  agent any
  environment {
    IMAGE = "your-registry/profitloss-
service:${env.BUILD_NUMBER}"
  }
  stages {
    stage('Checkout') { steps 
{ checkout scm } }
    stage('Build') { steps
 { sh './mvnw -B -DskipTests package' } }
    stage('Unit tests') { steps
 { sh './mvnw test' } }
    stage('Docker Build & Push') {
      steps {
        withCredentials([usernamePassword
(credentialsId: 'docker-creds', 
usernameVariable: 'USERNAME', 
passwordVariable: 'PASSWORD')]) {
          sh "docker login -u
 $USERNAME -p $PASSWORD"
          sh "docker build -t $IMAGE ."
          sh "docker push $IMAGE"
        }
      }
    }
    stage('Deploy to K8s') {
      steps {
        withCredentials([file
(credentialsId: 'kubeconfig',
 variable: 'KUBECONFIG_FILE')]) {
          sh 'kubectl --
kubeconfig=$KUBECONFIG_FILE set
 image deployment/profitloss-app
 profitloss-app=' + IMAGE
        }
      }
    }
  }
}

D) Web Frontend versions

1) React app (Create React App skeleton)

App.js

import React, {useState} from 'react';

function App(){
  const [cp,setCp]=useState(''); 
const [sp,setSp]=useState('');
  const [res,setRes]=useState(null);

  const calculate = async () => {
    const cpn = parseFloat(cp),
 spn = parseFloat(sp);
    if (isNaN(cpn)||isNaN(spn)) 
{ setRes({error: 'Enter valid numbers'});
 return; }
    // local calc:
    const amount = Math.abs(spn-cpn);
    const percent = cpn===0?0:amount/cpn*100;
    const type = spn>cpn? 'profit' 
: cpn>spn? 'loss' : 'no-profit-no-loss';
    setRes({type, amount, percent});
    // optionally POST to backend:
    // await fetch('/api/calculate', {...})
  };

  return (
    <div style={{padding:20}}>
      <h1>Profit & Loss</h1>
      <input value={cp}
 onChange={e=>setCp(e.target.value)}
 placeholder="Cost Price"/>
      <input value={sp} 
onChange={e=>setSp(e.target.value)}
 placeholder="Selling Price"/>
      <button onClick={calculate}>
Calculate</button>
      {res && <div>
        {res.error ? <p style=
{{color:'red'}}>{res.error}</p> :
          <p>{res.type} — 
{res.amount.toFixed(2)}
 ({res.percent.toFixed(2)}%)</p>}
      </div>}
    </div>
  );
}

export default App;

2) Plain HTML/CSS/JS (single file)

index.html

<!doctype html>
<html>
<body>
  <h2>Profit & Loss</h2>
  CP: <input id="cp"><br>
  SP: <input id="sp"><br>
  <button onclick="calc()">Calc</button>
  <div id="out"></div>
  <script>
    function calc(){
      const cp = parseFloat
(document.getElementById('cp').value);
      const sp = parseFloat
(document.getElementById('sp').value);
      if (isNaN(cp)||isNaN(sp)
){ document.getElementById('out').
innerText='Enter numbers'; return; }
      const amt = Math.abs(sp-cp);
      const pct = cp===0?0:(amt/cp)*100;
      const type = sp>cp? 'Profit'
 : cp>sp? 'Loss' : 'No Profit';
      document.getElementById('out').
innerText = `${type}: ${amt.toFixed(2)}
 (${pct.toFixed(2)}%)`;
    }
  </script>
</body>
</html>

3) Vue.js quick component (single-file)

ProfitLoss.vue

<template>
  <div>
    <input v-model="cp" placeholder="CP"/>
    <input v-model="sp" placeholder="SP"/>
    <button @click="calc">Calc</button>
    <div v-if="res">{{res.type}}
 — {{res.amount}} ({{res.percent}}%)</div>
  </div>
</template>
<script>
export default {
  data(){return {cp:'',sp:'',res:null}},
  methods:{
    calc(){
      const cpn=parseFloat(this.cp),
 spn=parseFloat(this.sp);
      if(isNaN(cpn)||isNaN(spn)
){this.res={type:'err',amount:
0,percent:0};return;}
      const amt = Math.abs(spn-cpn);
      const pct = cpn===0?0:(amt/cpn)*100;
      const type = spn>cpn?'
profit':cpn>spn?'loss':'no-profit';
      this.res={type,amount:amt.
toFixed(2),percent:pct.toFixed(2)};
    }
  }
}
</script>

E) Documentation

1) Project README (concise)

README.md (core parts)

# ProfitLoss Service & Apps

## What
A full-stack project for
 computing Profit / Loss:
- Spring Boot REST API (MySQL persistence)
- Docker, Kubernetes, Helm,
 Terraform stubs, GitHub Actions
 & Jenkins pipelines
- Android app (Kotlin MVVM +
 Retrofit + Room + Charts)
- Web frontends: React, Vue, plain HTML

## Quick start (Docker Compose)
1. Copy `application.properties` 
credentials or use env variables.
2. Run: `docker compose up --build`
3. API at: http://localhost:8080
/api/calculate

## Endpoints
- POST /api/calculate { cp, sp }
- GET /api/calculation/{id}

## Dev
- Build: `./mvnw -DskipTests package`
- Tests: `./mvnw test`
- Docker build: `docker build -t 
your-registry/profitloss:latest .`

## Author
Generated by ChatGPT. Adjust
 configs/secrets before production.

2) Simple UML (ASCII class diagram)

+----------------+        +----------------+
| CalculationDTO |        | CalculationEntity |
| - cp: double   |        | - id: long       |
| - sp: double   |        | - cp,sp,type...  |
+----------------+        +----------------+
         ^                        ^
         |                        |
   +-----------+            +-----------+
   | Controller| ---------- | Repository|
   +-----------+            +-----------+
         |
     Service

3) API docs / OpenAPI

I provided openapi.yaml earlier. Add springdoc-openapi to Spring Boot for automatic Swagger UI.

Java programming new version coding

  Java programming new version coding A) More Java versions 1) File-handling version (reads CP/SP from a CSV, writes results) ProfitLos...