Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: e201f2fb13f1460392c19559c7ce408ac36d7a86 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/*******************************************************************************
 * Copyright (c) 2014 protos software gmbh (http://www.protos.de).
 * 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:
 * 		hrentz (initial contribution)
 * 
 *******************************************************************************/
package org.eclipse.etrice.core.common.validation

import java.util.List
import java.util.Set
import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EStructuralFeature
import java.util.ArrayList
import org.eclipse.emf.ecore.resource.Resource
import com.google.common.base.Function

/**
 * @author hrentz
 *
 */
class ValidationHelpers {

	public static class NamedObject {
		@Property String name
		@Property EObject obj
		@Property EStructuralFeature feature

		new(String name, EObject obj, EStructuralFeature feature) {
			this.name = name
			this.obj = obj
			this.feature = feature
		}
	}

	public static class NamedObjectList extends ArrayList<NamedObject> {
		def addAll(List<? extends EObject> items, EStructuralFeature feature) {
			items.forEach[this.add(new NamedObject(it.eGet(feature) as String, it, feature))]
		}
	}

	def static Iterable<NamedObject> removeUniques(List<NamedObject> items) {
		val Set<String> allOfName = newHashSet
		val Set<String> duplicateNames = newHashSet

		// first sweep: determine duplicate names
		for (i : items) {

			// if the name already occurred we have a duplicate name and hence an error
			if (allOfName.contains(i.name)) {
				duplicateNames.add(i.name)
			}
			else {
				allOfName.add(i.name);
			}
		}

		// second sweep: remove duplicates
		items.filter(i|duplicateNames.contains(i.name))
	}
	
	def static Iterable<NamedObject> inSameResource(Iterable<NamedObject> items, Resource resource) {
		items.filter(i|i.obj.eResource==resource)
	}
	
	/**
	 * Visitor for inheritance, safeguards from null, eProxy and circular issues.
	 * 
	 * @param start EObject, may be null
	 * @param function return null to exit
	 */
	def static <E extends EObject> saveRecursiveVisitor(E  start, Function<E , E> function){
		val Set<E> visited = newHashSet
		var E next = start
		while(next !== null && !next.eIsProxy && (visited += next))
			next = function.apply(next)
	}
}

Back to the top