/*
 * Copyright (c) 2010, 2012 JBoss, Inc. and others
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 */
package org.eclipse.bpel.ui.adapters;

import java.util.ArrayList;

import org.eclipse.bpel.model.adapters.AbstractStatefulAdapter;
import org.eclipse.core.resources.IMarker;
import org.eclipse.emf.common.notify.Notification;

/**
 * This class was created out of the duplicated code in a bunch of activity adapters.
 * It manages the markers list and ensures that duplicate markers are not added to
 * the list, and that only valid markers are returned.
 *
 * @see https://bugs.eclipse.org/bugs/show_bug.cgi?id=330813
 * @see https://jira.jboss.org/browse/JBIDE-7526
 * @author Bob Brodt
 * @date Nov 9, 2010
 */
public class MarkerHolderAdapter extends AbstractStatefulAdapter implements IMarkerHolder, AdapterNotification {

	private class UniqueMarkers extends ArrayList<IMarker> {

		// prevent duplicate marker IDs from being added to the list
		@Override
		public boolean add(IMarker e) {
			for (int i=0; i<size(); ++i) {
				IMarker m = get(i);
				if (m.getId() == e.getId())
					return false;
			}
			return super.add(e);
		}
		
	}
	
	/**
	 * @see org.eclipse.bpel.model.adapters.AbstractAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
	 */
	@Override
	public void notifyChanged(Notification notification) {		
		super.notifyChanged(notification);
		switch (notification.getEventType()) {
			case NOTIFICATION_MARKERS_STALE : 
				fMarkers.clear();
				break;
			case NOTIFICATION_MARKER_ADDED :
				fMarkers.add ( (IMarker) notification.getNewValue() );
				break;
			case NOTIFICATION_MARKER_DELETED :
				fMarkers.remove ( notification.getOldValue() );
				break;								
		}				
	}
	
	UniqueMarkers fMarkers = new UniqueMarkers();

	static IMarker [] EMPTY_MARKERS = {};
	
	/** (non-Javadoc)
	 * @see org.eclipse.bpel.ui.adapters.IMarkerHolder#getMarkers(java.lang.Object)
	 */
	public IMarker[] getMarkers (Object object) {
		
		if (fMarkers.size() == 0) {
			return EMPTY_MARKERS;
		}
		
		UniqueMarkers removed = new UniqueMarkers();
		for (IMarker m : fMarkers) {
			if (!m.exists())
				removed.add(m);
		}
		
		fMarkers.removeAll(removed);

		return fMarkers.toArray( EMPTY_MARKERS );						
	}
}
