public Collection<SystemObject> getAllObjects(
			final Collection<ConfigurationArea> configurationAreas,
			final Collection<SystemObjectType> systemObjectTypes,
			ObjectTimeSpecification objectTimeSpecification) {
		// Liste, die alle ermittelten Objekte enthält
		final Collection<SystemObject> objects = new ArrayList<SystemObject>();

		// alle Konfigurationsbereiche, die zu berücksichtigen sind, ermitteln
		final List<ConfigurationArea> areas;
		if(configurationAreas == null) {
			areas = new ArrayList<ConfigurationArea>();
			ConfigurationAreaFile[] areaFiles = getConfigurationFileManager().getConfigurationAreas();
			for(ConfigurationAreaFile areaFile : areaFiles) {
				ConfigurationArea area = (ConfigurationArea)getObject(areaFile.getConfigurationAreaInfo().getPid());
				// nicht aktive Bereiche werden ignoriert
				if(area != null) {
					areas.add(area);
				}
			}
		}
		else {
			areas = new ArrayList<ConfigurationArea>(configurationAreas);
		}

		// alle Objekt-Typen, die zu betrachten sind, ermitteln - also auch die Typen, die die angegebenen Typen erweitern
		final Set<SystemObjectType> relevantObjectTypes = new HashSet<SystemObjectType>();
		if(systemObjectTypes == null) {
			// es wurde keine Einschränkung der Typen gegeben -> alle Typen ermitteln
			// die Typen eines TypTyp-Objekts ermittelt man mit getElements()!
			relevantObjectTypes.add(getTypeTypeObject());
			final List<SystemObject> typeTypeElements = getTypeTypeObject().getElements();
			for(SystemObject typeTypeElement : typeTypeElements) {
				relevantObjectTypes.add((SystemObjectType)typeTypeElement);
			}
		}
		else {
			// die Typen eines Typ-Objekts werden über die Sub-Types ermittelt.
			for(SystemObjectType objectType : systemObjectTypes) {
				relevantObjectTypes.add(objectType);
				relevantObjectTypes.addAll(getAllSubTypes(objectType));
			}
		}

		// Ermittlung der direkten Objekte der angegebenen Typen
		for(ConfigurationArea configurationArea : areas) {
			Collection<SystemObject> directObjects = configurationArea.getDirectObjects(relevantObjectTypes, objectTimeSpecification);
			objects.addAll(directObjects);
		}

		return objects;
	}