Package org.w3c.tools.resources

Examples of org.w3c.tools.resources.ResourceReference


  b_charset  = false;
  b_type     = false;
  b_language = false;
  b_encoding = false;

  ResourceReference variants[] = null;
  try {
      variants = getVariantResources() ;
  } catch (ProtocolException ex) {};
  // no vary for so few variants!
View Full Code Here


    }

    protected String[] checkVariants(String variants[]) {

  Vector checked = new Vector(variants.length) ;
  ResourceReference tmpres = null;
  ResourceReference r_parent   = resource.getParent() ;
  try {
      DirectoryResource parent= (DirectoryResource)r_parent.unsafeLock();
      for (int i = 0 ; i < variants.length ; i++) {
    tmpres = parent.lookup(variants[i]) ;
    if (tmpres != null) {
        try {
      FramedResource resource =
            (FramedResource)tmpres.unsafeLock() ;
      NegotiatedFrame itsframe = (NegotiatedFrame)
            resource.getFrame(negotiatedFrameClass);
      if (itsframe == null) {
          checked.addElement (variants[i]);
      }
        } catch (InvalidResourceException ex) {
        } finally {
      tmpres.unlock();
        }
    } else {
        checked.addElement (variants[i]);
    }
      }
  } catch (InvalidResourceException ex) {
      // throw new HTTPException("invalid parent for negotiation");
  } finally {
      r_parent.unlock();
  }

  String[] variants_ok = new String[checked.size()];
  checked.copyInto(variants_ok);
   
View Full Code Here

  if (getParanoidVariantCheck()) {
      names = checkVariants(names) ;
  }

  // Look them up in our parent directory:
  ResourceReference variants[] = new ResourceReference[names.length] ;
  ResourceReference r_parent   = resource.getParent() ;
  try {
      DirectoryResource parent= (DirectoryResource)r_parent.unsafeLock();
      int missing = 0;
      for (int i = 0 ; i < names.length ; i++) {
    variants[i] = parent.lookup(names[i]) ;
    if (variants[i] == null)
        missing++;
      }
      if (missing > 0) {
    int kept = names.length - missing;
    if (kept < 1)
        return null;
    String newNames[] = new String[kept];
    int j = 0; int i = 0;
    while (i < variants.length) {
        if (variants[i] != null) {
      newNames[j++] = names[i++];
        } else {
      i++;
        }
    }
    setVariants(newNames);
    //recompute Variant Resources
    return getVariantResources();
      } else if (oldlength > names.length){
    setVariants(names);
      }

  } catch (InvalidResourceException ex) {
      throw new HTTPException("invalid parent for negotiation");
  } finally {
      r_parent.unlock();
  }
  return variants ;
    }
View Full Code Here

      }
  } else {
      HttpAcceptEncoding encodings[] = request.getAcceptEncoding() ;
      for (int i = 0 ; i < states.size() ; i++) {
    VariantState state    = (VariantState) states.elementAt(i) ;
    ResourceReference rr  = state.getResource();
    try {
        FramedResource resource = (FramedResource)rr.unsafeLock() ;
        HTTPFrame itsframe =
      (HTTPFrame) resource.unsafeGetFrame(httpFrameClass);
        if (itsframe != null) {
      String ve;
      ve = (String) itsframe.unsafeGetValue(
                                ATTR_CONTENT_ENCODING, null);
      if ( ve == null ) {
          ve = "identity"; // default encoding
          state.setContentEncodingQuality (1.0) ;
      } else {
          state.setContentEncodingQuality (0.01) ;
      }
      int jidx    = -1 ;
      for (int j = 0 ; j < encodings.length ; j++) {
          if (encodings[j].getEncoding().equals(ve)) {
        jidx = j;
        break;
          }
          if (encodings[j].getEncoding().equals("*"))
        jidx = j; // default '*' if no better match
      }
      if ( jidx >= 0 )
          state.setContentEncodingQuality
        (encodings[jidx].getQuality() - jidx * 0.001) ;
        }
    } catch (InvalidResourceException ex) {
       
    } finally {
        rr.unlock();
    }
      }
      // FIXME We should check here against unlegible variants as now
  }
  return false ;
