| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package org.apache.jena.atlas.web; |
| |
| import org.apache.jena.atlas.logging.Log ; |
| |
| /** A media range is a media type used in content negotiation. |
| * It has a q parameter (others are possible but we don't need them ... yet */ |
| |
| public class MediaRange extends MediaType |
| { |
| // We pretend all MediaRanges have a q. |
| private double q = 1.0 ; |
| |
| public MediaRange(MediaRange other) |
| { |
| super(other) ; |
| q = other.q ; // set_q() ; |
| } |
| |
| public MediaRange(MediaType other) |
| { |
| super(other) ; |
| set_q() ; |
| } |
| |
| public MediaRange(String string) |
| { |
| super(MediaType.parse(string)) ; |
| set_q() ; |
| } |
| |
| public MediaRange(String type, String subType, String charset) |
| { |
| super(type, subType, charset) ; |
| set_q() ; |
| } |
| |
| public double get_q() |
| { |
| return q ; |
| } |
| |
| // public void set_q(double q) |
| // { |
| // this.q = q ; |
| // setParameter("q", Double.toString(q)) ; |
| // } |
| |
| // Set from parameters. |
| private void set_q() |
| { |
| String qStr = getParameter("q") ; |
| if ( qStr == null ) return ; |
| try { |
| q = Double.parseDouble(qStr) ; |
| } catch (NumberFormatException ex) |
| { |
| Log.warn(this, "Bad q seen: "+qStr) ; |
| } |
| } |
| |
| public boolean accepts(MediaType item) |
| { |
| if ( ! accept(this.getType(), item.getType()) ) |
| return false ; |
| |
| return accept(this.getSubType(), item.getSubType()) ; |
| } |
| |
| private boolean accept(String a, String b) |
| { |
| // Null implies * |
| if ( a == null || b == null ) |
| return true ; |
| |
| if ( a.equals("*") || b.equals("*") ) |
| return true ; |
| |
| return a.equals(b) ; |
| } |
| |
| public boolean grounded(MediaType item) { |
| return ! isStar(item.getType()) && ! isStar(item.getSubType()) ; |
| } |
| |
| // Strictly more grounded than |
| public boolean moreGroundedThan(MediaType item) |
| { |
| if ( isStar(item.getType()) && ! isStar(this.getType()) ) |
| return true ; |
| if ( isStar(item.getSubType()) && ! isStar(this.getSubType()) ) |
| return true ; |
| return false ; |
| } |
| |
| // Waeighting for "exactness" |
| // 3 for grounded, 2 for foo/*, 1 for */foo and 0 for */* |
| int subweight() { |
| int x = 0 ; |
| if ( !isStar(getType())) |
| x += 2 ; |
| if ( !isStar(getSubType())) |
| x += 1 ; |
| return x ; |
| } |
| |
| |
| private boolean isStar(String x) |
| { |
| return x == null || x.equals("*") ; |
| } |
| } |