Cześć.

Napisałem program do obsługi ZOO z użyciem OSGI. W programie znajdują się dwie klatki oraz 3 zwierzęta. W momencie usunięcia jednej klatki, zwierzęta powinny być przerzucane do drugiej ( pod warunkiem, że jest w niej miejsce). I tu pojawia się problem. Program w momencie usunięcia klatki, usuwa wszystkie zwierzęta w niej będące. Jestem w kropcem i nie mogę rozwiązać tego problemu, dlatego proszę o pomoc.
Z góry dzięki:
Menadżer:

package org.foo.zoo.main;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


import org.foo.zoo.animal.AnimalState;
import org.foo.zoo.animal.SimpleAnimal;
import org.foo.zoo.cage.SimpleCage;
import org.foo.zoo.swingutils.SwingUtils;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.FrameworkUtil;

import javax.swing.*;

import javax.swing.JFrame;

public class ZooManager extends JFrame {
	private JPanel panel;
	private Map<String, SimpleAnimal> animals = Collections.synchronizedMap(new HashMap<String, SimpleAnimal>());
	private Map<String, SimpleCage> cages = Collections.synchronizedMap(new HashMap<String, SimpleCage>());
	private List<JButton> buts = new ArrayList<JButton>();
	public ZooManager(){
		super("Zoo");
		GridLayout nLayout = new GridLayout(4,4,10,10);
		panel = new JPanel();
		panel.setBackground(Color.WHITE);
		panel.setLayout(nLayout);
		panel.setMinimumSize(new Dimension(400, 400));
		setSize(420, 420);
		add(panel);
		JButton b = new JButton("Pokaż stan wszystkich");
		b.addActionListener(new ActionListener() {
			  public void actionPerformed(ActionEvent evt) {
				//    Object src = evt.getSource();
				    CageState cs = new CageState(cages);
			  }						
		});
		panel.add(b);
		setVisible(true);
	}

	
	