View Full Code Here

      HttpAcceptCharset charsets[] = request.getAcceptCharset() ;

      for (int i = 0 ; i < states.size() ; i++ ) {
    VariantState state = (VariantState) states.elementAt(i) ;
    // Get the most specific match for this variant:
    ResourceReference rr = state.getResource();
    try {
        FramedResource resource = (FramedResource)rr.unsafeLock() ;
        HTTPFrame itsframe =
      (HTTPFrame) resource.unsafeGetFrame(httpFrameClass);
        if (itsframe != null) {
      MimeType vt;
      vt = (MimeType) itsframe.unsafeGetValue(
                                    ATTR_CONTENT_TYPE, null);
      String fcharset = vt.getParameterValue("charset");
      // if not defined in the frame, it must be the default
      if (fcharset == null) {
          fcharset = "ISO-8859-1";
      }
      double qual = 0.0 ;
      boolean default_done = false;
      String charset;
      for (int j = 0 ; j < charsets.length ; j++) {
          charset = charsets[j].getCharset();
          if (charset.equals("*")) {
        default_done = true;
        if (qual == 0) {
            qual = charsets[j].getQuality()-0.001*j;
        }
          } else {
        if ( charset.equals("ISO-8859-1"))
            default_done = true;
        if ( charset.equals(fcharset))
            if (charsets[j].getQuality() > qual) {
          qual =charsets[j].getQuality()-0.001*j;
            }
          }
      }
      if (!default_done && fcharset.equals("ISO-8859-1"))
          qual = 1.0 - 0.001*charsets.length;
      state.setCharsetQuality(qual) ;
        }
    } catch (InvalidResourceException ex) {
        //FIXME
    } finally {
        rr.unlock();
    }
      }
  }
  return false ;
    }
View Full Code Here

    req_lang[i] = new LanguageTag(languages[i].getLanguage());
      }
      boolean  varyLang    = false ;
      for (int i = 0 ; i < states.size() ; i++) {
    VariantState state    = (VariantState) states.elementAt(i) ;
    ResourceReference rr  = state.getResource();
    try {
        FramedResource resource = (FramedResource)rr.unsafeLock() ;
        HTTPFrame itsframe =
      (HTTPFrame) resource.getFrame(httpFrameClass);
        if (itsframe != null) {
      String lang;
      lang = (String) itsframe.unsafeGetValue(
                                ATTR_CONTENT_LANGUAGE, null);
      if ( lang == null ) {
          state.setLanguageQuality (-1.0) ;
      } else {
          varyLang = true ;
          LanguageTag ftag = new LanguageTag(lang);
          int jmatch = -1 ;
          int jidx   = -1 ;
          for (int j = 0 ; j < languages.length ; j++) {
        int match = ftag.match(req_lang[j]);
        if ( match > jmatch ) {
            jmatch = match ;
            jidx   = j ;
        }
          }
          if ( jidx < 0 )
        state.setLanguageQuality(0.01) ;
          else {
        // little hack for first
        state.setLanguageQuality (
            languages[jidx].getQuality()-jidx*0.001) ;
          }
      }
        }
    } catch (InvalidResourceException ex) {
        //FIXME
    } finally {
        rr.unlock();
    }
      }
      if ( varyLang ) {
    for (int i = 0 ; i < states.size() ; i++) {
        VariantState s = (VariantState) states.elementAt(i);
View Full Code Here

      HttpAccept accepts[] = request.getAccept() ;

      for (int i = 0 ; i < states.size() ; i++ ) {
    VariantState state = (VariantState) states.elementAt(i) ;
    // Get the most specific match for this variant:
    ResourceReference rr = state.getResource();
    try {
        FramedResource resource = (FramedResource)rr.unsafeLock() ;
        HTTPFrame itsframe =
      (HTTPFrame) resource.unsafeGetFrame(httpFrameClass);
        if (itsframe != null) {
      MimeType vt;
      vt = (MimeType) itsframe.unsafeGetValue(
                                    ATTR_CONTENT_TYPE, null);
      int jmatch = -1 ;
      int jidx   = -1 ;
      for (int j = 0 ; j < accepts.length ; j++) {
          try {
        int match = vt.match(accepts[j].getMimeType());
        if ( match > jmatch ) {
            jmatch = match ;
            jidx   = j ;
        }
          } catch (HttpInvalidValueException ivex) {
        // There is a bad acept header here
        // let's be cool and ignore it
        // FIXME we should answer with a Bad Request
          }
      }
      if ( jidx < 0 )
          state.setQuality (0.0) ;
      else
          state.setQuality(accepts[jidx].getQuality()
               -jidx*0.001) ;
        }
    } catch (InvalidResourceException ex) {
        //FIXME
    } finally {
        rr.unlock();
    }
      }
  }
  return false ;
    }
