Bug 501841 - Add more logging to controllers

* Fix compile issues

Change-Id: Id3bd5957c7e5ea2d837ba639cffb2588aa1f2a79
Signed-off-by: Johannes Faltermeier <jfaltermeier@eclipsesource.com>
diff --git a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/operations/util/ChangePackageUtil.java b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/operations/util/ChangePackageUtil.java
index 5dbde8c..03df1ce 100644
--- a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/operations/util/ChangePackageUtil.java
+++ b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/operations/util/ChangePackageUtil.java
@@ -11,21 +11,13 @@
  ******************************************************************************/
 package org.eclipse.emf.emfstore.internal.server.model.versioning.operations.util;
 
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.LineNumberReader;
 import java.text.MessageFormat;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
 
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.io.LineIterator;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.emfstore.internal.common.model.util.FileUtil;
 import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
@@ -80,9 +72,11 @@
 	 *            the max number of operations a single fragment may consists of
 	 * @return an iterator for the created fragments
 	 */
-	public static Iterator<ChangePackageEnvelope> splitChangePackage(final FileBasedChangePackage changePackage,
+	public static Iterator<ChangePackageEnvelope> splitChangePackage(final AbstractChangePackage changePackage,
 		final int changePackageFragmentSize) {
+
 		return new ChangePackageSplittingIterator(changePackageFragmentSize, changePackage);
+
 	}
 
 	/**
@@ -173,102 +167,82 @@
 	 */
 	private static final class ChangePackageSplittingIterator implements Iterator<ChangePackageEnvelope> {
 		private final int changePackageFragmentSize;
-		private final FileBasedChangePackage changePackage;
+		private final AbstractChangePackage changePackage;
 		private int fragmentIndex;
 		private int count;
 		private ChangePackageEnvelope envelope;
-		private boolean isInitialized;
+		private Iterator<AbstractOperation> operationsIterator;
+		private ESCloseableIterable<AbstractOperation> operationsIterable;
 
-		ChangePackageSplittingIterator(int changePackageFragmentSize, FileBasedChangePackage changePackage) {
+		ChangePackageSplittingIterator(int changePackageFragmentSize, AbstractChangePackage changePackage) {
 			this.changePackageFragmentSize = changePackageFragmentSize;
 			this.changePackage = changePackage;
-			ModelUtil.logProjectDetails(
-				MessageFormat.format("Splitting change package {0}", changePackage.getFilePath()), null, null, null, //$NON-NLS-1$
-				null, -1);
+			if (FileBasedChangePackage.class.isInstance(changePackage)) {
+				ModelUtil.logProjectDetails(MessageFormat.format("Splitting change package {0}", //$NON-NLS-1$
+					FileBasedChangePackage.class.cast(changePackage).getFilePath()), null, null, null, null, -1);
+			}
+		}
+
+		private void init() {
+			int leafSizeCounter = 0;
+			// it is not necessary to close the operations iterable, because the iterator already does this
+			// in hasNext() if there are no more operations
+			final ESCloseableIterable<AbstractOperation> operations = changePackage.operations();
+			for (final AbstractOperation operation : operations.iterable()) {
+				final int countLeafOperations = countLeafOperations(operation);
+				leafSizeCounter += countLeafOperations;
+				if (leafSizeCounter < changePackageFragmentSize) {
+					continue;
+				}
+				leafSizeCounter = 0;
+				count += 1;
+			}
+			if (leafSizeCounter != 0 || count == 0) {
+				count += 1;
+			}
+			operationsIterable = changePackage.operations();
+			operationsIterator = operationsIterable.iterable().iterator();
 		}
 
 		public boolean hasNext() {
 
-			if (!isInitialized) {
+			if (operationsIterable == null) {
 				init();
 			}
 
 			if (envelope == null) {
 				envelope = VersioningFactory.eINSTANCE.createChangePackageEnvelope();
+				final ChangePackage cp = VersioningFactory.eINSTANCE.createChangePackage();
+				cp.setLogMessage(ModelUtil.clone(changePackage.getLogMessage()));
 				envelope.setFragmentCount(count);
 			}
 
-			final List<String> readLines = readLines(fragmentIndex * changePackageFragmentSize, changePackage,
-				changePackageFragmentSize);
-			envelope.getFragment().addAll(readLines);
+			while (countLeafOperations(envelope.getFragment()) < changePackageFragmentSize
+				&& operationsIterator.hasNext()) {
+
+				final AbstractOperation op = operationsIterator.next();
+				envelope.getFragment().add(ModelUtil.clone(op));
+			}
 
 			envelope.setFragmentIndex(fragmentIndex);
 
 			if (!envelope.getFragment().isEmpty() || fragmentIndex == 0) {
-				ModelUtil.logProjectDetails(MessageFormat.format("Fragment {1} for Change package {0} prepared", //$NON-NLS-1$
-					changePackage.getFilePath(), fragmentIndex), null, null, null, null, -1);
+				if (FileBasedChangePackage.class.isInstance(changePackage)) {
+					ModelUtil.logProjectDetails(
+						MessageFormat.format("Fragment {1} for Change package {0} prepared", //$NON-NLS-1$
+							FileBasedChangePackage.class.cast(changePackage).getFilePath(), fragmentIndex),
+						null, null, null, null, -1);
+				}
 				return true;
 			}
 
-			ModelUtil.logProjectDetails(
-				MessageFormat.format("No more change package fragments for {0}", changePackage.getFilePath()), null, //$NON-NLS-1$
-				null, null, null, -1);
+			if (FileBasedChangePackage.class.isInstance(changePackage)) {
+				ModelUtil.logProjectDetails(MessageFormat.format("No more change package fragments for {0}", //$NON-NLS-1$
+					FileBasedChangePackage.class.cast(changePackage).getFilePath()), null, null, null, null, -1);
+			}
 			return false;
 		}
 
-		private void init() {
-			LineNumberReader lineNumberReader = null;
-			try {
-				lineNumberReader = new LineNumberReader(new FileReader(new File(changePackage.getTempFilePath())));
-				lineNumberReader.skip(Long.MAX_VALUE);
-				final int lines = lineNumberReader.getLineNumber() + 1;
-				count = lines / changePackageFragmentSize;
-				if (lines % changePackageFragmentSize != 0) {
-					count += 1;
-				}
-			} catch (final FileNotFoundException ex) {
-				throw new IllegalStateException(ex);
-			} catch (final IOException ex) {
-				throw new IllegalStateException(ex);
-			} finally {
-				IOUtils.closeQuietly(lineNumberReader);
-			}
-			isInitialized = true;
-		}
-
-		private List<String> readLines(int from, final FileBasedChangePackage changePackage,
-			final int changePackageFragmentSize) {
-
-			int readLines = 0;
-			FileReader reader;
-			final List<String> lines = new ArrayList<String>();
-
-			try {
-				reader = new FileReader(new File(changePackage.getTempFilePath()));
-				final LineIterator lineIterator = new LineIterator(reader);
-				int read = 0;
-
-				while (read < from) {
-					if (!lineIterator.hasNext()) {
-						return lines;
-					}
-					lineIterator.next();
-					read += 1;
-				}
-
-				while (readLines < changePackageFragmentSize && lineIterator.hasNext()) {
-					final String nextLine = lineIterator.next();
-					readLines += 1;
-					lines.add(nextLine);
-				}
-
-			} catch (final FileNotFoundException ex) {
-				throw new IllegalStateException(ex);
-			}
-
-			return lines;
-		}
-
 		public ChangePackageEnvelope next() {
 			if (envelope == null) {
 				final boolean hasNext = hasNext();