	void addCage(SimpleCage cage, Map<String,?> attrs){
		//System.out.print(ani.SayHello());
		final String name = (String)attrs.get(SimpleCage.NAME_PROPERTY);
		cages.put(name, cage);
		JOptionPane.showMessageDialog(null, "Dodano: " + name);

		SwingUtils.invokeAndWait(new Runnable() {
			@Override
			public void run() {
					JButton butt = new JButton(name);
					butt.addActionListener(new ActionListener() {
						  public void actionPerformed(ActionEvent evt) {
							    Object src = evt.getSource();
							    String name = ((JButton)src).getText();
							    cages.get(name).Show(true);
						  }						
					});
					buts.add(butt);
					panel.add(butt);
					panel.validate();
					repaint();
			}
		});
	}
	void removeCage(SimpleCage cage,Map<String,?> attrs){
		final String name = (String)attrs.get(SimpleCage.NAME_PROPERTY);
		cages.remove(name);

		SwingUtils.invokeAndWait(new Runnable() {
			@Override
			public void run() {
		panel.remove(getButton(name));
		panel.validate();
		repaint();
			}
		});
		
		List<SimpleAnimal> remove = new LinkedList<SimpleAnimal>();
		for (Entry<String, SimpleAnimal> ae : cage.GetAnimals().entrySet())
		{
			Map<String, String> animalAttrs = new HashMap<String, String>();
			animalAttrs.put(SimpleAnimal.NAME_PROPERTY, ae.getKey());
			for (Entry<String, SimpleCage> e : cages.entrySet())
			{
				if (e.getValue().addAnimal(ae.getValue(), animalAttrs))
				break;
			}
			// if we are here remove from zoo, because no space in cages (stop bundle)
			try 
			{
				FrameworkUtil.getBundle(ae.getValue().getClass()).stop();
				JOptionPane.showMessageDialog(null, "Wyrzucono " + ae.getKey() + " z ZOO z powodu braku miejsc.");
			}
			catch (BundleException e1)
			{
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}
	private JButton getButton(String name){
		for(JButton b : buts){
			if(b.getText().equalsIgnoreCase(name)){
				return b;
			}
		}
		return null;
	}

	
}
 

Duża klatka

 package org.foo.zoo.bigcage;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.foo.zoo.animal.AnimalState;
import org.foo.zoo.animal.SimpleAnimal;
import org.foo.zoo.cage.SimpleCage;
import org.foo.zoo.animaljanitor.AnimalJanitor;
import org.foo.zoo.swingutils.SwingUtils;


public class BigCage extends JFrame implements SimpleCage {

	private final int size = 5;
	private Map<String, SimpleAnimal> animals = Collections.synchronizedMap(new HashMap<String, SimpleAnimal>());
	
	private JPanel panel;
	private List<JButton> buts = new ArrayList<JButton>();
	
	public BigCage()
	{
		super("Big cage");
		
		GridLayout nLayout = new GridLayout(4,4,10,10);
		panel = new JPanel();
		panel.setBackground(Color.WHITE);
		panel.setLayout(nLayout);
		panel.setMinimumSize(new Dimension(400, 400));
		setSize(420, 420);
		add(panel);
		show(false);
	}

	@Override
	public Map<String, SimpleAnimal> GetAnimals() {
		// TODO Auto-generated method stub
		return animals;
	}

	@Override
	public boolean addAnimal(final SimpleAnimal animal, Map<String, ?> attrs) {
		// TODO Auto-generated method stub
		if (animals.size() >= size)
			return false;
		if (animal.GetState() != AnimalState.UNCAGED)
			return false;
		
		final String name = (String)attrs.get(SimpleAnimal.NAME_PROPERTY);
		animal.SetState(AnimalState.CAGED);
		SwingUtils.invokeAndWait(new Runnable()
		{
		@Override
			public void run()
			{
				JButton butt = new JButton(name);
				butt.addActionListener(new ActionListener() {
					  public void actionPerformed(ActionEvent evt) {
						  //  Object src = evt.getSource();
						    AnimalJanitor aj = new AnimalJanitor(animal);
					  }						
				});
				buts.add(butt);
				panel.add(butt);
				panel.validate();
				repaint();
			}
		});
		return animals.put(name, animal) == null;
	}

	@Override
	public boolean removeAnimal(SimpleAnimal animal, Map<String, ?> attrs) {
		// TODO Auto-generated method stub
		final String name = (String)attrs.get(SimpleAnimal.NAME_PROPERTY);
		SimpleAnimal ani = animals.remove(name);
		if (ani == null)
			return false;
		
		if (animal == null)
			animal = ani;
		animal.SetState(AnimalState.UNCAGED);
		SwingUtils.invokeAndWait(new Runnable() {
			@Override
			public void run() {
				panel.remove(getButton(name));
			panel.validate();
			repaint();
			}
		});
		return true;
	}

	@Override
	public void Show(boolean show) {
		// TODO Auto-generated method stub
		this.setVisible(show);
	}
	
	private JButton getButton(String name){
		for(JButton b : buts){
			if(b.getText().equalsIgnoreCase(name)){
				return b;
			}
		}
		return null;
	}

	@Override
	public String GetState() {
		return "Big Cage " + animals.size() + "/" + size;
	}
	
	@Override
	public boolean HasSlotForAnimal() {
		// TODO Auto-generated method stub
		return animals.size() < size;
	}
}

Mała klatka

package org.foo.zoo.smallcage;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import org.foo.zoo.animal.AnimalState;
import org.foo.zoo.animal.SimpleAnimal;
import org.foo.zoo.cage.SimpleCage;
import org.foo.zoo.animaljanitor.AnimalJanitor;
import org.foo.zoo.swingutils.SwingUtils;
import org.osgi.framework.FrameworkUtil;


public class SmallCage extends JFrame implements SimpleCage {

	private final int size = 1;
	private Map<String, SimpleAnimal> animals = Collections.synchronizedMap(new HashMap<String, SimpleAnimal>());
	
	private JPanel panel;
	private List<JButton> buts = new ArrayList<JButton>();
	
	public SmallCage()
	{
		super("Small cage");
		
		GridLayout nLayout = new GridLayout(4,4,10,10);
		panel = new JPanel();
		panel.setBackground(Color.WHITE);
		panel.setLayout(nLayout);
		panel.setMinimumSize(new Dimension(400, 400));
		setSize(420, 420);
		add(panel);
		
		for (final String key : animals.keySet())
		{
			final SimpleAnimal animal = animals.get(key);
			SwingUtils.invokeAndWait(new Runnable()
			{
			@Override
				public void run()
				{
					JButton butt = new JButton(key);
					butt.addActionListener(new ActionListener() {
						  public void actionPerformed(ActionEvent evt) {
							  //  Object src = evt.getSource();
							    AnimalJanitor aj = new AnimalJanitor(animal);
						  }						
					});
					//buts.add(butt);
					panel.add(butt);
					panel.validate();
					repaint();
				}
			});
		}
		show(false);
	}

	@Override
	public Map<String, SimpleAnimal> GetAnimals() {
		// TODO Auto-generated method stub
		return animals;
	}

	@Override
	public boolean addAnimal(final SimpleAnimal animal, Map<String, ?> attrs) {
		// TODO Auto-generated method stub
		if (animals.size() >= size)
			return false;
		if (animal.GetState() != AnimalState.UNCAGED)
			return false;
		
		final String name = (String)attrs.get(SimpleAnimal.NAME_PROPERTY);
		animal.SetState(AnimalState.CAGED);
		SwingUtils.invokeAndWait(new Runnable()
		{
		@Override
			public void run()
			{
				JButton butt = new JButton(name);
				butt.addActionListener(new ActionListener() {
					  public void actionPerformed(ActionEvent evt) {
						  //  Object src = evt.getSource();
						    AnimalJanitor aj = new AnimalJanitor(animal);
					  }						
				});
				buts.add(butt);
				panel.add(butt);
				panel.validate();
				repaint();
			}
		});
		return animals.put(name, animal) == null;
	}

	@Override
	public boolean removeAnimal(SimpleAnimal animal, Map<String, ?> attrs) {
		// TODO Auto-generated method stub
		final String name = (String)attrs.get(SimpleAnimal.NAME_PROPERTY);
		if (animals.remove(name) == null)
			return false;
		animal.SetState(AnimalState.UNCAGED);
		SwingUtils.invokeAndWait(new Runnable() {
			@Override
			public void run() {
				panel.remove(getButton(name));
			panel.validate();
			repaint();
			}
		});
		return true;
	}

	@Override
	public void Show(boolean show) {
		// TODO Auto-generated method stub
		this.setVisible(show);
	}

	
	private JButton getButton(String name){
		for(JButton b : buts){
			if(b.getText().equalsIgnoreCase(name)){
				return b;
			}
		}
		return null;
	}

	@Override
	public String GetState() {
		// TODO Auto-generated method stub
		return "Small Cage " + animals.size() + "/" + size;
	}

	@Override
	public boolean HasSlotForAnimal() {
		// TODO Auto-generated method stub
		return animals.size() < size;
	}
}