/*
* Copyright 2011 Future Systems, Inc.
*
* 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 org.krakenapps.dom.api.impl;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.Requires;
import org.krakenapps.confdb.Predicate;
import org.krakenapps.confdb.Predicates;
import org.krakenapps.dom.api.AreaApi;
import org.krakenapps.dom.api.ConfigManager;
import org.krakenapps.dom.api.DefaultEntityEventProvider;
import org.krakenapps.dom.model.Area;
@Component(name = "dom-area-api")
@Provides
public class AreaApiImpl extends DefaultEntityEventProvider<Area> implements AreaApi {
private static final Class<Area> cls = Area.class;
private static final String NOT_FOUND = "area-not-found";
private static final String ALREADY_EXIST = "area-already-exist";
@Requires
private ConfigManager cfg;
private Predicate getPred(String guid) {
return Predicates.field("guid", guid);
}
private List<Predicate> getPreds(List<Area> areas) {
if (areas == null)
return new ArrayList<Predicate>();
List<Predicate> preds = new ArrayList<Predicate>(areas.size());
for (Area area : areas)
preds.add(getPred(area.getGuid()));
return preds;
}
@Override
public Collection<Area> getRootAreas(String domain) {
Collection<Area> areas = cfg.all(domain, cls, Predicates.field("parent", null));
for (Area area : areas)
area.setChildren(getChildrens(domain, area.getGuid()));
return areas;
}
@Override
public Area findArea(String domain, String guid) {
Area area = cfg.find(domain, cls, getPred(guid));
if (area == null)
return null;
area.setChildren(getChildrens(domain, area.getGuid()));
return area;
}
@Override
public Area getArea(String domain, String guid) {
Area area = cfg.get(domain, cls, getPred(guid), NOT_FOUND);
area.setChildren(getChildrens(domain, area.getGuid()));
return area;
}
private List<Area> getChildrens(String domain, String guid) {
Collection<Area> areas = cfg.all(domain, cls, Predicates.field("parent", guid));
for (Area area : areas)
area.setChildren(getChildrens(domain, area.getGuid()));
return (List<Area>) areas;
}
@Override
public void createAreas(String domain, Collection<Area> areas) {
List<Area> areaList = new ArrayList<Area>(areas);
cfg.adds(domain, cls, getPreds(areaList), areaList, ALREADY_EXIST, this);
}
@Override
public void createArea(String domain, Area area) {
cfg.add(domain, cls, getPred(area.getGuid()), area, ALREADY_EXIST, this);
}
@Override
public void updateAreas(String domain, Collection<Area> areas) {
List<Area> areaList = new ArrayList<Area>(areas);
for (Area area : areas)
area.setUpdated(new Date());
cfg.updates(domain, cls, getPreds(areaList), areaList, NOT_FOUND, this);
}
@Override
public void updateArea(String domain, Area area) {
area.setUpdated(new Date());
cfg.update(domain, cls, getPred(area.getGuid()), area, NOT_FOUND, this);
}
@Override
public void removeAreas(String domain, Collection<String> guids) {
removeAreas(domain, guids, false);
}
@Override
public void removeArea(String domain, String guid) {
removeArea(domain, guid, false);
}
@Override
public void removeAreas(String domain, Collection<String> guids, boolean removeHost) {
Set<String> areaGuids = new HashSet<String>();
List<Predicate> preds = new ArrayList<Predicate>();
for (String guid : guids) {
if (areaGuids.contains(guid))
continue;
List<Area> areas = getAreaTree(getArea(domain, guid));
for (Area area : areas)
areaGuids.add(area.getGuid());
preds.addAll(getPreds(areas));
}
cfg.removes(domain, cls, preds, NOT_FOUND, this, removeHost, null);
}
@Override
public void removeArea(String domain, String guid, boolean removeHost) {
List<Area> areas = getAreaTree(getArea(domain, guid));
cfg.removes(domain, cls, getPreds(areas), NOT_FOUND, this, removeHost, null);
}
private List<Area> getAreaTree(Area area) {
List<Area> areas = new ArrayList<Area>();
for (Area child : area.getChildren())
areas.addAll(getAreaTree(child));
areas.add(area);
return areas;
}
}