1 import java.io.BufferedInputStream; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.StringReader; 7 import java.util.ArrayList; 8 import java.util.HashMap; 9 import java.util.List; 10 import java.util.zip.ZipEntry; 11 import java.util.zip.ZipFile; 12 import java.util.zip.ZipInputStream; 13 14 import org.apache.commons.lang.StringUtils; 15 import org.apache.poi.util.IOUtils; 16 import org.dom4j.Document; 17 import org.dom4j.DocumentException; 18 import org.dom4j.Element; 19 import org.dom4j.io.SAXReader; 20 import org.w3c.dom.Node; 21 import org.xml.sax.InputSource; 22 23 24 /** 25 * IOS文件解析 26 * 27 * @author dKF63325 28 * @version ONIP BME V300R001 2014-6-9 29 * @since ONIP BME V300R001C00 30 */ 31 public class IosInfoUtils 32 { 33 34 35 public static HashMapgetIosInfo(String filePath, String fileName) throws Exception 36 { 37 // 获得二级目录名称 38 String appName = getAppName(filePath); 39 40 // 解析文件 41 HashMap infoMap = parseXml(filePath, appName); 42 43 File file = new File(filePath); 44 // 文件名称 45 infoMap.put("fileName", file.getName()); 46 // 文件大小 47 infoMap.put("fileSize", convertFileSize(file.length())); 48 // 文件大小(单位:字节) 49 infoMap.put("fileByteSize", file.length()); 50 // 是否存在SDK 51 infoMap.put("isSDK", AXMLPrinter2.isExistsSdkFromIOS(filePath, appName)); 52 // SDK版本号 53 infoMap.put("sdkVersion", AXMLPrinter2.getSdkVersionFromIOS(filePath, appName)); 54 55 return infoMap; 56 } 57 58 private static String getAppName(String filePath) 59 { 60 ZipFile file = null; 61 InputStream in = null; 62 String name = StringUtils.EMPTY; 63 try 64 { 65 in = new BufferedInputStream(new FileInputStream(filePath)); 66 ZipInputStream zip = new ZipInputStream(in); 67 ZipEntry zp = null; 68 while ((zp = zip.getNextEntry()) != null) 69 { 70 name = zp.getName(); 71 if (name.indexOf(".app") != -1) 72 { 73 name = name.substring(name.indexOf("Payload/")+"Payload/".length(), name.indexOf(".app") + ".app".length()); 74 break; 75 } 76 } 77 } 78 catch (IOException e) 79 { 80 DEBUGGER.error("Failed to getAppName", e); 81 } 82 finally 83 { 84 IOUtils.closeQuietly(in); 85 AXMLPrinter2.closeZipFile(file); 86 } 87 return name; 88 } 89 90 private static HashMap parseXml(String filePath, String projectName) throws IOException, Exception, DocumentException 91 { 92 String xml = AXMLPrinter2.getXmlFromIOS(filePath, projectName); 93 StringReader read = new StringReader(xml); 94 InputSource scource = new InputSource(read); 95 SAXReader sax = new SAXReader(); 96 sax.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 97 Document root = sax.read(scource); 98 Element dictElement = (Element) root.selectSingleNode("//dict"); 99 List children = filterElement(dictElement.elements());100 HashMap infoMap = new HashMap ();101 for (int i = 0; i < children.size(); i+=2)102 {103 Element key = children.get(i);104 Element val = children.get(i+1);105 if ("array".equals(val.getName()))106 {107 List arrayList = filterElement(val.elements());108 String values = StringUtils.EMPTY;109 for (Element element : arrayList)110 {111 values += element.getStringValue() + ",";112 }113 infoMap.put(key.getStringValue(), StringUtils.removeEnd(values, ","));114 } else if ("true".equals(val.getName())) {115 infoMap.put(key.getStringValue(), true);116 } else if ("false".equals(val.getName())) {117 infoMap.put(key.getStringValue(), false);118 } else {119 infoMap.put(key.getStringValue(), val.getStringValue());120 }121 }122 return infoMap;123 }124 125 private static List filterElement(List elements) {126 List result = new ArrayList (elements.size());127 for (Object object : elements)128 {129 Element element = (Element)object;130 if (element.getNodeType() == Node.ELEMENT_NODE)131 {132 result.add(element);133 }134 }135 return result;136 }137 138 public static String convertFileSize(long filesize)139 {140 String strUnit = "Bytes";141 String strAfterComma = "";142 int intDivisor = 1;143 if (filesize >= 1024 * 1024)144 {145 strUnit = "MB";146 intDivisor = 1024 * 1024;147 } else if (filesize >= 1024)148 {149 strUnit = "KB";150 intDivisor = 1024;151 }152 if (intDivisor == 1){153 return filesize + " " + strUnit;154 }155 156 strAfterComma = "" + 100 * (filesize % intDivisor) / intDivisor;157 if (strAfterComma.equals(""))158 strAfterComma = ".0";159 160 return filesize / intDivisor + "." + strAfterComma + " " + strUnit;161 }162 }