package org.openntf.domino.nsfdata.structs; import java.util.Collections; import java.util.HashSet; import java.util.Set; public enum DesignFlagPattern { V4SEARCHBAR("(+Qq-Bst5nmz*"), SEARCHBAR("(+QM-st5nmz*"), VIEWFORM("-FQMUGXWy#i:|@0nK;g~%z^"), VIEWFORM_MENUABLE( "-FQMUGXWy#i:|@40nK;g~%z^}"), VIEWFORM_ALL_VERSIONS("-FQMUGXWy#i:|@K;g~%z^}"), FORM("-FQMUGXWy#i:|@0nK;g~%z^"), FORM_OR_SIMILAR( "-FMGXy#i=:|@0K;g~%z^"), FORM_OR_PAGE("-FQMUGXy#i:|@0nK;g~%z^"), FORM_MENUABLE("-FQMUGXWy#i:|@40nK;g~%z^}"), FORM_ALL_VERSIONS( "-FQMUGXWy#i:|@K;g~%z^}"), PRINTFORM_ALL_VERSIONS("+?"), FIELD("-FQMUGXWy#i@0nK;g~%z^"), FIELD_ALL_VERSIONS( "-FQMUGXWy#i@K;g~%z^}"), TOOLSRUNMACRO("-QXMBESIst5nmz{"), AGENTSLIST("-QXstmz{"), PASTEAGENTS("+I"), SCRIPTLIB("+sh."), SCRIPTLIB_LS( "(+s-jh.*"), SCRIPTLIB_JAVA("*sj"), SCRIPTLIB_JS("+h"), SCRIPTLIB_SERVER_JS("+."), DATABASESCRIPT("+t"), SUBFORM("(+U-40n*"), SUBFORM_DESIGN( "(+U-40*"), SUBFORM_ALL_VERSIONS("+U"), DBRUNMACRO("+BS"), COMPOSE("-C40n"), NOHIDDENNOTES("-n"), NOHIDEDENWEB("-w"), QUERYBYFORM( "-DU40gnyz{:|"), PRESERVE("+P"), SUBADD("(+-40*UA"), SUBNEW("(+-40*UN"), VIEW("-FG40n^"), VIEWMENUABLE( "-FQMUGXWy#i@40nK;g~%z^}"), VIEW_ALL_VERSIONS("-FG^"), VIEW_DESIGN("-FG40^"), NOTHIDDEN("-40n"), FOLDER("(+-04n*F"), FOLDER_DESIGN( "(+-04*F"), FOLDER_ALL_VERSIONS("*F"), CALENDAR("*c"), SHAREDVIEWS("-FGV^40n"), SHAREDVIEWSFOLDERS("-G^V40p"), SHAREDWEBVIEWS( "-FGV40wp^"), SHAREDWEBVIEWSFOLDERS("-GV40wp^"), VIEWS_AND_FOLDERS("-G40n^"), VIEWS_AND_FOLDERS_DESIGN("-G40^"), SHARED_COLS( "(+-*^"), VIEWMAP("(+-04n*G"), VIEWMAP_ALL_VERSIONS("*G"), VIEWMAPWEB("(+-04w*G"), VIEWMAP_DESIGN("(+-04*G"), WEBPAGE("(+-*W"), WEBPAGE_NOTES( "(+W-n*"), WEBPAGE_WEB("(+W-w*"), OTHER_DLG("(+-04n*H"), CATEGORIZED_VIEW("(+-04n*T"), DEFAULT_DESIGN("+d"), FRAMESET("(+-*#"), FRAMESET_NOTES( "(+#-n*"), FRAMESET_WEB("(+#-w*"), SITEMAP("+m"), SITEMAP_NOTES("(+m-n*"), SITEMAP_WEB("(+m-w*"), IMAGE_RESOURCE("+i"), IMAGE_RES_NOTES( "(+i-n~*"), IMAGE_RES_WEB("(+i-w~*"), IMAGE_WELL_RESOURCE("(+-*iv"), IMAGE_WELL_NOTES("(+-n*iv"), IMAGE_WELL_WEB("(+-w*iv"), JAVAFILE( "(+-*g["), JAVA_RESOURCE("+@"), JAVA_RESOURCE_NOTES("(+@-n*"), JAVA_RESOURCE_WEB("(+@-w*"), XSPPAGE("*gK"), XSPPAGE_WEB( "(+-w*gK"), XSPPAGE_NOTES("(+-n*gK"), XSPPAGE_NOPROPS("(+-2*gK"), NOPROPS_WEB("(+-2w*gK"), NOPROPS_NOTES("(+-2n*gK"), XSPCC( "*g;"), XSPCC_WEB("(+-w*g;"), XSPCC_NOTES("(+-n*g;"), DATA_CONNECTION_RESOURCE("+k"), DB2ACCESSVIEW("+z"), STYLE_SHEET_RESOURCE( "+="), STYLE_SHEETS_NOTES("(+=-n*"), STYLE_SHEETS_WEB("(+=-w*"), FILE("+g-K[];`,"), FILE_DL("(+g-~K[];`,*"), FILE_NOTES( "(+g-K[];n`,*"), FILE_WEB("(+g-K[];w`,*"), HTMLFILES("(+-*g>"), HTMLFILES_NOTES("(+-n*g>"), HTMLFILES_WEB("(+-w*g>"), FILE_ELEMS( "(+gi|=-/[],*"), SERVLET("+z"), SERVLET_NOTES("(+z-n*"), SERVLET_WEB("(+z-w*"), WEBSERVICE("+{"), JAVA_WEBSERVICE("(+Jj-*{"), LS_WEBSERVICE( "*{L"), JSP("(+-*g<"), STYLEKIT("(+-*g`"), STYLEKIT_NOTES("(+-n*g`"), STYLEKIT_WEB("(+-w*g`"), WIDGET("(+-*g_"), WIDGET_NOTES( "(+-n*g_"), WEDGET_WEB("(+-w*g_"), SACTIONS_DESIGN("+y"), SACTIONS_WEB("(+-0*y"), SACTIONS_NOTES("(+-0*y"), COMPDEF("+:"), COMPAPP( "+|"), NONWEB("+w80stVXp^"), NONWEB_EXCLUDE("-w80stVXp^"), AGENTSWEB("(+-QXstmz{*"), AGNTORWEBSVCWEB("(+-QXstmz*"), WEBSERVICEWEB( "+{"), FORMSWEB("-U#Wi@y:|"), SUBFORMSWEB("+U"), FRAMESETSWEB("+#"), PAGESWEB("+W"), VIEWSWEB("-G"), NAVIGATORSWEB("+G"), SHAREDFIELDSWEB( "*"), ALLWEB("*"), NO_FILERES_DIRS("-/"), FIRSTPATTERNCHAR("(+-*"), WEBHYBRIDDB("+%"); private final String value_; private final Set<Character> any_; private final Set<Character> none_; private final Set<Character> all_; @SuppressWarnings("null") private DesignFlagPattern(final String value) { value_ = value; Set<Character> any = null; Set<Character> none = null; Set<Character> all = null; Set<Character> currentBin = null; for (int i = 0; i < value_.length(); i++) { char current = value_.charAt(i); switch (current) { case '(': // Technically, this indicates that we'll be expecting a combination, // but parsing behavior is the same whether or not it's there break; // One of these will come before any flag characters. If present, create // the bin and switch the current one for future events case '+': any = new HashSet<Character>(); currentBin = any; break; case '-': none = new HashSet<Character>(); currentBin = none; break; case '*': all = new HashSet<Character>(); currentBin = all; break; // Add the flag character to the current bin default: currentBin.add(current); } } any_ = any == null ? null : Collections.unmodifiableSet(any); none_ = none == null ? null : Collections.unmodifiableSet(none); all_ = all == null ? null : Collections.unmodifiableSet(all); } public String getValue() { return value_; } /** * From stdnames.h: * * '+' = ANY of the flags, '-' = NONE of the flags, '*' = ALL of the flags * * '(+-*' = a combination of the above. * * Example: "(+AB-C*DE" = (A OR B) AND (NOT C) AND (D AND E) * * Note: be sure to have +-* placeholders even if no flags for some. ie: "(+-C*DE" = (NOT C) AND (D AND E). * * Note: "(+-Q*" is equivalent to "-Q" * * @param flags * A Set of DesignFlags from the note to match * @return Whether or not the provided Flags meet the pattern's criteria */ public boolean matches(final Set<DesignFlag> flags) { Set<Character> flagChars = new HashSet<Character>(); for (DesignFlag flag : flags) { flagChars.add(flag.getCharacter()); } if (any_ != null && !any_.isEmpty()) { // Make sure flags contains at least one of any's contents boolean matched = false; for (char matcher : any_) { if (flagChars.contains(matcher)) { matched = true; break; } } if (!matched) { return false; } } if (none_ != null) { // Make sure flags contains none of none's contents for (char matcher : none_) { if (flagChars.contains(matcher)) { return false; } } } if (all_ != null) { // All is easy if (!flagChars.containsAll(all_)) { return false; } } // If we're here, we must match return true; } }