/*******************************************************************************
* Copyright (c) 2011 Martin Schnabel <mb0@mb0.org>.
* 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
******************************************************************************/
package org.axdt.asdoc.access;
import java.util.List;
import org.axdt.asdoc.AsdocEFactory;
import org.axdt.asdoc.AsdocEPackage;
import org.axdt.asdoc.model.AsdocMember;
import org.axdt.asdoc.model.AsdocPackage;
import org.axdt.asdoc.model.AsdocRoot;
import org.axdt.asdoc.model.AsdocType;
import org.axdt.avm.access.AvmLibrary;
import org.axdt.avm.model.AvmDefinition;
import org.axdt.avm.naming.AvmQualifiedName;
import org.axdt.avm.naming.AvmQualifiedNameConverter;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import com.google.common.collect.Lists;
public class AsdocLibrary extends AvmLibrary {
AvmQualifiedNameConverter converter = new AvmQualifiedNameConverter();
private final List<IEObjectDescription> descriptions;
public AsdocLibrary(AsdocRoot root) {
descriptions = collectDescriptions(root);
}
private List<IEObjectDescription> collectDescriptions(AsdocRoot root) {
return collectPackageContent(root, Lists.<IEObjectDescription>newArrayList(), true);
}
private List<IEObjectDescription> collectPackageContent(AsdocPackage pack, List<IEObjectDescription> result, boolean roots) {
for (AsdocPackage child:pack.getPackages()) {
if (roots) result.add(createDesciption(child.getQualifiedName(), child.eClass(), "avm:/packages/"));
collectPackageContent(child, result, false);
}
if (pack.isTypeContentAvailable())
for (AsdocType type:pack.getTypes())
result.add(createDesciption(type.getQualifiedName(), type.eClass(), "avm:/types/"));
if (pack.isGlobalContentAvailable())
for (AsdocMember member:pack.getMembers())
result.add(createDesciption(member.getQualifiedName(), member.eClass(), "avm:/members/"));
EClass nsType = AsdocEPackage.eINSTANCE.getAsdocNamespace();
result.add(createDesciption(AvmQualifiedName.create("flash","utils","flash_proxy"), nsType,"avm:/members/"));
result.add(createDesciption(AvmQualifiedName.create("flash","utils","object_proxy"), nsType, "avm:/members/"));
result.add(createDesciption(AvmQualifiedName.create("AS3"), nsType, "avm:/members/"));
return result;
}
protected IEObjectDescription createDesciption(AvmDefinition identifiable, String prefix) {
return createDesciption(identifiable.getQualifiedName(), identifiable.eClass(), prefix);
}
protected IEObjectDescription createDesciption(AvmQualifiedName avmQualifiedName, EClass type, String prefix) {
// we use mirror resources thus return a proxy
InternalEObject proxy = (InternalEObject) AsdocEFactory.eINSTANCE.create(type);
proxy.eSetProxyURI(URI.createURI(prefix + avmQualifiedName.toString() +"#"));
return EObjectDescription.create(avmQualifiedName, proxy);
}
@Override
public List<IEObjectDescription> getExportedObjects() {
return descriptions;
}
}