Index: src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java =================================================================== --- src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java (revision 822319) +++ src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableDependencyDescriptor.java (working copy) @@ -1,169 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.ivyde.eclipse.revdepexplorer; - -import java.util.Map; - -import org.apache.ivy.core.module.descriptor.DependencyArtifactDescriptor; -import org.apache.ivy.core.module.descriptor.DependencyDescriptor; -import org.apache.ivy.core.module.descriptor.ExcludeRule; -import org.apache.ivy.core.module.descriptor.IncludeRule; -import org.apache.ivy.core.module.id.ArtifactId; -import org.apache.ivy.core.module.id.ModuleId; -import org.apache.ivy.core.module.id.ModuleRevisionId; -import org.apache.ivy.plugins.namespace.Namespace; - -/** - * Delegate dependency descriptor that makes the descriptor mutable.
- */ -public class EditableDependencyDescriptor implements DependencyDescriptor { - - private DependencyDescriptor descriptor; - - private ModuleRevisionId revisionId; - - public EditableDependencyDescriptor(DependencyDescriptor dd) { - descriptor = dd; - revisionId = dd.getDependencyRevisionId(); - } - - public void setRevision(String revision) { - revisionId = new ModuleRevisionId(getDependencyId(), revision); - } - - public ModuleRevisionId getDynamicConstraintDependencyRevisionId() { - return revisionId; - } - - public ModuleRevisionId getDependencyRevisionId() { - return revisionId; - } - - public DependencyDescriptor asSystem() { - return descriptor.asSystem(); - } - - public boolean canExclude() { - return descriptor.canExclude(); - } - - public DependencyDescriptor clone(ModuleRevisionId revision) { - return descriptor.clone(revision); - } - - public boolean doesExclude(String[] moduleConfigurations, ArtifactId artifactId) { - return descriptor.doesExclude(moduleConfigurations, artifactId); - } - - public DependencyArtifactDescriptor[] getAllDependencyArtifacts() { - return descriptor.getAllDependencyArtifacts(); - } - - public ExcludeRule[] getAllExcludeRules() { - return descriptor.getAllExcludeRules(); - } - - public IncludeRule[] getAllIncludeRules() { - return descriptor.getAllIncludeRules(); - } - - public String getAttribute(String attName) { - return descriptor.getAttribute(attName); - } - - public Map getAttributes() { - return descriptor.getAttributes(); - } - - public DependencyArtifactDescriptor[] getDependencyArtifacts(String moduleConfigurations) { - return descriptor.getDependencyArtifacts(moduleConfigurations); - } - - public DependencyArtifactDescriptor[] getDependencyArtifacts(String[] moduleConfigurations) { - return descriptor.getDependencyArtifacts(moduleConfigurations); - } - - public String[] getDependencyConfigurations(String moduleConfiguration, - String requestedConfiguration) { - return descriptor.getDependencyConfigurations(moduleConfiguration, requestedConfiguration); - } - - public String[] getDependencyConfigurations(String moduleConfiguration) { - return descriptor.getDependencyConfigurations(moduleConfiguration); - } - - public String[] getDependencyConfigurations(String[] moduleConfigurations) { - return descriptor.getDependencyConfigurations(moduleConfigurations); - } - - public ModuleId getDependencyId() { - return descriptor.getDependencyId(); - } - - public ExcludeRule[] getExcludeRules(String moduleConfigurations) { - return descriptor.getExcludeRules(moduleConfigurations); - } - - public ExcludeRule[] getExcludeRules(String[] moduleConfigurations) { - return descriptor.getExcludeRules(moduleConfigurations); - } - - public String getExtraAttribute(String attName) { - return descriptor.getExtraAttribute(attName); - } - - public Map getExtraAttributes() { - return descriptor.getExtraAttributes(); - } - - public IncludeRule[] getIncludeRules(String moduleConfigurations) { - return descriptor.getIncludeRules(moduleConfigurations); - } - - public IncludeRule[] getIncludeRules(String[] moduleConfigurations) { - return descriptor.getIncludeRules(moduleConfigurations); - } - - public String[] getModuleConfigurations() { - return descriptor.getModuleConfigurations(); - } - - public Namespace getNamespace() { - return descriptor.getNamespace(); - } - - public ModuleRevisionId getParentRevisionId() { - return descriptor.getParentRevisionId(); - } - - public Map getQualifiedExtraAttributes() { - return descriptor.getQualifiedExtraAttributes(); - } - - public boolean isChanging() { - return descriptor.isChanging(); - } - - public boolean isForce() { - return descriptor.isForce(); - } - - public boolean isTransitive() { - return descriptor.isTransitive(); - } -} Index: src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java =================================================================== --- src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java (revision 822319) +++ src/java/org/apache/ivyde/eclipse/revdepexplorer/EditableModuleDescriptor.java (working copy) @@ -1,354 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ -package org.apache.ivyde.eclipse.revdepexplorer; - -import java.io.File; -import java.io.IOException; -import java.text.ParseException; -import java.util.Arrays; -import java.util.Collection; -import java.util.Comparator; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.Map; -import java.util.Set; -import java.util.TreeSet; - -import org.apache.ivy.core.module.descriptor.Artifact; -import org.apache.ivy.core.module.descriptor.Configuration; -import org.apache.ivy.core.module.descriptor.DependencyDescriptor; -import org.apache.ivy.core.module.descriptor.ExcludeRule; -import org.apache.ivy.core.module.descriptor.License; -import org.apache.ivy.core.module.descriptor.ModuleDescriptor; -import org.apache.ivy.core.module.id.ArtifactId; -import org.apache.ivy.core.module.id.ModuleId; -import org.apache.ivy.core.module.id.ModuleRevisionId; -import org.apache.ivy.core.module.id.ModuleRules; -import org.apache.ivy.plugins.conflict.ConflictManager; -import org.apache.ivy.plugins.parser.ModuleDescriptorParser; -import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorWriter; -import org.apache.ivy.plugins.repository.Resource; -import org.apache.ivy.plugins.version.VersionMatcher; - -/** - * This is a editable implementation of a module descriptor; this was created so a module descriptor - * could be modified. This could go away if ivy ever exposes a descriptor where dependencies can be - * added/removed.
- */ -public class EditableModuleDescriptor implements ModuleDescriptor { - private ModuleDescriptor descriptor; - - private Set/* */dependencies; - - private DependencyDescriptorDelta delta = new DependencyDescriptorDelta(); - - private static final Comparator/* */DEFAULT_DEPENDENCY_COMPARATOR = new Comparator() { - public int compare(Object o1, Object o2) { - int result = 0; - - DependencyDescriptor desc1 = (DependencyDescriptor) o1; - DependencyDescriptor desc2 = (DependencyDescriptor) o2; - - result = desc1.getDependencyId().getOrganisation().compareTo( - desc2.getDependencyId().getOrganisation()); - - if (result == 0) { - result = desc1.getDependencyId().getName().compareTo( - desc2.getDependencyId().getName()); - } - - return result; - } - }; - - public EditableModuleDescriptor(ModuleDescriptor descriptor) { - this.descriptor = descriptor; - dependencies = new TreeSet/* */(DEFAULT_DEPENDENCY_COMPARATOR); - dependencies.addAll(Arrays.asList(descriptor.getDependencies())); - } - - public void removeDependency(DependencyDescriptor remove) { - DependencyDescriptor ddToRemove; - if ((ddToRemove = findDependencyDescriptor(dependencies, remove)) != null) { - delta.remove(ddToRemove); - dependencies.remove(ddToRemove); - } - } - - public void addDependency(DependencyDescriptor add) { - add.getDependencyConfigurations(add.getModuleConfigurations()); - - if (findDependencyDescriptor(dependencies, add) == null) { - delta.add(add); - dependencies.add(add); - } - } - - public void removeDependencies(DependencyDescriptor[] removes) { - for (int i = 0; i < removes.length; i++) { - removeDependency(removes[i]); - } - } - - public void removeDependencies(Collection/* */removes) { - removeDependencies((DependencyDescriptor[]) removes - .toArray(new DependencyDescriptor[removes.size()])); - } - - public void addDependencies(DependencyDescriptor[] additions) { - for (int i = 0; i < additions.length; i++) - addDependency(additions[i]); - } - - public void addDependencies(Collection/* */additions) { - addDependencies((DependencyDescriptor[]) additions - .toArray(new DependencyDescriptor[additions.size()])); - } - - public DependencyDescriptor[] getDependencies() { - return (DependencyDescriptor[]) dependencies.toArray(new DependencyDescriptor[dependencies - .size()]); - } - - public boolean isEdited() { - return !delta.isEmpty(); - } - - public boolean dependsOn(VersionMatcher matcher, ModuleDescriptor md) { - for (Iterator iter = dependencies.iterator(); iter.hasNext();) { - DependencyDescriptor dd = (DependencyDescriptor) iter.next(); - if (dd.getDependencyId().equals(md.getModuleRevisionId().getModuleId())) { - if (md.getResolvedModuleRevisionId().getRevision() == null) { - return true; - } - if (matcher.accept(dd.getDependencyRevisionId(), md)) { - return true; - } - } - } - - return false; - } - - /** - * Careful - This method bypasses the module descriptor Parser and Resource and delegates - * directly to XmlModuleDescriptorWriter. - * - * @see org.apache.ivy.core.module.descriptor.ModuleDescriptor#toIvyFile(java.io.File) - */ - public void toIvyFile(File destFile) throws ParseException, IOException { - XmlModuleDescriptorWriter.write(this, destFile); - } - - private DependencyDescriptor findDependencyDescriptor( - Collection/* */findIn, DependencyDescriptor find) { - Iterator iter = findIn.iterator(); - while (iter.hasNext()) { - DependencyDescriptor dependency = (DependencyDescriptor) iter.next(); - if (dependency.getDependencyRevisionId().equals(find.getDependencyRevisionId())) { - return dependency; - } - } - - return null; - } - - // Delegate all of the interface methods --------------------------------- - - public Artifact[] getAllArtifacts() { - return descriptor.getAllArtifacts(); - } - - public Artifact[] getArtifacts(String s) { - return descriptor.getArtifacts(s); - } - - public String getAttribute(String s) { - return descriptor.getAttribute(s); - } - - public Map getAttributes() { - return descriptor.getAttributes(); - } - - public Configuration getConfiguration(String s) { - return descriptor.getConfiguration(s); - } - - public Configuration[] getConfigurations() { - return descriptor.getConfigurations(); - } - - public String[] getConfigurationsNames() { - return descriptor.getConfigurationsNames(); - } - - public ConflictManager getConflictManager(ModuleId moduleid) { - return descriptor.getConflictManager(moduleid); - } - - public String getExtraAttribute(String s) { - return descriptor.getExtraAttribute(s); - } - - public Map getExtraAttributes() { - return descriptor.getExtraAttributes(); - } - - public String getHomePage() { - return descriptor.getHomePage(); - } - - public long getLastModified() { - return descriptor.getLastModified(); - } - - public License[] getLicenses() { - return descriptor.getLicenses(); - } - - public ModuleRevisionId getModuleRevisionId() { - return descriptor.getModuleRevisionId(); - } - - public ModuleDescriptorParser getParser() { - return descriptor.getParser(); - } - - public Date getPublicationDate() { - return descriptor.getPublicationDate(); - } - - public String[] getPublicConfigurationsNames() { - return descriptor.getPublicConfigurationsNames(); - } - - public ModuleRevisionId getResolvedModuleRevisionId() { - return ModuleRevisionId.newInstance(descriptor.getResolvedModuleRevisionId() - .getOrganisation(), descriptor.getResolvedModuleRevisionId().getName(), "revision"); - } - - public Date getResolvedPublicationDate() { - return descriptor.getResolvedPublicationDate(); - } - - public Resource getResource() { - return descriptor.getResource(); - } - - public String getStatus() { - return descriptor.getStatus(); - } - - public boolean isDefault() { - return descriptor.isDefault(); - } - - public boolean canExclude() { - return descriptor.canExclude(); - } - - public boolean doesExclude(String[] as, ArtifactId artifactid) { - return descriptor.doesExclude(as, artifactid); - } - - public ExcludeRule[] getAllExcludeRules() { - return descriptor.getAllExcludeRules(); - } - - public void setResolvedModuleRevisionId(ModuleRevisionId modulerevisionid) { - descriptor.setResolvedModuleRevisionId(modulerevisionid); - } - - public void setResolvedPublicationDate(Date date) { - descriptor.setResolvedPublicationDate(date); - } - - protected class DependencyDescriptorDelta { - private Set/* */added = new HashSet(); - - private Set/* */deleted = new HashSet(); - - public void add(DependencyDescriptor dependency) { - DependencyDescriptor ddToRemove; - if ((ddToRemove = findDependencyDescriptor(deleted, dependency)) != null) { - deleted.remove(ddToRemove); - } else { - added.add(dependency); - } - } - - public void remove(DependencyDescriptor dependency) { - DependencyDescriptor ddToRemove; - if ((ddToRemove = findDependencyDescriptor(added, dependency)) != null) { - added.remove(ddToRemove); - } else { - deleted.add(dependency); - } - } - - public void clear() { - added = new HashSet/* */(); - deleted = new HashSet/* */(); - } - - public boolean isEmpty() { - return added.size() == 0 && deleted.size() == 0; - } - - public Collection/* */getDeletedDeltas() { - return deleted; - } - - public Collection/* */getAddedDeltas() { - return added; - } - } - - public Map getExtraAttributesNamespaces() { - return descriptor.getExtraAttributesNamespaces(); - } - - public Map getExtraInfo() { - return descriptor.getExtraInfo(); - } - - public Artifact getMetadataArtifact() { - return descriptor.getMetadataArtifact(); - } - - public Map getQualifiedExtraAttributes() { - return descriptor.getQualifiedExtraAttributes(); - } - - public String getRevision() { - return descriptor.getRevision(); - } - - public ModuleRules getAllDependencyDescriptorMediators() { - return descriptor.getAllDependencyDescriptorMediators(); - } - public String getDescription() { - return descriptor.getDescription(); - } - - public DependencyDescriptor mediate(DependencyDescriptor arg0) { - return descriptor.mediate(arg0); - } -} Index: src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java =================================================================== --- src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java (revision 822319) +++ src/java/org/apache/ivyde/eclipse/revdepexplorer/SyncIvyFilesJob.java (working copy) @@ -17,19 +17,32 @@ */ package org.apache.ivyde.eclipse.revdepexplorer; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; import java.io.IOException; -import java.text.ParseException; -import java.util.ArrayList; +import java.net.MalformedURLException; import java.util.Arrays; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; +import java.util.Map; import org.apache.ivy.core.module.descriptor.DependencyDescriptor; +import org.apache.ivy.core.module.descriptor.ModuleDescriptor; +import org.apache.ivy.core.module.id.ModuleId; +import org.apache.ivy.core.module.id.ModuleRevisionId; +import org.apache.ivy.plugins.namespace.Namespace; +import org.apache.ivy.plugins.namespace.NamespaceTransformer; +import org.apache.ivy.plugins.parser.xml.UpdateOptions; +import org.apache.ivy.plugins.parser.xml.XmlModuleDescriptorUpdater; import org.apache.ivyde.eclipse.IvyDEException; import org.apache.ivyde.eclipse.IvyPlugin; import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainer; -import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathUtil; +import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainerConfiguration; +import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.resources.WorkspaceJob; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; @@ -37,6 +50,7 @@ import org.eclipse.core.runtime.MultiStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.Status; +import org.xml.sax.SAXException; /** * This job synchronizes all ivy files in a workspace according to the new revisions specified in @@ -46,10 +60,47 @@ private MultiRevisionDependencyDescriptor[] multiRevisionDependencies; + /** + * FIXME Here we seriously abuse the Ivy core API to allow us to preserve an info element + * containing no revision attribute. Ivy code should be altered to allow us to preserve + * revision (including the lack of its definition!). + */ + private class RevisionPreservingNamespace extends Namespace { + private class NullableRevisionModuleRevisionId extends ModuleRevisionId { + private String revision; + + public NullableRevisionModuleRevisionId(ModuleId moduleId, String revision) { + super(moduleId, revision); + this.revision = revision; + } + + public String getRevision() { + return revision; + } + } + + private class RevisionPreservingNamespaceTransformer implements NamespaceTransformer { + public boolean isIdentity() { + return false; + } + + public ModuleRevisionId transform(ModuleRevisionId mrid) { + if(mrid.getRevision().contains("working@")) { + return new NullableRevisionModuleRevisionId(mrid.getModuleId(), null); + } + return new ModuleRevisionId(mrid.getModuleId(), mrid.getRevision()); + } + } + + public NamespaceTransformer getToSystemTransformer() { + return new RevisionPreservingNamespaceTransformer(); + } + } + public SyncIvyFilesJob(MultiRevisionDependencyDescriptor[] multiRevisionDependencies) { super("Synchronizing Ivy Files"); this.multiRevisionDependencies = multiRevisionDependencies; - } + } protected IStatus executeJob(IProgressMonitor monitor) { MultiStatus errorStatuses = new MultiStatus(IvyPlugin.ID, IStatus.ERROR, @@ -59,10 +110,9 @@ for (int i = 0; i < containers.length; i++) { IvyClasspathContainer container = containers[i]; - EditableModuleDescriptor moduleDescriptor; + ModuleDescriptor moduleDescriptor; try { - moduleDescriptor = new EditableModuleDescriptor(container.getState() - .getModuleDescriptor()); + moduleDescriptor = container.getState().getModuleDescriptor(); } catch (IvyDEException e) { errorStatuses .add(new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR, @@ -70,36 +120,47 @@ + container.getConf().getIvyXmlPath(), e)); continue; } - Collection/* */newRevisions = getNewRevisions(container); - - Iterator multiRevisionIter = newRevisions.iterator(); - while (multiRevisionIter.hasNext()) { - MultiRevisionDependencyDescriptor newRevision = (MultiRevisionDependencyDescriptor) multiRevisionIter - .next(); - - DependencyDescriptor dependencyDescriptors[] = moduleDescriptor.getDependencies(); - for (int j = 0; j < dependencyDescriptors.length; j++) { - DependencyDescriptor dependencyDescriptor = dependencyDescriptors[j]; - if (newRevision.getModuleId().equals(dependencyDescriptor.getDependencyId())) { - EditableDependencyDescriptor editableDependencyDescriptor = new EditableDependencyDescriptor( - dependencyDescriptor); - editableDependencyDescriptor.setRevision(newRevision.getNewRevision()); - moduleDescriptor.removeDependency(dependencyDescriptor); - moduleDescriptor.addDependency(editableDependencyDescriptor); + + Map/* */ newRevisions = new HashMap/**/(); + + DependencyDescriptor[] dependencies = moduleDescriptor.getDependencies(); + for(int j = 0; j < dependencies.length; j++) { + for (int k = 0; k < multiRevisionDependencies.length; k++) { + MultiRevisionDependencyDescriptor multiRevision = multiRevisionDependencies[k]; + ModuleRevisionId dependencyRevisionId = dependencies[j].getDependencyRevisionId(); + if (dependencies[j].getDependencyId().equals(multiRevision.getModuleId()) && + multiRevision.hasNewRevision() && multiRevision.isForContainer(container)) { + newRevisions.put(dependencyRevisionId, multiRevisionDependencies[k].getNewRevision()); + break; // move on to the next dependency } } } - - try { - IvyClasspathUtil.toIvyFile(moduleDescriptor, container); - } catch (ParseException e) { + + UpdateOptions updateOptions = new UpdateOptions() + .setResolvedRevisions(newRevisions) + .setReplaceInclude(false) + .setGenerateRevConstraint(false) + .setNamespace(new RevisionPreservingNamespace()); + File ivyFile = container.getState().getIvyFile(); + + File ivyTempFile = new File(ivyFile.toString() + ".temp"); + try { + XmlModuleDescriptorUpdater.update(ivyFile.toURI().toURL(), ivyTempFile, updateOptions); + saveChanges(container, ivyFile, ivyTempFile); + } catch (MalformedURLException e) { errorStatuses.add(new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR, - "Failed to write Ivy file " + container.getState().getIvyFile().getPath(), - e)); + "Failed to write Ivy file " + container.getState().getIvyFile().getPath() + + " (malformed URL)", e)); } catch (IOException e) { errorStatuses.add(new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR, "Failed to write Ivy file " + container.getState().getIvyFile().getPath(), e)); + } catch (SAXException e) { + errorStatuses.add(new Status(IStatus.ERROR, IvyPlugin.ID, IStatus.ERROR, + "Failed to write Ivy file " + container.getState().getIvyFile().getPath(), + e)); + } finally { + ivyTempFile.delete(); } } @@ -135,24 +196,20 @@ .size()]); } - /** - * Return the new revision changes for a given project
- * - * @param project - * project - * @return multiRevision descriptors - */ - private Collection/* */getNewRevisions( - IvyClasspathContainer container) { - Collection/* */list = new ArrayList(); - - for (int i = 0; i < multiRevisionDependencies.length; i++) { - MultiRevisionDependencyDescriptor multiRevision = multiRevisionDependencies[i]; - if (multiRevision.hasNewRevision() && multiRevision.isForContainer(container)) { - list.add(multiRevision); + private void saveChanges(IvyClasspathContainer container, File permanentSaveTarget, File temporaryChanges) throws IOException { + IvyClasspathContainerConfiguration conf = container.getConf(); + IFile virtualIvyFile = conf.getJavaProject().getProject().getFile(conf.getIvyXmlPath()); + IStatus writable = virtualIvyFile.getWorkspace().validateEdit(new IFile[] {virtualIvyFile}, + IWorkspace.VALIDATE_PROMPT); + if (writable.isOK()) { + FileWriter writer = new FileWriter(permanentSaveTarget, false); + BufferedReader reader = new BufferedReader(new FileReader(temporaryChanges)); + while(reader.ready()) { + writer.write(reader.readLine() + "\n"); } + writer.flush(); + writer.close(); + reader.close(); } - - return list; - } + } }