All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.emfjson.jackson.databind.deser.ReferenceEntry Maven / Gradle / Ivy

There is a newer version: 1.3.0
Show newest version
/*
 * Copyright (c) 2015 Guillaume Hillairet.
 * 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:
 *     Guillaume Hillairet - initial API and implementation
 *
 */
package org.emfjson.jackson.databind.deser;

import com.fasterxml.jackson.databind.DatabindContext;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.emfjson.jackson.databind.EMFContext;
import org.emfjson.jackson.handlers.URIHandler;
import org.emfjson.jackson.utils.EObjects;

public interface ReferenceEntry {

	void resolve(DatabindContext context, URIHandler handler);

	class Base implements ReferenceEntry {

		private final EObject owner;
		private final EReference reference;
		private final String id;
		private final String type;

		public Base(EObject owner, EReference reference, String id) {
			this(owner, reference, id, null);
		}

		public Base(EObject owner, EReference reference, String id, String type) {
			this.owner = owner;
			this.reference = reference;
			this.id = id;
			this.type = type;
		}

		@Override
		public void resolve(DatabindContext context, URIHandler handler) {
			if (id == null) {
				return;
			}

			ReferenceEntries entries = EMFContext.getEntries(context);
			ResourceSet resourceSet = EMFContext.getResourceSet(context);
			EObject target = entries.get(id);

			if (target == null) {
				Resource resource = EMFContext.getResource(context, owner);
				target = resource.getEObject(id);

				if (target == null) {

					URI baseURI = resource.getURI().trimFragment();
					URI uri = handler.resolve(baseURI, URI.createURI(id));

					if (reference.isResolveProxies() && type != null) {
						target = createProxy(resourceSet, uri);
					} else {
						target = resourceSet.getEObject(uri, true);
					}
				}

				if (target != null) {
					entries.store(id, target);
				}
			}

			if (target != null) {
				EObjects.setOrAdd(owner, reference, target);
			}
		}

		private EObject createProxy(ResourceSet resourceSet, URI uri) {
			EClass eClass;
			try {
				eClass = (EClass) resourceSet.getEObject(URI.createURI(type), true);
			} catch (Exception e) {
				return null;
			}

			if (eClass == null) {
				return null;
			}

			EObject object = EcoreUtil.create(eClass);
			if (object instanceof InternalEObject) {
				((InternalEObject) object).eSetProxyURI(uri);
			}

			return object;
		}

		@Override
		public boolean equals(Object o) {
			if (this == o) return true;
			if (o == null || getClass() != o.getClass()) return false;

			Base that = (Base) o;

			if (!owner.equals(that.owner)) return false;
			if (!reference.equals(that.reference)) return false;
			if (!id.equals(that.id)) return false;
			return type != null ? type.equals(that.type): that.type == null;

		}

		@Override
		public int hashCode() {
			int result = owner.hashCode();
			result = 31 * result + reference.hashCode();
			result = 31 * result + id.hashCode();
			result = 31 * result + (type != null ? type.hashCode(): 0);
			return result;
		}
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy