/**
* (C) Copyright 2013 Jabylon (http://www.jabylon.org) and others.
*
* 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.jabylon.common.resolver.impl;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.felix.scr.annotations.Component;
import org.apache.felix.scr.annotations.Deactivate;
import org.apache.felix.scr.annotations.Reference;
import org.apache.felix.scr.annotations.ReferenceCardinality;
import org.apache.felix.scr.annotations.ReferencePolicy;
import org.apache.felix.scr.annotations.Service;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.common.util.URI;
import org.jabylon.cdo.connector.RepositoryConnector;
import org.jabylon.common.resolver.URIHandler;
import org.jabylon.common.resolver.URIResolver;
/**
* @author jutzig.dev@googlemail.com
*
*/
@Component
@Service
public class URIResolverImpl implements URIResolver {
@Reference(referenceInterface=URIHandler.class,cardinality=ReferenceCardinality.OPTIONAL_MULTIPLE,bind="addHandler",unbind="removeHandler",policy=ReferencePolicy.DYNAMIC)
private List<URIHandler> handlers = new CopyOnWriteArrayList<URIHandler>();
private CDONet4jSession session;
private CDOView view;
@Reference(cardinality=ReferenceCardinality.MANDATORY_UNARY)
private RepositoryConnector repositoryConnector;
public void addHandler(URIHandler handler)
{
handlers.add(handler);
}
public void removeHandler(URIHandler handler) {
handlers.remove(handler);
}
/*
* (non-Javadoc)
*
* @see
* org.jabylon.common.resolver.URIResolver#resolve(org.eclipse.emf
* .common.util.URI)
*/
@Override
public Object resolve(URI uri) {
for (URIHandler handler : handlers) {
if(handler.canHandle(uri))
{
Object resolved = handler.resolve(uri);
// URI internal = internalGetURI(resolved);
// if(!internal.equals(uri))
// throw new IllegalStateException(internal + " != " + uri);
return resolved;
}
}
return null;
}
public URI internalGetURI(Object o) {
for (URIHandler handler : handlers) {
if(handler.canHandle(o))
{
return handler.toURI(o);
}
}
return null;
}
@Override
public URI getURI(Object o) {
URI uri = internalGetURI(o);
if(uri==null)
return null;
//sanity check. Can be removed later
// Object resolved = resolve(uri);
// if(resolved == null)
// throw new IllegalStateException("handler is not sane");
return uri;
}
/*
* (non-Javadoc)
*
* @see
* org.jabylon.common.resolver.URIResolver#resolve(java.lang.String)
*/
@Override
public Object resolve(String path) {
if(path==null)
return resolve((URI)null);
URI uri = URI.createURI(path, true);
return resolve(uri);
}
public void bindRepositoryConnector(RepositoryConnector connector) {
repositoryConnector = connector;
session = connector.createSession();
view = connector.openView(session);
}
public void unbindRepositoryConnector(RepositoryConnector connector) {
view.close();
view = null;
session.close();
session = null;
}
@Deactivate
public void deactivate() {
if(view!=null)
view.close();
if(session!=null)
session.close();
}
@Override
public CDOObject resolve(CDOID id) {
return view.getObject(id);
}
@Override
public CDOObject resolveWithTransaction(CDOID id) {
return repositoryConnector.configureView(session.openTransaction()).getObject(id);
}
}