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.

What Is the Difference Between Artificial Intelligence and Machine Learning?

  What Is the Difference Between Artificial Intelligence and Machine Learning? In today’s digital world, terms like Artificial Intelligence...