Return-Path: Delivered-To: apmail-incubator-harmony-dev-archive@www.apache.org Received: (qmail 70501 invoked from network); 29 Dec 2005 14:10:43 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 29 Dec 2005 14:10:43 -0000 Received: (qmail 78566 invoked by uid 500); 29 Dec 2005 14:10:37 -0000 Delivered-To: apmail-incubator-harmony-dev-archive@incubator.apache.org Received: (qmail 78444 invoked by uid 500); 29 Dec 2005 14:10:34 -0000 Mailing-List: contact harmony-dev-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: harmony-dev@incubator.apache.org Delivered-To: mailing list harmony-dev@incubator.apache.org Received: (qmail 78353 invoked by uid 99); 29 Dec 2005 14:10:33 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 29 Dec 2005 06:10:33 -0800 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (asf.osuosl.org: domain of kumpera@gmail.com designates 64.233.184.197 as permitted sender) Received: from [64.233.184.197] (HELO wproxy.gmail.com) (64.233.184.197) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 29 Dec 2005 06:10:31 -0800 Received: by wproxy.gmail.com with SMTP id i1so1251166wra for ; Thu, 29 Dec 2005 06:10:10 -0800 (PST) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:in-reply-to:mime-version:content-type:references; b=e39qbXjIoHopiw82GDij9tPqBcxhcUp9ssFQuMnw3QXN0deLiqifIUKOmmFJ5A8OMMEkOBgQPS4BCkWG0syBMhG+i7DT6JvH0jKOhQYewpkc2fuTsdzUZO6es88F3HYnok6xMXhXR8zfXT0hV0AC2WayEjJdGaN597GgRi5Gty0= Received: by 10.65.232.11 with SMTP id j11mr3354997qbr; Thu, 29 Dec 2005 06:10:10 -0800 (PST) Received: by 10.65.84.14 with HTTP; Thu, 29 Dec 2005 06:10:10 -0800 (PST) Message-ID: <8cca42d80512290610vaa70143if3eec41a3531916b@mail.gmail.com> Date: Thu, 29 Dec 2005 12:10:10 -0200 From: Rodrigo Kumpera To: harmony-dev@incubator.apache.org Subject: Re: Bootstrapping the classlibrary builds In-Reply-To: <43B30722.20108@apache.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_6493_33216438.1135865410004" References: <43ABF70E.9040702@gmail.com> <43B1A564.3060608@gmail.com> <43B1B4C0.3080208@4quarters.com> <43B29FC3.3070108@gmail.com> <43B2A48C.6010703@4quarters.com> <43B2AA60.8010704@gmail.com> <43B2B071.4070007@4quarters.com> <43B2C8DE.1010601@4quarters.com> <8cca42d80512281335i13836c82o386d714eacc72a40@mail.gmail.com> <43B30722.20108@apache.org> X-Virus-Checked: Checked by ClamAV on apache.org X-Spam-Rating: minotaur.apache.org 1.6.2 0/1000/N ------=_Part_6493_33216438.1135865410004 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-Disposition: inline The source is attached. I've done some changes to compute dependencies. So the result is a bit diferent. On 12/28/05, Stefano Mazzocchi wrote: > Rodrigo Kumpera wrote: > > Just for curiosity I've written a small program that enumerate all > > graph cycles of packages dependencies in Java 1.4 (counting only > > fields, methods and super types). This shows that for most packages > > this won't be an issue and a packaging that have no cyclic dependencis > > is possible. > > > > Given the criteria that dependencies are: fields, super class, > > interfaces and method return/exception/parameters, one could have the > > following bundles: > > > > [java.applet] > > [java.awt.color] > > [java.awt.datatransfer] > > [java.awt.im.spi] > > [java.awt.print] > > [java.math] > > [java.nio] > > [java.rmi, java.rmi.registry] > > [java.rmi.activation] > > [java.rmi.dgc] > > [java.rmi.server] > > [java.security.acl] > > [java.sql] > > [java.io, java.lang, java.lang.ref, java.lang.reflect, java.net, > > java.nio.channels, java.nio.channels.spi, java.nio.charset, > > java.nio.charset.spi, java.security, java.security.cert, > > java.security.interfaces, java.security.spec, java.text, java.util, > > java.util.jar, javax.security.auth.x500] > > [java.util.logging] > > [java.util.prefs] > > [java.util.regex] > > [java.util.zip] > > [javax.crypto] > > [javax.crypto.interfaces] > > [javax.crypto.spec] > > [javax.imageio, javax.imageio.event, javax.imageio.metadata, javax.imag= eio.spi] > > [javax.imageio.plugins.jpeg] > > [javax.imageio.stream] > > [javax.naming] > > [javax.naming.directory] > > [javax.naming.event] > > [javax.naming.ldap] > > [javax.naming.spi] > > [javax.net] > > [javax.net.ssl] > > [javax.print, javax.print.event] > > [javax.print.attribute] > > [javax.print.attribute.standard] > > [javax.rmi] > > [javax.rmi.CORBA] > > [javax.security.auth] > > [javax.security.auth.callback] > > [javax.security.auth.kerberos] > > [javax.security.auth.login] > > [javax.security.auth.spi] > > [javax.security.cert] > > [javax.sound.midi, javax.sound.midi.spi] > > [javax.sound.sampled, javax.sound.sampled.spi] > > [javax.sql] > > [java.awt, java.awt.dnd, java.awt.dnd.peer, java.awt.event, > > java.awt.font, java.awt.geom, java.awt.im, java.awt.image, > > java.awt.image.renderable, java.awt.peer, java.beans, > > java.beans.beancontext, javax.accessibility, javax.swing, > > javax.swing.border, javax.swing.colorchooser, javax.swing.event, > > javax.swing.filechooser, javax.swing.plaf, javax.swing.plaf.basic, > > javax.swing.table, javax.swing.text, javax.swing.tree, > > javax.swing.undo] > > [javax.swing.plaf.metal] > > [javax.swing.plaf.multi] > > [javax.swing.text.html] > > [javax.swing.text.html.parser] > > [javax.swing.text.rtf] > > [javax.transaction] > > [javax.transaction.xa] > > [javax.xml.parsers] > > [javax.xml.transform] > > [javax.xml.transform.dom] > > [javax.xml.transform.sax] > > [javax.xml.transform.stream] > > > > From that we can see that most of the GUI stuff should live in the > > same package and the minimum set of classes for java.lang is not that > > huge. > > Nice! awesome job! > > (is the source-code of this program available?) > > -- > Stefano. > > ------=_Part_6493_33216438.1135865410004 Content-Type: text/x-java; name=Deps.java; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="Deps.java" import java.io.File; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Enumeration; import java.util.Iterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.zip.ZipEntry; import java.util.zip.ZipException; import java.util.zip.ZipFile; public class Deps { static class Group implements Comparable { String name; Set packages = new TreeSet(); Set deps = new TreeSet(); public Group(Package p) { this.name = mkGroup(); add(p); } public int compareTo(Object o) { return this.name.compareTo(((Group) o).name); } public void remark(Group from) { for (Iterator i = from.packages.iterator(); i.hasNext();) add((Package) i.next()); groups.remove(from); } public void add(Package p) { p.group = this; this.packages.add(p); } public String toString() { StringBuffer buff = new StringBuffer(); buff.append("group [").append(this.name).append("] ") .append(this.packages).append(" -> [ "); for(Iterator i = this.deps.iterator(); i.hasNext(); ){ Group g = (Group) i.next(); buff.append(g.name); if(i.hasNext()) buff.append(", "); } buff.append(" ]"); return buff.toString(); } public void computeDeps() { this.deps.clear(); for (Iterator i = this.packages.iterator(); i.hasNext();) { final Package p = (Package) i.next(); for (Iterator j = p.deps.iterator(); j.hasNext();) { Package dep = (Package) pkg.get(j.next()); if (dep.group != null) this.deps.add(dep.group); } } } } static class Package implements Comparable { Group group; String name; Set deps = new TreeSet(); public Package(String name) { this.name = name; } public int compareTo(Object o) { return this.name.compareTo(((Package) o).name); } public String toString() { return name; } public void digest(Class cl) { dep(cl.getSuperclass()); Class[] interfaces = cl.getInterfaces(); dep(interfaces); Field[] declaredFields = cl.getDeclaredFields(); for (int i = 0; i < declaredFields.length; ++i) dep(declaredFields[i].getType()); Method[] declaredMethods = cl.getDeclaredMethods(); for (int i = 0; i < declaredMethods.length; ++i) { Method m = declaredMethods[i]; dep(m.getReturnType()); dep(m.getParameterTypes()); dep(m.getExceptionTypes()); } } private void dep(Class[] cl) { if (cl == null) return; for (int i = 0; i < cl.length; ++i) dep(cl[i]); } private void dep(Class cl) { if (cl == null) return; while (cl.isArray()) cl = cl.getComponentType(); if (cl.isPrimitive()) return; if (cl.getPackage() == null) System.out.println(cl); final String pkgName = cl.getPackage().getName(); if (isApi(pkgName) && !pkgName.equals(this.name)) deps.add(pkgName); } public void mark() { if (this.group == null) groups.add(this.group = new Group(this)); for (Iterator i = this.deps.iterator(); i.hasNext();) { final Object key = i.next(); Package p = (Package) pkg.get(key); if (p == null) { System.out.println("#### " + key); continue; } if (p.group == this.group) continue; if (p.deps.contains(this.name)) { if (p.group == null) this.group.add(p); else this.group.remark(p.group); } } } } static Map pkg = new TreeMap(); static char nextGroup = 'a'; static Set groups = new TreeSet(); static String mkGroup() { return String.valueOf(nextGroup++); } public static boolean isApi(String str) { return str.startsWith("java.") || str.startsWith("javax."); } private static Package getPkg(Class cl) { String key = cl.getPackage().getName(); Package r = (Package) pkg.get(key); if (r == null) pkg.put(key, r = new Package(key)); return r; } public static void main(String[] args) throws Exception { collect("C:/j2sdk/jre/lib/rt.jar"); collect("C:/j2sdk/jre/lib/jce.jar"); collect("C:/j2sdk/jre/lib/jsse.jar"); for (Iterator i = pkg.values().iterator(); i.hasNext();) { Package p = (Package) i.next(); System.out.println("package " + p + " depends on " + p.deps); } for (Iterator i = pkg.values().iterator(); i.hasNext();) ((Package) i.next()).mark(); nextGroup = 'A'; for (Iterator i = groups.iterator(); i.hasNext();) { Group g = (Group) i.next(); g.name = mkGroup(); g.computeDeps(); } for (Iterator i = groups.iterator(); i.hasNext();) System.out.println(i.next()); } private static void collect(String file) throws ZipException, IOException, ClassNotFoundException { ZipFile zip = new ZipFile(new File(file)); for (Enumeration e = zip.entries(); e.hasMoreElements();) { ZipEntry entry = (ZipEntry) e.nextElement(); String name = entry.getName(); if ((!name.startsWith("java/") && !name.startsWith("javax/")) || !name.endsWith(".class")) continue; name = name.substring(0, name.length() - 6).replace('/', '.'); Class cl = Class.forName(name, false, null); Package p = getPkg(cl); p.digest(cl); } zip.close(); } } ------=_Part_6493_33216438.1135865410004--