package org.objectstyle.wolips.eomodeler.core.utils; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.core.commands.operations.IUndoContext; import org.eclipse.core.commands.operations.ObjectUndoContext; import org.objectstyle.wolips.baseforplugins.util.StringUtils; import org.objectstyle.wolips.eomodeler.core.model.EOArgument; import org.objectstyle.wolips.eomodeler.core.model.EODatabaseConfig; import org.objectstyle.wolips.eomodeler.core.model.EOEntity; import org.objectstyle.wolips.eomodeler.core.model.EOModel; import org.objectstyle.wolips.eomodeler.core.model.EOModelObject; import org.objectstyle.wolips.eomodeler.core.model.EOModelReferenceFailure; import org.objectstyle.wolips.eomodeler.core.model.EOStoredProcedure; import org.objectstyle.wolips.eomodeler.core.model.IEOEntityRelative; public class EOModelUtils { public static String getOperationLabel(String operation, List objs) { StringBuffer operationLabel = new StringBuffer(); operationLabel.append(operation); if (objs != null) { if (objs.size() == 1) { Object obj = objs.get(0); if (obj instanceof EOModelObject) { operationLabel.append(" "); operationLabel.append(((EOModelObject) obj).getName()); } } else if (objs.size() > 1) { operationLabel.append(" "); operationLabel.append(objs.size()); Class objType = null; for (Object obj : objs) { Class thisObjType = obj.getClass(); if (objType == null) { objType = thisObjType; } else if (!objType.isAssignableFrom(thisObjType)) { objType = null; break; } } operationLabel.append(" "); if (objType == null) { operationLabel.append("Items"); } else { operationLabel.append(StringUtils.toPlural(StringUtils.toShortPrettyClassName(objType.getName()))); } } } return operationLabel.toString(); } public static Set<EOModelObject> getRecommendedDeletions(Object[] selectedObjects) { Set<EOModelReferenceFailure> beforeReferenceFailures = EOModelUtils.getReferenceFailures(selectedObjects); Set<EOModelObject> allRecommendedObjectsSet = new HashSet<EOModelObject>(); for (Object selectedObject : selectedObjects) { if (selectedObject instanceof EOModelObject) { EOModelObject modelObject = (EOModelObject) selectedObject; allRecommendedObjectsSet.add(modelObject); } } for (EOModelReferenceFailure referenceFailure : beforeReferenceFailures) { Set<EOModelObject> recommendedDeletions = referenceFailure.getRecommendedDeletions(); for (EOModelObject recommendedDelete : recommendedDeletions) { allRecommendedObjectsSet.add(recommendedDelete); } } Object[] recommendedObjects = allRecommendedObjectsSet.toArray(); Set<EOModelReferenceFailure> afterReferenceFailures = EOModelUtils.getReferenceFailures(recommendedObjects); if (beforeReferenceFailures.size() != afterReferenceFailures.size()) { allRecommendedObjectsSet = EOModelUtils.getRecommendedDeletions(recommendedObjects); } return allRecommendedObjectsSet; } public static Set<EOModelReferenceFailure> getReferenceFailures(Object[] selectedObjects) { Set<EOModelObject> deletedObjects = new HashSet<EOModelObject>(); Set<EOModelReferenceFailure> referenceFailures = new HashSet<EOModelReferenceFailure>(); for (Object selectedObject : selectedObjects) { if (selectedObject instanceof EOModelObject) { EOModelObject modelObject = (EOModelObject) selectedObject; deletedObjects.add(modelObject); referenceFailures.addAll(modelObject.getReferenceFailures()); } } for (EOModelObject deletedObject : deletedObjects) { for (EOModelReferenceFailure referenceFailure : new HashSet<EOModelReferenceFailure>(referenceFailures)) { if (referenceFailure.getReferencingObject().equals(deletedObject)) { referenceFailures.remove(referenceFailure); } } } return referenceFailures; } public static IUndoContext getUndoContext(Object obj) { EOModel model = EOModelUtils.getRelatedModel(obj); String label = model == null ? "No Model" : model.getName(); return new ObjectUndoContext(model, label); } public static EOModelObject getRelated(Class<? extends EOModelObject> type, EOModelObject obj) { EOModelObject relatedObj; if (EOModel.class.isAssignableFrom(type)) { relatedObj = EOModelUtils.getRelatedModel(obj); } else if (EOEntity.class.isAssignableFrom(type)) { relatedObj = EOModelUtils.getRelatedEntity(obj); } else if (EOStoredProcedure.class.isAssignableFrom(type)) { if (obj instanceof EOStoredProcedure) { relatedObj = obj; } else if (obj instanceof EOArgument) { relatedObj = ((EOArgument) obj).getStoredProcedure(); } else { relatedObj = null; } } else { relatedObj = null; } return relatedObj; } public static EOModel getRelatedModel(Object obj) { EOModel model = null; if (obj instanceof EOModel) { model = (EOModel) obj; } else if (obj instanceof IEOEntityRelative) { model = ((IEOEntityRelative) obj).getEntity().getModel(); } else if (obj instanceof EOStoredProcedure) { model = ((EOStoredProcedure) obj).getModel(); } else if (obj instanceof EOArgument) { model = ((EOArgument) obj).getStoredProcedure().getModel(); } else if (obj instanceof EODatabaseConfig) { model = ((EODatabaseConfig) obj).getModel(); } else if (obj instanceof Object[]) { Object[] objs = (Object[]) obj; for (Object arrayObj : objs) { model = EOModelUtils.getRelatedModel(arrayObj); if (model != null) { break; } } } return model; } public static EOEntity getRelatedEntity(Object obj) { EOEntity entity = null; if (obj instanceof IEOEntityRelative) { entity = ((IEOEntityRelative) obj).getEntity(); } return entity; } public static EOStoredProcedure getRelatedStoredProcedure(Object obj) { EOStoredProcedure storedProcedure = null; if (obj instanceof EOStoredProcedure) { storedProcedure = (EOStoredProcedure) obj; } else if (obj instanceof EOArgument) { storedProcedure = ((EOArgument) obj).getStoredProcedure(); } return storedProcedure; } }