/* * 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 com.gitblit.wicket.panels; import java.util.List; import org.apache.wicket.Component; import org.apache.wicket.ResourceReference; import org.apache.wicket.Response; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.MarkupStream; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.Fragment; import org.apache.wicket.protocol.http.ClientProperties; import org.apache.wicket.protocol.http.WebRequestCycle; import org.apache.wicket.protocol.http.WebSession; import org.apache.wicket.protocol.http.request.WebClientInfo; import org.apache.wicket.request.ClientInfo; import org.apache.wicket.util.value.IValueMap; /** * https://cwiki.apache.org/WICKET/object-container-adding-flash-to-a-wicket-application.html */ public abstract class ObjectContainer extends WebMarkupContainer { private static final long serialVersionUID = 1L; // Some general attributes for the object tag: private static final String ATTRIBUTE_CONTENTTYPE = "type"; private static final String ATTRIBUTE_CLASSID = "classid"; private static final String ATTRIBUTE_CODEBASE = "codebase"; // This is used for browser specific adjustments private ClientProperties clientProperties = null; public ObjectContainer(String id) { super(id); } // Set an attribute/property public abstract void setValue(String name, String value); // Get an attribute/property public abstract String getValue(String name); // Set the object's content type protected abstract String getContentType(); // Set the object's clsid (for IE) protected abstract String getClsid(); // Where to get the browser plugin (for IE) protected abstract String getCodebase(); // Object's valid attribute names protected abstract List getAttributeNames(); // Object's valid parameter names protected abstract List getParameterNames(); // Utility function to get the URL for the object's data protected String resolveResource(String src) { // if it's an absolute path, return it: if (src.startsWith("/") || src.startsWith("http://") || src.startsWith("https://")) return (src); // use the parent container class to resolve the resource reference Component parent = getParent(); if (parent instanceof Fragment) { // must check for fragment, otherwise we end up in Wicket namespace parent = parent.getParent(); } if (parent != null) { ResourceReference resRef = new ResourceReference(parent.getClass(), src, false); return (urlFor(resRef).toString()); } return (src); } @Override public void onComponentTag(ComponentTag tag) { super.onComponentTag(tag); // get the attributes from the html-source IValueMap attributeMap = tag.getAttributes(); // set the content type String contentType = getContentType(); if (contentType != null && !"".equals(contentType)) attributeMap.put(ATTRIBUTE_CONTENTTYPE, contentType); // set clsid and codebase for IE if (getClientProperties().isBrowserInternetExplorer()) { String clsid = getClsid(); String codeBase = getCodebase(); if (clsid != null && !"".equals(clsid)) attributeMap.put(ATTRIBUTE_CLASSID, clsid); if (codeBase != null && !"".equals(codeBase)) attributeMap.put(ATTRIBUTE_CODEBASE, codeBase); } // add all attributes for (String name : getAttributeNames()) { String value = getValue(name); if (value != null) attributeMap.put(name, value); } } @Override public void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) { Response response = getResponse(); response.write("\n"); // add all object's parameters: for (String name : getParameterNames()) { String value = getValue(name); if (value != null) { response.write("\n"); } } super.onComponentTagBody(markupStream, openTag); } // shortcut to the client properties: protected ClientProperties getClientProperties() { if (clientProperties == null) { ClientInfo clientInfo = WebSession.get().getClientInfo(); if (clientInfo == null || !(clientInfo instanceof WebClientInfo)) { clientInfo = new WebClientInfo((WebRequestCycle) getRequestCycle()); WebSession.get().setClientInfo(clientInfo); } clientProperties = ((WebClientInfo) clientInfo).getProperties(); } return (clientProperties); } }