The Register

Biting the hand that feeds IT — Enterprise Technology News and Analysis

Meta reveals plan for several multi-gigawatt datacenter clusters

First, Zuck takes Manhattan. Then he might actually deliver a product that matters

Meta overlord-for-life Mark Zuckerberg has revealed he plans to build several multi-gigawatt datacenter clusters, with the first to come online in 2026.…

Scientists spot massive black hole collision that defies current theories

Off-the-charts gravitational waves ripple out from merged dead stars

Researchers have observed the largest ever collision between two massive black holes witnessed by humans, a finding that’s sent astrophysicists back to their calculators to re-think models.…

De Speld

Uw vaste prik voor betrouwbaar nieuws.

Omroep MAX-campagne moet ouderen bewust maken van babbeltrucs van politici

Na maanden van aanhoudende klachten is de maat vol voor de politiek. In samenwerking met Omroep MAX start vandaag een campagne die ouderen waarschuwt voor babbeltrucs van mensen die zich presenteren als politici.

‘We zien dat het aantal gevallen waarin ouderen worden benaderd met een onsamenhangend praatje over de staat van het land nog steeds met de dag toeneemt’, ziet omroepbaas Jan Slagter. ‘Die zogenaamde politici zijn gewoon uit op de stem van deze kwetsbare groep mensen, en vaak krijgen ze deze dan ook nog.’

De 82-jarige Jeltje kreeg iemand aan de deur en had direct door dat ze in de maling werd genomen. ‘Het was een jongeman, hij deed allemaal beloftes die hij helemaal niet kon waarmaken. Iets met een constitutioneel hof, rechtsstatelijkheid en een complete hervorming van het kiesstelsel. Ik heb de deur voor zijn neus dichtgesmeten. Ga een ander in de maling nemen, dacht ik.’ Helaas hoort Jeltje bij de minderheid.

Ook politiek Den Haag is klaar met ‘charlatans’ die de geloofwaardigheid van de politiek te grabbel gooien. ‘Mensen worden aangesproken met vage verhalen over een vermeende asielcrisis’, vertelt een anonieme bron. ‘In sommige gevallen komt dat erg overtuigend over, dus ik snap wel dat mensen hier intrappen.’

Dus zeggen Omroep MAX en de politiek nu: komt er iemand aan de deur en heb je geen flauw benul waar hij of zij het over heeft? Probeer dan altijd te vragen of deze persoon het kan staven met feiten. Zo niet, bel meteen de politie. De campagne raadt ouderen aan om extra waakzaam te zijn op termen als ‘dit land is verrot’, ‘het volk ervaart…’ en ‘ik sta aan jouw kant’.

&


Wel.nl

Minder lezen, Meer weten.

Damrak wacht op verdere ontwikkelingen rond handelstarieven

AMSTERDAM (ANP) - De AEX-index op het Damrak ging dinsdag licht omhoog, na de kleine verliesbeurt een dag eerder. Beleggers lijken erop te vertrouwen dat de Europese Unie voor 1 augustus een handelsovereenkomst met de Verenigde Staten weet te sluiten om hoge Amerikaanse importheffingen te voorkomen. De Amerikaanse president Donald Trump dreigde afgelopen weekend vanaf begin volgende maand een heffing van 30 procent in te voeren op producten uit de EU bij het uitblijven van een handelsdeal.

Naast de ontwikkelingen rond de handelstarieven kijken beleggers uit naar de resultaten van de grote Amerikaanse banken JPMorgan Chase, Wells Fargo en Citigroup, die later op de dag bekend worden gemaakt. Het cijferseizoen op Wall Street gaat daarmee officieel van start.

De Amsterdamse hoofdindex noteerde kort na opening van de markt 0,5 procent hoger op 924,80 punten. De MidKap klom 0,3 procent tot 916,14 punten. De beurzen in Frankfurt, Londen en Parijs wonnen tot 0,3 procent.


VvE-kosten afgelopen jaren flink gestegen, meldt Independer

