Package com.subgraph.vega.internal.model.conditions

Source Code of com.subgraph.vega.internal.model.conditions.HttpConditionManager

/*******************************************************************************
* Copyright (c) 2011 Subgraph.
* All rights reserved. This program and the accompanying materials
* are 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:
*     Subgraph - initial API and implementation
******************************************************************************/
package com.subgraph.vega.internal.model.conditions;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.db4o.ObjectContainer;
import com.db4o.events.CancellableObjectEventArgs;
import com.db4o.events.Event4;
import com.db4o.events.EventListener4;
import com.db4o.events.EventRegistry;
import com.db4o.events.EventRegistryFactory;
import com.subgraph.vega.api.events.NamedEventListenerManager;
import com.subgraph.vega.api.model.conditions.ConditionSetChanged;
import com.subgraph.vega.api.model.conditions.IHttpConditionManager;
import com.subgraph.vega.api.model.conditions.IHttpConditionSet;
import com.subgraph.vega.api.model.conditions.IHttpConditionType;

public class HttpConditionManager implements IHttpConditionManager {

  private final ObjectContainer database;
  private final List<IHttpConditionType> conditionTypes;
  private final NamedEventListenerManager conditionSetChangedManager;

  public HttpConditionManager(ObjectContainer database, NamedEventListenerManager conditionSetChangedManager) {
    this.database = database;
    this.conditionTypes = createConditionTypes();
    this.conditionSetChangedManager = conditionSetChangedManager;
    final EventRegistry registry = EventRegistryFactory.forObjectContainer(database);
    registry.activating().addListener(new EventListener4<CancellableObjectEventArgs>() {
      @Override
      public void onEvent(Event4<CancellableObjectEventArgs> e, CancellableObjectEventArgs args) {
        final Object ob = args.object();
        if(ob instanceof HttpConditionSet)
          ((HttpConditionSet)ob).setConditionManager(HttpConditionManager.this);         
        else if(ob instanceof HttpConditionSetMap)
          ((HttpConditionSetMap)ob).setConditionManager(HttpConditionManager.this);
      }
    });
    notifyAllChanged();
  }

  private List<IHttpConditionType> createConditionTypes() {
    final List<IHttpConditionType> types = new ArrayList<IHttpConditionType>();
    types.add(ConditionHostname.getConditionType());
    types.add(ConditionRequestMethod.getConditionType());
    types.add(ConditionHeader.getRequestConditionType());
    types.add(ConditionPath.getConditionType());
    types.add(ConditionHeader.getResponseConditionType());
    types.add(ConditionResponseLength.getConditionType());
    types.add(ConditionResponseStatusCode.getConditionType());
    types.add(ConditionRequestId.getConditionType());
    return types;
  }
 
  public void notifyClosed() {
    synchronized(conditionSetChangedManager) {
      conditionSetChangedManager.fireAllKeys(new ConditionSetChanged(null));
    }
  }
 
  private void notifyAllChanged() {
    synchronized(conditionSetChangedManager) {
      for(String conditionSetName: conditionSetChangedManager.getAllKeys()) {
        IHttpConditionSet conditionSet = getConditionSet(conditionSetName);
        conditionSetChangedManager.fireEvent(conditionSetName, new ConditionSetChanged(conditionSet));
      }
    }
  }

  void notifyConditionSetChanged(IHttpConditionSet conditionSet) {
    conditionSetChangedManager.fireEvent(conditionSet.getName(), new ConditionSetChanged(conditionSet));
  }

  @Override
  public IHttpConditionSet getConditionSet(String name) {
    return getConditionSetMap().getConditionSet(name);
  }
 
  @Override
  public IHttpConditionSet getConditionSetCopy(String name) {
    return getConditionSetMap().getConditionSetCopy(name);
  }

  @Override
  public void saveConditionSet(String name, IHttpConditionSet conditionSet) {
    synchronized(conditionSetChangedManager) {
      getConditionSetMap().saveConditionSet(name, conditionSet);
      conditionSetChangedManager.fireEvent(name, new ConditionSetChanged(conditionSet));
    }
  }

  private HttpConditionSetMap getConditionSetMap() {
    synchronized(this) {
      final List<HttpConditionSetMap> result = database.query(HttpConditionSetMap.class);
      if(result.size() == 1)
        return result.get(0);
      else if(result.size() > 1)
        throw new IllegalStateException("Duplicate HttpConditionSetMap records in database");
      HttpConditionSetMap map = new HttpConditionSetMap(this);
      database.store(map);
      return map;
    }
  }

  @Override
  public List<IHttpConditionType> getConditionTypes() {
    return getConditionTypes(false);
  }
 
  @Override
  public List<IHttpConditionType> getConditionTypes(boolean includeInternal) {
    if(includeInternal) {
      return Collections.unmodifiableList(new ArrayList<IHttpConditionType>(conditionTypes));
    }
    final List<IHttpConditionType> result = new ArrayList<IHttpConditionType>();
    for(IHttpConditionType type: conditionTypes) {
      if(!type.isInternal()) {
        result.add(type);
      }
    }
    return Collections.unmodifiableList(result);
   
  }

  @Override
  public IHttpConditionType getConditionTypeByName(String name) {
    for(IHttpConditionType type: getConditionTypes(true)) {
      if(type.getName().equals(name)) {
        return type;
      }
    }
    return null
  }
}
TOP

Related Classes of com.subgraph.vega.internal.model.conditions.HttpConditionManager

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.