//----------------------------------------------------------------------------// // // // F i l t e r D e s c r i p t o r // // // //----------------------------------------------------------------------------// // <editor-fold defaultstate="collapsed" desc="hdr"> // // Copyright © Hervé Bitteur and others 2000-2013. All rights reserved. // // This software is released under the GNU General Public License. // // Goto http://kenai.com/projects/audiveris to report bugs or suggestions. // //----------------------------------------------------------------------------// // </editor-fold> package omr.run; import omr.constant.ConstantSet; import omr.util.Param; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * Management data meant to describe an implementation instance of * a PixelFilter. * (kind of filter + related parameters) */ public abstract class FilterDescriptor { //~ Static fields/initializers --------------------------------------------- /** Specific application parameters */ private static final Constants constants = new Constants(); /** Usual logger utility */ private static final Logger logger = LoggerFactory.getLogger(FilterDescriptor.class); /** Default param. */ public static final Param<FilterDescriptor> defaultFilter = new Default(); //~ Methods ---------------------------------------------------------------- // //---------// // getKind // //---------// /** * Report the kind of filter used. * * @return the filter kind */ public abstract FilterKind getKind (); //----------------// // getDefaultKind // //----------------// public static FilterKind getDefaultKind () { return constants.defaultKind.getValue(); } //----------------// // setDefaultKind // //----------------// public static void setDefaultKind (FilterKind kind) { constants.defaultKind.setValue(kind); } //-----------// // getFilter // //-----------// /** * Create a filter instance compatible with the descriptor and * the underlying pixel source. * * @param source the underlying pixel source * @return the filter instance, ready to use */ public abstract PixelFilter getFilter (PixelSource source); //--------// // equals // //--------// @Override public boolean equals (Object obj) { return (obj instanceof FilterDescriptor); } //----------// // hashCode // //----------// @Override public int hashCode () { int hash = 5; return hash; } //----------// // toString // //----------// @Override public String toString () { StringBuilder sb = new StringBuilder("{"); sb.append(internalsString()); sb.append('}'); return sb.toString(); } //-----------------// // internalsString // //-----------------// protected String internalsString () { StringBuilder sb = new StringBuilder(); sb.append(getKind()); return sb.toString(); } //~ Inner Classes ---------------------------------------------------------- // //-----------// // Constants // //-----------// private static final class Constants extends ConstantSet { //~ Instance fields ---------------------------------------------------- FilterKind.Constant defaultKind = new FilterKind.Constant( FilterKind.GLOBAL, "Default kind of PixelFilter"); } //---------// // Default // //---------// private static class Default extends Param<FilterDescriptor> { @Override public FilterDescriptor getSpecific () { final String method = "getDefaultDescriptor"; try { FilterKind kind = getDefaultKind(); // Access the underlying class Method getDesc = kind.classe.getMethod(method, (Class[]) null); if (Modifier.isStatic(getDesc.getModifiers())) { return (FilterDescriptor) getDesc.invoke(null); } else { logger.error(method + " must be static"); } } catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) { logger.warn("Could not call " + method, ex); } return null; } @Override public boolean setSpecific (FilterDescriptor specific) { if (!getSpecific().equals(specific)) { FilterKind kind = specific.getKind(); FilterDescriptor.setDefaultKind(kind); switch (kind) { case GLOBAL: GlobalDescriptor gDesc = (GlobalDescriptor) specific; GlobalFilter.setDefaultThreshold(gDesc.threshold); break; case ADAPTIVE: AdaptiveDescriptor aDesc = (AdaptiveDescriptor) specific; AdaptiveFilter.setDefaultMeanCoeff(aDesc.meanCoeff); AdaptiveFilter.setDefaultStdDevCoeff(aDesc.stdDevCoeff); break; } logger.info("Default filter is now ''{}''", specific); return true; } return false; } } }