HILVERSUM (ANP) - De kosten die huiseigenaren moeten betalen voor Verenigingen van Eigenaren (VvE's) zijn de afgelopen jaren flink gestegen. Dit meldt vergelijkingssite Independer na onderzoek onder ruim 8100 te koop staande appartementen bij onder meer Funda en Pararius. De site merkt dat sommige mensen moeite hebben de stijgende kosten te betalen.

Voor een appartement van 70 vierkante meter betaalt een huiseigenaar nu gemiddeld 161 euro per maand aan VvE-kosten. Dat is zo'n 35 procent meer dan vijf jaar geleden, aldus Independer. Het gaat op jaarbasis om een stijging van ruim 500 euro.

Volgens Marga Lankreijer-Kos, hypotheekexpert bij Independer, komt die stijging in veel gevallen doordat VvE's in hoog tempo verduurzamen. Bijvoorbeeld om gebouwen aardgasvrij te maken. De rekening daarvan wordt volgens haar doorberekend aan huiseigenaren.


Russische veiligheidsadviseur: Trumps ultimatum doet ons niets

MOSKOU (ANP) - De vicevoorzitter van de Russische veiligheidsraad Dmitri Medvedev zegt dat het ultimatum van de Amerikaanse president Donald Trump hem niets doet. Trump beloofde Oekraïne nieuwe wapenleveranties en kondigde invoerheffingen aan als Rusland niet binnen vijftig dagen vredesafspraken maakt met Oekraïne.

"Trump heeft het Kremlin een theatraal ultimatum gesteld. De wereld sidderde in afwachting van de consequenties", schrijft Medvedev op X. "Europa op oorlogspad was teleurgesteld. Rusland maakt het niets uit."

Medvedev was president van Rusland van 2008 tot 2012 en premier van het land van 2012 tot 2020. Hij is nu de vicevoorzitter van de Veiligheidsraad van de Russische Federatie, waar president Vladimir Poetin de voorzitter is.

Poetin zelf heeft nog niet gereageerd op Trumps ultimatum.


Kallas: VS beseffen nu ook dat Rusland geen vrede wil

BRUSSEL (ANP) - EU-buitenlandchef Kaja Kallas is blij met de toezegging van de VS dat zij wapens aan Oekraïne gaan leveren. "Dit laat zien dat ze ook beseffen dat Rusland eigenlijk geen vrede wil", zei Kallas voor de vergadering met de EU-ministers van Buitenlandse Zaken. Ze hoopt dat de VS ook sancties opleggen aan Rusland "zodat de druk op Rusland toeneemt om deze oorlog echt te stoppen".

Kallas hoopt dat de EU-ministers dinsdag een besluit nemen over het achttiende sanctiepakket tegen Rusland. Daarover wordt al lang onderhandeld, maar Slowakije ligt nog steeds dwars. De afgelopen weken is er op hoog niveau druk onderhandeld om Slowakije te bewegen af te zien van een veto. Voor het opleggen van sancties is unanimiteit nodig.

"We zijn er heel, heel dichtbij", zei Kallas. "We hebben voorstellen gedaan, maar het is de vraag of we het veto van een lidstaat kunnen voorkomen of niet."


Bouwstop voor aanleg stroomkabel naar gasplatform Noordzee

OLDENBURG (ANP) - Het Nederlandse energiebedrijf One-Dyas moet voorlopig de aanleg van een stroomkabel in de Noordzee staken. De Duitse milieuorganisatie Deutsche Umwelthilfe (DUH) heeft een spoedprocedure ingediend tegen natuurbeschermingsvergunningen voor het project. Zolang die procedure loopt geldt een bouwstop, heeft de rechter bepaald.

Dat heeft One-Dyas bevestigd aan het Duitse persbureau dpa. De rechtbank heeft volgens het bedrijf meer tijd nodig om alles nauwkeuriger te onderzoeken. Het is zeker geen uitspraak tegen het project, benadrukte de woordvoerder.

De kabel moet een boorplatform voor de kust van het Duitse waddeneiland Borkum van stroom voorzien. De stroom is afkomstig van het nabijgelegen windpark Riffgat. De kabel zou echter door een beschermd zeegebied lopen en daar een zeldzaam steenrif aantasten, voert DUH aan.

De Duitse bondsregering heeft eerder al toestemming gegeven voor gaswinning bij Borkum. De deelstaatregering van Nedersaksen is juist tegen.


Zwemster Schouten op de weg terug na gezondheidsklachten

BODEGRAVEN (ANP) - Zwemster Tes Schouten is op de weg terug na gezondheidsklachten. De 24-jarige wereldkampioene op de 200 meter schoolslag kreeg na de Olympische Spelen van Parijs, waar ze brons veroverde, last van grote vermoeidheid, pijn en zwellingen aan de linkerkant van haar gezicht en later ook uitvalsverschijnselen aan de linkerkant van haar lichaam.

Schouten kondigde in april aan dat ze dit jaar niet meer in actie komt. Inmiddels durft ze weer aan zwemmen op topniveau te denken. "Alle onderzoeken zijn nu goed", zei de zwemster bij de NOS. "Mijn lichaam is in principe gezond. De pijnklachten zijn vrijwel weg. Ik heb nog wel wat last van vermoeidheid, wat wel heel extreem was, maar dat gaat echt een stuk beter."

Schouten richt zich vooralsnog op een rentree bij de EK lange baan van volgend jaar. "Dan heb ik nu nog meer dan een jaar, want die zijn pas half augustus. Mocht op een of andere manier de EK korte baan toch lukken, dan is dat leuk meegenomen. Maar om de rust te bewaren, richten we ons op de zomer."


Overslag havens Antwerpen en Brugge daalt in eerste jaarhelft

ANTWERPEN (ANP) - De goederenoverslag in de havens van Antwerpen en Brugge is in de eerste helft van 2025 afgenomen. Volgens havenbedrijf Port of Antwerp-Bruges daalde de overslag van vloeibare brandstoffen, zoals nafta en vloeibaar gemaakt aardgas (lng), flink door de geopolitieke spanningen, sancties en overcapaciteit. Ook de overslag van steenkool en bouwmaterialen nam fors af. De containeroverslag hield daarentegen goed stand en het handelsverkeer van en naar de Verenigde Staten nam stevig toe.

De twee Belgische havens sloegen in totaal ruim 137 miljoen ton over, 4,3 procent minder dan in de eerste helft van 2024. Het handelsverkeer van en naar de VS groeide met ruim 17 procent tot 16,4 miljoen ton. De VS blijven daarmee de tweede belangrijkste handelspartner van Port of Antwerp-Bruges, na het Verenigd Koninkrijk. Omgekeerd blijven de Belgische havens de grootste Europese exporthavens naar de VS.


Oracle steekt honderden miljoenen in AI in Nederland

AMSTERDAM (ANP) - Het Amerikaanse softwarebedrijf Oracle investeert in de komende vijf jaar 1 miljard dollar, omgerekend zo'n 855 miljoen euro, in de ontwikkeling van kunstmatige intelligentie (AI) in Nederland. Het bedrijf zegt dat de vraag daarnaar snel groeit en dat het daarom de capaciteit wil uitbreiden.

Oracle heeft in Nederland een hoofdkantoor in Utrecht en een vestiging in Amsterdam. Het bedrijf wil niet zeggen hoeveel medewerkers het in dienst heeft. Het bouwen van nieuwe locaties door de investering behoort tot de mogelijkheden, maar dat is volgens een woordvoerder "afhankelijk van de marktvraag". Het bedrijf zegt "in dit stadium" nog geen uitspraken te kunnen doen over de gevolgen voor de werkgelegenheid.

Oracle kondigde in maart aan 5 miljard dollar te investeren in kunstmatige intelligentie in het Verenigd Koninkrijk. Het bedrijf steekt bovendien 1 miljard dollar in de technologie in Spanje.

Het softwarebedrijf wil daarnaast de komende vijf jaar 2 miljard dollar investeren in Duitsland vanwege de groeiende vraag naar AI-toepassingen en infrastructuur voor clouddiensten, meldt het Duitse persbureau dpa. Dat geld gaat grotendeels naar de regio rond Frankfurt. Daar wil Oracle zijn capaciteit voor AI-toepassingen flink vergroten en zijn cloudinfrastructuur uitbreiden.


Hot Air Balloon ride through Melbourne CBD

Quinn Chow has added a photo to the pool:

Hot Air Balloon ride through Melbourne CBD

...from Point Cooke to Richmond VIC, along the Yarra river

Hot Air Balloon ride through Melbourne CBD

Quinn Chow has added a photo to the pool:

Hot Air Balloon ride through Melbourne CBD

...from Point Cooke to Richmond VIC, along the Yarra river

Everybody's Pal

gecko47 has added a photo to the pool:

Everybody's Pal

Sweet, affable insect-eater. Grey Fantail checks in at reception to pick up its photographer.

Rijnmond - Nieuws

Het laatste nieuws van vandaag over Rotterdam, Feyenoord, het verkeer en het weer in de regio Rijnmond

Brandweerman Jaco leert in Spanje hoe je brand met brand bestrijdt: 'Het is een avontuur'

Het worden drie avontuurlijke en spannende weken voor brandweerman Jaco Kleijburg uit Rockanje. Hij gaat naar het bloedhete Spanje om te ontdekken hoe ze daar grote natuurbranden bestrijden. "De kans daarop wordt in onze regio ook steeds groter."

Brandweerman Jaco gaat in Spanje grote natuurbranden leren blussen: 'Kans dat het hier gebeurt steeds groter'

Het worden drie avontuurlijke en spannende weken voor brandweerman Jaco Kleijburg uit Rockanje. Hij gaat naar het bloedhete Spanje om te ontdekken hoe ze daar grote natuurbranden bestrijden. "De kans daarop wordt in onze regio ook steeds groter."

Amerikaanse immigratiepolitie ICE houdt Nederlandse fiscalist aan, vlak nadat hij vrijkwam uit gevangenis

De Nederlandse belastingadviseur Frank B. is maandag opgepakt door de Amerikaanse immigratiepolitie ICE, kort na zijn vrijlating uit de gevangenis waar hij vastzat wegens belastingfraude.


EU staat voor belangrijk besluit: hoe ziet de toekomstige relatie met Israël eruit?

Volgens de Europese Commissie zijn er ,,aanwijzingen” dat Israël zijn verplichtingen op het gebied van mensenrechten niet nakomt. De ministers van EU-landen moeten nu besluiten hoe ze op die overtreding reageren.

The Daily WTF

Curious Perversions in Information Technology

CodeSOD: Born Single

Alistair sends us a pretty big blob of code, but it's a blob which touches upon everyone's favorite design pattern: the singleton. It's a lot of Java code, so we're going to take this as chunks. Let's start with the two methods responsible for constructing the object.

The purpose of this code is to parse an XML file, and construct a mapping from a "name" field in the XML to a "batch descriptor".

	/**
	 * Instantiates a new batch manager.
	 */
	private BatchManager() {
		try {
			final XMLReader xmlReader = XMLReaderFactory.createXMLReader();
			xmlReader.setContentHandler(this);
			xmlReader.parse(new InputSource(this.getClass().getClassLoader().getResourceAsStream("templates/" + DOCUMENT)));
		} catch (final Exception e) {
			logger.error("Error parsing Batch XML.", e);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see nz.this.is.absolute.crap.sax.XMLEntity#initChild(java.lang.String,
	 * java.lang.String, java.lang.String, org.xml.sax.Attributes)
	 */
	@Override
	protected ContentHandler initChild(String uri, String localName,
			String qName, Attributes attributes) throws SAXException {
		final BatchDescriptor batchDescriptor = new BatchDescriptor();
		// put it in the map
		batchMap.put(attributes.getValue("name"), batchDescriptor);
		return batchDescriptor;
	}

Here we see a private constructor, which is reasonable for a singleton. It creates a SAX based reader. SAX is event driven- instead of loading the whole document into a DOM, it emits an event as it encounters each new key element in the XML document. It's cumbersome to use, but far more memory efficient, and I'd hardly say this.is.absolute.crap, but whatever.

This code is perfectly reasonable. But do you know what's unreasonable? There's a lot more code, and these are the only things not marked as static. So let's keep going.

	// singleton instance so that static batch map can be initialised using
	// xml
	/** The Constant singleton. */
	@SuppressWarnings("unused")
	private static final Object singleton = new BatchManager();

Wait… why is the singleton object throwing warnings about being unused? And wait a second, what is that comment saying, "so the static batch map can be initalalised"? I saw a batchMap up in the initChild method above, but it can't be…

	private static Map<String, BatchDescriptor> batchMap = new HashMap<String, BatchDescriptor>();

Oh. Oh no.

	/**
	 * Gets the.
	 * 
	 * @param batchName
	 *            the batch name
	 * 
	 * @return the batch descriptor
	 */
	public static BatchDescriptor get(String batchName) {
		return batchMap.get(batchName);
	}

	/**
	 * Gets the post to selector name.
	 * 
	 * @param batchName
	 *            the batch name
	 * 
	 * @return the post to selector name
	 */
	public static String getPostToSelectorName(String batchName) {
		final BatchDescriptor batchDescriptor = batchMap.get(batchName);
		if (batchDescriptor == null) {
			return null;
		}
		return batchDescriptor.getPostTo();
	}

There are more methods, and I'll share the whole code at the end, but this gives us a taste. Here's what this code is actually doing.

It creates a static Map. static, in this context, means that this instance is shared across all instances of BatchManager.They also create a static instance of BatchManager inside of itself. The constructor of that instance then executes, populating that static Map. Now, when anyone invokes BatchManager.get it will use that static Map to resolve that.

This certainly works, and it offers a certain degree of cleanness in its implementation. A more conventional singleton would have the Map being owned by an instance, and it's just using the singleton convention to ensure there's only a single instance. This version's calling convention is certainly nicer than doing something like BatchManager.getInstance().get(…), but there's just something unholy about this that sticks into me.

I can't say for certain if it's because I just hate Singletons, or if it's this specific abuse of constructors and static members.

This is certainly one of the cases of misusing a singleton- it does not represent something there can be only one of, it's ensuring that an expensive computation is only allowed to be done once. There are better ways to handle that lifecycle. This approach also forces that expensive operation to happen at application startup, instead of being something flexible that can be evaluated lazily. It's not wrong to do this eagerly, but building something that can only do it eagerly is a mistake.

In any case, the full code submission follows:

package nz.this.is.absolute.crap.server.template;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.ResourceBundle;

import nz.this.is.absolute.crap.KupengaException;
import nz.this.is.absolute.crap.SafeComparator;
import nz.this.is.absolute.crap.sax.XMLEntity;
import nz.this.is.absolute.crap.selector.Selector;
import nz.this.is.absolute.crap.selector.SelectorItem;
import nz.this.is.absolute.crap.server.BatchValidator;
import nz.this.is.absolute.crap.server.Validatable;
import nz.this.is.absolute.crap.server.ValidationException;
import nz.this.is.absolute.crap.server.business.BusinessObject;
import nz.this.is.absolute.crap.server.database.EntityHandler;
import nz.this.is.absolute.crap.server.database.SQLEntityHandler;

import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

/**
 * The Class BatchManager.
 */
public class BatchManager extends XMLEntity {

	private static final Logger logger = Logger.getLogger(BatchManager.class);
	
	/** The Constant DOCUMENT. */
	private final static String DOCUMENT = "Batches.xml";

	/**
	 * The Class BatchDescriptor.
	 */
	public class BatchDescriptor extends XMLEntity {

		/** The batchSelectors. */
		private final Collection<String> batchSelectors = new ArrayList<String>();

		/** The dependentCollections. */
		private final Collection<String> dependentCollections = new ArrayList<String>();

		/** The directSelectors. */
		private final Collection<String> directSelectors = new ArrayList<String>();

		/** The postTo. */
		private String postTo;

		/** The properties. */
		private final Collection<String> properties = new ArrayList<String>();

		/**
		 * Gets the batch selectors iterator.
		 * 
		 * @return the batch selectors iterator
		 */
		public Iterator<String> getBatchSelectorsIterator() {
			return this.batchSelectors.iterator();
		}

		/**
		 * Gets the dependent collections iterator.
		 * 
		 * @return the dependent collections iterator
		 */
		public Iterator<String> getDependentCollectionsIterator() {
			return this.dependentCollections.iterator();
		}

		/**
		 * Gets the post to.
		 * 
		 * @return the post to
		 */
		public String getPostTo() {
			return this.postTo;
		}

		/**
		 * Gets the post to business object.
		 * 
		 * @param businessObject
		 *            the business object
		 * @param postHandler
		 *            the post handler
		 * 
		 * @return the post to business object
		 * 
		 * @throws ValidationException
		 *             the validation exception
		 */
		private BusinessObject getPostToBusinessObject(
				BusinessObject businessObject, EntityHandler postHandler)
				throws ValidationException {
			if (this.postTo == null) {
				return null;
			}
			final BusinessObject postToBusinessObject = businessObject
					.getBusinessObjectFromMap(this.postTo, postHandler);
			// copy properties
			for (final String propertyName : this.properties) {
				String postToPropertyName;
				if ("postToStatus".equals(propertyName)) {
					// status field on batch entity refers to the batch entity
					// itself
					// so postToStatus is used for updating the status property
					// of the postToBusinessObject itself
					postToPropertyName = "status";
				} else {
					postToPropertyName = propertyName;
				}
				final SelectorItem destinationItem = postToBusinessObject
						.find(postToPropertyName);
				if (destinationItem != null) {
					final Object oldValue = destinationItem.getValue();
					final Object newValue = businessObject.get(propertyName);
					if (SafeComparator.areDifferent(oldValue, newValue)) {
						destinationItem.setValue(newValue);
					}
				}
			}
			// copy direct selectors
			for (final String selectorName : this.directSelectors) {
				final SelectorItem destinationItem = postToBusinessObject
						.find(selectorName);
				if (destinationItem != null) {
					// get the old and new values for the selectors
					Selector oldSelector = (Selector) destinationItem
							.getValue();
					Selector newSelector = (Selector) businessObject
							.get(selectorName);
					// strip them down to bare identifiers for comparison
					if (oldSelector != null) {
						oldSelector = oldSelector.getAsIdentifier();
					}
					if (newSelector != null) {
						newSelector = newSelector.getAsIdentifier();
					}
					// if they're different then update
					if (SafeComparator.areDifferent(oldSelector, newSelector)) {
						destinationItem.setValue(newSelector);
					}
				}
			}
			// copy batch selectors
			for (final String batchSelectorName : this.batchSelectors) {
				final Selector batchSelector = (Selector) businessObject
						.get(batchSelectorName);
				if (batchSelector == null) {
					throw new ValidationException(
							"\"PostTo\" selector missing.");
				}
				final BusinessObject batchObject = postHandler
						.find(batchSelector);
				if (batchObject != null) {
					// get the postTo selector for the batch object we depend on
					final BatchDescriptor batchDescriptor = batchMap
							.get(batchObject.getName());
					if (batchDescriptor.postTo != null
							&& postToBusinessObject
									.containsKey(batchDescriptor.postTo)) {
						final Selector realSelector = batchObject
								.getBusinessObjectFromMap(
										batchDescriptor.postTo, postHandler);
						postToBusinessObject.put(batchDescriptor.postTo,
								realSelector);
					}
				}
			}
			businessObject.put(this.postTo, postToBusinessObject);
			return postToBusinessObject;
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see
		 * nz.this.is.absolute.crap.sax.XMLEntity#initChild(java.lang.String,
		 * java.lang.String, java.lang.String, org.xml.sax.Attributes)
		 */
		@Override
		protected ContentHandler initChild(String uri, String localName,
				String qName, Attributes attributes) throws SAXException {
			if ("Properties".equals(qName)) {
				return new XMLEntity() {
					@Override
					protected ContentHandler initChild(String uri,
							String localName, String qName,
							Attributes attributes) throws SAXException {
						BatchDescriptor.this.properties.add(attributes
								.getValue("name"));
						return null;
					}
				};
			} else if ("DirectSelectors".equals(qName)) {
				return new XMLEntity() {
					@Override
					protected ContentHandler initChild(String uri,
							String localName, String qName,
							Attributes attributes) throws SAXException {
						BatchDescriptor.this.directSelectors.add(attributes
								.getValue("name"));
						return null;
					}
				};
			} else if ("BatchSelectors".equals(qName)) {
				return new XMLEntity() {
					@Override
					protected ContentHandler initChild(String uri,
							String localName, String qName,
							Attributes attributes) throws SAXException {
						BatchDescriptor.this.batchSelectors.add(attributes
								.getValue("name"));
						return null;
					}
				};
			} else if ("PostTo".equals(qName)) {
				return new XMLEntity() {
					@Override
					protected ContentHandler initChild(String uri,
							String localName, String qName,
							Attributes attributes) throws SAXException {
						BatchDescriptor.this.postTo = attributes
								.getValue("name");
						return null;
					}
				};
			} else if ("DependentCollections".equals(qName)) {
				return new XMLEntity() {
					@Override
					protected ContentHandler initChild(String uri,
							String localName, String qName,
							Attributes attributes) throws SAXException {
						BatchDescriptor.this.dependentCollections
								.add(attributes.getValue("name"));
						return null;
					}
				};
			}
			return null;
		}
	}

	/** The batchMap. */
	private static Map<String, BatchDescriptor> batchMap = new HashMap<String, BatchDescriptor>();

	/**
	 * Gets the.
	 * 
	 * @param batchName
	 *            the batch name
	 * 
	 * @return the batch descriptor
	 */
	public static BatchDescriptor get(String batchName) {
		return batchMap.get(batchName);
	}

	/**
	 * Gets the post to selector name.
	 * 
	 * @param batchName
	 *            the batch name
	 * 
	 * @return the post to selector name
	 */
	public static String getPostToSelectorName(String batchName) {
		final BatchDescriptor batchDescriptor = batchMap.get(batchName);
		if (batchDescriptor == null) {
			return null;
		}
		return batchDescriptor.getPostTo();
	}

	// singleton instance so that static batch map can be initialised using
	// xml
	/** The Constant singleton. */
	@SuppressWarnings("unused")
	private static final Object singleton = new BatchManager();

	/**
	 * Post.
	 * 
	 * @param businessObject
	 *            the business object
	 * 
	 * @throws Exception
	 *             the exception
	 */
	public static void post(BusinessObject businessObject) throws Exception {
		// validate the batch root object only - it can validate the rest if it
		// needs to
		
		if (businessObject instanceof Validatable) {
			if (!BatchValidator.validate(businessObject)) {
				logger.warn(String.format("Validating %s failed", businessObject.getClass().getSimpleName()));
				throw new ValidationException(
						"Batch did not validate - it was not posted");
			}
		
			((Validatable) businessObject).validator().prepareToPost();
		}
		final SQLEntityHandler postHandler = new SQLEntityHandler(true);
		final Iterator<BusinessObject> batchIterator = new BatchIterator(
				businessObject, null, postHandler);
		// iterate through batch again posting each object
		try {
			while (batchIterator.hasNext()) {
				post(batchIterator.next(), postHandler);
			}
			postHandler.commit();
		} catch (final Exception e) {
			logger.error("Exception occurred while posting batches", e);
			// something went wrong
			postHandler.rollback();
			throw e;
		}
		return;
	}

	/**
	 * Post.
	 * 
	 * @param businessObject
	 *            the business object
	 * @param postHandler
	 *            the post handler
	 * 
	 * @throws KupengaException
	 *             the kupenga exception
	 */
	private static void post(BusinessObject businessObject,
			EntityHandler postHandler) throws KupengaException {
		if (businessObject == null) {
			return;
		}
		if (Boolean.TRUE.equals(businessObject.get("posted"))) {
			return;
		}
		final BatchDescriptor batchDescriptor = batchMap.get(businessObject
				.getName());
		final BusinessObject postToBusinessObject = batchDescriptor
				.getPostToBusinessObject(businessObject, postHandler);
		if (postToBusinessObject != null) {
			postToBusinessObject.save(postHandler);
		}
		businessObject.setItemValue("posted", Boolean.TRUE);
		businessObject.save(postHandler);
	}

	/**
	 * Instantiates a new batch manager.
	 */
	private BatchManager() {
		try {
			final XMLReader xmlReader = XMLReaderFactory.createXMLReader();
			xmlReader.setContentHandler(this);
			xmlReader.parse(new InputSource(this.getClass().getClassLoader().getResourceAsStream("templates/" + DOCUMENT)));
		} catch (final Exception e) {
			logger.error("Error parsing Batch XML.", e);
		}
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see nz.this.is.absolute.crap.sax.XMLEntity#initChild(java.lang.String,
	 * java.lang.String, java.lang.String, org.xml.sax.Attributes)
	 */
	@Override
	protected ContentHandler initChild(String uri, String localName,
			String qName, Attributes attributes) throws SAXException {
		final BatchDescriptor batchDescriptor = new BatchDescriptor();
		// put it in the map
		batchMap.put(attributes.getValue("name"), batchDescriptor);
		return batchDescriptor;
	}
}
[Advertisement] Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.Learn more.

Leerlingen Amsterdams enige islamitische school Haga Lyceum terroriseren buurt

Het is soms bijna alsof een school gestoeld op het enige monotheïsme dat zowel wetgevend als expansiegericht is leerlingen produceert die zich als zodanig gedragen. Amsterdams enige islamitische middelbare school het Haga Lyceum - niet te verwarren met 'doorstart' Het Achterhuis Lyceum - groeide op de nieuwe locatie te Bos en Lommer van 150 naar ruim 500 leerlingen. De Telegraaf tekent op hoe de buurt om de school heen dit zoal ervaart. 

"„We voelen ons gewoon onveilig. Diverse buren werken niet meer thuis of overwegen te verhuizen vanwege de overlast”, vertelt een buurtbewoner die laatst nog getuige was van intimidatie en vernieling, waar een fiets tegen een raam werd gegooid en daarna agressief tegen de voordeur werd aangetrapt. Dat soort dingen gebeurt eigenlijk dagelijks, als de school open is. Leerlingen van het Cornelius Haga Lyceum laten bijvoorbeeld continu de alarmen van scooters en fatbikes afgaan, scheuren daarmee door omliggende straten en vooral op voetpaden, klimmen op auto’s en balkons en hebben geen respect voor kleine kinderen of huisdieren.

Spullen worden opzettelijk vernield en overal ligt rotzooi. Een buurtbewoonster vertelt dat zelfs met het vuilnis buiten zetten de deur op slot moet, anders lopen leerlingen zomaar je huis in. „Dat is bij meerdere buren gebeurd.” Het vervelendste is het provoceren en intimideren, geven de buurtbewoners aan, die tientallen buren vertegenwoordigen. „Dan staan ze aan weerszijden van de stoep, je allemaal aan te kijken als je langsloopt. Je krijgt seksuele opmerkingen naar je hoofd, of te horen dat je maar goed moet oppassen. En als je iets terugzegt, word je uitgescholden. En straks begint het vuurwerk weer. Dat wordt van oktober tot maart afgestoken en zorgt voor erg veel overlast.”"

(...) Volgens een andere buurtbewoner komen er dagelijks veel buitenstaanders op de school af. „Die willen leerlingen ronselen voor criminele activiteiten of komen gewoon provoceren”, vermoedt hij. „Dan komen ze aanrijden op een scooter zonder uitlaat, als een mafkees over de stoep. Of je ziet ze in die hele dure auto’s.”"

En het is misschien het laatste wat je van deze school verwacht, maar het bestuur geeft de gemeente de schuld van, ja, alles. "Op de vraag wat het Cornelius Haga Lyceum doet om overlast voor de buurt te verminderen, wijst het bestuur van de school naar de gemeente, die de school van een gebouw heeft voorzien zonder plein. „Het ontbreken van buitenruimte leidt tot overlast in de buurt, waar leerlingen zich genoodzaakt zien pauzes door te brengen in de omliggende woonstraten”, stelt het bestuur."

En daarin ligt een wijze les in besloten: de enige oplossing is 'ze' nog meer accommoderen.