FatLibAnalyzer.java
/*
* #%L
* xcode-maven-plugin
* %%
* Copyright (C) 2012 SAP AG
* %%
* 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.
* #L%
*/
package com.sap.prd.mobile.ios.mios;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.StringReader;
import java.nio.charset.Charset;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
class FatLibAnalyzer
{
private File fatLib;
private Set<String> architectures = null;
FatLibAnalyzer(final File fatLib)
{
if (fatLib == null)
throw new NullPointerException();
if (!fatLib.canRead())
throw new IllegalArgumentException("Cannot access " + fatLib + ".");
this.fatLib = fatLib;
}
File getFatLibrary()
{
return fatLib;
}
Set<String> getArchitectures() throws IOException
{
if (architectures == null) {
BufferedReader br = null;
try {
br = new BufferedReader(new StringReader(getDetailedLipoInfo()));
Set<String> architectures = new HashSet<String>();
for (String line; (line = br.readLine()) != null;) {
if (!line.trim().startsWith("architecture"))
continue;
String[] strings = line.split(" ");
if (strings.length < 2)
throw new IllegalStateException("Architecture could not be parsed: " + line);
String[] architecture = new String[strings.length - 1];
System.arraycopy(strings, 1, architecture, 0, strings.length - 1);
architectures.add(StringUtils.join(architecture, " "));
}
this.architectures = architectures;
}
finally {
IOUtils.closeQuietly(br);
}
}
return this.architectures;
}
boolean containsI386() throws IOException
{
return getArchitectures().contains("i386");
}
boolean containsArmv() throws IOException
{
for (String architecture : getArchitectures()) {
if (architecture.startsWith("armv")) {
return true;
}
}
return false;
}
private String getDetailedLipoInfo() throws IOException
{
final String defaultCharSet = Charset.defaultCharset().name();
ByteArrayOutputStream byteOs = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(byteOs, true, defaultCharSet);
try {
Forker.forkProcess(ps, null, "lipo", "-detailed_info", fatLib.getAbsolutePath());
return new String(byteOs.toByteArray(), defaultCharSet);
}
finally {
IOUtils.closeQuietly(ps);
}
}
}