/** * This handler is used for the navigation nodes that request content from an external URL. This * handler pulls the "real url" from from the component specified by the <code>compId</code> * parameter (this necessarily depends on the presence of the navigation container in the view for * the component look up to work). Once the component has been found, the url is retrieved from * the attribute map, and its contents retrieved. If <code>processPage</code> is true, the URL * contents are interpretted and the resulting component(s) are added to the component tree (This * feature is not currently supported).. Otherwise, the contents are returned in the output * parameter <code>pluginPage</code> to be output as-is on the page. * * @param handlerCtx The <code>HandlerContext</code>. */ @Handler( id = "retrievePluginPageContents", input = {@HandlerInput(name = "compId", type = String.class, required = true)}, output = {@HandlerOutput(name = "pluginPage", type = String.class)}) public static void retrievePluginPageContents(HandlerContext handlerCtx) { String id = (String) handlerCtx.getInputValue("compId"); UIComponent comp = handlerCtx.getFacesContext().getViewRoot().findComponent(id); String urlContents = ""; if (comp != null) { String url = (String) comp.getAttributes().get(NavigationNodeFactory.REAL_URL); try { // Read from the URL... URL contentUrl = FileUtil.searchForFile(url, null); if (contentUrl == null) { throw new IOException("Unable to locate file: " + url); } urlContents = new String(FileUtil.readFromURL(contentUrl)); // FIXME: Implement processPage support /* if (processPage) { // probably do something like what includeIntegrations does ... } */ } catch (IOException ex) { Logger.getLogger(PluginHandlers.class.getName()) .log(Level.SEVERE, "Unable to read url: " + url, ex); } } // Set the content to output... handlerCtx.setOutputValue("pluginPage", urlContents); }
/** * Includes the first IP based on priority for the given type. It adds the content to the given * UIComponent root. If the IP content looks like a URL (contains ://), a StaticText component * will be added with the value of the content from the URL. */ @Handler( id = "includeFirstIntegrationPoint", input = { @HandlerInput(name = "type", type = String.class, required = true), @HandlerInput(name = "root", type = UIComponent.class, required = false) }) public static void includeFirstIntegrationPoint(HandlerContext handlerCtx) throws java.io.IOException { // Get the input String type = (String) handlerCtx.getInputValue("type"); UIComponent root = (UIComponent) handlerCtx.getInputValue("root"); // Get the IntegrationPoints FacesContext ctx = handlerCtx.getFacesContext(); Set<IntegrationPoint> points = getSortedIntegrationPoints(getIntegrationPoints(ctx, type)); if (points != null) { Iterator<IntegrationPoint> it = points.iterator(); if (it.hasNext()) { // Get the first one... IntegrationPoint point = it.next(); root = getIntegrationPointParent(ctx, root, point); // Check to see if IP points to an external URL... if (point.getContent().lastIndexOf("://", 15) != -1) { // Treat content as a url... URL contentURL = FileUtil.searchForFile(point.getContent(), null); if (contentURL == null) { throw new IOException("Unable to locate file: " + point.getContent()); } // Read the content... String content = new String(FileUtil.readFromURL(contentURL)); // Create a StaticText component and add it under the // "root" component. LayoutComponent stDesc = new LayoutComponent( null, "externalContent", new ComponentType( "tmpTextCT", "com.sun.jsftemplating.component.factory.basic.StaticTextFactory")); stDesc.addOption("value", content); ComponentUtil.getInstance(ctx).createChildComponent(ctx, stDesc, root); } else { // Include the first one... includeIntegrationPoint(ctx, root, point); } } } }