content: /**
   * Copyright 1999-2011 Alibaba Group
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   * http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
   package com.alibaba.cobar.client.router.config;
  
  import java.io.IOException;
  import java.util.ArrayList;
  import java.util.List;
  
  import org.springframework.core.io.Resource;
  
  import com.alibaba.cobar.client.router.config.vo.InternalRule;
  import com.alibaba.cobar.client.router.config.vo.InternalRules;
  import com.alibaba.cobar.client.support.utils.CollectionUtils;
  import com.thoughtworks.xstream.XStream;
  /**
   * 
   * {@link DefaultCobarClientInternalRouterXmlFactoryBean} will load rule definitions from external xml configuration files.<br>
   * if you want to directly define rules in spring's IoC Container, see {@link StaticCobarClientInternalRouterFactoryBean}.
   * @author fujohnwang
   * @see    StaticCobarClientInternalRouterFactoryBean
   */
  public class DefaultCobarClientInternalRouterXmlFactoryBean extends
          AbstractCobarClientInternalRouterFactoryBean {
  
      private Resource   configLocation;
      private Resource[] configLocations;
  
      public Resource getConfigLocation() {
          return configLocation;
      }
  
      public void setConfigLocation(Resource configLocation) {
          this.configLocation = configLocation;
      }
  
      public Resource[] getConfigLocations() {
          return configLocations;
      }
  
      public void setConfigLocations(Resource[] configLocations) {
          this.configLocations = configLocations;
      }
  
      @Override
      protected List<InternalRule> loadRulesFromExternal() throws IOException {
          XStream xstream = new XStream();
          xstream.alias("rules", InternalRules.class);
          xstream.alias("rule", InternalRule.class);
          xstream.addImplicitCollection(InternalRules.class, "rules");
          xstream.useAttributeFor(InternalRule.class, "merger");
  
          List<InternalRule> rules = new ArrayList<InternalRule>();
  
          if (getConfigLocation() != null) {
              InternalRules internalRules = (InternalRules) xstream.fromXML(getConfigLocation()
                      .getInputStream());
              if (!CollectionUtils.isEmpty(internalRules.getRules())) {
                  rules.addAll(internalRules.getRules());
              }
          }
          if (getConfigLocations() != null && getConfigLocations().length > 0) {
              for (Resource resource : getConfigLocations()) {
                  InternalRules internalRules = (InternalRules) xstream.fromXML(resource
                          .getInputStream());
                  if (!CollectionUtils.isEmpty(internalRules.getRules())) {
                      rules.addAll(internalRules.getRules());
                  }
              }
          }
  
          return rules;
      }
  
  }
  