aboutsummaryrefslogtreecommitdiffstats
path: root/Framework/hu.bme.mit.inf.dslreasoner.logic.model/src/hu/bme/mit/inf/dslreasoner/workspace/ProjectWorkspace.xtend
blob: c7e4dcbf7517bfd149f52965da9e2236747cb8e6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package hu.bme.mit.inf.dslreasoner.workspace

import java.io.BufferedReader
import java.io.ByteArrayInputStream
import java.io.IOException
import java.io.InputStreamReader
import org.eclipse.core.resources.IContainer
import org.eclipse.core.resources.IFolder
import org.eclipse.core.resources.IProject
import org.eclipse.core.resources.IWorkspaceRoot
import org.eclipse.core.resources.ResourcesPlugin
import org.eclipse.core.runtime.NullProgressMonitor
import org.eclipse.emf.common.util.URI

class ProjectWorkspace extends ReasonerWorkspace{
	
	val monitor = new NullProgressMonitor
	var IContainer target;
	
	new(String targetFolder, String prefix) {
		super(targetFolder, prefix)
	}
	
	override protected getURI(String name) {
		URI.createURI(targetFolder + "/" + prefix + name,true);
	}
	
	def protected getDirUri() {
		URI.createURI(targetFolder,true)
	}
	
	override getWorkspaceURI() {
		getDirUri
	}
	
	override initAndClear() {
		target = ResourcesPlugin.workspace.root
		
		val segments = if(dirUri.platformResource) {
			dirUri.segments.subList(1,dirUri.segments.size)
		} else {
			throw new UnsupportedOperationException('''Only platform resources are supported, but recieved: "«dirUri»"!''')
		}
		for(nameSegment : segments) {
			target = createContainer(target,nameSegment)
		}
		target.members.forEach[delete(false,monitor)]
	}
	
	def protected dispatch createContainer(IWorkspaceRoot root, String name) {
		val project = root.getProject(name)
		if(project.exists) {
			if(!project.open) {
				project.open(monitor)
			}
		} else {
			project.create(monitor)
		}
		return project
	}
	
	def protected dispatch createContainer(IProject root, String name) {
		val folder = root.getFolder(name);
		if(!folder.exists) {
			folder.create(true,true,monitor)
		}
		return folder
	}
	
	def protected dispatch createContainer(IFolder root, String name) {
		val folder = root.getFolder(name);
		if(!folder.exists) {
			folder.create(true,true,monitor)
		}
		return folder
	}
	
	def dispatch getTargetFile(IFolder targetFolder, String name) { targetFolder.getFile(name) }
	def dispatch getTargetFile(IProject targetProject, String name) { targetProject.getFile(name) }
	
	override writeText(String name, CharSequence content) {
		val file = target.getTargetFile(name);
		if(!file.exists()) {
			file.create(new ByteArrayInputStream(content.toString().getBytes()),true, new NullProgressMonitor());
			return URI.createPlatformResourceURI(file.projectRelativePath.toString,true)
		}
		else throw new IOException("The file is already existing.")
	}
	
	override readText(String name) {		
		val file = target.getTargetFile(name)
		val in = new BufferedReader(new InputStreamReader(file.contents))
		
		var result = ""
		var String line;
		
		while ((line = in.readLine()) != null) {
			result = result.concat(line)
		}
		
        return result
	}
	
	override protected renameFile(String name) {
		throw new UnsupportedOperationException("TODO: auto-generated method stub")
	}
	
	override subWorkspace(String targetFolder, String prefix) {
		return new ProjectWorkspace(this.targetFolder+"/"+targetFolder,this.prefix + prefix);
	}
	
	override allFiles() {
		target.members.map[it.name]
	}
	
}