/******************************************************************************* * Copyright (c) 2007 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.projecttemplates; import java.io.File; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; /** * * @author Viacheslav Kabanovich * */ public class JarVersionObserver { static String JAR_SUFFIX = ".jar"; //$NON-NLS-1$ File folder; Set<File> existedJars = new HashSet<File>(); Map<File, JarVersionObserver> children = new HashMap<File, JarVersionObserver>(); public JarVersionObserver(File f) { folder = f; init(); } public boolean containsJars() { return !existedJars.isEmpty() || !children.isEmpty(); } private void init() { if(!folder.isDirectory()) return; File[] fs = folder.listFiles(); if(fs == null) return; for (File f: fs) { if(f.isDirectory()) { JarVersionObserver c = new JarVersionObserver(f); if(!c.containsJars()) continue; children.put(f, c); } else if(f.isFile()) { String n = f.getName(); if(n.toLowerCase().endsWith(JAR_SUFFIX)) { existedJars.add(f); } } } } public void execute() { File[] fs = folder.listFiles(); if(fs == null) return; Set<File> oldJars = new HashSet<File>(); Set<File> newJars = new HashSet<File>(); for (File f: fs) { if(f.isDirectory()) { JarVersionObserver c = children.get(f); if(c != null) c.execute(); } else if(f.isFile()) { String n = f.getName(); if(n.toLowerCase().endsWith(JAR_SUFFIX)) { if(!existedJars.contains(f)) { newJars.add(f); } else { oldJars.add(f); } } } } filter(oldJars, newJars); } public void filter(Set<File> oldJars, Set<File> newJars) { if(oldJars.isEmpty() || newJars.isEmpty()) return; for (File f: newJars) { String n1 = f.getName().substring(0, f.getName().length() - JAR_SUFFIX.length()); Iterator<File> it = oldJars.iterator(); while(it.hasNext()) { File o = it.next(); String n2 = o.getName().substring(0, o.getName().length() - JAR_SUFFIX.length()); if(areEqualNamesOfDifferentVersions(n1, n2)) { it.remove(); o.delete(); } } } } static boolean areEqualNamesOfDifferentVersions(String n1, String n2) { int d1 = n1.lastIndexOf('-'); int d2 = n2.lastIndexOf('-'); String base1 = d1 < 0 ? n1 : n1.substring(0, d1); String base2 = d2 < 0 ? n2 : n2.substring(0, d2); if(!base1.equals(base2)) return false; String regex = "([0-9]+\\.)+([^\\.]+)"; //$NON-NLS-1$ boolean isVersion1 = d1 < 0 || n1.substring(d1 + 1).matches(regex); boolean isVersion2 = d2 < 0 || n2.substring(d2 + 1).matches(regex); return isVersion1 && isVersion2; } }