Copy cat > /tmp/AdvLab15.java << 'JAVAEOF'
import java.sql.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.stream.*;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.*;
import java.lang.reflect.*;
public class AdvLab15 {
// Sealed ADT for orders
sealed interface OrderEvent permits OrderEvent.Placed, OrderEvent.Fulfilled, OrderEvent.Failed {
record Placed(int id, String product, int qty, double total) implements OrderEvent {}
record Fulfilled(int id, long processingMs) implements OrderEvent {}
record Failed(int id, String reason) implements OrderEvent {}
}
// Payment crypto
static final SecretKey AES_KEY;
static { try { var kg = KeyGenerator.getInstance("AES"); kg.init(256); AES_KEY = kg.generateKey(); }
catch (Exception e) { throw new RuntimeException(e); } }
static String encryptPayment(String cc) throws Exception {
byte[] iv = new byte[12]; new SecureRandom().nextBytes(iv);
var cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.ENCRYPT_MODE, AES_KEY, new GCMParameterSpec(128, iv));
byte[] enc = cipher.doFinal(cc.getBytes());
byte[] combined = new byte[iv.length + enc.length];
System.arraycopy(iv, 0, combined, 0, iv.length);
System.arraycopy(enc, 0, combined, iv.length, enc.length);
return Base64.getEncoder().encodeToString(combined);
}
static String decryptPayment(String b64) throws Exception {
byte[] combined = Base64.getDecoder().decode(b64);
byte[] iv = Arrays.copyOf(combined, 12);
byte[] enc = Arrays.copyOfRange(combined, 12, combined.length);
var cipher = Cipher.getInstance("AES/GCM/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, AES_KEY, new GCMParameterSpec(128, iv));
return new String(cipher.doFinal(enc));
}
// OrderService interface + implementation
interface OrderService {
int placeOrder(String product, int qty, double price, String region);
List<Map<String,Object>> getWindowReport(Connection conn) throws Exception;
}
static class OrderServiceImpl implements OrderService {
private final Connection conn;
private final AtomicInteger seq = new AtomicInteger(1000);
OrderServiceImpl(Connection c) { this.conn = c; }
@Override public int placeOrder(String product, int qty, double price, String region) {
int id = seq.incrementAndGet();
try (var ps = conn.prepareStatement(
"INSERT INTO orders(id,product,qty,total,region) VALUES(?,?,?,?,?)")) {
ps.setInt(1,id); ps.setString(2,product); ps.setInt(3,qty);
ps.setDouble(4, Math.round(price*qty*100)/100.0); ps.setString(5,region);
ps.executeUpdate();
conn.commit();
} catch (Exception e) { try { conn.rollback(); } catch (Exception ignored) {} }
return id;
}
@Override public List<Map<String,Object>> getWindowReport(Connection conn) throws Exception {
var result = new ArrayList<Map<String,Object>>();
var rs = conn.createStatement().executeQuery(
"SELECT product, SUM(total) as revenue," +
" RANK() OVER(ORDER BY SUM(total) DESC) as rnk," +
" ROUND(SUM(total)*100.0/(SELECT SUM(total) FROM orders),1) as pct" +
" FROM orders GROUP BY product ORDER BY rnk");
while (rs.next()) result.add(Map.of("product", rs.getString("product"),
"revenue", rs.getDouble("revenue"), "rank", rs.getInt("rnk"), "pct", rs.getDouble("pct")));
return result;
}
}
// Audit proxy
static OrderService auditProxy(OrderService svc) {
var log = Collections.synchronizedList(new ArrayList<String>());
var proxy = (OrderService) Proxy.newProxyInstance(
svc.getClass().getClassLoader(),
new Class[]{OrderService.class},
(p, method, args) -> {
long t0 = System.nanoTime();
try {
var result = method.invoke(svc, args);
long ms = (System.nanoTime()-t0)/1_000_000;
log.add("[AUDIT] %s(%s) -> %s (%dms)".formatted(
method.getName(),
args == null ? "" : Arrays.stream(args).map(Object::toString).collect(Collectors.joining(",")),
result, ms));
return result;
} catch (InvocationTargetException e) {
log.add("[AUDIT] %s FAILED: %s".formatted(method.getName(), e.getCause().getMessage()));
throw e.getCause();
}
});
// Store log ref for printing
((Object[])new Object[]{log})[0] = log;
// Expose log via thread-local hack → simpler: return wrapper
return new OrderService() {
@Override public int placeOrder(String pr, int qty, double price, String region) {
try { return (int) ((java.lang.reflect.Proxy)proxy)
.getClass().getMethod("placeOrder",String.class,int.class,double.class,String.class)
.invoke(proxy, pr, qty, price, region); }
catch (Exception e) { return -1; }
}
@Override public List<Map<String,Object>> getWindowReport(Connection conn) throws Exception {
return ((OrderService)proxy).getWindowReport(conn);
}
public List<String> auditLog() { return log; }
};
}
// ForkJoin analytics
static class RevenueAnalyzer extends RecursiveTask<Double> {
private final List<Map<String,Object>> orders; private final int lo, hi;
RevenueAnalyzer(List<Map<String,Object>> orders, int lo, int hi) {
this.orders=orders; this.lo=lo; this.hi=hi; }
@Override protected Double compute() {
if (hi-lo <= 50) {
return orders.subList(lo,hi).stream()
.mapToDouble(m -> (Double)m.get("total")).sum();
}
int mid = (lo+hi)/2;
var left = new RevenueAnalyzer(orders,lo,mid);
var right = new RevenueAnalyzer(orders,mid,hi);
left.fork();
return right.compute() + left.join();
}
}
public static void main(String[] args) throws Exception {
// Setup SQLite
Class.forName("org.sqlite.JDBC");
var conn = DriverManager.getConnection("jdbc:sqlite::memory:");
conn.setAutoCommit(false);
conn.createStatement().executeUpdate(
"CREATE TABLE orders(id INTEGER PRIMARY KEY, product TEXT, qty INTEGER, total REAL, region TEXT)");
conn.commit();
var svcImpl = new OrderServiceImpl(conn);
var auditSvc = auditProxy(svcImpl);
// Virtual threads: 50 concurrent orders
System.out.println("=== Virtual Threads: 50 Concurrent Orders ===");
var executor = Executors.newVirtualThreadPerTaskExecutor();
String[] products = {"Surface Pro","Surface Pen","Office 365","USB-C Hub","Surface Book"};
double[] prices = {864.0, 49.99, 99.99, 29.99, 1299.0};
String[] regions = {"North","South","East","West"};
var rng = new Random(42);
var futures = new ArrayList<Future<Integer>>();
for (int i = 0; i < 50; i++) {
int idx = rng.nextInt(5);
int qty = rng.nextInt(5)+1;
String region = regions[rng.nextInt(4)];
futures.add(executor.submit(() ->
svcImpl.placeOrder(products[idx], qty, prices[idx], region)));
}
var orderIds = futures.stream().map(f -> { try { return f.get(); } catch (Exception e) { return -1; } }).toList();
executor.shutdown();
System.out.println(" Placed " + orderIds.stream().filter(id->id>0).count() + "/50 orders successfully");
// AES-GCM payment encryption
System.out.println("\n=== AES-256-GCM Payment Encryption ===");
String cc = "4111-1111-1111-1111:12/28:123";
String encrypted = encryptPayment(cc);
String decrypted = decryptPayment(encrypted);
System.out.println(" Original: " + cc);
System.out.println(" Encrypted: " + encrypted.substring(0,32) + "...");
System.out.println(" Decrypted: " + decrypted);
System.out.println(" Match: " + cc.equals(decrypted));
// ForkJoin analytics
System.out.println("\n=== ForkJoinPool: Parallel Revenue Analytics ===");
var rs = conn.createStatement().executeQuery("SELECT product, qty, total, region FROM orders");
var allOrders = new ArrayList<Map<String,Object>>();
while (rs.next()) allOrders.add(Map.of(
"product", rs.getString("product"),
"qty", rs.getInt("qty"), "total", rs.getDouble("total")));
double fjTotal = ForkJoinPool.commonPool().invoke(new RevenueAnalyzer(allOrders, 0, allOrders.size()));
double seqTotal = allOrders.stream().mapToDouble(m->(Double)m.get("total")).sum();
System.out.printf(" ForkJoin total: $%,.2f%n", fjTotal);
System.out.printf(" Seq total: $%,.2f%n", seqTotal);
System.out.printf(" Match: %b%n", Math.abs(fjTotal-seqTotal) < 0.01);
// Window function report
System.out.println("\n=== SQL Window Functions: Revenue Report ===");
var report = svcImpl.getWindowReport(conn);
report.forEach(row -> System.out.printf(" #%-2d %-15s $%,9.2f (%.1f%%)%n",
row.get("rank"), row.get("product"), row.get("revenue"), row.get("pct")));
// Summary
System.out.println("\n=== Service Summary ===");
var totals = conn.createStatement().executeQuery(
"SELECT COUNT(*) orders, SUM(total) revenue, COUNT(DISTINCT product) products, COUNT(DISTINCT region) regions FROM orders");
System.out.printf(" Orders: %d Revenue: $%,.2f Products: %d Regions: %d%n",
totals.getInt(1), totals.getDouble(2), totals.getInt(3), totals.getInt(4));
conn.close();
}
}
JAVAEOF
docker run --rm -v /tmp/AdvLab15.java:/tmp/AdvLab15.java zchencow/innozverse-java:latest sh -c "
mvn dependency:get -Dartifact=org.xerial:sqlite-jdbc:3.47.0.0 -Dmaven.repo.local=/tmp/repo -q 2>/dev/null
JDBC=/tmp/repo/org/xerial/sqlite-jdbc/3.47.0.0/sqlite-jdbc-3.47.0.0.jar
javac -cp \$JDBC /tmp/AdvLab15.java -d /tmp && java -cp /tmp:\$JDBC AdvLab15"