Java tutorial
/******************************************************************************* * Copyright (c) 2011 Obeo. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Obeo - initial API and implementation *******************************************************************************/ package org.eclipse.sirius.synchronizer; import java.util.Collection; import java.util.Iterator; import org.eclipse.sirius.ext.base.Option; import org.eclipse.sirius.ext.base.Options; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; /** * The refresh planner use the input mappings and status of the output model * before update to compute the {@link RefreshPlan} * * @author Cedric Brun <cedric.brun@obeo.fr> * */ public class RefreshPlanner { private MappingHiearchyTable mappingTable; private SemanticPartitionInvalidator invalidator; private PreRefreshStatus pre; private SignatureProvider signatureProvider; /** * Function that returns the Hierarchy of the given Mapping. */ private final Function<Mapping, Collection<MappingHiearchy>> toHierarchy = new Function<Mapping, Collection<MappingHiearchy>>() { public Collection<MappingHiearchy> apply(Mapping from) { return mappingTable.getHierarchy(from); } }; /** * Creates a new RefreshPlanner. * * @param mappingTable * the MappingHierarchy table to refresh * @param invalidator * the semantic invalidator to use during refresh * @param pre * the PreRefresh Status * @param signatureProvider * the Signature Provider */ public RefreshPlanner(MappingHiearchyTable mappingTable, SemanticPartitionInvalidator invalidator, PreRefreshStatus pre, SignatureProvider signatureProvider) { super(); this.mappingTable = mappingTable; this.invalidator = invalidator; this.pre = pre; this.signatureProvider = signatureProvider; } /** * Computes the RefreshPlan from a CreatedOutput. * * @param container * the CreatedOutput to computes the RefreshPlan from * @return the RefreshPlan computed from the given CreatedOutput */ public RefreshPlan computePlan(CreatedOutput container) { RefreshPlan post = new RefreshPlan(signatureProvider); Collection<? extends Mapping> childMappings = container.getChildMappings(); pre.computeStatus(container, childMappings); post.addPreviousStatus(pre.getExistingOutputs()); Iterable<? extends Mapping> mappingsCreatingElements = Iterables.filter(childMappings, new Predicate<Mapping>() { @Override public boolean apply(Mapping input) { return input.getCreator().some(); } }); Iterable<Collection<MappingHiearchy>> transformedHiearchy = Iterables.transform(mappingsCreatingElements, toHierarchy); Iterable<MappingHiearchy> childHiearchies = Sets.newLinkedHashSet(Iterables.concat(transformedHiearchy)); for (MappingHiearchy nodeHiearch : childHiearchies) { Iterator<Mapping> it = nodeHiearch.fromMostSpecificToMostGeneral(); while (it.hasNext()) { Mapping cur = it.next(); if (cur.isEnabled() && cur.getCreator().some()) { Option<EvaluatedSemanticPartition> par = invalidator.hasFastResult( container.getDescriptor().getSourceElement(), cur.getSemanticPartition(), container); if (!par.some()) { par = Options.newSome(cur.getSemanticPartition() .evaluate(container.getDescriptor().getSourceElement(), container)); } Collection<? extends OutputDescriptor> allCandidateDescriptors = cur.getCreator().get() .computeDescriptors(container, par.get().elements()); post.appendOutputDescritorsKeepingTheMostSpecific(allCandidateDescriptors); } } } return post; } }