| /* |
| * 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.cocoon.portal.tools.copletManagement.generation; |
| |
| import java.beans.PropertyDescriptor; |
| import java.io.ByteArrayOutputStream; |
| import java.io.IOException; |
| import java.io.StringReader; |
| import java.lang.reflect.Method; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.apache.avalon.framework.service.ServiceException; |
| import org.apache.cocoon.ProcessingException; |
| import org.apache.cocoon.components.flow.FlowHelper; |
| import org.apache.cocoon.components.persistence.CastorSourceConverter; |
| import org.apache.cocoon.components.persistence.ConverterException; |
| import org.apache.cocoon.generation.ServiceableGenerator; |
| import org.apache.commons.jxpath.DynamicPropertyHandler; |
| import org.apache.commons.jxpath.JXPathBeanInfo; |
| import org.apache.commons.jxpath.JXPathIntrospector; |
| import org.apache.excalibur.xml.sax.SAXParser; |
| import org.xml.sax.InputSource; |
| import org.xml.sax.SAXException; |
| |
| |
| /** |
| * |
| * @version CVS $Id$ |
| */ |
| public class XMLProfileGenerator |
| extends ServiceableGenerator { |
| |
| /* (non-Javadoc) |
| * @see org.apache.cocoon.generation.Generator#generate() |
| */ |
| public void generate() |
| throws IOException, SAXException, ProcessingException { |
| |
| SAXParser parser = null; |
| CastorSourceConverter converter = null; |
| final Object context = FlowHelper.getContextObject(this.objectModel); |
| Map myMap = new HashMap(); |
| if (context instanceof Map) { |
| myMap = (Map) context; |
| } else { |
| fillContext(context, myMap); |
| } |
| try { |
| Object layout = myMap.get("layout"); |
| converter = (CastorSourceConverter) this.manager.lookup(org.apache.cocoon.components.persistence.CastorSourceConverter.ROLE); |
| ByteArrayOutputStream os = new java.io.ByteArrayOutputStream(); |
| HashMap para = new HashMap(); |
| para.put("profiletype", "layout"); |
| converter.storeObject(os, para, layout); |
| String xml = new String(); |
| xml = os.toString(); |
| final InputSource inputSource = new InputSource(new StringReader(xml)); |
| parser = (SAXParser)this.manager.lookup(SAXParser.ROLE); |
| parser.parse(inputSource, super.xmlConsumer); |
| } catch (ServiceException e) { |
| throw new ProcessingException(e); |
| } catch (ConverterException e) { |
| throw new ProcessingException(e); |
| } finally { |
| this.manager.release(parser); |
| this.manager.release(converter); |
| } |
| } |
| |
| // FIXME: Copy from JXTemplateGenerator |
| private void fillContext(Object contextObject, Map map) { |
| if (contextObject != null) { |
| // Hack: I use jxpath to populate the context object's properties |
| // in the jexl context |
| final JXPathBeanInfo bi = JXPathIntrospector.getBeanInfo(contextObject.getClass()); |
| if (bi.isDynamic()) { |
| Class cl = bi.getDynamicPropertyHandlerClass(); |
| try { |
| DynamicPropertyHandler h = (DynamicPropertyHandler)cl.newInstance(); |
| String[] result = h.getPropertyNames(contextObject); |
| int len = result.length; |
| for (int i = 0; i < len; i++) { |
| try { |
| map.put(result[i], h.getProperty(contextObject, result[i])); |
| } catch (Exception exc) { |
| exc.printStackTrace(); |
| } |
| } |
| } catch (Exception ignored) { |
| ignored.printStackTrace(); |
| } |
| } else { |
| PropertyDescriptor[] props = bi.getPropertyDescriptors(); |
| int len = props.length; |
| for (int i = 0; i < len; i++) { |
| try { |
| Method read = props[i].getReadMethod(); |
| if (read != null) { |
| map.put(props[i].getName(), read.invoke(contextObject, null)); |
| } |
| } catch (Exception ignored) { |
| ignored.printStackTrace(); |
| } |
| } |
| } |
| } |
| } |
| } |
| |