View Full Code Here

     */
    protected ResourceReference negotiate (Request request)
  throws ProtocolException
    {
  // Check for zero or one variant:
  ResourceReference variants[] = getVariantResources() ;
  if (variants == null) {
      try {
    getResource().delete();
      } catch (MultipleLockException ex) {
    //will be deleted later...
      } finally {
    Reply reply = request.makeReply(HTTP.NOT_FOUND);
    reply.setContent ("<h1>Document not found</h1>"+
          "<p>The document "+request.getURL()+
          " has no acceptable variants "+
          "(probably deleted).");
    throw new HTTPException (reply);
      }
  }
  if ( variants.length < 2 ) {
      if ( variants.length == 0 ) {
    try {
        getResource().delete();
    } catch (MultipleLockException ex) {
        //will be deleted later...
    } finally {
        Reply reply = request.makeReply(HTTP.NOT_FOUND);
        reply.setContent ("<h1>Document not found</h1>"+
              "<p>The document "+request.getURL()+
              " has no acceptable variants "+
              "(probably deleted).");
        throw new HTTPException (reply);
    }
      } else {
    return variants[0] ;
      }
  }
  // Build a vector of variant negociation states, one per variants:
  Vector states = new Vector (variants.length) ;
  for (int i = 0 ; i < variants.length ; i++) {
      double qs = 1.0 ;
      try {
    FramedResource resource =
        (FramedResource) variants[i].unsafeLock() ;
    HTTPFrame itsframe =
        (HTTPFrame) resource.unsafeGetFrame(httpFrameClass);
    if (itsframe != null) {
        if ( itsframe.unsafeDefinesAttribute (ATTR_QUALITY) )
      qs = itsframe.unsafeGetQuality() ;
        if ( qs > REQUIRED_QUALITY )
      states.addElement(new VariantState (variants[i], qs)) ;
    }
      } catch (InvalidResourceException ex) {
    //FIXME
      } finally {
    variants[i].unlock();
      }
  }
  // Content-encoding negociation:
  if ( debug ) {
      printNegotiationState ("init:", states) ;
  }
  if ( negotiateContentEncoding (states, request) ) {
      // Remains a single acceptable variant:
      return ((VariantState) states.elementAt(0)).getResource() ;
  }
  if ( debug ) {
      printNegotiationState ("encoding:", states) ;
  }
  // Charset quality negociation:
  if ( negotiateCharsetQuality (states, request) ) {
      // Remains a single acceptable variant:
      return ((VariantState) states.elementAt(0)).getResource() ;
  }
  if ( debug ) {
      printNegotiationState ("charset:", states) ;
  }
  // Language quality negociation:
  if ( negotiateLanguageQuality (states, request) ) {
      // Remains a single acceptable variant:
      return ((VariantState) states.elementAt(0)).getResource() ;
  }
  if ( debug ) {
      printNegotiationState ("language:", states) ;
  }
  // Content-type negociation:
  if ( negotiateContentType (states, request) ) {
      // Remains a single acceptable variant:
      return ((VariantState) states.elementAt(0)).getResource() ;
  }
  if ( debug ) {
      printNegotiationState ("type:", states) ;
  }
  // If we reached this point, this means that multiple variants are
  // acceptable at this point. Keep the ones that have the best quality.
  if ( debug ) {
      printNegotiationState ("before Q selection:", states) ;
  }
  double qmax = REQUIRED_QUALITY ;

  for (int i=0; i< states.size() ; ) {
      VariantState state = (VariantState) states.elementAt(i) ;
      if ( state.getQ() > qmax ) {
    for (int j = i ; j > 0 ; j--)
        states.removeElementAt(0) ;
    qmax = state.getQ() ;
    i = 1 ;
      } else {
    if ( state.getQ() < qmax)
        states.removeElementAt(i) ;
    else
        i++;
      }
  }
  if ( debug )
      printNegotiationState ("After Q selection:", states) ;
  if ( qmax == REQUIRED_QUALITY ) {

      Reply reply = request.makeReply(HTTP.NOT_ACCEPTABLE) ;
       HtmlGenerator g = new HtmlGenerator("No acceptable");
       g.append("<P>The resource cannot be served according to the "
          + "headers sent</P>");
       reply.setStream (g) ;
      throw new HTTPException (reply) ;
  } else if ( states.size() == 1 ) {
      return ((VariantState) states.elementAt(0)).getResource() ;
  } else {
      // Respond with multiple choice (for the time being, there should
      // be a parameter to decide what to do.
      Reply reply = request.makeReply(HTTP.MULTIPLE_CHOICE) ;
      HtmlGenerator g = new HtmlGenerator ("Multiple choice for "+
             resource.getIdentifier()) ;
      g.append ("<ul>") ;
      for (int i = 0 ; i < states.size() ; i++) {
    VariantState state = (VariantState) states.elementAt(i) ;
    String name = null;
    ResourceReference rr = state.getResource();
    try {
        name = rr.unsafeLock().getIdentifier();
        g.append ("<li>"
            + "<a href=\"" + name + "\">" + name + "</a>"
            + " Q= " + state.getQ()) ;
    } catch (InvalidResourceException ex) {
        //FIXME
    } finally {
        rr.unlock();
    }
      }
      reply.setStream (g) ;
      reply.setHeaderValue(reply.H_VARY, getVary());
      throw new HTTPException (reply) ;
View Full Code Here

    protected ResourceReference  negotiatePut(Request request)
  throws ProtocolException, ResourceException
   
  // Check for zero or one variant:
  ResourceReference variants[] = getVariantResources() ;
  HTTPFrame itsframe;
  int nb_v;
  // zero, don't PUT on a negotiable resource!
  if (variants == null ||  variants.length == 0) {
      try {
    getResource().delete();
      } catch (MultipleLockException ex) {
    //will be deleted later...
      } finally {
    Reply reply = request.makeReply(HTTP.NOT_FOUND);
    reply.setContent ("<h1>Document not found</h1>"+
          "<p>The document "+request.getURL()+
          " has no acceptable variants "+
          "(probably deleted).");
    throw new HTTPException (reply);
      }
  }
  // negotiate etag
  HttpEntityTag etag = request.getETag();
  HttpEntityTag etags[] = request.getIfMatch();
  // gather the etags
  if (etags == null && etag != null) {
      etags = new HttpEntityTag[1];
      etags[0] = etag;
  } else if (etag != null) {
      HttpEntityTag t_etags[] = new HttpEntityTag[etags.length+1];
      System.arraycopy(etags, 0, t_etags, 0, etags.length);
      t_etags[etags.length] = etag;
      etags = t_etags;
  }

  if (etags != null) {
      // yeah go for it!
      FramedResource resource;
      HttpEntityTag frametag;
      for (int i = 0 ; i < variants.length ; i++) {
    try {
        resource = (FramedResource)variants[i].unsafeLock() ;
        itsframe = (HTTPFrame)resource.getFrame(httpFrameClass);
        if (itsframe != null) {
      frametag = itsframe.getETag();
      if (frametag == null) {
          continue;
      }
      // Do we have a winner?
      try {
          for (int j=0; j<etags.length; j++)
        if(frametag.getTag().equals(etags[j].getTag()))
            return variants[i];
      } catch (NullPointerException ex) {
          // if the list of etag contains a null
          // it should never happen and the try doesn't cost
      }
        }
    } catch (InvalidResourceException ex) {
        //FIXME
    } finally {
        variants[i].unlock();
    }
      }
      // no matching variants...
      Reply reply = request.makeReply(HTTP.NOT_FOUND);
      reply.setContent ("<h1>Document not found</h1>"+
            "<p>The document "+request.getURL()+
            " has no acceptable variants "+
            "according to the ETag sent");
      throw new HTTPException (reply);
  }
  // if we are strict, don't go any further, etags
  // is the mandatory thing, otherwise PUT on the direct version
  if (getPutPolicy()) {
      Reply reply = request.makeReply(HTTP.NOT_FOUND);
      reply.setContent ("<h1>Document not found</h1>"+
            "<p>The document "+request.getURL()+
            " has no acceptable variants "+
            " for a PUT, as no ETags were sent");
      throw new HTTPException (reply);
  }
  // now filter out variants
  nb_v = variants.length;
  MimeType type = request.getContentType();
  String encodings[] = request.getContentEncoding();
  String languages[] = request.getContentLanguage();
  ResourceReference rr;

  if (type != null || encodings != null || languages != null) {
      // the request is not too bad ;)
      for (int i = 0 ; i < variants.length ; i++) {
    if (variants[i] == null)
        continue;
    rr = variants[i];
    try {
        resource = (FramedResource)rr.unsafeLock() ;
        itsframe = (HTTPFrame)resource.getFrame(httpFrameClass);
        if (itsframe == null) {
      nb_v--;
      variants[i] = null;
      continue;
        }
        // remove the non matching mime types
        if (type != null) {
      MimeType fmt = itsframe.getContentType();
      if (fmt == null || (fmt.match(type) !=
              MimeType.MATCH_SPECIFIC_SUBTYPE)) {
          nb_v--;
          variants[i] = null;
          continue;
      }
        }
        // remove the non matching languages
        if (languages != null) {
      String language = itsframe.getContentLanguage();
      nb_v--;
      variants[i] = null;
      if (language == null) {
          continue;
      }
      for (int j=0; j<languages.length; j++) {
          if (language.equals(languages[j])) {
        nb_v++;
        variants[i] = rr;
        break;
          }
      }
        }
        // remove the non matching encodings       
        if (encodings != null) {
      String encoding = itsframe.getContentEncoding();
      nb_v--;
      variants[i] = null;
      if (encoding == null) {
          continue;
      }
      for (int j=0; j<encodings.length; j++) {
          if (encoding.equals(languages[j])) {
        nb_v++;
        variants[i] = rr;
        break;
          }
      }
        }
    } catch (InvalidResourceException ex) {
        //FIXME
    } finally {
        rr.unlock();
    }
      }
      // a winner!
      if (nb_v == 1) {
    for (int i=0; i< variants.length; i++) {
View Full Code Here

      lr.setTarget(null);
      return false;
  } else {
      //we are done! try to find the negotiated one...
      RequestInterface reqi = ls.getRequest();
      ResourceReference selected;
      Request request = (Request) reqi;
      // Run content negotiation now:
      // The PUT is special, we negotiate with ETag (if present) or
      // using the metainformation about the PUT entity.
      String method = request.getMethod ();
      try {
    if (method.equals("PUT")) {
        selected = negotiatePut(request);
    } else {
        selected = negotiate(request);
    }
      } catch (ResourceException ex) {
    // the failure will be processed in perform
    return false;
      }
      if (selected != null) {
    try {
        FramedResource resource =
      (FramedResource) selected.unsafeLock();
        resource.lookup(ls, lr);
    } catch (InvalidResourceException ex) {
        // the failure will be processed in perform
    } finally {
        selected.unlock();
    }
      }
      request.setState(STATE_NEG, selected);
      // fake now, we handle the process to have a two-level processing
      // just to add the Vary: header
View Full Code Here

TOP

Related Classes of org.w3c.tools.resources.ResourceReference

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.