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 HashMap<String, Object> getIosInfo(String filePath, String fileName) throws Exception 36 { 37 // 获得二级目录名称 38 String appName = getAppName(filePath); 39 40 // 解析文件 41 HashMap<String, Object> 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<String, Object> 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<Element> children = filterElement(dictElement.elements()); 100 HashMap<String, Object> infoMap = new HashMap<String, Object>(); 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<Element> 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<Element> filterElement(List<?> elements) { 126 List<Element> result = new ArrayList<Element>(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 }