String determinePackageName(int uniqueRound) { if (this.meta.size() == 1) { AddressTemplate address = this.meta.get(0).getAddress(); int numTokens = address.tokenLength() - 1; List<String> segments = determineSegments(address, uniqueRound); return packagize(segments); } List<List<String>> allSegments = new ArrayList<>(); for (ResourceMetaData resourceMetaData : this.meta) { allSegments.add(determineSegments(resourceMetaData.getAddress(), uniqueRound)); } List<String> commonSegments = new ArrayList<>(); int i = 0; OUTER: while (true) { String cur = null; INNER: for (List<String> each : allSegments) { if (!(each.size() > i)) { break OUTER; } if (cur == null) { cur = each.get(i); } else { if (!cur.equals(each.get(i))) { break OUTER; } } } commonSegments.add(cur); cur = null; ++i; } return packagize(commonSegments); }
/** * Construct a class plan for set of identical resources. * * @param meta */ ClassPlan(List<ResourceMetaData> meta) { // type assertion to make things more obvious ResourceMetaData prime = meta.get(0); String primeType = prime.getAddress().getResourceType(); meta.forEach( resourceMetaData -> { String resourceType = resourceMetaData.getAddress().getResourceType(); if (!resourceType.equals(primeType)) throw new IllegalArgumentException( "Illegal partition, resourceType's don't match: " + primeType + " > " + resourceType); }); this.meta.addAll(meta); this.addr = prime.getAddress(); this.packageName = determinePackageName(0); this.originalClassName = determineClassName(0); this.className = NameFixer.fixClassName(this.originalClassName); this.type = addr.getResourceType(); }