/*
* 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.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import org.apache.felix.ipojo.annotations.Component;
import org.apache.felix.ipojo.annotations.Invalidate;
import org.apache.felix.ipojo.annotations.Provides;
import org.apache.felix.ipojo.annotations.Requires;
import org.apache.felix.ipojo.annotations.Validate;
import org.krakenapps.confdb.ConfigTransaction;
import org.krakenapps.confdb.Predicate;
import org.krakenapps.confdb.Predicates;
import org.krakenapps.dom.api.ApplicationApi;
import org.krakenapps.dom.api.ConfigManager;
import org.krakenapps.dom.api.DefaultEntityEventListener;
import org.krakenapps.dom.api.DefaultEntityEventProvider;
import org.krakenapps.dom.api.EntityEventListener;
import org.krakenapps.dom.api.EntityEventProvider;
import org.krakenapps.dom.api.Transaction;
import org.krakenapps.dom.model.Application;
import org.krakenapps.dom.model.ApplicationGroup;
import org.krakenapps.dom.model.ApplicationVersion;
import org.krakenapps.dom.model.Vendor;
@Component(name = "dom-app-api")
@Provides
public class ApplicationApiImpl extends DefaultEntityEventProvider<Application> implements ApplicationApi {
private static final Class<Vendor> ven = Vendor.class;
private static final String VEN_NOT_FOUND = "vendor-not-found";
private static final String VEN_ALREADY_EXIST = "vendor-already-exist";
private DefaultEntityEventProvider<Vendor> vendorEventProvider = new DefaultEntityEventProvider<Vendor>();
private static final Class<Application> app = Application.class;
private static final String APP_NOT_FOUND = "application-not-found";
private static final String APP_ALREADY_EXIST = "application-already-exist";
private static final Class<ApplicationVersion> ver = ApplicationVersion.class;
private static final String VER_NOT_FOUND = "application-version-not-found";
private static final String VER_ALREADY_EXIST = "application-version-already-exist";
private DefaultEntityEventProvider<ApplicationVersion> versionEventProvider = new DefaultEntityEventProvider<ApplicationVersion>();
private static final Class<ApplicationGroup> grp = ApplicationGroup.class;
private static final String GRP_NOT_FOUND = "application-group-not-found";
private static final String GRP_ALREADY_EXIST = "application-group-already-exist";
private DefaultEntityEventProvider<ApplicationGroup> groupEventProvider = new DefaultEntityEventProvider<ApplicationGroup>();
private EntityEventListener<Vendor> vendorEventListener = new DefaultEntityEventListener<Vendor>() {
@Override
public void entityRemoving(String domain, Vendor obj, ConfigTransaction xact, Object state) {
List<Predicate> preds = Arrays.asList(Predicates.field("vendor/guid", obj.getGuid()));
Transaction x = Transaction.getInstance(xact);
cfg.removes(x, domain, Application.class, preds, null, ApplicationApiImpl.this, state, null);
}
};
private EntityEventListener<Application> applicationEventListener = new DefaultEntityEventListener<Application>() {
@Override
public void entityRemoving(String domain, Application obj, ConfigTransaction xact, Object state) {
Transaction x = Transaction.getInstance(xact);
cfg.removes(x, domain, ApplicationVersion.class, getPreds(obj.getVersions()), null, versionEventProvider, state, null);
}
};
@Requires
private ConfigManager cfg;
@Validate
public void validate() {
vendorEventProvider.addEntityEventListener(vendorEventListener);
this.addEntityEventListener(applicationEventListener);
}
@Invalidate
public void invalidate() {
vendorEventProvider.removeEntityEventListener(vendorEventListener);
this.removeEntityEventListener(applicationEventListener);
}
private Predicate getPred(String guid) {
return Predicates.field("guid", guid);
}
private List<Predicate> getPreds(List<? extends Object> objs) {
if (objs == null)
return new ArrayList<Predicate>();
List<Predicate> preds = new ArrayList<Predicate>(objs.size());
for (Object obj : objs) {
if (obj instanceof Vendor)
preds.add(getPred(((Vendor) obj).getGuid()));
else if (obj instanceof Application)
preds.add(getPred(((Application) obj).getGuid()));
else if (obj instanceof ApplicationVersion)
preds.add(getPred(((ApplicationVersion) obj).getGuid()));
else if (obj instanceof ApplicationGroup)
preds.add(getPred(((ApplicationGroup) obj).getGuid()));
}
return preds;
}
@Override
public Collection<Vendor> getVendors(String domain) {
return cfg.all(domain, ven);
}
@Override
public Vendor findVendor(String domain, String guid) {
return cfg.find(domain, ven, getPred(guid));
}
@Override
public Vendor getVendor(String domain, String guid) {
return cfg.get(domain, ven, getPred(guid), VEN_NOT_FOUND);
}
@Override
public void createVendors(String domain, Collection<Vendor> vendors) {
List<Vendor> vendorList = new ArrayList<Vendor>(vendors);
cfg.adds(domain, ven, getPreds(vendorList), vendorList, VEN_ALREADY_EXIST, vendorEventProvider);
}
@Override
public void createVendor(String domain, Vendor vendor) {
cfg.add(domain, ven, getPred(vendor.getGuid()), vendor, VEN_ALREADY_EXIST, vendorEventProvider);
}
@Override
public void updateVendors(String domain, Collection<Vendor> vendors) {
List<Vendor> vendorList = new ArrayList<Vendor>(vendors);
for (Vendor vendor : vendorList)
vendor.setUpdated(new Date());
cfg.updates(domain, ven, getPreds(vendorList), vendorList, VEN_NOT_FOUND, vendorEventProvider);
}
@Override
public void updateVendor(String domain, Vendor vendor) {
vendor.setUpdated(new Date());
cfg.update(domain, ven, getPred(vendor.getGuid()), vendor, VEN_NOT_FOUND, vendorEventProvider);
}
@Override
public void removeVendors(String domain, Collection<String> guids) {
List<Predicate> preds = new ArrayList<Predicate>();
for (String guid : guids)
preds.add(getPred(guid));
cfg.removes(domain, ven, preds, VEN_NOT_FOUND, vendorEventProvider);
}
@Override
public void removeVendor(String domain, String guid) {
cfg.remove(domain, ven, getPred(guid), VEN_NOT_FOUND, vendorEventProvider);
}
@Override
public EntityEventProvider<Vendor> getVendorEventProvider() {
return vendorEventProvider;
}
@Override
public Collection<Application> getApplications(String domain) {
return cfg.all(domain, app);
}
@Override
public Application findApplication(String domain, String guid) {
return cfg.find(domain, app, getPred(guid));
}
@Override
public Application getApplication(String domain, String guid) {
return cfg.get(domain, app, getPred(guid), APP_NOT_FOUND);
}
@Override
public void createApplications(String domain, Collection<Application> applications) {
List<Application> applicationList = new ArrayList<Application>(applications);
cfg.adds(domain, app, getPreds(applicationList), applicationList, APP_ALREADY_EXIST, this);
}
@Override
public void createApplication(String domain, Application application) {
cfg.add(domain, app, getPred(application.getGuid()), application, APP_ALREADY_EXIST, this);
}
@Override
public void updateApplications(String domain, Collection<Application> applications) {
List<Application> applicationList = new ArrayList<Application>(applications);
for (Application application : applicationList)
application.setUpdated(new Date());
cfg.updates(domain, app, getPreds(applicationList), applicationList, APP_NOT_FOUND, this);
}
@Override
public void updateApplication(String domain, Application application) {
application.setUpdated(new Date());
cfg.update(domain, app, getPred(application.getGuid()), application, APP_NOT_FOUND, this);
}
@Override
public void removeApplications(String domain, Collection<String> guids) {
List<Predicate> preds = new ArrayList<Predicate>();
for (String guid : guids)
preds.add(getPred(guid));
cfg.removes(domain, app, preds, APP_NOT_FOUND, this);
}
@Override
public void removeApplication(String domain, String guid) {
cfg.remove(domain, app, getPred(guid), APP_NOT_FOUND, this);
}
@Override
public Collection<ApplicationVersion> getApplicationVersions(String domain) {
return cfg.all(domain, ver);
}
@Override
public ApplicationVersion findApplicationVersion(String domain, String guid) {
return cfg.find(domain, ver, getPred(guid));
}
@Override
public ApplicationVersion getApplicationVersion(String domain, String guid) {
return cfg.get(domain, ver, getPred(guid), VER_NOT_FOUND);
}
@Override
public void createApplicationVersions(String domain, Collection<ApplicationVersion> versions) {
List<ApplicationVersion> versionList = new ArrayList<ApplicationVersion>(versions);
cfg.adds(domain, ver, getPreds(versionList), versionList, VER_ALREADY_EXIST, versionEventProvider);
}
@Override
public void createApplicationVersion(String domain, ApplicationVersion version) {
cfg.add(domain, ver, getPred(version.getGuid()), version, VER_ALREADY_EXIST, versionEventProvider);
}
@Override
public void updateApplicationVersions(String domain, Collection<ApplicationVersion> versions) {
List<ApplicationVersion> versionList = new ArrayList<ApplicationVersion>(versions);
for (ApplicationVersion version : versionList)
version.setUpdated(new Date());
cfg.updates(domain, ver, getPreds(versionList), versionList, VER_NOT_FOUND, versionEventProvider);
}
@Override
public void updateApplicationVersion(String domain, ApplicationVersion version) {
version.setUpdated(new Date());
cfg.update(domain, ver, getPred(version.getGuid()), version, VER_NOT_FOUND, versionEventProvider);
}
@Override
public void removeApplicationVersions(String domain, Collection<String> guids) {
List<Predicate> preds = new ArrayList<Predicate>();
for (String guid : guids)
preds.add(getPred(guid));
cfg.removes(domain, ver, preds, VER_NOT_FOUND, versionEventProvider);
}
@Override
public void removeApplicationVersion(String domain, String guid) {
cfg.remove(domain, ver, getPred(guid), VER_NOT_FOUND, versionEventProvider);
}
@Override
public EntityEventProvider<ApplicationVersion> getApplicationVersionEventProvider() {
return versionEventProvider;
}
@Override
public Collection<ApplicationGroup> getApplicationGroups(String domain) {
return cfg.all(domain, grp);
}
@Override
public ApplicationGroup findApplicationGroup(String domain, String guid) {
return cfg.find(domain, grp, getPred(guid));
}
@Override
public ApplicationGroup getApplicationGroup(String domain, String guid) {
return cfg.get(domain, grp, getPred(guid), GRP_NOT_FOUND);
}
@Override
public void createApplicationGroups(String domain, Collection<ApplicationGroup> groups) {
List<ApplicationGroup> groupList = new ArrayList<ApplicationGroup>(groups);
cfg.adds(domain, grp, getPreds(groupList), groupList, GRP_ALREADY_EXIST, groupEventProvider);
}
@Override
public void createApplicationGroup(String domain, ApplicationGroup group) {
cfg.add(domain, grp, getPred(group.getGuid()), group, GRP_ALREADY_EXIST, groupEventProvider);
}
@Override
public void updateApplicationGroups(String domain, Collection<ApplicationGroup> groups) {
List<ApplicationGroup> groupList = new ArrayList<ApplicationGroup>(groups);
for (ApplicationGroup group : groupList)
group.setUpdated(new Date());
cfg.updates(domain, grp, getPreds(groupList), groupList, VEN_NOT_FOUND, groupEventProvider);
}
@Override
public void updateApplicationGroup(String domain, ApplicationGroup group) {
group.setUpdated(new Date());
cfg.update(domain, grp, getPred(group.getGuid()), group, GRP_NOT_FOUND, groupEventProvider);
}
@Override
public void removeApplicationGroups(String domain, Collection<String> guids) {
List<Predicate> preds = new ArrayList<Predicate>();
for (String guid : guids)
preds.add(getPred(guid));
cfg.removes(domain, grp, preds, GRP_NOT_FOUND, groupEventProvider);
}
@Override
public void removeApplicationGroup(String domain, String guid) {
cfg.remove(domain, grp, getPred(guid), GRP_NOT_FOUND, groupEventProvider);
}
@Override
public EntityEventProvider<ApplicationGroup> getApplicationGroupEventProvider() {
return groupEventProvider;
}
}