/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package eu.cloud4soa.semantic;
import com.viceversatech.rdfbeans.annotations.RDF;
import com.viceversatech.rdfbeans.annotations.RDFSubject;
import eu.cloud4soa.api.datamodel.core.UserInstance;
import eu.cloud4soa.api.datamodel.core.UserSemanticModel;
import eu.cloud4soa.api.datamodel.core.annotations.SemanticRelation;
import java.lang.reflect.Method;
import java.util.HashMap;
import org.ontoware.rdf2go.model.node.URI;
import org.ontoware.rdf2go.model.node.impl.URIImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author vincenzo
*/
public class UserModel implements eu.cloud4soa.api.semantic.UserModel{
final Logger logger = LoggerFactory.getLogger(UserModel.class);
@Override
public UserSemanticModel getUserSemanticModel() {
logger.debug("getUserSemanticModel()");
HashMap<Method,URI> releatedResources = exploreUserModel();
UserSemanticModel userSemanticModel = new UserSemanticModel(releatedResources);
logger.debug("created UserSemanticModel: "+ userSemanticModel);
logger.debug("return UserSemanticModel "+userSemanticModel);
return userSemanticModel;
}
private HashMap<Method, URI> exploreUserModel() {
HashMap<Method,URI> releatedResources = new HashMap<Method, URI>();
Method[] methods = null;
try {
methods = UserInstance.class.getMethods();
} catch (SecurityException ex) {
logger.error("SecurityException", ex);
}
if(methods!=null){
for( int i=0; i<methods.length; i++ ){
String methodName = methods[ i ].getName();
if( (methodName.startsWith( "get" ) || methodName.startsWith( "is" )) && methods[ i ].getParameterTypes().length == 0){
// Skip over "getClass()"
if( !methodName.equals( "getClass" ) ){
SemanticRelation annotation = methods[ i ].getAnnotation(SemanticRelation.class);
if(annotation!=null){
Class semanticClass = annotation.semanticClass();
String semanticMethodName = annotation.methodName();
logger.debug("semanticClass: "+semanticClass);
logger.debug("semanticMethodName: "+semanticMethodName);
try {
RDF ann = semanticClass.getMethod(semanticMethodName, new Class[0]).getAnnotation(RDF.class);
if (ann != null) {
URI attributeURI = new URIImpl(ann.value());
releatedResources.put(methods[ i ], attributeURI);
}
else{
RDFSubject rdfSubjectAnnotation = semanticClass.getMethod(semanticMethodName, new Class[0]).getAnnotation(RDFSubject.class);
if (rdfSubjectAnnotation != null) {
URI attributeURI = new URIImpl(rdfSubjectAnnotation.prefix());
releatedResources.put(methods[ i ], attributeURI);
}
}
} catch (NoSuchMethodException ex) {
logger.error("NoSuchMethodException: "+ex);
} catch (SecurityException ex) {
logger.error("SecurityException: "+ex);
}
}
}
}
}
}
return releatedResources;
}
}