/** * GRANITE DATA SERVICES * Copyright (C) 2006-2015 GRANITE DATA SERVICES S.A.S. * * This file is part of the Granite Data Services Platform. * * Granite Data Services is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * Granite Data Services is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser * General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA, or see <http://www.gnu.org/licenses/>. */ package org.granite.client.scan; import java.lang.annotation.Annotation; import java.util.HashSet; import java.util.Set; import org.granite.client.configuration.ClassScanner; import org.granite.client.messaging.RemoteAlias; import net.sf.extcos.ComponentQuery; import net.sf.extcos.ComponentScanner; import net.sf.extcos.spi.ResourceAccessor; import net.sf.extcos.spi.ResourceType; /** * @author William DRAI */ public class ExtCosClassScanner implements ClassScanner { public Set<Class<?>> scan(final Set<String> packageNames, Class<? extends Annotation> annotationClass) { ComponentScanner scanner = new ComponentScanner(); final String[] basePackageNames = packageNames.toArray(new String[packageNames.size()]); Set<Class<?>> classes = scanner.getClasses(new ComponentQuery() { @Override protected void query() { select(JavaClassResourceType.javaClasses()).from(basePackageNames).returning(allAnnotatedWith(RemoteAlias.class)); } }); Set<Class<?>> annotatedClasses = new HashSet<Class<?>>(); for (Class<?> cls : classes) { if (cls.isAnnotationPresent(annotationClass)) annotatedClasses.add(cls); } return annotatedClasses; } public static class JavaClassResourceType implements ResourceType { private static final String JAVA_CLASS_SUFFIX = "class"; private static JavaClassResourceType instance; /** * Always instantiate via the {@link #javaClasses()} method. */ private JavaClassResourceType() { } @Override public String getFileSuffix() { return JAVA_CLASS_SUFFIX; } /** * EDSL method */ public static JavaClassResourceType javaClasses() { if (instance == null) instance = new JavaClassResourceType(); return instance; } @Override public ResourceAccessor getResourceAccessor() { return new JavaResourceAccessor(); } } }