blob: 3c09e7c72366e16e494a0e763ebc90079f6aa90d [file] [log] [blame]
/*
* 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<String> getAttributeNames();
// Object's valid parameter names
protected abstract List<String> 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("<param name=\"");
response.write(name);
response.write("\" value=\"");
response.write(value);
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);
}
}