blob: d9df442d90fbdf20898467dff65ac6fbf99a0ee0 [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 org.apache.myfaces.trinidaddemo.change;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.myfaces.trinidad.change.AddChildComponentChange;
import org.apache.myfaces.trinidad.change.AddChildDocumentChange;
import org.apache.myfaces.trinidad.change.SetFacetChildComponentChange;
import org.apache.myfaces.trinidad.change.AttributeComponentChange;
import org.apache.myfaces.trinidad.change.ChangeManager;
import org.apache.myfaces.trinidad.change.ComponentChange;
import org.apache.myfaces.trinidad.change.DocumentChange;
import org.apache.myfaces.trinidad.change.RemoveChildComponentChange;
import org.apache.myfaces.trinidad.change.RemoveFacetComponentChange;
import org.apache.myfaces.trinidad.change.ReorderChildrenComponentChange;
import org.apache.myfaces.trinidad.component.core.nav.CoreCommandButton;
import org.apache.myfaces.trinidad.component.core.output.CoreImage;
import org.apache.myfaces.trinidad.component.core.output.CoreOutputFormatted;
import org.apache.myfaces.trinidad.context.RequestContext;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.xml.sax.SAXException;
import java.io.ByteArrayInputStream;
/**
* Managed bean for Change persistence demos.
* @version $Name: $ ($Revision: adfrt/faces/adf-faces-demo/src/main/java/oracle/adfdemo/view/faces/change/ChangeBean.java#1 $) $Date: 16-aug-2005.15:12:29 $
*/
public class ChangeBean
{
/**
* Picks up an image randomly from a list and changes it on the image.
*/
@SuppressWarnings("unchecked")
public void modifyObjectImage(ActionEvent event)
{
UIComponent uic = event.getComponent().findComponent("oi1");
String source = "/components/images/" + _images[_getRandIndex()];
uic.getAttributes().put("source", source);
_addAttributeChange(uic, "source", source);
}
/**
* Picks up a string randomly from a list and changes the text attribute value
* of the panelBox.
*/
@SuppressWarnings("unchecked")
public void modifyPanelBox(ActionEvent event)
{
UIComponent uic = event.getComponent().findComponent("pb1");
String text = _texts[_getRandIndex()];
uic.getAttributes().put("text", text);
_addAttributeChange(uic, "text", text);
}
/**
* Modifies the sortable property of the column.
*/
@SuppressWarnings("unchecked")
public void modifyColumn(ActionEvent event)
{
//=-=pu: 'uic1' gets null, while 'uic' gets valid component, maybe a bug ?.
//UIComponent uic1 = event.getComponent().findComponent("c1");
UIComponent uic2 = event.getComponent().findComponent("t1");
UIComponent uic = uic2.findComponent("c1");
Object sortableAttrib = uic.getAttributes().get("sortable");
Boolean isSortable =
(sortableAttrib == null)? Boolean.TRUE:(Boolean)sortableAttrib;
Boolean newSortableValue =
Boolean.TRUE.equals(isSortable)? Boolean.FALSE:Boolean.TRUE;
uic.getAttributes().put("sortable", newSortableValue);
_addAttributeChange(uic, "sortable", newSortableValue);
}
/**
* Picks up a string randomly from a list and changes the label attribute
* value of the inputText.
*/
@SuppressWarnings("unchecked")
public void modifyInputText(ActionEvent event)
{
UIComponent uic = event.getComponent().findComponent("it1");
String label = _labels[_getRandIndex()];
uic.getAttributes().put("label", label);
_addAttributeChange(uic, "label", label);
}
/**
* Appends an image child to the panelGroup in the underlying JSP document
*/
public void appendChildToDocument(ActionEvent event)
{
UIComponent eventSource = event.getComponent();
UIComponent uic = eventSource.findComponent("pg1");
// only allow the image to be added once
if (_findChildById(uic,"oi3") != null)
return;
FacesContext fc = FacesContext.getCurrentInstance();
DocumentFragment imageFragment = _createDocumentFragment(_IMAGE_MARK_UP);
if (imageFragment != null)
{
DocumentChange change = new AddChildDocumentChange(imageFragment);
ChangeManager apm = RequestContext.getCurrentInstance().getChangeManager();
apm.addDocumentChange(fc, uic, change);
}
}
/**
* Appends an image child to the panelGroup.
*/
@SuppressWarnings("unchecked")
public void appendChild(ActionEvent event)
{
UIComponent eventSource = event.getComponent();
UIComponent uic = eventSource.findComponent("pg1");
if (_findChildById(uic,"oi2") != null)
return;
FacesContext fc = FacesContext.getCurrentInstance();
CoreImage newChild =
(CoreImage) fc.getApplication().createComponent(
"org.apache.myfaces.trinidad.CoreImage");
newChild.setId("oi2");
newChild.setInlineStyle("height: 100px, width: 120px");
newChild.setSource(
"http://homepage.mac.com/awiner/.Pictures/WindyHill/PaleSwallowtail.jpg");
uic.getChildren().add(newChild);
ComponentChange aca = new AddChildComponentChange(newChild);
ChangeManager apm = RequestContext.getCurrentInstance().getChangeManager();
apm.addComponentChange(fc, uic, aca);
}
/**
* Adds a 'brandingAppContextual' facet to the panelGroup.
*/
@SuppressWarnings("unchecked")
public void addFacet(ActionEvent event)
{
UIComponent eventSource = event.getComponent();
UIComponent uic = eventSource.findComponent("pp1");
FacesContext fc = FacesContext.getCurrentInstance();
CoreOutputFormatted newFacetComponent =
(CoreOutputFormatted) fc.getApplication().createComponent(
"org.apache.myfaces.trinidad.CoreOutputFormatted");
newFacetComponent.setStyleUsage("inContextBranding" );
newFacetComponent.setValue(
"Customer Company - Menlo Park");
uic.getFacets().put("brandingAppContextual", newFacetComponent);
ComponentChange afa = new SetFacetChildComponentChange("brandingAppContextual", newFacetComponent);
ChangeManager apm = RequestContext.getCurrentInstance().getChangeManager();
apm.addComponentChange(fc, uic, afa);
}
/**
* Reverses the order of children of the panelGroup.
*/
@SuppressWarnings("unchecked")
public void reorderChildren(ActionEvent event)
{
UIComponent uic = event.getComponent().findComponent("pg1");
int numChildren = uic.getChildCount();
if (numChildren == 0)
return;
List<UIComponent> children = uic.getChildren();
Collections.reverse(children);
List<String> reorderedChildIdList = new ArrayList<String>();
for(UIComponent child : children)
{
reorderedChildIdList.add(child.getId());
}
ComponentChange ra = new ReorderChildrenComponentChange(reorderedChildIdList);
FacesContext fc = FacesContext.getCurrentInstance();
ChangeManager apm = RequestContext.getCurrentInstance().getChangeManager();
apm.addComponentChange(fc, uic, ra);
}
/**
* Removes a pair of children, based on some characteristic of the
* event source.
*/
public void removeChildren(ActionEvent event)
{
UIComponent eventSource = event.getComponent();
UIComponent uic = eventSource.findComponent("pg1");
int numChildren = uic.getChildCount();
if (numChildren == 0)
return;
String eventSourceId = eventSource.getId();
if (eventSourceId.equals("cb2"))
{
_removeChild(uic, "sic1");
_removeChild(uic, "cc1");
}
else if (eventSourceId.equals("cb3"))
{
_removeChild(uic, "cd1");
_removeChild(uic, "sid1");
}
}
/**
* Removes one or more facets, based on some characteristic of the
* event source.
*/
@SuppressWarnings("unchecked")
public void removeFacets(ActionEvent event)
{
CoreCommandButton eventSource = (CoreCommandButton) event.getComponent();
//pu: Anything until ":" in the button text represents the facet name/s
String facetNameFromButtonText = (eventSource.getText().split(":"))[0];
//pu: In case of the button that removes multiple facets, this is again
// delimited by "_"
String removableFacetNames[] = facetNameFromButtonText.split("_");
//pu: Get the CorePanelPage components that has all the removable facets
UIComponent uic = eventSource.findComponent("pp1");
Map<String, UIComponent> facets = uic.getFacets();
if (facets.keySet().size() == 0)
return;
for (int i=0; i<removableFacetNames.length; i++)
{
if (facets.get(removableFacetNames[i]) != null)
{
facets.remove(removableFacetNames[i]);
ComponentChange rfa = new RemoveFacetComponentChange(removableFacetNames[i]);
FacesContext fc = FacesContext.getCurrentInstance();
ChangeManager apm = RequestContext.getCurrentInstance().getChangeManager();
apm.addComponentChange(fc, uic, rfa);
}
}
}
/**
* Creates a DocumentFragment containing the parsed content
* @param markUp JSP Document markup
* @return DocumentFragment containing the parsed content
*/
private static DocumentFragment _createDocumentFragment(
String markUp)
{
// prepend XML declaration
markUp = "<?xml version = '1.0' encoding = 'ISO-8859-1'?>" + markUp;
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(false);
DocumentBuilder builder;
try
{
builder = factory.newDocumentBuilder();
}
catch (ParserConfigurationException pce)
{
_LOG.log(Level.WARNING, "Unable to get XML Parser:", pce);
return null;
}
try
{
// use a version explicitly with ISO-8859-1 instead
byte[] markupBytes = markUp.getBytes();
Document newDoc = builder.parse(new ByteArrayInputStream(markupBytes));
DocumentFragment fragment = newDoc.createDocumentFragment();
// add the document's root element to the fragment
fragment.appendChild(newDoc.getDocumentElement());
return fragment;
}
catch (SAXException se)
{
_LOG.log(Level.WARNING, "Unable to parse markup:" + markUp, se);
return null;
}
catch (IOException ioe)
{
_LOG.log(Level.WARNING, "IO Problem with markup:" + markUp, ioe);
return null;
}
}
@SuppressWarnings("unchecked")
private static void _removeChild(UIComponent uic, String removableChildId)
{
UIComponent removableChild = _findChildById(uic, removableChildId);
if (removableChild != null)
{
List<UIComponent> children = uic.getChildren();
children.remove(removableChild);
ComponentChange rca = new RemoveChildComponentChange(removableChildId);
FacesContext fc = FacesContext.getCurrentInstance();
ChangeManager apm = RequestContext.getCurrentInstance().getChangeManager();
apm.addComponentChange(fc, uic, rca);
}
}
@SuppressWarnings("unchecked")
private static UIComponent _findChildById(UIComponent uic, String id)
{
int numChildren = uic.getChildCount();
if (numChildren == 0)
return null;
List<UIComponent> children = uic.getChildren();
UIComponent child = null;
for (int i=0; i<numChildren; i++)
{
child = children.get(i);
if (id.equals(child.getId()))
return child;
}
return null;
}
private static void _addAttributeChange(
UIComponent uic,
String attribName,
Object attribValue
)
{
FacesContext fc = FacesContext.getCurrentInstance();
ChangeManager apm = RequestContext.getCurrentInstance().getChangeManager();
ComponentChange aa = new AttributeComponentChange(attribName, attribValue);
apm.addComponentChange(fc, uic, aa);
}
private static int _getRandIndex()
{
return (int) (Math.random()*10)/2;
}
private static final String _images[] =
{"cobrand.gif","corporateBrand.gif","largeAd.gif","mediumAd.gif","new.gif"};
private static final String _labels[] =
{"Label One","Label Two","Label Three","Label Four","Label Five"};
private static final String _texts[] =
{"PanelBoxText One",
"PanelBoxText Two",
"PanelBoxText Three",
"PanelBoxText Four",
"PanelBoxText Five"};
// markup to use for image added to document
private static final String _IMAGE_MARK_UP =
"<tr:Image id='oi3' inlineStyle='height: 100px; width: 120px;' " +
"source='http://homepage.mac.com/awiner/.Pictures/WindyHill/PaleSwallowtail.jpg' " +
"xmlns:af='http://myfaces.apache.org/adf/faces/EA17'/>";
static private final Logger _LOG = Logger.getLogger(ChangeBean.class.getName());
}