/* * 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.shindig.gadgets.servlet; import org.apache.shindig.gadgets.Gadget; import org.apache.shindig.gadgets.http.HttpRequest; import org.apache.shindig.gadgets.http.HttpResponse; import org.apache.shindig.gadgets.rewrite.ContentRewriter; import org.apache.shindig.gadgets.rewrite.MutableContent; import org.apache.shindig.gadgets.rewrite.RewriterResults; import com.google.caja.lexer.CharProducer; import com.google.caja.lexer.ExternalReference; import com.google.caja.lexer.FilePosition; import com.google.caja.lexer.InputSource; import com.google.caja.opensocial.*; import com.google.caja.reporting.Message; import com.google.caja.reporting.MessageContext; import com.google.caja.reporting.MessageQueue; import com.google.caja.reporting.SimpleMessageQueue; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.io.StringReader; import java.net.URI; import java.util.logging.Logger; public class CajaContentRewriter implements ContentRewriter { private final Logger logger = Logger.getLogger(CajaContentRewriter.class.getName()); public RewriterResults rewrite(HttpRequest req, HttpResponse resp, MutableContent content) { return null; } public RewriterResults rewrite(Gadget gadget, MutableContent content) { if (gadget.getSpec().getModulePrefs().getFeatures().containsKey("caja") || "1".equals(gadget.getContext().getParameter("caja"))) { final URI retrievedUri = gadget.getContext().getUrl(); UriCallback cb = new UriCallback() { public UriCallbackOption getOption(ExternalReference externalReference, String string) { return UriCallbackOption.REWRITE; } public Reader retrieve(ExternalReference externalReference, String string) throws UriCallbackException { logger.info("Retrieving " + externalReference.toString()); try { Reader in = new InputStreamReader( externalReference.getUri().toURL().openConnection().getInputStream(), "UTF-8"); char[] buf = new char[4096]; StringBuilder sb = new StringBuilder(); for (int n; (n = in.read(buf)) > 0;) { sb.append(buf, 0, n); } return new StringReader(sb.toString()); } catch (java.net.MalformedURLException ex) { throw new UriCallbackException(externalReference, ex); } catch (IOException ex) { throw new UriCallbackException(externalReference, ex); } } public URI rewrite(ExternalReference externalReference, String string) { return retrievedUri.resolve(externalReference.getUri()); } }; MessageQueue mq = new SimpleMessageQueue(); DefaultGadgetRewriter rw = new DefaultGadgetRewriter(mq); CharProducer input = CharProducer.Factory.create( new StringReader(content.getContent()), FilePosition.instance(new InputSource(retrievedUri), 2, 1, 1)); StringBuilder output = new StringBuilder(); try { rw.rewriteContent(retrievedUri, input, cb, output); } catch (GadgetRewriteException e) { throwCajolingException(e, mq); return RewriterResults.notCacheable(); } catch (IOException e) { throwCajolingException(e, mq); return RewriterResults.notCacheable(); } content.setContent(output.toString()); } return null; } private void throwCajolingException(Exception cause, MessageQueue mq) { StringBuilder errbuilder = new StringBuilder(); MessageContext mc = new MessageContext(); if (cause != null) { errbuilder.append(cause).append('\n'); } for (Message m : mq.getMessages()) { errbuilder.append(m.format(mc)).append('\n'); } logger.info("Unable to cajole gadget: " + errbuilder.toString()); // throw new GadgetException( // GadgetException.Code.MALFORMED_FOR_SAFE_INLINING, errbuilder.toString()); } }