001: /*
002: * Copyright 2006-2007 Pentaho Corporation. All rights reserved.
003: * This software was developed by Pentaho Corporation and is provided under the terms
004: * of the Mozilla Public License, Version 1.1, or any later version. You may not use
005: * this file except in compliance with the license. If you need a copy of the license,
006: * please go to http://www.mozilla.org/MPL/MPL-1.1.txt.
007: *
008: * Software distributed under the Mozilla Public License is distributed on an "AS IS"
009: * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. Please refer to
010: * the license for the specific language governing your rights and limitations.
011: *
012: * Additional Contributor(s): Martin Schmid gridvision engineering GmbH
013: */
014: package org.pentaho.reportdesigner.crm.report.model;
015:
016: import org.gjt.xpp.XmlPullNode;
017: import org.jetbrains.annotations.NonNls;
018: import org.jetbrains.annotations.NotNull;
019: import org.jetbrains.annotations.Nullable;
020: import org.pentaho.reportdesigner.crm.report.model.functions.ExpressionRegistry;
021: import org.pentaho.reportdesigner.crm.report.reportexporter.ReportCreationException;
022: import org.pentaho.reportdesigner.crm.report.reportexporter.ReportVisitor;
023: import org.pentaho.reportdesigner.lib.common.xml.ObjectConverter;
024: import org.pentaho.reportdesigner.lib.common.xml.ObjectConverterFactory;
025: import org.pentaho.reportdesigner.lib.common.xml.XMLConstants;
026: import org.pentaho.reportdesigner.lib.common.xml.XMLContext;
027: import org.pentaho.reportdesigner.lib.common.xml.XMLUtils;
028: import org.pentaho.reportdesigner.lib.common.xml.XMLWriter;
029:
030: import java.io.IOException;
031: import java.lang.reflect.Array;
032: import java.lang.reflect.Field;
033: import java.util.ArrayList;
034: import java.util.logging.Level;
035: import java.util.logging.Logger;
036:
037: /**
038: * User: Martin
039: * Date: 10.01.2006
040: * Time: 13:07:11
041: */
042: public class ReportFunctionElement extends ReportElement {
043: @NonNls
044: @NotNull
045: private static final Logger LOG = Logger
046: .getLogger(ReportFunctionElement.class.getName());
047:
048: public ReportFunctionElement() {
049: setName("");
050: }
051:
052: public void accept(@Nullable
053: Object parent, @NotNull
054: ReportVisitor reportVisitor) throws ReportCreationException {
055: Object newParent = reportVisitor.visit(parent, this );
056:
057: ArrayList<ReportElement> children = new ArrayList<ReportElement>(
058: getChildren());
059: for (ReportElement reportElement : children) {
060: reportElement.accept(newParent, reportVisitor);
061: }
062: }
063:
064: protected void externalizeElements(@NotNull
065: XMLWriter xmlWriter, @NotNull
066: XMLContext xmlContext) throws IOException {
067: super .externalizeElements(xmlWriter, xmlContext);
068:
069: Field[] fields = getClass().getDeclaredFields();
070: for (Field field : fields) {
071: field.setAccessible(true);
072: try {
073: Object o = field.get(this );
074: if (field.getType().isArray() && o != null) {
075: Object[] objArray = (Object[]) o;
076: ObjectConverter converter = ObjectConverterFactory
077: .getInstance().getConverter(
078: field.getType().getComponentType(),
079: field, xmlContext);
080: xmlWriter.startElement(XMLConstants.PROPERTY);
081: xmlWriter.writeAttribute(XMLConstants.NAME, field
082: .getName());
083: xmlWriter
084: .writeAttribute(XMLConstants.ARRAY, "true");
085: for (int j = 0; j < objArray.length; j++) {
086: Object o1 = objArray[j];
087: if (o1 != null && converter != null) {
088: xmlWriter.writeProperty(String.valueOf(j),
089: converter.getString(o1));
090: }
091: }
092: xmlWriter.closeElement(XMLConstants.PROPERTY);
093: } else {
094: if (o != null) {
095: ObjectConverter converter = ObjectConverterFactory
096: .getInstance().getConverter(
097: field.getType(), field,
098: xmlContext);
099: if (converter != null) {
100: xmlWriter.writeProperty(field.getName(),
101: converter.getString(o));
102: }
103: }
104: }
105: } catch (IllegalAccessException e) {
106: if (LOG.isLoggable(Level.FINE))
107: LOG
108: .log(
109: Level.FINE,
110: "ReportFunctionElement.externalizeAttributes ",
111: e);
112: }
113: }
114: }
115:
116: protected void readElement(@NotNull
117: ExpressionRegistry expressions, @NotNull
118: XmlPullNode node, @NotNull
119: XMLContext xmlContext) throws Exception {
120: super .readElement(expressions, node, xmlContext);
121:
122: Field[] fields = getClass().getDeclaredFields();
123: for (Field field : fields) {
124: field.setAccessible(true);
125: try {
126: if (XMLConstants.PROPERTY.equals(node.getRawName())
127: && field
128: .getName()
129: .equals(
130: node
131: .getAttributeValueFromRawName(XMLConstants.NAME))) {
132: if (node
133: .getAttributeValueFromRawName(XMLConstants.ARRAY) != null) {
134: ObjectConverter converter = ObjectConverterFactory
135: .getInstance().getConverter(
136: field.getType()
137: .getComponentType(),
138: field, xmlContext);
139: if (converter != null) {
140: ArrayList<Object> al = new ArrayList<Object>();
141: int n = 0;
142: while (!node.isFinished()) {
143: Object childNodeList = node
144: .readNextChild();
145: if (childNodeList instanceof XmlPullNode) {
146: XmlPullNode child = (XmlPullNode) childNodeList;
147: if (XMLConstants.PROPERTY
148: .equals(child.getRawName())) {
149: //int index = Integer.valueOf(child.getAttributeValueFromRawName(XMLConstants.NAME));//MARKED perhaps obey index/subarrays as necessary?
150: al
151: .add(converter
152: .getObject(XMLUtils
153: .readProperty(
154: String
155: .valueOf(n),
156: child)));
157: n++;
158: }
159: }
160: }
161: Object[] o = (Object[]) Array.newInstance(
162: field.getType().getComponentType(),
163: al.size());
164: for (int j = 0; j < o.length; j++) {
165: o[j] = al.get(j);
166: }
167: field.set(this , o);
168: }
169: } else {
170: String s = XMLUtils.readProperty(field
171: .getName(), node);
172: ObjectConverter converter = ObjectConverterFactory
173: .getInstance().getConverter(
174: field.getType(), field,
175: xmlContext);
176:
177: if (converter != null) {
178: field.set(this , converter.getObject(s));
179: }
180: }
181: }
182:
183: } catch (IllegalAccessException e) {
184: if (LOG.isLoggable(Level.FINE))
185: LOG.log(Level.FINE,
186: "ReportFunctionElement.readAttributes ", e);
187: }
188: }
189: }
190:
191: //@NotNull
192: //private String getAbsolutePath(@NotNull XMLContext xmlContext, @NotNull Field field, @NotNull ObjectConverter objectConverter, @NotNull String path)
193: //{
194: // if (objectConverter instanceof URLConverter)
195: // {
196: // try
197: // {
198: // return FileRelativator.getAbsoluteURLString(xmlContext, path);
199: // }
200: // catch (MalformedURLException e)
201: // {
202: // if (LOG.isLoggable(Level.FINE)) LOG.log(Level.FINE, "ReportFunctionElement.getAbsolutePath ", e);
203: // return path;
204: // }
205: // }
206: //
207: // return path;
208: //}
209: //
210: //
211: //private boolean isPathProperty(@NotNull XMLContext xmlContext, @NotNull Field field, @NotNull ObjectConverter objectConverter)
212: //{
213: // return objectConverter instanceof URLConverter;
214: //}
215: //
216: //
217: //@NotNull
218: //private String getRelativePath(@NotNull XMLContext xmlContext, @NotNull Object object)
219: //{
220: // if (object instanceof URL)
221: // {
222: // URL url = (URL) object;
223: //
224: // }
225: //}
226:
227: }
|