/* JFox, the OpenSource J2EE Application Server
 *
 * Copyright (C) 2002 huihoo.com
 * Distributable under GNU LGPL license
 * See the GNU Lesser General Public License for more details.
 */

package org.jfox.mx;

import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;

/**
 * 
 * @author <a href="mailto:young_yy@hotmail.com">Young Yang</a>
 */

public class RepositoryCtrl {
  private MxRepository repo = new MxRepository();
  private String domain = null;

  public RepositoryCtrl(String domain) {
    this.domain = domain;
  }

  public MxMetaData retrieve(ObjectName name) throws MxException {
    if(!contains(name)) throw new MxException("instance not found: " + name.toString());
    return repo.get(name);
  }

  public void store(ObjectName name, MxMetaData metadata) throws MxException {
    if(contains(name)) throw new MxException("instance already exists: " + name.toString());
    repo.put(name,metadata);
  }

  public void remove(ObjectName name) throws MxException {
    if(name.isPattern()) throw new MxException(new IllegalArgumentException("ObjectName " + name.toString() + " is a pattern object name"));
    if(!contains(name)) throw new MxException("instance not found: " + name.toString());
    repo.remove(name);
  }

  public int getRepoSize() {
    return repo.size();
  }

  public boolean contains(ObjectName name) throws MxException {
    if(name.isPattern()) throw new MxException(new IllegalArgumentException("ObjectName " + name.toString() + " is a pattern object name"));
    return repo.contains(name);
  }

//  public Iterator iterator() {
//    return repo.iterator();
//  }

  public Iterator queryMBean(String domain){
    List objectNames = new ArrayList();
    Iterator it = repo.iterator();
    if(domain.equals("*")){
      while(it.hasNext()){
        objectNames.add(((MxMetaData)it.next()).getObjectName());
      }
    }
    else {
      while(it.hasNext()){
        ObjectName on = ((MxMetaData)it.next()).getObjectName();
        if(on.getDomain().equals(domain) || (on.getDomain().equals("") && domain.equals(this.domain))) {
          objectNames.add(on);
        }
      }
    }
    return objectNames.iterator();
  }

  public String[] getDomains(){
    List domains = new ArrayList();
    Iterator it = repo.iterator();
    while(it.hasNext()){
      ObjectName on = ((MxMetaData)it.next()).getObjectName();
      String domain = on.getDomain();
      if(domain.equals("")){
        domain = this.domain;
      }
      if(!domains.contains(domain)){
        domains.add(domain);
      }
    }
    return (String[])domains.toArray(new String[0]);
  }
  /*
  public Set queryMBeans(ObjectName pattern, QueryExp query) {
    HashSet set = new HashSet();
    if(pattern == null){
      try {
        pattern = new ObjectName("*:*");
      }
      catch(MalformedObjectNameException malformedobjectnameexception) { }
    }
    pattern = getCompleteObjectName(pattern);

    // not pattern ,single mbean
    if(!pattern.isPattern()){
      try {
        MBeanMetaData meta = retrieve(pattern);
        if(meta != null) set.add(meta.getObjectInstance());
      }
      catch(InstanceNotFoundException ignore){}
      catch(RuntimeOperationsException e) {
        e.printStackTrace();
      }
    }
    else {
//      String p_domain = pattern.getDomain();
      Iterator it = this.iterator();
      while(it.hasNext()){
        MBeanMetaData meta = (MBeanMetaData)it.next();
        ObjectInstance instance = meta.getObjectInstance();
        ObjectName objectName = instance.getObjectName();
//          String domain = objectName.getDomain();
//        if(matchDomain(domain,p_domain) && matchKeys(objectName,pattern)){ // domain & keys all matched
//          set.add(instance);
//        }
        // changed from jmx1.2
        try {
          if(pattern.apply(objectName)){
            set.add(instance);
          }
        }
        catch(Exception e){
          e.printStackTrace();
        }
      }
    }
    return set;

  }
*/

  public static void main(String[] args) {

  }
}