Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
   *
   * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
   *
   * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
   * Other names may be trademarks of their respective owners.
   *
   * The contents of this file are subject to the terms of either the GNU
  * General Public License Version 2 only ("GPL") or the Common
  * Development and Distribution License("CDDL") (collectively, the
  * "License"). You may not use this file except in compliance with the
  * License. You can obtain a copy of the License at
  * http://www.netbeans.org/cddl-gplv2.html
  * or nbbuild/licenses/CDDL-GPL-2-CP. See the License for the
  * specific language governing permissions and limitations under the
  * License.  When distributing the software, include this License Header
  * Notice in each file and include the License file at
  * nbbuild/licenses/CDDL-GPL-2-CP.  Oracle designates this
  * particular file as subject to the "Classpath" exception as provided
  * by Oracle in the GPL Version 2 section of the License file that
  * accompanied this code. If applicable, add the following below the
  * License Header, with the fields enclosed by brackets [] replaced by
  * your own identifying information:
  * "Portions Copyrighted [year] [name of copyright owner]"
  *
  * If you wish your version of this file to be governed by only the CDDL
  * or only the GPL Version 2, indicate your decision by adding
  * "[Contributor] elects to include this software in this distribution
  * under the [CDDL or GPL Version 2] license." If you do not indicate a
  * single choice of license, a recipient has the option to distribute
  * your version of this file under either the CDDL, the GPL Version 2 or
  * to extend the choice of license to its licensees as provided above.
  * However, if you add GPL Version 2 code and therefore, elected the GPL
  * Version 2 license, then the option applies only if the new code is
  * made subject to such option by the copyright holder.
  *
  * Contributor(s):
  *
  * Portions Copyrighted 2008 Sun Microsystems, Inc.
  */
 
 package org.netbeans.modules.ide.ergonomics.fod;
 
 import java.io.File;
 import java.net.URL;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;

Author(s):
Jirka Rechtacek
 
 public final class FeatureManager
     private static FeatureManager INSTANCE;
     private static final Logger UILOG = Logger.getLogger("org.netbeans.ui.ergonomics"); // NOI18N
     private static final RequestProcessor RP = new RequestProcessor("FoD Processor"); // NOI18N
 
     private final Lookup.Result<ModuleInforesult;
     private final ChangeSupport support;
     private Set<StringenabledCnbs = Collections.emptySet();
 
     private FeatureManager() {
          = new ChangeSupport(this);
          = Lookup.getDefault().lookupResult(ModuleInfo.class);
         .addLookupListener(this);
         resultChanged(null);
     }
    public static synchronized FeatureManager getInstance () {
        if ( == null) {
             = new FeatureManager();
        }
        return ;
    }
    
    public RequestProcessor.Task create(Runnable r) {
        return .create(r);
    }
    static void logUI(String msgObject... params) {
        LogRecord rec = new LogRecord(.msg);
        rec.setResourceBundleName("org.netbeans.modules.ide.ergonomics.fod.Bundle"); // NOI18N
        rec.setResourceBundle(NbBundle.getBundle(ConfigurationPanel.class));
        rec.setParameters(params);
        rec.setLoggerName(.getName());
        .log(rec);
    }
    static boolean showInAU(ModuleInfo mi) {
        final Object show = mi.getAttribute("AutoUpdate-Show-In-Client"); // NOI18N
        return show == null || "true".equals(show); // NOI18N
    }
    public static Map<String,StringnbprojectTypes() {
        return FeatureInfo.nbprojectTypes();
    }
    public static Map<String,StringprojectFiles() {
        return FeatureInfo.projectFiles();
    }
    public static Collection<? extends FeatureInfofeatures() {
        return featureTypesLookup().lookupAll(FeatureInfo.class);
    }

    

Returns:
feature info that contains given cnb in its cnbs or null if not found
    static FeatureInfo findInfo(String cnb) {
        for (FeatureInfo fi : features()) {
            if (fi.getCodeNames().contains(cnb)) {
                return fi;
            }
        }
        return null;
    }

    
Returns the amount of (partially) enabled clusters, or -1 if not computed.

Returns:
    public static int dumpModules() {
        return dumpModules(..);
    }
    
Returns the amount of (partially) enabled clusters, or -1 if not computed.

