/**
* Copyright (c) 2007 Borland Software Corporation
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* bblajer - initial API and implementation
*/
package org.eclipse.gmf.runtime.lite.validation;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import org.eclipse.emf.common.util.URI;
/**
* Represents a state of validation of a single diagram.
*/
public class ValidationState {
private final URI myDiagramUri;
private final ValidationStateManager myStateManager;
private HashMap<URI, Collection<ViolationDescriptor>> myViolations = new HashMap<URI, Collection<ViolationDescriptor>>();
private ValidationStateUpdater myUpdater;
public ValidationState(ValidationStateManager stateManager, URI diagramUri) {
myDiagramUri = diagramUri;
myStateManager = stateManager;
}
/**
* @return the diagramUri
*/
public URI getDiagramUri() {
return myDiagramUri;
}
public Collection<ViolationDescriptor> getViolations(URI uri) {
return myViolations.get(uri);
}
public Collection<ViolationDescriptor> getAllViolations() {
Collection<ViolationDescriptor> result = new ArrayList<ViolationDescriptor>();
for (Collection<ViolationDescriptor> next : myViolations.values()) {
result.addAll(next);
}
return result;
}
/**
* Starts an update operation. The operation will typically create the violations based on
* the current state of the validation and report completion
* using {@link IValidationStateUpdater#commitChanges()} method.
* After the operation is completed successfully, the {@link IValidationStateListener listeners}
* registered to the {@link ValidationStateManager} will be notified about the change.
* It is expected that a single command may be active at any given time, and that a command will
* not be used after is has been reported as completed.
*/
public IValidationStateUpdater startUpdate() {
if (myUpdater != null) {
throw new IllegalStateException();
}
myUpdater = new ValidationStateUpdater();
return myUpdater;
}
private class ValidationStateUpdater implements IValidationStateUpdater {
private HashMap<URI, Collection<ViolationDescriptor>> myUpdatedViolations;
public ValidationStateUpdater() {
myUpdatedViolations = new HashMap<URI, Collection<ViolationDescriptor>>();
}
public void addViolation(ViolationDescriptor violation) {
if (violation == null) {
return;
}
URI uri = violation.getUri();
Collection<ViolationDescriptor> descriptors = get(uri, true);
if (!descriptors.contains(violation)) {
descriptors.add(violation);
}
}
public void removeViolation(ViolationDescriptor violation) {
if (violation == null) {
return;
}
URI uri = violation.getUri();
Collection<ViolationDescriptor> descriptors = get(uri, false);
if (descriptors != null) {
descriptors.remove(violation);
}
}
private Collection<ViolationDescriptor> get(URI uri, boolean createIfMissing) {
Collection<ViolationDescriptor> result = myUpdatedViolations.get(uri);
if (result == null && createIfMissing) {
result = new ArrayList<ViolationDescriptor>();
myUpdatedViolations.put(uri, result);
}
return result;
}
public void commitChanges() {
if (myUpdater != this) {
throw new IllegalStateException();
}
try {
HashMap<URI, Collection<ViolationDescriptor>> oldViolations = myViolations;
myViolations = myUpdatedViolations;
myStateManager.fireValidationStateChanged(ValidationState.this, Collections.unmodifiableMap(oldViolations), Collections.unmodifiableMap(myUpdatedViolations));
} finally {
myUpdater = null;
}
}
public void discardChanges() {
if (myUpdater == this) {
myUpdater = null;
}
}
}
}