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

io.milton.http.annotated.PrincipalSearchAnnotationHandler Maven / Gradle / Ivy

/*
 *
 * Copyright 2014 McEvoy Software Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.milton.http.annotated;

import io.milton.annotations.PrincipalSearch;
import io.milton.common.Path;
import io.milton.http.exceptions.BadRequestException;
import io.milton.http.exceptions.NotAuthorizedException;
import io.milton.principal.PrincipalSearchCriteria;
import io.milton.resource.Resource;
import java.util.Collection;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 *
 * @author brad
 */
public class PrincipalSearchAnnotationHandler extends AbstractAnnotationHandler {
	
	private static final Logger log = LoggerFactory.getLogger(AnnotationResourceFactory.class);
	
	public PrincipalSearchAnnotationHandler(final AnnotationResourceFactory outer) {
		super(outer, PrincipalSearch.class);
	}

	public List execute(AnnoAddressBookResource addressBookRes, PrincipalSearchCriteria crit) {
		Object source = addressBookRes.getSource();
		try {
			Object value = null;
			ControllerMethod cm = getBestMethod(source.getClass());
			if (cm == null) {
				// look for an annotation on the source itself
				java.lang.reflect.Method m = annoResourceFactory.findMethodForAnno(source.getClass(), annoClass);
				if (m != null) {
					value = m.invoke(source, crit);
				} else {
					return null;
				}
			} else {
				value = invoke(cm, addressBookRes, crit);
			}
			if (value != null) {
				return toResourceList(addressBookRes, value);
			} else {
				return null;
			}
		} catch (Exception e) {
			throw new RuntimeException("Exception executing " + getClass() + " - " + source.getClass(), e);
		}
	}
	
	private ResourceList toResourceList(AnnoAddressBookResource addressBookRes, Object value) throws NotAuthorizedException, BadRequestException {
		ResourceList list = new ResourceList();
		if( value == null ) {
			log.warn("Got null from principal search");
		} else if( list instanceof Collection ) {
			Collection col = (Collection) value;
			for( Object o : col) {
				CommonResource cr = toResource(addressBookRes, o);
			}
		}
		return list;
	}

	private CommonResource toResource(AnnoAddressBookResource addressBookRes, Object o) throws NotAuthorizedException, BadRequestException {
		if( o instanceof CommonResource) {
			return (CommonResource) o;
		} else if( o instanceof Resource ) {
			Resource r = (Resource) o;
			log.warn("Got an incompatible Resource={} with name={}, should be implementation of CommonResource", o.getClass(), r.getName());
			return null;
		} else if( o instanceof Path) {
			Path path = (Path) o;
			AnnoCollectionResource fromCol;
			if( path.isRelative()) {
				fromCol = addressBookRes;
			} else {
				fromCol = addressBookRes.getRoot();
			}
			Resource r = annoResourceFactory.findFromRoot(fromCol, path);
			return toResource(addressBookRes, r);			
		} else if( o instanceof String ) {
			// treat as a href
			String s = (String) o;
			Path path = Path.path(s);
			return toResource(addressBookRes, path);
		} else {
			log.warn("Got an incompatible search result with class={}. I dont know how to convert this to a CommonResource. Return a String href or Path (path to resource), or a source object, or a CommonResource", o.getClass() );
			return null;
		}
		
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy