/** * 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.support.vo; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import com.alibaba.cobar.client.support.utils.CollectionUtils; /** * * TODO Comment of CobarHive * @author fujohnwang * */ public class CobarMRBase { private Map<String, List<Object>> resources = new HashMap<String, List<Object>>(); private Map<String, Lock> locks = new HashMap<String, Lock>(); private Set<String> keys = new HashSet<String>(); public CobarMRBase(String[] keys) { this(Arrays.asList(keys)); } public CobarMRBase(List<String> keys) { if (CollectionUtils.isEmpty(keys)) { throw new IllegalArgumentException( "empty collection is invalid for hive to spawn data holders."); } this.keys.addAll(keys); initResourceHolders(); initResourceLocks(); } public CobarMRBase(Set<String> keys) { if (CollectionUtils.isEmpty(keys)) { throw new IllegalArgumentException( "empty collection is invalid for hive to spawn data holders."); } this.keys.addAll(keys); initResourceHolders(); initResourceLocks(); } private void initResourceLocks() { for (String key : keys) { locks.put(key, new ReentrantLock()); } } private void initResourceHolders() { for (String key : keys) { resources.put(key, new ArrayList<Object>()); } } public Map<String, List<Object>> getResources() { return this.resources; } public <T> void emit(String key, T entity) { Lock lock = locks.get(key); lock.lock(); try{ resources.get(key).add(entity); } finally { lock.unlock(); } } }