/**
* (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.ArrayDeque;
import java.util.Collection;
import java.util.Deque;
import java.util.List;
import org.apache.felix.scr.annotations.Activate;
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.Service;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.net4j.CDONet4jSession;
import org.eclipse.emf.cdo.view.CDOView;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.jabylon.cdo.connector.RepositoryConnector;
import org.jabylon.cdo.server.ServerConstants;
import org.jabylon.common.resolver.URIConstants;
import org.jabylon.common.resolver.URIHandler;
import org.jabylon.users.UserManagement;
import org.jabylon.users.UsersPackage;
/**
* @author Johannes Utzig (jutzig.dev@googlemail.com)
*
*/
@Component
@Service
public class UserManagmentURIHandler implements URIHandler {
@Reference
private RepositoryConnector repositoryConnector;
private CDONet4jSession session;
private UserManagement userManagment;
@Activate
public void activate() {
session = repositoryConnector.createSession();
CDOView view = repositoryConnector.openView(session);
CDOResource userResource = view.getResource(ServerConstants.USERS_RESOURCE);
userManagment = (UserManagement) userResource.getContents().get(0);
}
@Deactivate
public void deactivate() {
session.close();
}
/*
* (non-Javadoc)
*
* @see
* org.jabylon.common.resolver.URIResolver#resolve(org.eclipse.emf
* .common.util.URI)
*/
@Override
public Object resolve(URI uri) {
if (uri == null || uri.isEmpty() || uri.segmentCount() == 0)
return null;
String firstSegment = uri.segment(0);
if (URIConstants.SECURITY_URI_PREFIX.equals(firstSegment)) {
List<String> list = uri.segmentsList().subList(1, uri.segmentCount());
Object parent = userManagment;
for (String segment : list) {
parent = getChild(parent, URI.decode(segment));
if (parent == null)
return null;
}
return parent;
}
return null;
}
private Object getChild(Object parent, String segment) {
if (parent instanceof Collection) {
@SuppressWarnings("rawtypes")
Collection list = (Collection) parent;
for (Object object : list) {
if(matches(object,segment))
return object;
}
}
else if (parent instanceof EObject) {
EObject eobject = (EObject) parent;
EStructuralFeature feature = eobject.eClass().getEStructuralFeature(segment);
if(feature!=null)
return eobject.eGet(feature);
}
return null;
}
private boolean matches(Object object, String segment) {
if (object instanceof EObject) {
EObject eobject = (EObject) object;
String name = getSegmentName(eobject);
if(name==null)
return false;
return name.equals(segment);
}
return false;
}
private String getSegmentName(EObject object) {
if (object instanceof UserManagement) {
return URIConstants.SECURITY_URI_PREFIX;
}
EStructuralFeature feature = object.eClass().getEStructuralFeature("name");
if(feature==null)
return null;
return (String) object.eGet(feature);
}
public void bindRepositoryConnector(RepositoryConnector connector) {
this.repositoryConnector = connector;
}
public void unbindRepositoryConnector(RepositoryConnector connector) {
this.repositoryConnector = null;
}
@Override
public boolean canHandle(URI uri) {
if (uri == null || uri.isEmpty() || uri.segmentCount() == 0)
return false;
return URIConstants.SECURITY_URI_PREFIX.equals(uri.segment(0));
}
@Override
public boolean canHandle(Object o) {
if (o instanceof EObject) {
EObject eobject = (EObject) o;
return eobject.eClass().getEPackage().equals(UsersPackage.eINSTANCE);
}
if (o instanceof EStructuralFeature.Setting) {
EStructuralFeature.Setting setting = (EStructuralFeature.Setting) o;
return setting.getEStructuralFeature().getEType().getEPackage().equals(UsersPackage.eINSTANCE);
}
return false;
}
@Override
public URI toURI(Object o) {
Deque<String> segments = new ArrayDeque<String>();
if (o instanceof EStructuralFeature.Setting) {
EStructuralFeature.Setting setting = (EStructuralFeature.Setting) o;
o = setting.getEObject();
segments.add(setting.getEStructuralFeature().getName());
}
if (o instanceof EObject) {
EObject object = (EObject) o;
while(true) {
segments.push(getSegmentName(object));
EStructuralFeature eContainingFeature = object.eContainingFeature();
if(eContainingFeature==null)
break;
else
{
segments.push(eContainingFeature.getName());
object = object.eContainer();
}
}
StringBuilder builder = new StringBuilder();
for (String segment : segments) {
builder.append(segment);
builder.append("/");
}
if(builder.length()>0)
builder.setLength(builder.length()-1);
return URI.createURI(builder.toString());
}
return null;
}
}