📄 librarystatistics.java
字号:
/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: LibraryStatistics.java * Input/output tool: Statistics over a set of libraries. * Written by Steven M. Rubin, Sun Microsystems. * * Copyright (c) 2004 Sun Microsystems and Static Free Software * * Electric(tm) is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Electric(tm) is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */package com.sun.electric.tool.io.input;import com.sun.electric.database.geometry.GenMath;import com.sun.electric.database.id.CellId;import com.sun.electric.database.id.IdManager;import com.sun.electric.database.id.LibId;import com.sun.electric.database.text.CellName;import com.sun.electric.database.text.TextUtils;import com.sun.electric.database.text.Version;import com.sun.electric.database.variable.Variable;import com.sun.electric.tool.io.ELIBConstants;import com.sun.electric.tool.io.FileType;import com.sun.electric.tool.io.input.JelibParser;import com.sun.electric.tool.io.output.Output;import com.sun.electric.tool.ncc.basic.NccCellAnnotations;import com.sun.electric.tool.user.ErrorLogger;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.FilenameFilter;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.io.PrintWriter;import java.io.Serializable;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.HashMap;import java.util.HashSet;import java.util.Map;import java.util.Set;import java.util.TreeMap;import java.util.TreeSet;import java.util.zip.CRC32;import java.util.zip.CheckedInputStream;/** * This class keeps contents of disk library file. */public class LibraryStatistics implements Serializable{ private static final long serialVersionUID = -361650802811567400L; private transient IdManager idManager; private final TreeMap<String,Directory> directories = new TreeMap<String,Directory>(); private final TreeMap<String,LibraryName> libraryNames = new TreeMap<String,LibraryName>();// transient LibraryContents totalLibraryContents; private LibraryStatistics(IdManager idManager) { this.idManager = idManager; } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { idManager = new IdManager(); in.defaultReadObject(); } Directory getDirectory(String dirName) { Directory dir = directories.get(dirName); if (dir == null) dir = new Directory(this, dirName); return dir; } LibraryName getLibraryName(String name) { LibraryName libraryName = libraryNames.get(name); if (libraryName == null) libraryName = new LibraryName(this, name); return libraryName; } Iterator<Directory> getDirectories() { return directories.values().iterator(); } Iterator<LibraryName> getLibraryNames() { return libraryNames.values().iterator(); } public static void scanProjectDirs(String[] dirNames, String[] excludeDirs, File projListDir) { HashSet<String> canonicalDirs = new HashSet<String>(); TreeSet<String> projectDirs = new TreeSet<String>(); for (int i = 0; i < dirNames.length; i++) scanProjectDir(new File(dirNames[i]), excludeDirs, canonicalDirs, projectDirs); File projListFile = new File(projListDir, "proj.list"); try { PrintWriter out = new PrintWriter(projListFile); for (Iterator it = projectDirs.iterator(); it.hasNext(); ) out.println((String)it.next()); out.close(); } catch (IOException e) { System.out.println("Error writing " + projListFile); e.printStackTrace(); } } private static void scanProjectDir(File dir, String[] excludeDirs, Set<String> canonicalDirs, TreeSet<String> projectDirs) { try { String canonicalDir = dir.getCanonicalPath(); if (canonicalDirs.contains(canonicalDir)) return; canonicalDirs.add(canonicalDir); if (!canonicalDir.equals(dir.getPath())) System.out.println(dir + " -> " + canonicalDir); dir = new File(canonicalDir); assert dir.getPath().equals(canonicalDir); } catch (IOException e) { System.out.println(dir + " CANONICAL FAILED"); return; } for (String excludeDir: excludeDirs) { if (dir.getPath().equals(excludeDir)) { System.out.println(dir + " EXCLUDED"); return; } } File[] files = dir.listFiles(); if (files == null) { System.out.println(dir + " ACCESS DENIED"); return; } boolean libdirs = false; int xmls = 0; int txts = 0; int elibs = 0; int jelibs = 0; int delibs = 0; for (File file: files) { String name = file.getName(); if (name.startsWith("._")) continue; int extensionPos = name.lastIndexOf('.'); if (extensionPos < 0) continue; String extension = name.substring(extensionPos); name = name.substring(0, extensionPos); if (file.isDirectory()) { if (extension.equals(".delib")) delibs++; } else { if (name.equals("LIBDIRS")) libdirs = true; if (extension.equals(".xml")) xmls++; if (extension.equals(".txt")) txts++; if (extension.equals(".elib")) elibs++; if (extension.equals(".jelib")) jelibs++; } } if (delibs > 0 || elibs > 0 || jelibs > 0) { String projectDir = dir.getPath(); System.out.print(projectDir + " :"); if (libdirs) System.out.print(" LIBDIRS"); if (xmls > 0) System.out.print(" " + xmls + " xmls"); if (txts > 0) System.out.print(" " + txts + " txts"); if (elibs > 0) System.out.print(" " + elibs + " elibs"); if (jelibs > 0) System.out.print(" " + jelibs + " jelibs"); if (delibs > 0) System.out.print(" " + delibs + " delibs"); System.out.println(); assert canonicalDirs.contains(projectDir); boolean added = projectDirs.add(projectDir); assert added; } for (File file: files) { if (!file.isDirectory()) continue; if (file.getName().equals("CVS")) continue; scanProjectDir(file, excludeDirs, canonicalDirs, projectDirs); } } public static TreeSet<String> readProjList(File wrkDir) { File projListFile = new File(wrkDir, "proj.list"); try { TreeSet<String> dirs = new TreeSet<String>(); BufferedReader in = new BufferedReader(new FileReader(projListFile)); String line; while ((line = in.readLine()) != null) { if (line.length() == 0) continue; boolean added = dirs.add(line); assert added; } in.close(); return dirs; } catch (IOException e) { System.out.println("Error reading " + projListFile + " : " + e); return null; } } public static Map<String,File[]> readProjectDirs(File wrkDir, boolean allDirs) { final String projectsExt = ".projects"; FilenameFilter filter = new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(projectsExt); } }; Map<String,File[]> projectDirs = new TreeMap<String,File[]>(); for (File file: wrkDir.listFiles(filter)) { String projectName = file.getName(); assert projectName.endsWith(projectsExt); projectName = projectName.substring(0, projectName.length() - projectsExt.length()); try { BufferedReader in = new BufferedReader(new FileReader(file)); ArrayList<File> dirs = new ArrayList<File>(); String line; while ((line = in.readLine()) != null) { if (line.length() == 0) continue; char firstChar = line.charAt(0); if (firstChar == '-') { if (!allDirs) continue; } else if (firstChar != '+') { continue; } String fileName = line.substring(1); dirs.add(new File(fileName)); } in.close(); projectDirs.put(projectName, dirs.toArray(new File[dirs.size()])); } catch (IOException e) { System.out.println("Error reading " + file); e.printStackTrace(); } } return projectDirs; } public static LibraryStatistics scanDirectories(IdManager idManager, File[] dirs) { LibraryStatistics stat = new LibraryStatistics(idManager); Set<String> canonicalDirs = new HashSet<String>(); Map<String,Set<FileInstance>> preLibraries = new HashMap<String,Set<FileInstance>>(); for (File dir: dirs) stat.scanDir(dir, canonicalDirs, preLibraries, null); byte[] buf = new byte[Input.READ_BUFFER_SIZE]; for (Iterator lit = preLibraries.entrySet().iterator(); lit.hasNext(); ) { Map.Entry entry = (Map.Entry)lit.next(); String libName = (String)entry.getKey(); TreeSet files = (TreeSet)entry.getValue(); LibraryName libraryName = new LibraryName(stat, libName); while (!files.isEmpty()) { FileInstance f = (FileInstance)files.iterator().next(); files.remove(f); FileContents fc = new FileContents(libraryName, f); byte[] bytes = null; int len = (int)f.fileLength; fileLoop: for (Iterator it = files.iterator(); it.hasNext(); ) { FileInstance f1 = (FileInstance)it.next(); if (f1.fileLength != len || f1.crc != f.crc) continue; if (!f.canonicalPath.equals(f1.canonicalPath)) { if (bytes == null) { Input in = new Input(); if (in.openBinaryInput(f1.getUrl())) continue; try { bytes = new byte[len]; try { in.dataInputStream.readFully(bytes); } catch (IOException e) { continue; } } finally { in.closeInput(); } } Input in = new Input(); if (in.openBinaryInput(f1.getUrl())) continue; try { int n = 0; while (n < len) { int count = -1; try { count = in.dataInputStream.read(buf, 0, Math.min(len - n, buf.length)); } catch (IOException ex) { } if (count < 0) continue fileLoop; for (int i=0; i<count; i++) if (buf[i] != bytes[n + i]) { in.closeInput(); continue fileLoop; } n += count; } } finally { in.closeInput(); } } it.remove(); fc.add(f1); } } } return stat; } private void scanDir(File dir, Set<String> canonicalDirs, Map<String,Set<FileInstance>> preLibraries, String parentLibName) { try { String canonicalDir = dir.getCanonicalPath(); if (canonicalDirs.contains(canonicalDir)) return; canonicalDirs.add(canonicalDir); dir = new File(canonicalDir); } catch (IOException e) { System.out.println(dir + " CANONICAL FAILED"); return; } if (dir.getPath().equals("/import/async/archive/2005/tic/gilda/TreasureIsland/electric-old/projectManagement") || dir.getPath().equals("/import/async/archive/2005/tic/jkg/projectTest") || dir.getPath().equals("/import/async/cad/cvs")) { System.out.println(dir + " IGNORED"); return; } File[] files = dir.listFiles(); if (files == null) { System.out.println(dir + " ACCESS DENIED"); return; } boolean isDelib = dir.getName().endsWith(".delib"); String libName = null; if (isDelib) { libName = dir.getName(); int extPos = libName.lastIndexOf('.'); if (extPos >= 0) libName = libName.substring(0, extPos); } boolean libFound = false; for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) continue; String name = files[i].getName(); if (name.startsWith("._")) continue; int extensionPos = name.lastIndexOf('.'); if (extensionPos < 0) continue; String extension = name.substring(extensionPos); name = name.substring(0, extensionPos); if (extension.equals(".elib") || extension.equals(".jelib") || isDelib && !extension.equals(".bak") && !extension.equals(".log") || parentLibName != null)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -