|
Lines 21-33
Link Here
|
| 21 |
import java.util.Arrays; |
21 |
import java.util.Arrays; |
| 22 |
import java.util.Collection; |
22 |
import java.util.Collection; |
| 23 |
import java.util.Collections; |
23 |
import java.util.Collections; |
| 24 |
import java.util.HashSet; |
|
|
| 25 |
import java.util.Iterator; |
24 |
import java.util.Iterator; |
| 26 |
import java.util.LinkedHashMap; |
25 |
import java.util.LinkedHashMap; |
| 27 |
import java.util.List; |
26 |
import java.util.List; |
| 28 |
import java.util.Locale; |
27 |
import java.util.Locale; |
| 29 |
import java.util.Map; |
28 |
import java.util.Map; |
| 30 |
import java.util.Set; |
|
|
| 31 |
|
29 |
|
| 32 |
import org.eclipse.emf.codegen.ecore.CodeGenEcorePlugin; |
30 |
import org.eclipse.emf.codegen.ecore.CodeGenEcorePlugin; |
| 33 |
import org.eclipse.emf.codegen.ecore.Generator; |
31 |
import org.eclipse.emf.codegen.ecore.Generator; |
|
Lines 448-482
Link Here
|
| 448 |
} |
446 |
} |
| 449 |
|
447 |
|
| 450 |
public List<GenClass> getSwitchGenClasses() |
448 |
public List<GenClass> getSwitchGenClasses() |
| 451 |
{ |
449 |
{ |
| 452 |
// for Ecore or something that explicitly extends it, we need to exclude |
450 |
// Traverse the supertypes to find the maximum depths. |
| 453 |
// EObject, which is already handled by the default case |
451 |
// Exclude this class itself, which is handled separately in the template. |
| 454 |
List<GenClass> result = |
452 |
// |
| 455 |
collectGenClasses |
453 |
Map<EClass, Integer> maxDepths = new LinkedHashMap<EClass, Integer>(); |
| 456 |
(getEcoreClass().getESuperTypes(), |
454 |
findMaxSuperTypeDepths(maxDepths, getEcoreClass(), 0); |
| 457 |
new GenClassFilter() |
455 |
maxDepths.remove(getEcoreClass()); |
| 458 |
{ |
|
|
| 459 |
public boolean accept(GenClass genClass) |
| 460 |
{ |
| 461 |
return !genClass.isEObject(); |
| 462 |
} |
| 463 |
}); |
| 464 |
Set<GenClass> resultSet = new HashSet<GenClass>(result); |
| 465 |
|
456 |
|
| 466 |
for (int i = 0; i < result.size(); i++) |
457 |
// Order the results in a list of lists, indexed by maximum depth. |
|
|
458 |
// Exclude EObject, which is handled by the default case. |
| 459 |
// |
| 460 |
List<List<GenClass>> ordered = new ArrayList<List<GenClass>>(); |
| 461 |
int resultSize = 0; |
| 462 |
for (Map.Entry<EClass, Integer> entry : maxDepths.entrySet()) |
| 467 |
{ |
463 |
{ |
| 468 |
GenClass base = result.get(i); |
464 |
GenClass genClass = findGenClass(entry.getKey()); |
| 469 |
for (GenClass baseOfBase : base.getBaseGenClasses()) |
465 |
if (genClass != null && !genClass.isEObject()) |
| 470 |
{ |
466 |
{ |
| 471 |
if (!baseOfBase.isEObject() && resultSet.add(baseOfBase)) |
467 |
int depth = entry.getValue(); |
|
|
468 |
while (ordered.size() <= depth) |
| 472 |
{ |
469 |
{ |
| 473 |
result.add(baseOfBase); |
470 |
ordered.add(new ArrayList<GenClass>()); |
| 474 |
} |
471 |
} |
|
|
472 |
ordered.get(depth).add(genClass); |
| 473 |
resultSize++; |
| 475 |
} |
474 |
} |
| 476 |
} |
475 |
} |
|
|
476 |
|
| 477 |
// Traverse the list of lists to build a final ordered result. |
| 478 |
// |
| 479 |
List<GenClass> result = new ArrayList<GenClass>(resultSize); |
| 480 |
for (List<GenClass> genClasses : ordered) |
| 481 |
{ |
| 482 |
result.addAll(genClasses); |
| 483 |
} |
| 477 |
return result; |
484 |
return result; |
| 478 |
} |
485 |
} |
| 479 |
|
486 |
|
|
|
487 |
private void findMaxSuperTypeDepths(Map<EClass, Integer> maxDepths, EClass eClass, int depth) |
| 488 |
{ |
| 489 |
Integer existing = maxDepths.get(eClass); |
| 490 |
if (existing != null) |
| 491 |
{ |
| 492 |
if (depth > existing) |
| 493 |
{ |
| 494 |
maxDepths.put(eClass, depth); |
| 495 |
} |
| 496 |
} |
| 497 |
else |
| 498 |
{ |
| 499 |
maxDepths.put(eClass, depth); |
| 500 |
for (EClass base : eClass.getESuperTypes()) |
| 501 |
{ |
| 502 |
findMaxSuperTypeDepths(maxDepths, base, depth + 1); |
| 503 |
} |
| 504 |
} |
| 505 |
} |
| 506 |
|
| 480 |
public GenClass getBaseGenClass() |
507 |
public GenClass getBaseGenClass() |
| 481 |
{ |
508 |
{ |
| 482 |
List<EClass> s = getEcoreClass().getESuperTypes(); |
509 |
List<EClass> s = getEcoreClass().getESuperTypes(); |