alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

Glassfish example source code file (RosterBean.java)

This example Glassfish source code file (RosterBean.java) is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Java - Glassfish tags/keywords

arraylist, arraylist, collection, collection, ejb, exception, exception, iterator, leaguedetails, localleague, localplayer, localteam, naming, rosterbean, rosterbean, servlet, string, util, web

The Glassfish RosterBean.java source code

/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright (c) 2001-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * The contents of this file are subject to the terms of either the GNU
 * General Public License Version 2 only ("GPL") or the Common Development
 * and Distribution License("CDDL") (collectively, the "License").  You
 * may not use this file except in compliance with the License.  You can
 * obtain a copy of the License at
 * https://glassfish.dev.java.net/public/CDDL+GPL_1_1.html
 * or packager/legal/LICENSE.txt.  See the License for the specific
 * language governing permissions and limitations under the License.
 *
 * When distributing the software, include this License Header Notice in each
 * file and include the License file at packager/legal/LICENSE.txt.
 *
 * GPL Classpath Exception:
 * Oracle designates this particular file as subject to the "Classpath"
 * exception as provided by Oracle in the GPL Version 2 section of the License
 * file that accompanied this code.
 *
 * Modifications:
 * If applicable, add the following below the License Header, with the fields
 * enclosed by brackets [] replaced by your own identifying information:
 * "Portions Copyright [year] [name of copyright owner]"
 *
 * Contributor(s):
 * If you wish your version of this file to be governed by only the CDDL or
 * only the GPL Version 2, indicate your decision by adding "[Contributor]
 * elects to include this software in this distribution under the [CDDL or GPL
 * Version 2] license."  If you don't indicate a single choice of license, a
 * recipient has the option to distribute your version of this file under
 * either the CDDL, the GPL Version 2 or to extend the choice of license to
 * its licensees as provided above.  However, if you add GPL Version 2 code
 * and therefore, elected the GPL Version 2 license, then the option applies
 * only if the new code is made subject to such option by the copyright
 * holder.
 */

package roster;

import java.util.*;
import javax.ejb.*;
import javax.ejb.*;
import javax.naming.*;
import util.*;
import team.*;

public class RosterBean implements SessionBean {

    private  LocalPlayerHome playerHome = null;
    private  LocalTeamHome teamHome = null;
    private  LocalLeagueHome leagueHome = null;

    // Player business methods