Parameters:
withLevel with what severity dump the modules?
detailsLevel level to print detailed infos
Returns:
    public static int dumpModules(Level withLevelLevel detailsLevel) {
        if (!..isLoggable(withLevel)) {
            return -1;
        }
        int cnt = 0;
        Collection<? extends ModuleInfoallModules = Lookup.getDefault().lookupAll(ModuleInfo.class);
        for (FeatureInfo info : features()) {
            Set<Stringenabled = new TreeSet<String>();
            Set<Stringdisabled = new TreeSet<String>();
            for (ModuleInfo m : allModules) {
                if (info.getCodeNames().contains(m.getCodeNameBase())) {
                    if (m.isEnabled()) {
                        enabled.add(m.getCodeNameBase());
                    } else {
                        disabled.add(m.getCodeNameBase());
                    }
                }
            }
            if (enabled.isEmpty() && disabled.isEmpty()) {
                ..log(withLevelinfo.clusterName + " not present"); // NOTICES
                continue;
            }
            if (enabled.isEmpty()) {
                ..log(withLevelinfo.clusterName + " disabled"); // NOTICES
                continue;
            }
            if (disabled.isEmpty()) {
                ..log(withLevelinfo.clusterName + " enabled"); // NOTICES
                cnt++;
                continue;
            }
            ..log(withLevel,
                info.clusterName + " enabled " + enabled.size() + " disabled " + disabled.size()); // NOTICES
            cnt++;
            for (String cnb : disabled) {
                ..log(detailsLevel"- " + cnb); // NOI18N
            }
            for (String cnb : enabled) {
                ..log(detailsLevel"+ " + cnb); // NOI18N
            }
        }
        return cnt;
    }

    
Used from tests
    public static synchronized void assignFeatureTypesLookup(Lookup lkp) {
        boolean eaOn = false;
        assert eaOn = true;
        if (!eaOn) {
            throw new IllegalStateException();
        }
         = lkp;
         = true;
    }
    private static Lookup featureTypesLookup;
    private static boolean noCnbCheck;
    private static synchronized Lookup featureTypesLookup() {
        if ( != null) {
            return ;
        }
        String clusters = System.getProperty("netbeans.dirs");
        if (clusters == null) {
             = .;
        } else {
            InstanceContent ic = new InstanceContent();
            AbstractLookup l = new AbstractLookup(ic);
            String[] paths = clusters.split(.);
            for (String c : paths) {
                int last = c.lastIndexOf(.);
                String clusterName = c.substring(last + 1).replaceFirst("[0-9\\.]*$""");
                String basename = "/org/netbeans/modules/ide/ergonomics/" + clusterName;
                String layerName = basename + "/layer.xml";
                String bundleName = basename + "/Bundle.properties";
                URL layer = FeatureManager.class.getResource(layerName);
                URL bundle = FeatureManager.class.getResource(bundleName);
                if (layer != null && bundle != null) {
                    FeatureInfo info;
                    try {
                        info = FeatureInfo.create(clusterNamelayerbundle);
                        ic.add(info);
                    } catch (IOException ex) {
                        Exceptions.printStackTrace(ex);
                    }
                }
            }
             = l;
        }
        return ;
    }
    public void addChangeListener(ChangeListener l) {
        .addChangeListener(l);
    }
    public void removeChangeListener(ChangeListener l) {
        .removeChangeListener(l);
    }
    public void resultChanged(LookupEvent ev) {
        for (ModuleInfo m : .allInstances()) {
            m.removePropertyChangeListener(this);
            m.addPropertyChangeListener(this);
        }
        Set<Stringtmp = new HashSet<String>();
        for (ModuleInfo mi : .allInstances()) {
            if (mi.isEnabled()) {
                tmp.add(mi.getCodeNameBase());
            }
        }
         = tmp;
        if (ev != null) {
            fireChange();
        }
    }
    public void propertyChange(PropertyChangeEvent evt) {
        if (..equals(evt.getPropertyName())) {
            ModuleInfo mi = (ModuleInfo)evt.getSource();
            if (! && .contains(mi.getCodeNameBase()) && mi.isEnabled()) {
                return;
            }
            fireChange();
            if (mi.isEnabled()) {
                .add(mi.getCodeNameBase());
            } else {
                .remove(mi.getCodeNameBase());
            }
        }
    }
    private void fireChange() {
        ..fine("Firing FeatureManager change"); // NOI18N
        for (FeatureInfo f : features()) {
            f.clearCache();
        }
        .fireChange();
        ..fine("FeatureManager change delivered"); // NOI18N
    }

    
