/* * Copyright 2007 T-Rank AS * * 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 no.trank.openpipe.parse.ms; import java.beans.IntrospectionException; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.io.InputStream; import java.lang.reflect.Type; import java.util.Date; import java.util.HashMap; import java.util.Map; import org.apache.poi.POIDocument; import org.apache.poi.hpsf.CustomProperties; import org.apache.poi.hpsf.DocumentSummaryInformation; import org.apache.poi.hpsf.PropertySetFactory; import org.apache.poi.hpsf.SummaryInformation; import org.apache.poi.poifs.filesystem.POIFSFileSystem; /** * Functionality shared by the ms parsers. * * @version $Revision$ */ public class POIUtils { /** * Removes control codes from the text returned by the poi extractors. * Adds one space per chunk with control codes. * * @param text text to be cleaned * @return clean text */ public static String getCleanText(String text) { StringBuilder ret = new StringBuilder(); boolean prevControl = false; if(text != null) { for(int i = 0; i < text.length(); ++i) { char c = text.charAt(i); if(c < 32) { if(!prevControl) { ret.append(' '); } prevControl = true; } else { ret.append(c); prevControl = false; } } } return ret.toString(); } /** * Fetches the \005SummaryInformation and \005DocumentSummaryInformation streams from the poi * file system and exctracts all properties of primitive type, String or Date. * * @param fs the poi filesystem * @return the properties */ public static Map<String, String> getProperties(POIFSFileSystem fs) { Map<String, String> map = new HashMap<String, String>(); try { InputStream stream = fs.createDocumentInputStream(SummaryInformation.DEFAULT_STREAM_NAME); addProperties(map, PropertySetFactory.create(stream)); } catch (Exception e) { // ignore } try { InputStream stream = fs.createDocumentInputStream(DocumentSummaryInformation.DEFAULT_STREAM_NAME); addProperties(map, PropertySetFactory.create(stream)); } catch (Exception e) { // ignore } return map; } /** * Exctracts all properties of primitive type, String or Date from the document's summary information * and document summary information. * * @param doc the poi document * @return the properties */ public static Map<String, String> getProperties(POIDocument doc) { Map<String, String> map = new HashMap<String, String>(); addProperties(map, doc.getSummaryInformation()); addProperties(map, doc.getDocumentSummaryInformation()); return map; } private static void addProperties(Map<String, String> map, Object ob) { try { for(PropertyDescriptor pd : Introspector.getBeanInfo(ob.getClass()).getPropertyDescriptors()) { try { if(pd.getReadMethod() != null && pd.getWriteMethod() != null) { Type type = pd.getWriteMethod().getGenericParameterTypes()[0]; Class<?> c = type instanceof Class ? (Class<?>)type : null; if(c != null && (c.isPrimitive() || c == String.class || c == Date.class || c == CustomProperties.class)) { Object value = pd.getReadMethod().invoke(ob, new Object[0]); // TODO: decide what to do with custom properties if(value instanceof CustomProperties) { // CustomProperties cc = (CustomProperties)value; } else if(value != null) { String valueString = value.toString().trim(); if(valueString != null) { map.put(pd.getName(), valueString); } } } } } catch (Exception e) { e.printStackTrace(); } } } catch (IntrospectionException e) { e.printStackTrace(); } } }