Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into gui-devel
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Jun 25, 2014
2 parents 86fda4d + cd26e4b commit b65129a
Show file tree
Hide file tree
Showing 33 changed files with 1,379 additions and 111 deletions.
Expand Up @@ -22,6 +22,7 @@
import org.w3c.dom.Document;

import com.evolveum.midpoint.prism.ComplexTypeDefinition;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.Definition;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.Objectable;
Expand All @@ -30,6 +31,8 @@
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.PrismReferenceDefinition;
import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
import com.evolveum.midpoint.schema.processor.ResourceSchema;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.exception.SchemaException;
Expand Down Expand Up @@ -201,6 +204,63 @@ public Document serializeToXsd() throws SchemaException {
public boolean isEmpty() {
return refinedResourceSchema.isEmpty();
}

public Collection<ObjectClassComplexTypeDefinition> getObjectClassDefinitions() {
return refinedResourceSchema.getObjectClassDefinitions();
}

public ObjectClassComplexTypeDefinition createObjectClassDefinition(String localTypeName) {
return refinedResourceSchema.createObjectClassDefinition(localTypeName);
}

public ObjectClassComplexTypeDefinition createObjectClassDefinition(QName typeName) {
return refinedResourceSchema.createObjectClassDefinition(typeName);
}

public Collection<? extends RefinedObjectClassDefinition> getRefinedDefinitions() {
return refinedResourceSchema.getRefinedDefinitions();
}

public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowType shadow) {
return refinedResourceSchema.findObjectClassDefinition(shadow);
}

public ObjectClassComplexTypeDefinition findObjectClassDefinition(String localName) {
return refinedResourceSchema.findObjectClassDefinition(localName);
}

public Collection<PrismObjectDefinition> getObjectDefinitions() {
return refinedResourceSchema.getObjectDefinitions();
}

public Collection<ComplexTypeDefinition> getComplexTypeDefinitions() {
return refinedResourceSchema.getComplexTypeDefinitions();
}

public ObjectClassComplexTypeDefinition findObjectClassDefinition(ShadowKindType kind, String intent) {
return refinedResourceSchema.findObjectClassDefinition(kind, intent);
}

public ObjectClassComplexTypeDefinition findDefaultObjectClassDefinition(ShadowKindType kind) {
return refinedResourceSchema.findDefaultObjectClassDefinition(kind);
}

public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName) {
return refinedResourceSchema.findObjectClassDefinition(objectClassQName);
}

public <X extends Objectable> PrismObjectDefinition<X> findObjectDefinitionByTypeAssumeNs(QName typeName) {
return refinedResourceSchema.findObjectDefinitionByTypeAssumeNs(typeName);
}

public <C extends Containerable> PrismContainerDefinition<C> findContainerDefinitionByCompileTimeClass(
Class<C> type) {
return refinedResourceSchema.findContainerDefinitionByCompileTimeClass(type);
}

public PrismReferenceDefinition findReferenceDefinitionByElementName(QName elementName) {
return refinedResourceSchema.findReferenceDefinitionByElementName(elementName);
}

