import groovy.io.FileType
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import rba.core.*;
import rba.view.*;
import rba.sound.*;
import rba.tool.editor.rbaEditorModel.*;
import sun.font.EAttribute;
import org.eclipse.emf.ecore.util.EContentsEList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EStructuralFeature;
util.metaClass.getClassName = { it ->
String pattern = "core\$";
return it.split(pattern);
}
util.metaClass.getDisplaySize = { it ->
Size s;
SizeIdentifier si = it.getSize();
if (si instanceof SizeReference) {
s = si.getSize();
} else {
s = si;
}
}
util.metaClass.getZones = {
collect(Zone.class);
}
util.metaClass.getViewContents = {
collect(ViewContent.class);
}
util.metaClass.getSoundContents = {
collect(SoundContent.class);
}
util.metaClass.getAreaSets = {
collect(AreaSet.class);
}
util.metaClass.getZoneSets = {
collect(ZoneSet.class);
}
util.metaClass.getViewContentSets = {
collect(ViewContentSet.class);
}
util.metaClass.getSoundContentSets = {
collect(SoundContentSet.class);
}
util.metaClass.getProject = {
p = null;
projects = collect(Project.class);
if (!projects.isEmpty()) p = projects.get(0)
p;
}
class util2 {
static List allAreas;
static List allZones;
static List allViewContents;
static List allSoundContents;
static void setAll(List areas, List zones, List viewContents, List soundContents) {
allAreas = areas;
allZones = zones;
allViewContents = viewContents;
allSoundContents = soundContents;
}
static void addAllIfNotContains(Collection> list, Collection> all) {
all.each {
if (!list.contains(it)) {
list.add(it);
}
}
}
static Collection getLeafContentList(AbstractContent ac) {
Collection result = new ArrayList();
if (ac instanceof Content) {
result.add((Content)ac);
} else if (ac instanceof ContentSet) {
for (AbstractContent c : ((ContentSet)ac).getTarget()) {
addAllIfNotContains(result, getLeafContentList(c));
}
}
return result;
}
static Collection getAllocatableList(AbstractContent ac) {
Collection result = new ArrayList();
Collection allocatables = new ArrayList();
allocatables.addAll(ac.allocatable);
ac.contentGroup.each {
allocatables.addAll(it.allocatableList);
}
if (ac instanceof Content) {
allocatables.each {
if (it instanceof AllocatableSet) {
it.collectLeafAllocatable().each {
if (!result.contains(it)) {
result.add(it);
}
}
} else {
if (!result.contains(it)) {
result.add(it);
}
}
}
} else if (ac instanceof ContentSet) {
for (AbstractContent c : ((ContentSet)ac).getTarget()) {
addAllIfNotContains(result, getAllocatableList(c));
}
}
return result;
}
static String getFullName(EObject e) {
if (e == null) return "";
String fullName = e.name;
EObject parent = e.eContainer();
while (!(parent instanceof Package)) {
fullName = parent.getName() + "/" + fullName;
parent = parent.eContainer();
}
return fullName;
}
static String getFullNameWithClassName(EObject e) {
String className = e.eClass().getName().replaceAll('rba.([a-z]+.)+.impl.', '').replaceAll('Impl$', '');
String fullName = e.name + ":" + className;
EObject parent = e.eContainer();
while (!(parent instanceof Package)) {
className = parent.eClass().getName().replaceAll('rba.([a-z]+.)+.impl.', '').replaceAll('Impl$', '');
fullName = parent.getName() + ":" + className + "/" + fullName;
parent = parent.eContainer();
}
return fullName;
}
static String indentSet(String si, int nest) {
si = si + '\n';
for (int i = 0; i < nest; ++i) {
si = si + '\t';
}
return si;
}
static String jsonConstractor(EObject eO, int nest) {
String s = '';
if ((eO instanceof SugarExpression) && ((SugarExpression)eO).canExpand()) {
s = s + jsonConstractor(((SugarExpression) eO).getExpanded(), nest);
return s;
}
s = indentSet(s, nest);
s = s + '{';
nest = nest+1;
s = indentSet(s, nest);
s = s + jsonConstractorOtherThan(eO, nest, new ArrayList());
s = indentSet(s, nest-1);
s = s + '}';
return s;
}
static String jsonConstractorOtherThan(EObject eO, int nest, Collection excepts) {
if (eO == null) return;
String s = '';
boolean isObjRef = false;
boolean isFullNameWithClassName = false;
if (!excepts.contains("class")) {
String className = eO.eClass().getName().replaceAll('rba.([a-z]+.)+.impl.', '').replaceAll('Impl$', '');
if (className == "ObjectReference") {
isObjRef = true;
}
s += '\"class\":\"' + className + '\"';
}
for (EAttribute a : eO.eClass().getEAllAttributes()) {
if (a.isDerived() && a.isChangeable()) continue;
if (a.getName().contentEquals("description")) continue;
if (excepts.contains(a.getName())) continue;
s += ',';
s = indentSet(s, nest);
s += '\"' + a.getName() + '\":';
if ((a.name == "name") && isFullNameWithClassName) {
s += "\"" + getFullNameWithClassName(eO) + "\"";
continue;
}
if (a.isMany()) {
List