    public ArrayList testFinder(String parm1, String parm2,
        String parm3) {

        Debug.print("RosterBean testFinder");
        Collection players = null;

        try {
            players = playerHome.findByTest(parm1, parm2, parm3);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    }

    public void createPlayer(PlayerDetails details) { 
 
        Debug.print("RosterBean createPlayer");
        try {
            LocalPlayer player = playerHome.create(details.getId(), 
                details.getName(), details.getPosition(), details.getSalary());
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
    }
 
    public void addPlayer(String playerId, String teamId) { 
 
        Debug.print("RosterBean addPlayer");
        try {
            LocalTeam team = teamHome.findByPrimaryKey(teamId);
            LocalPlayer player = playerHome.findByPrimaryKey(playerId);
            team.addPlayer(player);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
    }

    public void removePlayer(String playerId) { 

        Debug.print("RosterBean removePlayer");
        try {
            LocalPlayer player = playerHome.findByPrimaryKey(playerId);
            player.remove();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
    }
 
    public void dropPlayer(String playerId, String teamId) {

        Debug.print("RosterBean dropPlayer");
        try {
            LocalPlayer player = playerHome.findByPrimaryKey(playerId);
            LocalTeam team = teamHome.findByPrimaryKey(teamId);
            team.dropPlayer(player);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
    }

    public PlayerDetails getPlayer(String playerId) {

        Debug.print("RosterBean getPlayer");
        PlayerDetails playerDetails = null;
        try {
            LocalPlayer player = playerHome.findByPrimaryKey(playerId);
            playerDetails = new PlayerDetails(playerId,
                player.getName(), player.getPosition(), player.getSalary());
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        return playerDetails;
    } // getPlayer


    public ArrayList getPlayersOfTeam(String teamId) { 

        Debug.print("RosterBean getPlayersOfTeam");
        Collection players = null;
        try {
            LocalTeam team = teamHome.findByPrimaryKey(teamId);
            players = team.getPlayers();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersOfTeam


    public ArrayList getPlayersOfTeamCopy(String teamId) { 

        Debug.print("RosterBean getPlayersOfTeamCopy");
        ArrayList playersList = null;

        try {
            LocalTeam team = teamHome.findByPrimaryKey(teamId);
            playersList = team.getCopyOfPlayers();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return playersList;

    } // getPlayersOfTeamCopy


    public ArrayList getTeamsOfLeague(String leagueId) { 

        Debug.print("RosterBean getTeamsOfLeague");

        ArrayList detailsList = new ArrayList();
        Collection teams = null;

        try {
            LocalLeague league = leagueHome.findByPrimaryKey(leagueId);
            teams = league.getTeams();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        Iterator i = teams.iterator();
        while (i.hasNext()) {
            LocalTeam team = (LocalTeam) i.next();
            TeamDetails details = new TeamDetails(team.getTeamId(),
                team.getName(), team.getCity());
            detailsList.add(details);
        }

        return detailsList;
    } // getTeamsOfLeague


    public ArrayList getPlayersByPosition(String position) {

        Debug.print("RosterBean getPlayersByPosition");
        Collection players = null;

        try {
            players = playerHome.findByPosition(position);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersByPosition


    public ArrayList getPlayersByHigherSalary(String name) { 

        Debug.print("RosterBean getPlayersByByHigherSalary");
        Collection players = null;

        try {
            players = playerHome.findByHigherSalary(name);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersByHigherSalary

    public ArrayList getPlayersBySalaryRange(double low, double high) { 

        Debug.print("RosterBean getPlayersBySalaryRange");
        Collection players = null;

        try {
            players = playerHome.findBySalaryRange(low, high);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersBySalaryRange

    public ArrayList getPlayersByLeagueId(String leagueId) { 

        Debug.print("RosterBean getPlayersByLeagueId");
        Collection players = null;

        try {
            LocalLeague league = leagueHome.findByPrimaryKey(leagueId);
            players = playerHome.findByLeague(league);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersByLeagueId

    public ArrayList getPlayersBySport(String sport) { 

        Debug.print("RosterBean getPlayersBySport");
        Collection players = null;

        try {
            players = playerHome.findBySport(sport);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersBySport

    public ArrayList getPlayersByCity(String city) { 

        Debug.print("RosterBean getPlayersByCity");
        Collection players = null;

        try {
            players = playerHome.findByCity(city);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersByCity

    public ArrayList getAllPlayers() { 

        Debug.print("RosterBean getAllPlayers");
        Collection players = null;

        try {
            players = playerHome.findAll();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getAllPlayers

    public ArrayList getPlayersNotOnTeam() { 

        Debug.print("RosterBean getPlayersNotOnTeam");
        Collection players = null;

        try {
            players = playerHome.findNotOnTeam();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersNotOnTeam

    public ArrayList getPlayersByPositionAndName(String position, 
        String name) { 

        Debug.print("RosterBean getPlayersByPositionAndName");
        Collection players = null;

        try {
            players = playerHome.findByPositionAndName(position, name);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersByPositionAndName

    public ArrayList getLeaguesOfPlayer(String playerId) { 

        Debug.print("RosterBean getLeaguesOfPlayer");
        ArrayList detailsList = new ArrayList();
        Collection leagues = null;

        try {
            LocalPlayer player = playerHome.findByPrimaryKey(playerId);
            leagues = player.getLeagues();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
      
        Iterator i = leagues.iterator();
        while (i.hasNext()) {
            LocalLeague league = (LocalLeague) i.next();
            LeagueDetails details = new LeagueDetails(league.getLeagueId(),
                league.getName(), league.getSport());
            detailsList.add(details);
        }
        return detailsList;
    } // getLeaguesOfPlayer

    public ArrayList getSportsOfPlayer(String playerId) { 

        Debug.print("RosterBean getSportsOfPlayer");
        ArrayList sportsList = new ArrayList();
        Collection sports = null;

        try {
            LocalPlayer player = playerHome.findByPrimaryKey(playerId);
            sports = player.getSports();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
      
        Iterator i = sports.iterator();
        while (i.hasNext()) {
            String sport = (String) i.next();
            sportsList.add(sport);
        }
        return sportsList;
    } // getSportsOfPlayer

    // Team business methods

    public void createTeamInLeague(TeamDetails details, String leagueId) { 
 
        Debug.print("RosterBean createTeamInLeague");
        try {
            LocalLeague league = leagueHome.findByPrimaryKey(leagueId);
            LocalTeam team = teamHome.create(details.getId(),
                details.getName(), details.getCity());
            league.addTeam(team);
        } catch (Exception ex) {
ex.printStackTrace();
            throw new EJBException(ex.getMessage());
        }
    }
 
    public void removeTeam(String teamId) { 

        Debug.print("RosterBean removeTeam");
        try {
            LocalTeam team = teamHome.findByPrimaryKey(teamId);
            team.remove();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
    }
 
    public TeamDetails getTeam(String teamId) {

        Debug.print("RosterBean getTeam");
        TeamDetails teamDetails = null;
        try {
            LocalTeam team = teamHome.findByPrimaryKey(teamId);
            teamDetails = new TeamDetails(teamId,
                team.getName(), team.getCity());
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        return teamDetails;
    }


    // League business methods

    public void createLeague(LeagueDetails details) { 
 
        Debug.print("RosterBean createLeague");
        try {
            LocalLeague league = leagueHome.create(details.getId(), 
                details.getName(), details.getSport());
System.err.println("==== : " + league);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
    }
 
    public void removeLeague(String leagueId) { 

        Debug.print("RosterBean removeLeague");
        try {
            LocalLeague league = leagueHome.findByPrimaryKey(leagueId);
            league.remove();
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
    }
 
    public LeagueDetails getLeague(String leagueId) {

        Debug.print("RosterBean getLeague");
        LeagueDetails leagueDetails = null;
        try {
            LocalLeague league = leagueHome.findByPrimaryKey(leagueId);
            leagueDetails = new LeagueDetails(leagueId,
                league.getName(), league.getSport());
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        return leagueDetails;
    }
 
    // SessionBean methods

    public void ejbCreate() throws CreateException {

        Debug.print("RosterBean ejbCreate");
        try {
            playerHome = lookupPlayer();
            teamHome = lookupTeam();
            leagueHome = lookupLeague();
        } catch (NamingException ex) {
            throw new CreateException(ex.getMessage());
        }
    }

    public void ejbActivate() {

        Debug.print("RosterBean ejbActivate");
        try {
            playerHome = lookupPlayer();
            teamHome = lookupTeam();
            leagueHome = lookupLeague();
        } catch (NamingException ex) {
            throw new EJBException(ex.getMessage());
        }
    }

    public void ejbPassivate() {

        playerHome = null;
        teamHome = null;
        leagueHome = null;
    }

    public RosterBean() {}
    public void ejbRemove() {}
    public void setSessionContext(SessionContext sc) {}
 
    // Private methods

    private LocalPlayerHome lookupPlayer() throws NamingException {
       
        Context initial = new InitialContext();
        Object objref = initial.lookup("java:comp/env/ejb/SimplePlayer");
        return (LocalPlayerHome) objref;
   }

    private LocalTeamHome lookupTeam() throws NamingException {
       
        Context initial = new InitialContext();
        Object objref = initial.lookup("java:comp/env/ejb/SimpleTeam");
        return (LocalTeamHome) objref;
   }

    private LocalLeagueHome lookupLeague() throws NamingException {
       
        Context initial = new InitialContext();
        Object objref = initial.lookup("java:comp/env/ejb/SimpleLeague");
        return (LocalLeagueHome) objref;
   }

   private ArrayList copyPlayersToDetails(Collection players) {

        ArrayList detailsList = new ArrayList();
        Iterator i = players.iterator();

        while (i.hasNext()) {
            LocalPlayer player = (LocalPlayer) i.next();
            PlayerDetails details = new PlayerDetails(player.getPlayerId(),
                player.getName(), player.getPosition(), player.getSalary());
            detailsList.add(details);
        }

        return detailsList;
   } // copyPlayersToDetails

   /**
    * dirty cleanUp method only EJBs with hardcoded PK will be removed  
    */
    public void cleanUp() {
        Debug.print("Cleaning up the database");   
        Collection toClean = null;
        Iterator it = null;
        
        try {
            //removing the player EJBs
            toClean = playerHome.findAll();
            it = toClean.iterator();
            while (it.hasNext()) {
                ((LocalPlayer)it.next()).remove();
            }
    
            // removing the team EJBs
            toClean = teamHome.findAll();
            it = toClean.iterator();
            while (it.hasNext()) {
                ((LocalTeam)it.next()).remove();
            }
                
            // removing the league EJBs
            toClean = leagueHome.findAll();
            it = toClean.iterator();
            while (it.hasNext()) {
                ((LocalLeague)it.next()).remove();
            }                                   
        Debug.print("Cleaning up the database ... done!");	                                                                                                                                                                                                                                                                                                                         					
        }  catch (Exception ex) {
ex.printStackTrace();
            throw new EJBException(ex.getMessage());
        }
    }
      
    /**
     * 
     * @param name
     * @return
     */
    public LeagueDetails getLeagueByName(String name) {
            
        Debug.print("RosterBean getLeagueByName (SingleObjectFinder)");
        LeagueDetails leagueDetails = null;
        try {
            LocalLeague league = leagueHome.findByName(name);
            leagueDetails = new LeagueDetails(league.getLeagueId(),
                league.getName(), league.getSport());
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return leagueDetails;
    }        
    // getLeagueByName()

    
    /**
     * 
     * @param playerKey
     * @param leagueKey
     * @return
     */
    public ArrayList getTeamsByPlayerAndLeague(String playerKey,
                                               String leagueKey) {

        Debug.print("RosterBean getTeamsByPlayerAndLeague");
        ArrayList detailsList = new ArrayList();									   
        Collection teamsColl = null;

        try {
            LocalPlayer player = playerHome.findByPrimaryKey(playerKey);
            LocalLeague league = leagueHome.findByPrimaryKey(leagueKey);                                         
            teamsColl = teamHome.findByPlayerAndLeague(player, league);			
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        Iterator it = teamsColl.iterator();
        while (it.hasNext()) {
            LocalTeam team = (LocalTeam) it.next();
            TeamDetails details = new TeamDetails(team.getTeamId(),
                team.getName(), team.getCity());
            detailsList.add(details);
        }

        return detailsList;	
    }	

    /**
     * 
     * @param city
     * @return
     */
    public Set getCitiesOfLeague(String leagueKey) {
        
        Debug.print("RosterBean getCitiesOfLeague(leagueKey)");
        LocalLeague league; 
        Set cities;
        
        try {
            league = leagueHome.findByPrimaryKey(leagueKey);
            cities = league.getCitiesOfThisLeague();	
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());			
        }
        
        return cities;
    }// getCitiesOfLeague()


    /**
     * 
     * @param leagueKey
     * @param city
     * @return
     */
    public TeamDetails getTeamOfLeagueByCity(String leagueKey, String city) {
        Debug.print("RosterBean getTeamOfLeagueByCity(leagueKey, city)");
        LocalLeague league;
        LocalTeam team;
        
        try {
            league = leagueHome.findByPrimaryKey(leagueKey);
            team = league.getTeamByCity(city);
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return new TeamDetails(team.getTeamId(), team.getName(), team.getCity());
    }// getTeamOfLeagueByCity()

    
    /**
     * 
     * @param leagueKey
     * @param city
     * @return
     */
    public String getTeamsNameOfLeagueByCity(String leagueKey, String city) {
        Debug.print("RosterBean getTeamsNameOfLeagueByCity(leagueKey, city)");
        LocalLeague league;
        String teamName;
        
        try {
            league = leagueHome.findByPrimaryKey(leagueKey);
            teamName = league.getTeamsNameByCity(city);
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return teamName;

    }// getTeamsNameOfLeagueByCity()
    
    
    /**
     * 
     * @param teamID
     * @param playerName
     * @return
     */
    public double getSalaryOfPlayerFromTeam(String teamID, String playerName) {
        Debug.print("RosterBean getSalaryOfPlayerFromTeam(teamKey, playerKey)");
        LocalTeam team;
        double salary;
        
        try {
            team = teamHome.findByPrimaryKey(teamID);		
            salary = team.getSalaryOfPlayer(playerName);			
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return salary;       
    }// getSalaryOfPlayerFromTeam()
    
    
    /**
     * 
     * @param leagueId
     * @return
     */
    public ArrayList getPlayersOfLeague(String leagueId) {
       Debug.print("RosterBean getPlayersOfLeague(leagueId)");
       LocalLeague league;
       Set players;
       
       try {
           league = leagueHome.findByPrimaryKey(leagueId);
           players = league.getPlayersFromLeague();
       }
       catch (Exception ex) {
           throw new EJBException(ex.getMessage());
       }
       
       return copyPlayersToDetails(players);     
    }// getPlayersOfLeague()
    
    /**
     * 
     * @return
     */
    public ArrayList getPlayersWithPositionsGoalkeeperOrDefender() {
        Debug.print("RosterBean getPlayersWithPositionsGoalkeeperOrDefender()");
        Collection players = null;
        
        try {
            players = playerHome.findByPositionsGoalkeeperOrDefender();
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return copyPlayersToDetails(players);
    }// getPlayersWithPositionsGoalkeeperOrDefender()
    
    /**
     * 
     * @return
     */
    public ArrayList getPlayersWithNameEndingWithON() {
        Debug.print("RosterBean getPlayersWithNameEndingWithON()");
        Collection players = null;
        
        try {
            players = playerHome.findByNameEndingWithON();
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return copyPlayersToDetails(players);
    }// getPlayersWithNameEndingWithON()

    /**
     * 
     * @return
     */
    public ArrayList getPlayersWithNullName() {
        Debug.print("RosterBean getPlayersWithNullName()");
        Collection players = null;
        
        try {
            players = playerHome.findByNullName();
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return copyPlayersToDetails(players);
    }// getPlayersWithNullName()



    /**
     * 
     * @param teamId
     * @return
     */
    public ArrayList getPlayersWithTeam(String teamId) {
        Debug.print("RosterBean getPlayersWithTeam(teamId)");
        LocalTeam team;
        Collection players = null;
        
        try {
            team = teamHome.findByPrimaryKey(teamId);
            players = playerHome.findByTeam(team);
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return copyPlayersToDetails(players);
    }// getPlayersWithTeam()
    
    
    /**
     * 
     * @param teamId
     * @return
     */
    public  String getTeamNameVariations(String teamId) {
        Debug.print("RosterBean getTeamNameVariations(teamId)");
        LocalTeam team;
        StringBuffer out = new StringBuffer();
        
        try {
            team = teamHome.findByPrimaryKey(teamId);
            Debug.print("--- CONCAT");
            out.append(team.getTeamNameWithStringfunctionTests1());
            Debug.print("--- SUBSTRING");
            out.append(team.getTeamNameWithStringfunctionTests2());
            Debug.print("--- LOCATE AND LENGTH");
            out.append(team.getTeamNameWithStringfunctionTests3());			
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());			
        }
        
        return out.toString();
    }// getTeamNameVariations()
    
    
    /**
     * 
     * @param salary
     * @return
     */
    public ArrayList getPlayersWithSalaryUsingABS(double salary) {
        Debug.print("RosterBean getPlayersWithSalaryUsingABS(salary)");
        Collection players = null;
        
        try {
            players = playerHome.findBySalarayWithArithmeticFunctionABS(salary);
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return copyPlayersToDetails(players);
    }// getPlayersWithSalaryUsingABS()


    /**
     * 
     * @param salary
     * @return
     */
    public ArrayList getPlayersWithSalaryUsingSQRT(double salary) {
        Debug.print("RosterBean getPlayersWithSalaryUsingSQRT(salary)");
        Collection players = null;
        
        try {
            players = playerHome.findBySalarayWithArithmeticFunctionSQRT(salary);
        }
        catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }
        
        return copyPlayersToDetails(players);
    }// getPlayersWithSalaryUsingSQRT()
    
    
    
    public ArrayList getPlayersByLeagueIdWithNULL(String leagueId) { 

        Debug.print("RosterBean getPlayersByLeagueId");
        Collection players = null;

        try {
            LocalLeague league = null; //leagueHome.findByPrimaryKey(leagueId);
            players = playerHome.findByLeague(league);
        } catch (Exception ex) {
            throw new EJBException(ex.getMessage());
        }

        return copyPlayersToDetails(players);
    } // getPlayersByLeagueId

    
} // RosterBean 

Other Glassfish examples (source code examples)

Here is a short list of links related to this Glassfish RosterBean.java source code file:

... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.