blob: 098a6fa98675ee03cfd6336184be4b6d00bead74 [file] [log] [blame]
// Copyright 2004 The Apache Software Foundation
//
// Licensed 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.tapestry.contrib.inspector;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import org.apache.tapestry.BaseComponent;
import org.apache.tapestry.IAsset;
import org.apache.tapestry.IBinding;
import org.apache.tapestry.IComponent;
import org.apache.tapestry.event.PageEvent;
import org.apache.tapestry.event.PageRenderListener;
import org.apache.tapestry.spec.IBeanSpecification;
import org.apache.tapestry.spec.IComponentSpecification;
import org.apache.tapestry.spec.IContainedComponent;
import org.apache.tapestry.spec.IParameterSpecification;
/**
* Component of the {@link Inspector} page used to display
* the specification, parameters and bindings and assets of the inspected component.
*
*
* @version $Id$
* @author Howard Lewis Ship
*
**/
public class ShowSpecification extends BaseComponent implements PageRenderListener
{
private IComponent _inspectedComponent;
private IComponentSpecification _inspectedSpecification;
private String _parameterName;
private String _assetName;
private List _sortedComponents;
private IComponent _component;
private List _assetNames;
private List _formalParameterNames;
private List _informalParameterNames;
private List _sortedPropertyNames;
private String _propertyName;
private List _beanNames;
private String _beanName;
private IBeanSpecification _beanSpecification;
private static class ComponentComparitor implements Comparator
{
public int compare(Object left, Object right)
{
IComponent leftComponent;
String leftId;
IComponent rightComponent;
String rightId;
if (left == right)
return 0;
leftComponent = (IComponent) left;
rightComponent = (IComponent) right;
leftId = leftComponent.getId();
rightId = rightComponent.getId();
return leftId.compareTo(rightId);
}
}
/**
* Clears all cached information about the component and such after
* each render (including the rewind phase render used to process
* the tab view).
*
* @since 1.0.5
*
**/
public void pageEndRender(PageEvent event)
{
_inspectedComponent = null;
_inspectedSpecification = null;
_parameterName = null;
_assetName = null;
_sortedComponents = null;
_component = null;
_assetNames = null;
_formalParameterNames = null;
_informalParameterNames = null;
_sortedPropertyNames = null;
_propertyName = null;
_beanNames = null;
_beanName = null;
_beanSpecification = null;
}
/**
* Gets the inspected component and specification from the {@link Inspector} page.
*
* @since 1.0.5
**/
public void pageBeginRender(PageEvent event)
{
Inspector inspector = (Inspector) getPage();
_inspectedComponent = inspector.getInspectedComponent();
_inspectedSpecification = _inspectedComponent.getSpecification();
}
public IComponent getInspectedComponent()
{
return _inspectedComponent;
}
public IComponentSpecification getInspectedSpecification()
{
return _inspectedSpecification;
}
/**
* Returns a sorted list of formal parameter names.
*
**/
public List getFormalParameterNames()
{
if (_formalParameterNames == null)
_formalParameterNames = sort(_inspectedSpecification.getParameterNames());
return _formalParameterNames;
}
/**
* Returns a sorted list of informal parameter names. This is
* the list of all bindings, with the list of parameter names removed,
* sorted.
*
**/
public List getInformalParameterNames()
{
if (_informalParameterNames != null)
return _informalParameterNames;
Collection names = _inspectedComponent.getBindingNames();
if (names != null && names.size() > 0)
{
_informalParameterNames = new ArrayList(names);
// Remove the names of any formal parameters. This leaves
// just the names of informal parameters (informal parameters
// are any parameters/bindings that don't match a formal parameter
// name).
names = _inspectedSpecification.getParameterNames();
if (names != null)
_informalParameterNames.removeAll(names);
Collections.sort(_informalParameterNames);
}
return _informalParameterNames;
}
public String getParameterName()
{
return _parameterName;
}
public void setParameterName(String value)
{
_parameterName = value;
}
/**
* Returns the {@link org.apache.tapestry.spec.ParameterSpecification} corresponding to
* the value of the parameterName property.
*
**/
public IParameterSpecification getParameterSpecification()
{
return _inspectedSpecification.getParameter(_parameterName);
}
/**
* Returns the {@link IBinding} corresponding to the value of
* the parameterName property.
*
**/
public IBinding getBinding()
{
return _inspectedComponent.getBinding(_parameterName);
}
public void setAssetName(String value)
{
_assetName = value;
}
public String getAssetName()
{
return _assetName;
}
/**
* Returns the {@link IAsset} corresponding to the value
* of the assetName property.
*
**/
public IAsset getAsset()
{
return (IAsset) _inspectedComponent.getAssets().get(_assetName);
}
/**
* Returns a sorted list of asset names, or null if the
* component contains no assets.
*
**/
public List getAssetNames()
{
if (_assetNames == null)
_assetNames = sort(_inspectedComponent.getAssets().keySet());
return _assetNames;
}
public List getSortedComponents()
{
if (_sortedComponents != null)
return _sortedComponents;
Inspector inspector = (Inspector) getPage();
IComponent inspectedComponent = inspector.getInspectedComponent();
// Get a Map of the components and simply return null if there
// are none.
Map components = inspectedComponent.getComponents();
_sortedComponents = new ArrayList(components.values());
Collections.sort(_sortedComponents, new ComponentComparitor());
return _sortedComponents;
}
public void setComponent(IComponent value)
{
_component = value;
}
public IComponent getComponent()
{
return _component;
}
/**
* Returns the type of the component, as specified in the container's
* specification (i.e., the component alias if known).
*
**/
public String getComponentType()
{
IComponent container = _component.getContainer();
IComponentSpecification containerSpecification = container.getSpecification();
String id = _component.getId();
IContainedComponent contained = containerSpecification.getComponent(id);
// Temporary: An implicit component will not be in the containing
// component's specification as a ContainedComponent.
if (contained == null)
return null;
return contained.getType();
}
/**
* Returns a list of the properties for the component
* (from its specification), or null if the component
* has no properties.
*
**/
public List getSortedPropertyNames()
{
if (_sortedPropertyNames == null)
_sortedPropertyNames = sort(_inspectedSpecification.getPropertyNames());
return _sortedPropertyNames;
}
public void setPropertyName(String value)
{
_propertyName = value;
}
public String getPropertyName()
{
return _propertyName;
}
public String getPropertyValue()
{
return _inspectedSpecification.getProperty(_propertyName);
}
public List getBeanNames()
{
if (_beanNames == null)
_beanNames = sort(_inspectedSpecification.getBeanNames());
return _beanNames;
}
public void setBeanName(String value)
{
_beanName = value;
_beanSpecification = _inspectedSpecification.getBeanSpecification(_beanName);
}
public String getBeanName()
{
return _beanName;
}
public IBeanSpecification getBeanSpecification()
{
return _beanSpecification;
}
private List sort(Collection c)
{
if (c == null || c.size() == 0)
return null;
List result = new ArrayList(c);
Collections.sort(result);
return result;
}
}