/*
* Copyright 2016 the original author or authors.
*
* 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 org.gradle.performance.android;
import com.android.builder.model.AndroidArtifact;
import com.android.builder.model.AndroidLibrary;
import com.android.builder.model.AndroidProject;
import com.android.builder.model.Dependencies;
import com.android.builder.model.JavaLibrary;
import com.android.builder.model.Variant;
import org.gradle.tooling.internal.adapter.ProtocolToModelAdapter;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Set;
public class Inspector {
Set<JavaLibrary> javaLibsByEquality = new HashSet<JavaLibrary>();
Map<File, JavaLibrary> javaLibsByFile = new HashMap<File, JavaLibrary>();
Map<JavaLibrary, JavaLibrary> javaLibsByIdentity = new IdentityHashMap<JavaLibrary, JavaLibrary>();
Map<Object, Object> javaLibsBackingByIdentity = new IdentityHashMap<Object, Object>();
Set<AndroidLibrary> libsByEquality = new HashSet<AndroidLibrary>();
Map<File, AndroidLibrary> libsByFile = new HashMap<File, AndroidLibrary>();
Map<AndroidLibrary, AndroidLibrary> libsByIdentity = new IdentityHashMap<AndroidLibrary, AndroidLibrary>();
Map<Object, Object> libsBackingByIdentity = new IdentityHashMap<Object, Object>();
void inspectModel(Map<String, AndroidProject> models) {
System.out.println("* Inspecting");
Timer timer = new Timer();
for (AndroidProject androidProject : models.values()) {
if (androidProject == null) {
continue;
}
inspect(androidProject);
}
timer.stop();
System.out.println("Inspect took " + timer.duration());
System.out.println("---");
System.out.println("Android libs: " + libsByEquality.size());
System.out.println("Android libs by file: " + libsByFile.size());
System.out.println("Android libs by id: " + libsByIdentity.size());
System.out.println("Android libs by id (backing): " + libsBackingByIdentity.size());
System.out.println("Java libs: " + javaLibsByEquality.size());
System.out.println("Java libs by file: " + javaLibsByFile.size());
System.out.println("Java libs by id: " + javaLibsByIdentity.size());
System.out.println("Java libs by id (backing): " + javaLibsBackingByIdentity.size());
System.out.println("---");
}
private void inspect(AndroidProject androidProject) {
for (Variant variant : androidProject.getVariants()) {
inspect(variant.getMainArtifact().getDependencies());
for (AndroidArtifact otherArtifact : variant.getExtraAndroidArtifacts()) {
inspect(otherArtifact.getDependencies());
}
}
}
private void inspect(Dependencies dependencies) {
for (AndroidLibrary androidLibrary : dependencies.getLibraries()) {
inspect(androidLibrary);
}
for (JavaLibrary javaLibrary : dependencies.getJavaLibraries()) {
inspect(javaLibrary);
}
}
private void inspect(AndroidLibrary androidLibrary) {
libsByEquality.add(androidLibrary);
libsByFile.put(androidLibrary.getJarFile(), androidLibrary);
libsByIdentity.put(androidLibrary, androidLibrary);
unpack(androidLibrary, libsBackingByIdentity);
for (AndroidLibrary library : androidLibrary.getLibraryDependencies()) {
inspect(library);
}
for (JavaLibrary library : androidLibrary.getJavaDependencies()) {
inspect(library);
}
}
private void inspect(JavaLibrary javaLibrary) {
javaLibsByEquality.add(javaLibrary);
if (!javaLibsByFile.containsKey(javaLibrary.getJarFile())) {
javaLibsByFile.put(javaLibrary.getJarFile(), javaLibrary);
}
if (!javaLibsByIdentity.containsKey(javaLibrary)) {
javaLibsByIdentity.put(javaLibrary, javaLibrary);
}
unpack(javaLibrary, javaLibsBackingByIdentity);
for (JavaLibrary library : javaLibrary.getDependencies()) {
inspect(library);
}
}
private void unpack(Object library, Map<Object, Object> objectMap) {
Object unpacked = new ProtocolToModelAdapter().unpack(library);
objectMap.put(unpacked, unpacked);
}
}