X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=auth%2Fauth-core%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Faaf%2Fauth%2Frserv%2FAcceptor.java;h=bd718e4623911fb25d683bd0288b130653112f2c;hb=1296352d8eafee57f982a4342ad79ada4aa56d28;hp=1953694bbaad4d2f0d15d0fc697442c75c831f43;hpb=ceda6e8bc270202bcb24340b86617110289c902e;p=aaf%2Fauthz.git diff --git a/auth/auth-core/src/main/java/org/onap/aaf/auth/rserv/Acceptor.java b/auth/auth-core/src/main/java/org/onap/aaf/auth/rserv/Acceptor.java index 1953694b..bd718e46 100644 --- a/auth/auth-core/src/main/java/org/onap/aaf/auth/rserv/Acceptor.java +++ b/auth/auth-core/src/main/java/org/onap/aaf/auth/rserv/Acceptor.java @@ -7,9 +7,9 @@ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -29,141 +29,141 @@ import org.onap.aaf.misc.env.Trans; /** * Find Acceptable Paths and place them where TypeCode can evaluate. - * + * * If there are more than one, TypeCode will choose based on "q" value * @author Jonathan * * @param */ class Acceptor { - private List, List>>>> types; - List, List>>>> acceptable; - - public Acceptor(List, List>>>> types) { - this.types = types; - acceptable = new ArrayList, List>>>>(); - } - - private boolean eval(HttpCode code, String str, List props) { -// int plus = str.indexOf('+'); -// if(plus<0) { - boolean ok = false; - boolean any = false; - for(Pair, List>>> type : types) { - ok = true; - if(type.x.equals(str)) { - for(Iterator iter = props.iterator();ok && iter.hasNext();) { - ok = props(type,iter.next(),iter.next()); - } - if(ok) { - any = true; - acceptable.add(type); - } - } - } -// } else { // Handle Accepts with "+" as in application/xaml+xml -// int prev = str.indexOf('/')+1; -// String first = str.substring(0,prev); -// String nstr; -// while(prev!=0) { -// nstr = first + (plus<0?str.substring(prev):str.substring(prev,plus)); -// -// for(Pair, List>>> type : types) { -// if(type.x.equals(nstr)) { -// acceptable.add(type); -// return type; -// } -// } -// prev = plus+1; -// plus=str.indexOf('+', prev); -// }; -// } - return any; - } + private List, List>>>> types; + List, List>>>> acceptable; + + public Acceptor(List, List>>>> types) { + this.types = types; + acceptable = new ArrayList<>(); + } + + private boolean eval(HttpCode code, String str, List props) { +// int plus = str.indexOf('+'); +// if (plus<0) { + boolean ok = false; + boolean any = false; + for (Pair, List>>> type : types) { + ok = true; + if (type.x.equals(str)) { + for (Iterator iter = props.iterator();ok && iter.hasNext();) { + ok = props(type,iter.next(),iter.next()); + } + if (ok) { + any = true; + acceptable.add(type); + } + } + } +// } else { // Handle Accepts with "+" as in application/xaml+xml +// int prev = str.indexOf('/')+1; +// String first = str.substring(0,prev); +// String nstr; +// while (prev!=0) { +// nstr = first + (plus<0?str.substring(prev):str.substring(prev,plus)); +// +// for (Pair, List>>> type : types) { +// if (type.x.equals(nstr)) { +// acceptable.add(type); +// return type; +// } +// } +// prev = plus+1; +// plus=str.indexOf('+', prev); +// }; +// } + return any; + } + + /** + * Evaluate Properties + * @param type + * @param tag + * @param value + * @return + */ + private boolean props(Pair, List>>> type, String tag, String value) { + boolean rv = false; + if (type.y!=null) { + for (Pair prop : type.y.y){ + if (tag.equals(prop.x)) { + if (tag.equals("charset")) { + return prop.x==null?false:prop.y.equals(value.toLowerCase()); // return True if Matched + } else if (tag.equals("version")) { + return prop.y.equals(new Version(value)); // Note: Version Class knows Minor Version encoding + } else if (tag.equals(Content.Q)) { // replace Q value + try { + type.y.y.get(0).y=Float.parseFloat(value); + } catch (NumberFormatException e) { + rv=false; // need to do something to make Sonar happy. But nothing to do. + } + return true; + } else { + return value.equals(prop.y); + } + } + } + } + return rv; + } + + /** + * parse + * + * Note: I'm processing by index to avoid lots of memory creation, which speeds things + * up for this time critical section of code. + * @param code + * @param cntnt + * @return + */ + protected boolean parse(HttpCode code, String cntnt) { + byte bytes[] = cntnt.getBytes(); + + int cis,cie=-1,cend; + int sis,sie,send; + String name; + ArrayList props = new ArrayList<>(); + do { + // Clear these in case more than one Semi + props.clear(); // on loop, do not want mixed properties + name=null; - /** - * Evaluate Properties - * @param type - * @param tag - * @param value - * @return - */ - private boolean props(Pair, List>>> type, String tag, String value) { - boolean rv = false; - if(type.y!=null) { - for(Pair prop : type.y.y){ - if(tag.equals(prop.x)) { - if(tag.equals("charset")) { - return prop.x==null?false:prop.y.equals(value.toLowerCase()); // return True if Matched - } else if(tag.equals("version")) { - return prop.y.equals(new Version(value)); // Note: Version Class knows Minor Version encoding - } else if(tag.equals(Content.Q)) { // replace Q value - try { - type.y.y.get(0).y=Float.parseFloat(value); - } catch (NumberFormatException e) { - rv=false; // need to do something to make Sonar happy. But nothing to do. - } - return true; - } else { - return value.equals(prop.y); - } - } - } - } - return rv; - } + cis = cie+1; // find comma start + while (ciscis && Character.isSpaceChar(bytes[cend-1]))--cend; + // Start SEMIS + sie=cis-1; + do { + sis = sie+1; // semi start is one after previous end + while (siscend || sie<0?cend:sie; // if the Semicolon is after the comma, or non-existent, use comma end, else keep + while (send>sis && Character.isSpaceChar(bytes[send-1]))--send; + if (name==null) { // first entry in Comma set is the name, not a property + name = new String(bytes,sis,send-sis); + } else { // We've looped past the first Semi, now process as properties + // If there are additional elements (more entities within Semi Colons) + // apply Properties + int eq = cntnt.indexOf('=',sis); + if (eq>sis && eq=cis); // End SEMI processing + // Now evaluate Comma set and return if true + if (eval(code,name,props))return true; // else loop again to check next comma + } while (cie>=0); // loop to next comma + return false; // didn't get even one match + } - /** - * parse - * - * Note: I'm processing by index to avoid lots of memory creation, which speeds things - * up for this time critical section of code. - * @param code - * @param cntnt - * @return - */ - protected boolean parse(HttpCode code, String cntnt) { - byte bytes[] = cntnt.getBytes(); - - int cis,cie=-1,cend; - int sis,sie,send; - String name; - ArrayList props = new ArrayList(); - do { - // Clear these in case more than one Semi - props.clear(); // on loop, do not want mixed properties - name=null; - - cis = cie+1; // find comma start - while(ciscis && Character.isSpaceChar(bytes[cend-1]))--cend; - // Start SEMIS - sie=cis-1; - do { - sis = sie+1; // semi start is one after previous end - while(siscend || sie<0?cend:sie; // if the Semicolon is after the comma, or non-existent, use comma end, else keep - while(send>sis && Character.isSpaceChar(bytes[send-1]))--send; - if(name==null) { // first entry in Comma set is the name, not a property - name = new String(bytes,sis,send-sis); - } else { // We've looped past the first Semi, now process as properties - // If there are additional elements (more entities within Semi Colons) - // apply Properties - int eq = cntnt.indexOf('=',sis); - if(eq>sis && eq=cis); // End SEMI processing - // Now evaluate Comma set and return if true - if(eval(code,name,props))return true; // else loop again to check next comma - } while(cie>=0); // loop to next comma - return false; // didn't get even one match - } - } \ No newline at end of file