@Override
public int hashCode() {
Expand Down
Expand Up @@ -24,6 +24,7 @@

import com.evolveum.midpoint.util.QNameUtil;

import org.apache.commons.lang.Validate;
import org.w3c.dom.Element;

import com.evolveum.midpoint.common.monitor.InternalMonitor;
Expand All @@ -50,7 +51,7 @@
* @author semancik
*
*/
public class RefinedResourceSchema extends PrismSchema implements DebugDumpable {
public class RefinedResourceSchema extends ResourceSchema implements DebugDumpable {

private static final String USER_DATA_KEY_PARSED_RESOURCE_SCHEMA = RefinedResourceSchema.class.getName()+".parsedResourceSchema";
private static final String USER_DATA_KEY_REFINED_SCHEMA = RefinedResourceSchema.class.getName()+".refinedSchema";
Expand All @@ -63,6 +64,7 @@ protected RefinedResourceSchema(PrismContext prismContext) {

private RefinedResourceSchema(ResourceType resourceType, ResourceSchema originalResourceSchema, PrismContext prismContext) {
super(ResourceTypeUtil.getResourceNamespace(resourceType), prismContext);
Validate.notNull(originalResourceSchema);
this.originalResourceSchema = originalResourceSchema;
}

Expand Down Expand Up @@ -152,11 +154,10 @@ public RefinedObjectClassDefinition findRefinedDefinitionByObjectClassQName(Shad
return null;
}

private ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName) {
public ObjectClassComplexTypeDefinition findObjectClassDefinition(QName objectClassQName) {
return originalResourceSchema.findObjectClassDefinition(objectClassQName);
}


public static RefinedResourceSchema getRefinedSchema(ResourceType resourceType) throws SchemaException {
return getRefinedSchema(resourceType, resourceType.asPrismObject().getPrismContext());
}
Expand Down
Expand Up @@ -1392,6 +1392,7 @@ public String debugDump(int indent) {
}
sb.append("id=").append(PrettyPrinter.prettyPrint(getId()));
}
appendOriginDump(sb);
List<Item<?>> items = getItems();
if (items != null) {
Iterator<Item<?>> i = getItems().iterator();
Expand Down
Expand Up @@ -572,12 +572,7 @@ public String toString() {
}

private void dumpSuffix(StringBuilder builder) {
if (getOriginType() != null || getOriginObject() != null) {
builder.append(", origin: ");
builder.append(getOriginType());
builder.append(":");
builder.append(getOriginObject());
}
appendOriginDump(builder);
if (getRawElement() != null) {
builder.append(", raw element: ");
builder.append(PrettyPrinter.prettyPrint(getRawElement()));
Expand Down
Expand Up @@ -18,6 +18,8 @@
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.PrettyPrinter;
import com.evolveum.midpoint.util.exception.SchemaException;

import org.w3c.dom.Element;
Expand Down Expand Up @@ -312,6 +314,17 @@ void diffMatchingRepresentation(PrismValue otherValue,
* The value is returned without any decorations or type demarcations (such as PPV, PRV, etc.)
*/
public abstract String toHumanReadableString();

protected void appendOriginDump(StringBuilder builder) {
if (DebugUtil.isDetailedDebugDump()) {
if (getOriginType() != null || getOriginObject() != null) {
builder.append(", origin: ");
builder.append(getOriginType());
builder.append(":");
builder.append(getOriginObject());
}
}
}

public static <T> Set<T> getRealValuesOfCollection(Collection<PrismPropertyValue<T>> collection) {
Set<T> retval = new HashSet<T>(collection.size());
Expand Down
Expand Up @@ -38,6 +38,7 @@
import com.evolveum.midpoint.provisioning.api.ProvisioningService;
import com.evolveum.midpoint.provisioning.api.ResourceObjectChangeListener;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
import com.evolveum.midpoint.schema.result.OperationConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectQueryUtil;
Expand Down Expand Up @@ -199,17 +200,17 @@ private SynchronizeAccountResultHandler createHandler(ResourceType resource, Tas
LOGGER.trace("Refined schema:\n{}", refinedSchema.debugDump());
}

RefinedObjectClassDefinition rObjectClass = Utils.determineObjectClass(refinedSchema, task);
if (rObjectClass == null) {
ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchema, task);
if (objectClass == null) {
LOGGER.error("Import: No objectclass specified and no default can be determined.");
opResult.recordFatalError("No objectclass specified and no default can be determined");
runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR);
return null;
}

LOGGER.info("Start executing import from resource {}, importing object class {}", resource, rObjectClass.getTypeName());
LOGGER.info("Start executing import from resource {}, importing object class {}", resource, objectClass.getTypeName());

SynchronizeAccountResultHandler handler = new SynchronizeAccountResultHandler(resource, rObjectClass, "import",
SynchronizeAccountResultHandler handler = new SynchronizeAccountResultHandler(resource, objectClass, "import",
task, changeNotificationDispatcher);
handler.setSourceChannel(SchemaConstants.CHANGE_CHANNEL_IMPORT);
handler.setForceAdd(true);
Expand All @@ -230,7 +231,7 @@ protected boolean initializeRun(SynchronizeAccountResultHandler handler,
protected ObjectQuery createQuery(SynchronizeAccountResultHandler handler, TaskRunResult runResult, Task task, OperationResult opResult) {
try {
return ObjectQueryUtil.createResourceAndAccountQuery(handler.getResource().getOid(),
handler.getRefinedObjectClass().getTypeName(), prismContext);
handler.getObjectClass().getTypeName(), prismContext);
} catch (SchemaException e) {
LOGGER.error("Import: Schema error during creating search query: {}",e.getMessage());
opResult.recordFatalError("Schema error during creating search query: "+e.getMessage(),e);
Expand Down
Expand Up @@ -411,6 +411,8 @@ private Mapping<PrismContainerValue<ShadowAssociationType>> evaluateAssociation(
PrismContainerDefinition<ShadowAssociationType> outputDefinition = getAssociationContainerDefinition();
Mapping<PrismContainerValue<ShadowAssociationType>> mapping = mappingFactory.createMapping(outboundMappingType,
"for association " + PrettyPrinter.prettyPrint(assocName) + " in " + source);
mapping.setOriginType(OriginType.ASSIGNMENTS);
mapping.setOriginObject(source);

RefinedAssociationDefinition rAssocDef = refinedObjectClassDefinition.findAssociation(assocName);
if (rAssocDef == null) {
Expand Down
Expand Up @@ -17,6 +17,7 @@

import javax.annotation.PostConstruct;

import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
import com.evolveum.midpoint.task.api.*;

Expand Down Expand Up @@ -191,8 +192,8 @@ public TaskRunResult run(Task task) {
return runResult;
}

RefinedObjectClassDefinition rObjectClass = Utils.determineObjectClass(refinedSchema, task);
if (rObjectClass == null) {
ObjectClassComplexTypeDefinition objectClass = Utils.determineObjectClass(refinedSchema, task);
if (objectClass == null) {
LOGGER.error("Live Sync: No objectclass specified and no default can be determined.");
opResult.recordFatalError("No objectclass specified and no default can be determined");
runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR);
Expand All @@ -209,7 +210,7 @@ public TaskRunResult run(Task task) {
// It will use extension of task to store synchronization state

Utils.clearRequestee(task);
changesProcessed = provisioningService.synchronize(resourceOid, rObjectClass.getTypeName(), task, opResult);
changesProcessed = provisioningService.synchronize(resourceOid, objectClass.getTypeName(), task, opResult);
progress += changesProcessed;

} catch (ObjectNotFoundException ex) {
Expand Down
Expand Up @@ -60,6 +60,7 @@
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.processor.ObjectClassComplexTypeDefinition;
import com.evolveum.midpoint.schema.result.OperationConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.result.OperationResultStatus;
Expand Down Expand Up @@ -175,12 +176,12 @@ public TaskRunResult run(Task task) {
// todo consider setting expectedTotal to null here

PrismObject<ResourceType> resource;
RefinedObjectClassDefinition rObjectclassDef;
ObjectClassComplexTypeDefinition objectclassDef;
try {
resource = provisioningService.getObject(ResourceType.class, resourceOid, null, task, opResult);

RefinedResourceSchema refinedSchema = RefinedResourceSchema.getRefinedSchema(resource, LayerType.MODEL, prismContext);
rObjectclassDef = Utils.determineObjectClass(refinedSchema, task);
objectclassDef = Utils.determineObjectClass(refinedSchema, task);

} catch (ObjectNotFoundException ex) {
// This is bad. The resource does not exist. Permanent problem.
Expand Down Expand Up @@ -212,10 +213,10 @@ public TaskRunResult run(Task task) {
}

reconResult.setResource(resource);
reconResult.setRefinedObjectclassDefinition(rObjectclassDef);
reconResult.setObjectclassDefinition(objectclassDef);

LOGGER.info("Start executing reconciliation of resource {}, reconciling object class {}",
resource, rObjectclassDef);
resource, objectclassDef);
long reconStartTimestamp = clock.currentTimeMillis();

AuditEventRecord requestRecord = new AuditEventRecord(AuditEventType.RECONCILIATION, AuditEventStage.REQUEST);
Expand Down Expand Up @@ -260,12 +261,12 @@ public TaskRunResult run(Task task) {
long afterResourceReconTimestamp;
long afterShadowReconTimestamp;
try {
if (!performResourceReconciliation(resource, rObjectclassDef, reconResult, task, opResult)) {
if (!performResourceReconciliation(resource, objectclassDef, reconResult, task, opResult)) {
processInterruption(runResult, resource, task, opResult);
return runResult;
}
afterResourceReconTimestamp = clock.currentTimeMillis();
if (!performShadowReconciliation(resource, rObjectclassDef, reconStartTimestamp, afterResourceReconTimestamp, reconResult, task, opResult)) {
if (!performShadowReconciliation(resource, objectclassDef, reconStartTimestamp, afterResourceReconTimestamp, reconResult, task, opResult)) {
processInterruption(runResult, resource, task, opResult);
return runResult;
}
Expand Down Expand Up @@ -320,7 +321,7 @@ public TaskRunResult run(Task task) {
long resourceReconTime = afterResourceReconTimestamp - beforeResourceReconTimestamp;
long shadowReconTime = afterShadowReconTimestamp - afterResourceReconTimestamp;
LOGGER.info("Done executing reconciliation of resource {}, object class {}, Etime: {} ms (un-ops: {}, resource: {}, shadow: {})",
new Object[]{resource, rObjectclassDef,
new Object[]{resource, objectclassDef,
etime,
unOpsTime,
resourceReconTime,
Expand Down Expand Up @@ -383,7 +384,7 @@ private void processErrorPartial(TaskRunResult runResult, String errorDesc, Exce
}

// returns false in case of execution interruption
private boolean performResourceReconciliation(PrismObject<ResourceType> resource, RefinedObjectClassDefinition rObjectclassDef, ReconciliationTaskResult reconResult, Task task, OperationResult result)
private boolean performResourceReconciliation(PrismObject<ResourceType> resource, ObjectClassComplexTypeDefinition objectclassDef, ReconciliationTaskResult reconResult, Task task, OperationResult result)
throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException,
SecurityViolationException {

Expand All @@ -394,13 +395,13 @@ private boolean performResourceReconciliation(PrismObject<ResourceType> resource
// Instantiate result handler. This will be called with every search
// result in the following iterative search
SynchronizeAccountResultHandler handler = new SynchronizeAccountResultHandler(resource.asObjectable(),
rObjectclassDef, "reconciliation", task, changeNotificationDispatcher);
objectclassDef, "reconciliation", task, changeNotificationDispatcher);
handler.setSourceChannel(SchemaConstants.CHANGE_CHANNEL_RECON);
handler.setStopOnError(false);

try {

ObjectQuery query = createObjectclassSearchQuery(resource, rObjectclassDef);
ObjectQuery query = createObjectclassSearchQuery(resource, objectclassDef);

OperationResult searchResult = new OperationResult(OperationConstants.RECONCILIATION+".searchIterative");
provisioningService.searchObjectsIterative(ShadowType.class, query, null, handler, searchResult); // note that progress is incremented within the handler, as it extends AbstractSearchIterativeResultHandler
Expand Down Expand Up @@ -444,7 +445,7 @@ private boolean performResourceReconciliation(PrismObject<ResourceType> resource
}

// returns false in case of execution interruption
private boolean performShadowReconciliation(final PrismObject<ResourceType> resource, final RefinedObjectClassDefinition rObjectclassDef,
private boolean performShadowReconciliation(final PrismObject<ResourceType> resource, final ObjectClassComplexTypeDefinition objectclassDef,
long startTimestamp, long endTimestamp, ReconciliationTaskResult reconResult, final Task task, OperationResult result) throws SchemaException {
boolean interrupted;

Expand All @@ -468,7 +469,7 @@ private boolean performShadowReconciliation(final PrismObject<ResourceType> reso
Handler<PrismObject<ShadowType>> handler = new Handler<PrismObject<ShadowType>>() {
@Override
public boolean handle(PrismObject<ShadowType> shadow) {
if (!rObjectclassDef.matches(shadow.asObjectable())) {
if ((objectclassDef instanceof RefinedObjectClassDefinition) && !((RefinedObjectClassDefinition)objectclassDef).matches(shadow.asObjectable())) {
return true;
}
reconcileShadow(shadow, resource, task);
Expand Down Expand Up @@ -614,8 +615,8 @@ private ObjectFilter createFailedOpFilter(FailedOperationTypeType failedOp) thro
}

private ObjectQuery createObjectclassSearchQuery(PrismObject<ResourceType> resource,
RefinedObjectClassDefinition refinedAccountDefinition) throws SchemaException {
QName objectClass = refinedAccountDefinition.getObjectClassDefinition().getTypeName();
ObjectClassComplexTypeDefinition objectClassDefinition) throws SchemaException {
QName objectClass = objectClassDefinition.getTypeName();
return ObjectQueryUtil.createResourceAndAccountQuery(resource.getOid(), objectClass, prismContext);
}

Expand Down

0 comments on commit b65129a

Please sign in to comment.