/*
* Copyright (c) 2012 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.db.common;
import java.lang.annotation.*;
import java.util.*;
import com.sun.jersey.core.spi.scanning.PackageNamesScanner;
import com.sun.jersey.spi.scanning.AnnotationScannerListener;
/**
* Scanner for sweeping all DataObject types defined and creates:
* - CF Map for building db schema
* - DependencyTracker - with all the dependency information between the types
*/
public abstract class PackageScanner {
protected DbSchemaScannerInterceptor _scannerInterceptor = null;
private PackageNamesScanner _scanner;
private String[] packages;
public PackageScanner(String... packages) {
this.packages = packages;
_scanner = new PackageNamesScanner(packages);
}
/**
* Package where model classes are defined
*
* @param packages
*/
public void setPackages(String... packages) {
this.packages = packages;
_scanner = new PackageNamesScanner(packages);
}
/**
* set schema scanner interceptor - use only for unit testing schema changes
*
* @param scannerInterceptor
*/
public void setScannerInterceptor(DbSchemaScannerInterceptor scannerInterceptor) {
_scannerInterceptor = scannerInterceptor;
}
/**
* Scan model classes and load up CF information from them
*/
@SuppressWarnings("unchecked")
public void scan(Class<? extends Annotation>... annotations) {
AnnotationScannerListener scannerListener = new AnnotationScannerListener(annotations);
_scanner.scan(scannerListener);
Iterator<Class<?>> it = scannerListener.getAnnotatedClasses().iterator();
while (it.hasNext()) {
processClass(it.next());
}
}
@SuppressWarnings("unchecked")
protected Collection<Class<?>> getModelClasses(Class<? extends Annotation>... annotations) {
PackageNamesScanner clazzScanner = new PackageNamesScanner(this.packages);
AnnotationScannerListener scannerListener = new AnnotationScannerListener(annotations);
clazzScanner.scan(scannerListener);
return scannerListener.getAnnotatedClasses();
}
/**
* Processes class
*
* @param clazz
*/
abstract protected void processClass(Class clazz);
}