use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.
the class JdbcManagedItemRepository method findRoots.
@Override
@JdbcTransaction
public List<ItemBase> findRoots(ProjectId project, boolean fetchTags, SecretProvider secretProvider) throws RepositoryException {
DbHelper db = new DbHelper(project);
try {
// TODO: Push-down logic for item selection as well
JoinedQueryResult result = db.listRoots();
List<ItemBase> roots = mapItemsAndTags(project, secretProvider, db, result);
for (ItemBase root : roots) {
// A little bit of paranoia
boolean isRoot = true;
for (Tag tag : root.getTags()) {
boolean tagIsParent = Tag.PARENT.getKey().equals(tag.getKey());
if (tagIsParent) {
isRoot = false;
break;
}
}
assert isRoot;
if (!isRoot) {
throw new IllegalStateException();
}
}
return roots;
} catch (SQLException e) {
throw new RepositoryException("Error fetching items", e);
} finally {
db.close();
}
}
use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.
the class JdbcManagedItemRepository method changeTags.
@Override
@JdbcTransaction
public Tags changeTags(ModelClass<?> modelClass, ProjectId project, ManagedItemId itemKey, TagChanges changeTags, Long ifVersion) throws RepositoryException {
DbHelper db = new DbHelper(modelClass, project);
try {
int projectId = db.mapToValue(project);
int modelId = db.mapToValue(modelClass.getItemType());
int serviceId = db.mapToValue(modelClass.getServiceType());
ItemEntity rs = db.queries.findItem(serviceId, modelId, projectId, itemKey.getKey());
if (rs == null) {
// TODO: Better exception??
throw new IllegalStateException("Not found");
}
int itemId = rs.id;
if (ifVersion != null) {
log.warn("CAS version swapping not implemented");
}
Tags tags = new Tags();
mapToTags(db.listTagsForItem(itemId), tags);
if (changeTags.addTags != null) {
for (Tag addTag : changeTags.addTags) {
if (tags.hasTag(addTag)) {
continue;
}
db.insertTag(itemId, addTag);
tags.add(addTag);
}
}
if (changeTags.removeTags != null) {
for (Tag removeTag : changeTags.removeTags) {
boolean removed = tags.remove(removeTag);
if (!removed) {
continue;
}
db.removeTag(itemId, removeTag);
}
}
return tags;
} catch (SQLException e) {
throw new RepositoryException("Error running query", e);
} finally {
db.close();
}
}
use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.
the class JdbcManagedItemRepository method mapItemsAndTags.
private <T extends ItemBase> List<T> mapItemsAndTags(ProjectId project, SecretProvider secretProvider, DbHelper db, JoinedQueryResult result) throws RepositoryException, SQLException {
Multimap<Integer, Tag> itemTags = HashMultimap.create();
for (TagEntity row : result.getAll(TagEntity.class)) {
Tag tag = Tag.build(row.key, row.data);
itemTags.put(row.item, tag);
}
List<T> items = Lists.newArrayList();
for (ItemEntity entity : result.getAll(ItemEntity.class)) {
if (entity == null) {
throw new IllegalStateException();
}
ServiceType serviceType = db.getServiceType(entity.service);
ItemType itemType = db.getItemType(entity.model);
JaxbHelper jaxbHelper = getJaxbHelper(db, serviceType, itemType);
T item = mapToModel(project, serviceType, itemType, entity, jaxbHelper, secretProvider);
int itemId = entity.id;
Collection<Tag> tags = itemTags.get(itemId);
item.getTags().addAll(tags);
items.add(item);
}
return items;
}
use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.
the class JdbcManagedItemRepository method mapToTags.
private void mapToTags(List<TagEntity> tagEntities, Tags tags) {
// Once REMOVE_DUPLICATE_TAGS is false, we can add direct to tags
List<Tag> addList = Lists.newArrayList();
for (TagEntity tag : tagEntities) {
addList.add(Tag.build(tag.key, tag.data));
}
if (REMOVE_DUPLICATE_TAGS) {
List<Tag> deduplicated = Lists.newArrayList();
HashMultimap<String, String> valueMap = HashMultimap.create();
for (Tag tag : addList) {
if (valueMap.put(tag.getKey(), tag.getValue())) {
deduplicated.add(tag);
}
}
addList = deduplicated;
}
tags.addAll(addList);
}
use of org.platformlayer.core.model.Tag in project platformlayer by platformlayer.
the class ItemServiceImpl method ensureItem.
<T extends ItemBase> T ensureItem(final ProjectAuthorization auth, final T item, final boolean canExist, final boolean generateUniqueName, final String uniqueTagKey) throws OpsException {
final ModelClass<T> modelClass = (ModelClass<T>) serviceProviderDirectory.getModelClass(item.getClass());
if (modelClass == null) {
throw new IllegalStateException("Unknown item type");
}
final Class<T> javaClass = modelClass.getJavaClass();
// JaxbHelper jaxbHelper = JaxbHelper.get(javaClass);
final ServiceProvider serviceProvider = modelClass.getProvider();
String id = item.getId();
if (Strings.isNullOrEmpty(id)) {
if (generateUniqueName) {
id = serviceProvider.buildItemId(modelClass, item);
} else {
// otherwise we end up with lots of randomly named items
throw new OpsException("Must specify item id");
// id = UUID.randomUUID().toString();
// item.setId(id);
}
}
ProjectId project = getProjectId(auth);
PlatformLayerKey itemKey = new PlatformLayerKey(null, project, modelClass.getServiceType(), modelClass.getItemType(), new ManagedItemId(id));
item.setKey(itemKey);
item.state = ManagedItemState.CREATION_REQUESTED;
final OpsContext opsContext = buildTemporaryOpsContext(modelClass.getServiceType(), auth);
T created = OpsContext.runInContext(opsContext, new CheckedCallable<T, Exception>() {
@Override
public T call() throws Exception {
PlatformLayerKey itemKey = item.getKey();
T existing;
SecretProvider secretProvider = SecretProvider.from(auth);
if (uniqueTagKey != null) {
boolean fetchTags = true;
Tag uniqueTag = null;
for (Tag tag : item.getTags()) {
if (Objects.equal(tag.getKey(), uniqueTagKey)) {
uniqueTag = tag;
}
}
if (uniqueTag == null) {
throw new IllegalArgumentException("Could not find unique tag");
}
Filter filter = TagFilter.byTag(uniqueTag);
filter = StateFilter.excludeDeleted(filter);
existing = null;
List<T> existingList = repository.findAll(modelClass, itemKey.getProject(), fetchTags, secretProvider, filter);
if (!existingList.isEmpty()) {
if (existingList.size() != 1) {
throw new IllegalArgumentException("Found multiple items with unique tag");
}
existing = existingList.get(0);
}
if (existing == null) {
itemKey = findUniqueId(item, itemKey, secretProvider);
}
} else {
if (generateUniqueName) {
itemKey = findUniqueId(item, itemKey, secretProvider);
}
try {
boolean fetchTags = true;
existing = Casts.checkedCast(repository.getManagedItem(itemKey, fetchTags, secretProvider), javaClass);
} catch (RepositoryException e) {
throw new OpsException("Error fetching item from database", e);
}
}
if (!canExist && existing != null) {
throw new OpsException("Item already exists");
}
serviceProvider.beforeCreateItem(item);
ProjectId project = getProjectId(auth);
T newItem;
try {
if (existing == null) {
newItem = repository.createManagedItem(project, item);
} else {
item.secret = existing.secret;
item.setKey(existing.getKey());
newItem = repository.updateManagedItem(project, item);
TagChanges tagChanges = new TagChanges();
for (Tag tag : item.getTags()) {
if (newItem.getTags().hasTag(tag)) {
continue;
}
boolean uniqueTagKey = false;
if (tag.getKey().equals(Tag.PARENT.getKey())) {
uniqueTagKey = true;
}
tagChanges.addTags.add(tag);
if (uniqueTagKey) {
for (Tag oldTag : newItem.getTags().findTags(tag.getKey())) {
tagChanges.removeTags.add(oldTag);
}
}
}
if (!tagChanges.isEmpty()) {
repository.changeTags(modelClass, project, newItem.getKey().getItemId(), tagChanges, null);
}
}
} catch (RepositoryException e) {
throw new OpsException("Error writing object to database", e);
}
itemKey = newItem.getKey();
JobData jobKey = changeQueue.notifyChange(auth, itemKey, ManagedItemState.CREATION_REQUESTED);
return newItem;
}
private <T extends ItemBase> PlatformLayerKey findUniqueId(final T item, final PlatformLayerKey itemKey, SecretProvider secretProvider) throws RepositoryException {
int sequence = 0;
while (true) {
String tryId = item.getId();
if (sequence != 0) {
tryId += sequence;
}
final PlatformLayerKey tryKey = itemKey.withId(new ManagedItemId(tryId));
boolean fetchTags = false;
ItemBase found = repository.getManagedItem(tryKey, fetchTags, secretProvider);
if (found == null) {
item.setKey(tryKey);
return tryKey;
}
sequence++;
}
}
});
return created;
}
Aggregations