Useful for testing
    public final void waitFinished() {
        .post(new Runnable() {
            public void run() {
            }
        }).waitFinished();
    }
    //
    // Features Off Demand
    //
    private static final Logger LOG = Logger.getLogger(FeatureManager.class.getName());
    static void associateFiles(List<FileObjectenabled) {
        long when = 0;
        for (FileObject f : enabled) {
            long t = f.lastModified().getTime();
            if (t > when) {
                when = t;
            }
        }
        for (FileObject f : enabled) {
            .log(."Enabling ErgoControl for {0}"f);
            try {
                f.setAttribute("ergonomicsEnabled"when); // NOI18N
                f.setAttribute("ergonomicsUnused", 0); // NOI18N
            } catch (IOException ex) {
                Exceptions.printStackTrace(ex);
            }
        }
    }
    public static void incrementUnused(Project[] projectsthrows IOException {
        final FileObject fo = FileUtil.getConfigFile("Modules"); // NOI18N
        if (fo == null) {
            return;
        }
        final FileObject[] arr = fo.getChildren();
        Set<Stringenabled = new HashSet<String>();
        for (ModuleInfo mi : Lookup.getDefault().lookupAll(ModuleInfo.class)) {
            Module m = (Modulemi;
            if (m.isAutoload() || m.isEager() || m.isFixed()) {
                continue;
            }
            if (m.isEnabled()) {
                enabled.add(m.getCodeNameBase());
            }
        }
        Map<String,Longcnb2Date = new HashMap<StringLong>();
        Map<Long,List<FileObject>> date2Files = new HashMap<Long,List<FileObject>>();
        Set<StringexplicitlyUsedCnbs = new HashSet<String>();
        for (int i = 0; i < arr.lengthi++) {
            final FileObject module = arr[i];
            final String cnb = module.getName().replace('-''.');
            final Object when = module.getAttribute("ergonomicsEnabled"); // NOI18N
            .log(."Controlling {0}: {1}"new Object[] { modulewhen });
            if (!(when instanceof Long) || ((Long)when) < module.lastModified().getTime()) {
                if (enabled.contains(cnb)) {
                    explicitlyUsedCnbs.add(cnb);
                }
                continue;
            }
            final Long date = (Longwhen;
            cnb2Date.put(cnbdate);
            List<FileObjectfiles = date2Files.get(date);
            if (files == null) {
                files = new ArrayList<FileObject>();
                date2Files.put(datefiles);
            }
            files.add(module);
        }
        Set<StringtransitivelyUsedCnbs = transitiveDeps(explicitlyUsedCnbs);
        List<FeatureInfounused = new ArrayList<FeatureInfo>();
        NEXT_FEATURE: for (FeatureInfo fi : FeatureManager.features()) {
            for (ModuleInfo mi : Lookup.getDefault().lookupAll(ModuleInfo.class)) {
                if (!isModuleFrom(mifi.clusterName)) {
                    continue;
                }
                if (transitivelyUsedCnbs.contains(mi.getCodeNameBase())) {
                    .log(."Transitive dependency on {0}"mi.getCodeNameBase());
                    markUsed(unusedficnb2Datedate2Files);
                    continue NEXT_FEATURE;
                }
            }
            unused.add(fi);
        }
        for (int i = 0; i < projects.lengthi++) {
            FeatureProjectFactory.Data d = new FeatureProjectFactory.Data(
                projects[i].getProjectDirectory(), true
            );
            for (FeatureInfo fi : FeatureManager.features()) {
                if (!fi.isEnabled()) {
                    continue;
                }
                if (fi.isProject(d) == 0) {
                    continue;
                }
                markUsed(unusedficnb2Datedate2Files);
            }
        }
        Set<FileObjectprocessed = new HashSet<FileObject>();
        for (FeatureInfo fi : unused) {
            .log(."Unused feature {0}"fi.clusterName);
            Long groupId = null;
            for (String cnb : fi.getCodeNames()) {
                if (groupId == null) {
                    groupId = cnb2Date.get(cnb);
                    if (groupId == null) {
                        break;
                    }
                }
                if (!groupId.equals(cnb2Date.get(cnb))) {
                    date2Files.remove(groupId);
                    groupId = null;
                    break;
                }
            }
            if (groupId != null) {
                for (List<FileObjectlist : date2Files.values()) {
                    for (FileObject increment : list) {
                        if (!processed.add(increment)) {
                            continue;
                        }
                        int now = 0;
                        Object obj = increment.getAttribute("ergonomicsUnused"); // NOI18N
                        if (obj instanceof Number) {
                            now = ((Number)obj).intValue();
                        }
                        now++;
                        increment.setAttribute("ergonomicsUnused"now); // NOI18N
                        .log(."Incremented to {0} for {1}"new Object[] { nowincrement });
                    }
                }
            }
        }
    }
    public static void disableUnused(int howMuchthrows Exception {
        FileObject fo = FileUtil.getConfigFile("Modules"); // NOI18N
        final FileObject[] arr = fo.getChildren();
        boolean first = true;
        for (int i = 0; i < arr.lengthi++) {
            FileObject module = arr[i];
            final Object when = module.getAttribute("ergonomicsEnabled"); // NOI18N
            .log(."Checking {0}: {1}"new Object[] { modulewhen });
            if (!(when instanceof Long) || ((Longwhen) < module.lastModified().getTime()) {
                continue;
            }
            final Object unused = module.getAttribute("ergonomicsUnused"); // NOI18N
            .log(."Unused {0}"unused);
            if (!(unused instanceof Number) || ((Number)unused).intValue() < howMuch) {
                continue;
            }
            String cnb = module.getName().replace('-''.');
            if (first) {
                .info("Long time unused modules found, disabling:"); // NOI18N
                first = false;
            }
            .info(cnb);
            Object clean = module.getAttribute("removeWritables"); // NOI18N
            if (clean instanceof Callable) {
                ((Callable)clean).call();
            }
        }
    }
    private static Set<StringtransitiveDeps(Set<Stringcnbs) {
        HashSet<Stringall = new HashSet<String>();
        all.addAll(cnbs);
        for (;;) {
            int prev = all.size();
            for (ModuleInfo mi : Lookup.getDefault().lookupAll(ModuleInfo.class)) {
                if (all.contains(mi.getCodeNameBase())) {
                    for (Dependency d : mi.getDependencies()) {
                        if (d.getType() != .) {
                            continue;
                        }
                        String moduleName = d.getName();
                        int slash = moduleName.indexOf('/');
                        if (slash != -1) {
                            moduleName = moduleName.substring(0, slash);
                        }
                        all.add(moduleName);
                    }
                }
            }
            if (prev == all.size()) {
                Set<Stringtest = null;
                assert (test = new HashSet<String>(all)) != null;
                if (test != null) {
                    for (ModuleInfo mi : Lookup.getDefault().lookupAll(ModuleInfo.class)) {
                        test.remove(mi.getCodeNameBase());
                    }
                    assert test.isEmpty() : "Only CNBs are in the set: " + test;
                }
                return all;
            }
        }
    }
    
    static boolean isModuleFrom(ModuleInfo miString prefix) {
        File f;
        if (mi instanceof Module) {
            f = ((Module)mi).getJarFile();
        } else {
            return false;
        }
        if (f != null && f.getParentFile().getName().equals("modules")) { // NOI18N
            if (f.getParentFile().getParentFile().getName().startsWith(prefix)) {
                return true;
            }
        }
        return false;
    }
    private static void markUsed(
        List<FeatureInfounused,
        FeatureInfo fi,
        Map<StringLongcnb2Date,
        Map<LongList<FileObject>> date2Files
    ) throws IOException {
        unused.remove(fi);
        for (String cnb : fi.getCodeNames()) {
            final Long thisIsUsedGroup = cnb2Date.get(cnb);
            final List<FileObjectfiles = date2Files.get(thisIsUsedGroup);
            if (files != null) {
                for (FileObject usedFile : files) {
                    Object prev = usedFile.getAttribute("ergonomicsUnused"); // NOI18N
                    if (!(prev instanceof Number) || ((Numberprev).intValue() == 0) {
                        .log(."Already marked as used: {0}"usedFile);
                        continue;
                    }
                    .log(."Marking {0} as used"usedFile);
                    usedFile.setAttribute("ergonomicsUnused", 0); // NOI18N
                }
                date2Files.remove(thisIsUsedGroup);
            }
        }
    }
New to GrepCode? Check out our FAQ X