00001 00005 package edu.mit.csail.sdg.squander.spec; 00006 00007 import java.lang.reflect.Field; 00008 import java.lang.reflect.Method; 00009 import java.util.LinkedList; 00010 import java.util.List; 00011 00012 public class CompositeSpecProvider implements ISpecProvider { 00013 00014 private final ISpecProvider[] providers; 00015 00016 public CompositeSpecProvider(ISpecProvider... providers) { 00017 this.providers = providers; 00018 } 00019 00020 @Override 00021 public List<Source> extractClassSpec(JType.Unary jtype) { 00022 List<Source> result = new LinkedList<Source>(); 00023 for (ISpecProvider isp : providers) 00024 result.addAll(isp.extractClassSpec(jtype)); 00025 return result; 00026 } 00027 00028 @Override 00029 public List<Source> extractFieldSpec(Field field, JType.Unary declaringType) { 00030 List<Source> result = new LinkedList<Source>(); 00031 for (ISpecProvider isp : providers) 00032 result.addAll(isp.extractFieldSpec(field, declaringType)); 00033 return result; 00034 } 00035 00036 @Override 00037 public MethodSpec extractMethodSpec(Method method, NameSpace ns) { 00038 MethodSpec result = null; 00039 for (ISpecProvider isp : providers) { 00040 MethodSpec ms = isp.extractMethodSpec(method, ns); 00041 if (ms == null || ms.cases().size() == 0) 00042 continue; 00043 if (result != null) 00044 throw new RuntimeException("Multiple specs for method found: " + method); 00045 result = ms; 00046 } 00047 if (result == null) 00048 result = new MethodSpec(); 00049 return result; 00050 } 00051 00052 }