Index: modules/dnet-modular-workflows-ui/trunk/src/main/java/eu/dnetlib/functionality/modular/ui/workflows/controllers/WorkflowsController.java
===================================================================
--- modules/dnet-modular-workflows-ui/trunk/src/main/java/eu/dnetlib/functionality/modular/ui/workflows/controllers/WorkflowsController.java	(revision 58437)
+++ modules/dnet-modular-workflows-ui/trunk/src/main/java/eu/dnetlib/functionality/modular/ui/workflows/controllers/WorkflowsController.java	(revision 58438)
@@ -65,7 +65,7 @@
 
 /**
  * Web controller for the UI
- * 
+ *
  * @author Michele Artini
  */
 
@@ -77,18 +77,18 @@
 		@Override
 		public ProcessListEntry apply(final Map<String, String> input) {
 			final String name = input.get(WorkflowsConstants.SYSTEM_WF_PROFILE_NAME);
-			
-			String repo = "";
-			if (input.containsKey(WorkflowsConstants.DATAPROVIDER_NAME)) {
-				repo += input.get(WorkflowsConstants.DATAPROVIDER_NAME);
-			}
+
+			final String repo = input.containsKey(WorkflowsConstants.DATAPROVIDER_NAME) ? input.get(WorkflowsConstants.DATAPROVIDER_NAME) : "";
+			final String repoId = input.containsKey(WorkflowsConstants.DATAPROVIDER_ORIGINALID) ? input.get(WorkflowsConstants.DATAPROVIDER_ORIGINALID) : "";
+			final String apiId = input.containsKey(WorkflowsConstants.DATAPROVIDER_INTERFACE) ? input.get(WorkflowsConstants.DATAPROVIDER_INTERFACE) : "";
+
 			final String procId = input.get(WorkflowsConstants.SYSTEM_WF_PROCESS_ID);
 			final String wfId = input.get(WorkflowsConstants.SYSTEM_WF_PROFILE_ID);
 			final String family = input.get(WorkflowsConstants.SYSTEM_WF_PROFILE_FAMILY);
 			final long date = NumberUtils.toLong(input.get(LogMessage.LOG_DATE_FIELD), 0);
 			final String status = Boolean.valueOf(input.get(WorkflowsConstants.SYSTEM_COMPLETED_SUCCESSFULLY)) ? "SUCCESS" : "FAILURE";
-		
-			return new ProcessListEntry(procId, wfId, name, family, status, date, repo);
+
+			return new ProcessListEntry(procId, wfId, name, family, status, date, repo, repoId, apiId);
 		}
 	}
 
@@ -119,7 +119,8 @@
 	private static final Log log = LogFactory.getLog(WorkflowsController.class);
 
 	@RequestMapping("/ui/list_metaworkflows.json")
-	public @ResponseBody List<MetaWorkflowDescriptor> listMetaWorflowsForSection(@RequestParam(value = "section", required = false) final String sectionName, @RequestParam(value = "dsId", required = false) final String dsId)
+	public @ResponseBody List<MetaWorkflowDescriptor> listMetaWorflowsForSection(@RequestParam(value = "section", required = false) final String sectionName,
+			@RequestParam(value = "dsId", required = false) final String dsId)
 			throws ISLookUpException, IOException {
 		if (sectionName != null) {
 			return workflowSectionGrouper.listMetaWorflowsForSection(sectionName);
@@ -148,15 +149,15 @@
 	@RequestMapping("/ui/wf_atomic_workflow.img")
 	public void showAtomicWorkflow(final HttpServletResponse response, @RequestParam(value = "id", required = true) final String id) throws Exception {
 
-		String xml = profileToSarasvatiConverter.getSarasvatiWorkflow(id).getWorkflowXml();
-		Set<String> notConfiguredNodes = isLookupClient.getNotConfiguredNodes(id);
-		BufferedImage image = processGraphGenerator.getWfDescImage(id, xml, notConfiguredNodes);
+		final String xml = profileToSarasvatiConverter.getSarasvatiWorkflow(id).getWorkflowXml();
+		final Set<String> notConfiguredNodes = isLookupClient.getNotConfiguredNodes(id);
+		final BufferedImage image = processGraphGenerator.getWfDescImage(id, xml, notConfiguredNodes);
 		sendImage(response, image);
 	}
 
 	private void sendImage(final HttpServletResponse response, final BufferedImage image) throws IOException {
 		response.setContentType("image/png");
-		OutputStream out = response.getOutputStream();
+		final OutputStream out = response.getOutputStream();
 		ImageIO.write(image, "png", out);
 		out.flush();
 		out.close();
@@ -181,13 +182,13 @@
 
 	@RequestMapping("/ui/wf_metaworkflow.edit")
 	public @ResponseBody boolean scheduleMetaWorkflow(@RequestParam(value = "json", required = true) final String json) throws Exception {
-		
-		final AdvancedMetaWorkflowDescriptor info = (new Gson()).fromJson(json, AdvancedMetaWorkflowDescriptor.class);
 
+		final AdvancedMetaWorkflowDescriptor info = new Gson().fromJson(json, AdvancedMetaWorkflowDescriptor.class);
+
 		log.info("Updating workflow " + info.getName());
 
 		final String xml = isLookupClient.getProfile(info.getWfId());
-		boolean res = isRegistryClient.updateSarasvatiMetaWorkflow(info.getWfId(), xml, info);
+		final boolean res = isRegistryClient.updateSarasvatiMetaWorkflow(info.getWfId(), xml, info);
 
 		return res;
 	}
@@ -198,17 +199,19 @@
 
 		if (name.trim().length() > 0) {
 			final String xml = isLookupClient.getProfile(id);
-			SAXReader reader = new SAXReader();
-			Document doc = reader.read(new StringReader(xml));
+			final SAXReader reader = new SAXReader();
+			final Document doc = reader.read(new StringReader(xml));
 			doc.selectSingleNode("//METAWORKFLOW_NAME").setText(name);
-			for (Object o : doc.selectNodes("//WORKFLOW")) {
-				Element n = (Element) o;
-				String atomWfXml = isLookupClient.getProfile(n.valueOf("@id"));
-				String newAtomWfId = isRegistryClient.registerProfile(atomWfXml);
+			for (final Object o : doc.selectNodes("//WORKFLOW")) {
+				final Element n = (Element) o;
+				final String atomWfXml = isLookupClient.getProfile(n.valueOf("@id"));
+				final String newAtomWfId = isRegistryClient.registerProfile(atomWfXml);
 				n.addAttribute("id", newAtomWfId);
 			}
 			return isRegistryClient.registerProfile(doc.asXML());
-		} else throw new IllegalArgumentException("Name is empty");
+		} else {
+			throw new IllegalArgumentException("Name is empty");
+		}
 	}
 
 	@RequestMapping("/ui/wf_proc_node.json")
@@ -217,7 +220,7 @@
 
 		final NodeToken token = findNodeToken(pid, nid);
 
-		final NodeTokenInfo info = (token == null) ? new NodeTokenInfo(findNodeName(pid, nid)) : new NodeTokenInfo(token);
+		final NodeTokenInfo info = token == null ? new NodeTokenInfo(findNodeName(pid, nid)) : new NodeTokenInfo(token);
 
 		return info;
 	}
@@ -225,8 +228,8 @@
 	private NodeToken findNodeToken(final String pid, final long nid) {
 		final GraphProcess process = graphProcessRegistry.findProcess(pid);
 		if (process != null) {
-			for (NodeToken token : process.getNodeTokens()) {
-				if (token.getNode().getId() == nid) return token;
+			for (final NodeToken token : process.getNodeTokens()) {
+				if (token.getNode().getId() == nid) { return token; }
 			}
 		}
 		return null;
@@ -235,97 +238,99 @@
 	private String findNodeName(final String pid, final long nid) {
 		final GraphProcess process = graphProcessRegistry.findProcess(pid);
 		if (process != null) {
-			for (Node node : process.getGraph().getNodes()) {
-				if (node.getId() == nid) return node.getName();
+			for (final Node node : process.getGraph().getNodes()) {
+				if (node.getId() == nid) { return node.getName(); }
 			}
 		}
 		return "-";
 	}
 
-
 	@RequestMapping("/ui/wf_proc.img")
 	public void showProcessWorkflow(final HttpServletResponse response, @RequestParam(value = "id", required = true) final String id) throws Exception {
-		BufferedImage image = processGraphGenerator.getProcessImage(id);
+		final BufferedImage image = processGraphGenerator.getProcessImage(id);
 		sendImage(response, image);
 	}
 
 	@RequestMapping("/ui/wf_proc.kill")
 	public @ResponseBody boolean killProcessWorkflow(@RequestParam(value = "id", required = true) final String id) throws Exception {
-		GraphProcess proc = graphProcessRegistry.findProcess(id);
+		final GraphProcess proc = graphProcessRegistry.findProcess(id);
 		proc.setState(ProcessState.Canceled);
 		return true;
 	}
-	
+
 	@RequestMapping("/ui/wf_journal.range")
 	public @ResponseBody Collection<ProcessListEntry> rangeWfJournal(@RequestParam(value = "start", required = true) final String start,
 			@RequestParam(value = "end", required = true) final String end) throws Exception {
-		
+
 		final Map<String, ProcessListEntry> res = Maps.newHashMap();
-		
+
 		final DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
 		final DateTime startDate = formatter.parseDateTime(start);
 		final DateTime endDate = formatter.parseDateTime(end).plusHours(23).plusMinutes(59).plusSeconds(59);
-		
+
 		final Iterator<ProcessListEntry> iter = Iterators.transform(dnetLogger.range(startDate.toDate(), endDate.toDate()), new JournalEntryFunction());
 		while (iter.hasNext()) {
-			ProcessListEntry e = iter.next();
+			final ProcessListEntry e = iter.next();
 			res.put(e.getProcId(), e);
 		}
-		
-		long now = DateUtils.now();
+
+		final long now = DateUtils.now();
 		if (startDate.isBefore(now) && endDate.isAfter(now)) {
-			for (String pid : graphProcessRegistry.listIdentifiers()) {
+			for (final String pid : graphProcessRegistry.listIdentifiers()) {
 				final GraphProcess proc = graphProcessRegistry.findProcess(pid);
 				res.put(pid, new ProcessListEntry(pid, proc));
 			}
 		}
-	
+
 		return res.values();
-		
+
 	}
 
 	@RequestMapping("/ui/wf_journal.find")
 	public @ResponseBody Collection<ProcessListEntry> findWfJournal(@RequestParam(value = "wfs", required = true) final String wfs) {
 		final Map<String, ProcessListEntry> res = Maps.newHashMap();
-		
-		final Set<String> wfFilter = (new Gson()).fromJson(wfs, new TypeToken<Set<String>>(){}.getType());
-				
-		for (String wfId : wfFilter) {
-			final Iterator<ProcessListEntry> iter = Iterators.transform(dnetLogger.find(WorkflowsConstants.SYSTEM_WF_PROFILE_ID, wfId), new JournalEntryFunction());
+
+		final Set<String> wfFilter = new Gson().fromJson(wfs, new TypeToken<Set<String>>() {}.getType());
+
+		for (final String wfId : wfFilter) {
+			final Iterator<ProcessListEntry> iter =
+					Iterators.transform(dnetLogger.find(WorkflowsConstants.SYSTEM_WF_PROFILE_ID, wfId), new JournalEntryFunction());
 			while (iter.hasNext()) {
-				ProcessListEntry e = iter.next();
+				final ProcessListEntry e = iter.next();
 				res.put(e.getProcId(), e);
 			}
 		}
-		
-		for (String pid : graphProcessRegistry.listIdentifiers()) {
+
+		for (final String pid : graphProcessRegistry.listIdentifiers()) {
 			final GraphProcess proc = graphProcessRegistry.findProcess(pid);
 			if (wfFilter.contains(ProcessUtils.calculateWfId(proc))) {
 				res.put(pid, new ProcessListEntry(pid, proc));
 			}
 		}
-		
+
 		return res.values();
 	}
-		
+
 	@RequestMapping("/ui/wf_journal_byFamily.find")
-	public @ResponseBody Collection<ProcessListEntry> findWfJournalByFamily(@RequestParam(value = "family", required = true) final String family) throws IOException {
-		final Iterator<ProcessListEntry> iter = Iterators.transform(dnetLogger.find(WorkflowsConstants.SYSTEM_WF_PROFILE_FAMILY, family), new JournalEntryFunction());
+	public @ResponseBody Collection<ProcessListEntry> findWfJournalByFamily(@RequestParam(value = "family", required = true) final String family)
+			throws IOException {
+		final Iterator<ProcessListEntry> iter =
+				Iterators.transform(dnetLogger.find(WorkflowsConstants.SYSTEM_WF_PROFILE_FAMILY, family), new JournalEntryFunction());
 		return Lists.newArrayList(iter);
 	}
-		
+
 	@RequestMapping("/ui/wf_journal.get")
 	public @ResponseBody Map<String, Object> getWfJournalLog(@RequestParam(value = "id", required = true) final String id) throws Exception {
 		final Map<String, Object> res = Maps.newHashMap();
-		
+
 		final Map<String, String> logs = dnetLogger.findOne("system:processId", id);
 
 		if (logs != null && !logs.isEmpty()) {
 			final List<String> keys = Lists.newArrayList(logs.keySet());
 			Collections.sort(keys);
-			
+
 			final List<Map<String, String>> journalEntry = Lists.newArrayList();
-			for (String k : keys) {
+			for (final String k : keys) {
 				final Map<String, String> m = Maps.newHashMap();
 				m.put("name", k);
 				m.put("value", logs.get(k));
@@ -333,12 +338,12 @@
 			}
 			res.put("journal", journalEntry);
 		}
-		
+
 		final GraphProcess process = graphProcessRegistry.findProcess(id);
-	
+
 		if (process != null) {
-			final String mapContent = (process.getState() == ProcessState.Created) ? "" : processGraphGenerator.getProcessImageMap(id);
-	
+			final String mapContent = process.getState() == ProcessState.Created ? "" : processGraphGenerator.getProcessImageMap(id);
+
 			String status = "";
 			if (!process.isComplete()) {
 				status = process.getState().toString().toUpperCase();
@@ -347,16 +352,17 @@
 			} else {
 				status = "FAILURE";
 			}
-	
-			final String img = (process.getState() == ProcessState.Created) ? "../resources/img/notStarted.gif" : "wf_proc.img?id=" + id + "&t=" + DateUtils.now();
-			
+
+			final String img =
+					process.getState() == ProcessState.Created ? "../resources/img/notStarted.gif" : "wf_proc.img?id=" + id + "&t=" + DateUtils.now();
+
 			final String name = process.getGraph().getName();
-			
+
 			final long startDate = NumberUtils.toLong(process.getEnv().getAttribute(WorkflowsConstants.SYSTEM_START_DATE), 0);
 			final long endDate = NumberUtils.toLong(process.getEnv().getAttribute(WorkflowsConstants.SYSTEM_END_DATE), 0);
-	
+
 			final AtomicWorkflowDescriptor wf = new AtomicWorkflowDescriptor(id, name, status, mapContent, img, true, "auto", "RUNNING", startDate, endDate);
-		
+
 			res.put("graph", wf);
 		}
 
@@ -370,22 +376,23 @@
 
 		return value;
 	}
-	
+
 	@RequestMapping("/ui/workflow_user_params.json")
 	public @ResponseBody List<NodeWithUserParams> listWorkflowUserParams(@RequestParam(value = "wf", required = true) final String wfId) throws Exception {
 		return isLookupClient.listWorkflowUserParams(wfId);
-	}	
+	}
 
-	@RequestMapping(value="/ui/save_user_params.do")
-	public @ResponseBody boolean saveWorkflowUserParams(@RequestParam(value = "wf", required = true) final String wfId, @RequestParam(value = "params", required = true) final String jsonParams) throws Exception {
-		
+	@RequestMapping(value = "/ui/save_user_params.do")
+	public @ResponseBody boolean saveWorkflowUserParams(@RequestParam(value = "wf", required = true) final String wfId,
+			@RequestParam(value = "params", required = true) final String jsonParams) throws Exception {
+
 		final String xml = isLookupClient.getProfile(wfId);
-		
-		final List<NodeWithUserParams> params = new Gson().fromJson(jsonParams,  new TypeToken<List<NodeWithUserParams>>(){}.getType());
-		
-		boolean res = isRegistryClient.updateSarasvatiWorkflow(wfId, xml, params);
 
-		for (String metaWfId : isLookupClient.listMetaWorflowsForWfId(wfId)) {
+		final List<NodeWithUserParams> params = new Gson().fromJson(jsonParams, new TypeToken<List<NodeWithUserParams>>() {}.getType());
+
+		final boolean res = isRegistryClient.updateSarasvatiWorkflow(wfId, xml, params);
+
+		for (final String metaWfId : isLookupClient.listMetaWorflowsForWfId(wfId)) {
 			if (isLookupClient.isExecutable(metaWfId)) {
 				isRegistryClient.updateMetaWorkflowStatus(metaWfId, WorkflowStatus.EXECUTABLE);
 			} else {
@@ -392,7 +399,7 @@
 				isRegistryClient.updateMetaWorkflowStatus(metaWfId, WorkflowStatus.WAIT_USER_SETTINGS);
 			}
 		}
-		
+
 		return res;
 	}
 
Index: modules/dnet-modular-workflows-ui/trunk/src/main/java/eu/dnetlib/functionality/modular/ui/workflows/objects/ProcessListEntry.java
===================================================================
--- modules/dnet-modular-workflows-ui/trunk/src/main/java/eu/dnetlib/functionality/modular/ui/workflows/objects/ProcessListEntry.java	(revision 58437)
+++ modules/dnet-modular-workflows-ui/trunk/src/main/java/eu/dnetlib/functionality/modular/ui/workflows/objects/ProcessListEntry.java	(revision 58438)
@@ -7,6 +7,7 @@
 import eu.dnetlib.msro.workflows.util.ProcessUtils;
 
 public class ProcessListEntry {
+
 	private String procId;
 	private String wfId;
 	private String name;
@@ -14,10 +15,13 @@
 	private String status;
 	private long date;
 	private String repo;
-	
+	private String repoId;
+	private String apiId;
+
 	public ProcessListEntry() {}
 
-	public ProcessListEntry(String procId, String wfId, String name, String family, String status, long date, String repo) {
+	public ProcessListEntry(final String procId, final String wfId, final String name, final String family, final String status, final long date,
+			final String repo, final String repoId, final String apiId) {
 		this.procId = procId;
 		this.wfId = wfId;
 		this.name = name;
@@ -25,20 +29,25 @@
 		this.status = status;
 		this.date = date;
 		this.repo = repo;
+		this.repoId = repoId;
+		this.apiId = apiId;
 	}
 
-	public ProcessListEntry(String procId, String wfId, String name, String family, String status, Date date, String repo) {
-		this(procId, wfId, name, family, status, dateToLong(date), repo);
+	public ProcessListEntry(final String procId, final String wfId, final String name, final String family, final String status, final Date date,
+			final String repo, final String repoId, final String apiId) {
+		this(procId, wfId, name, family, status, dateToLong(date), repo, repoId, apiId);
 	}
-	
+
 	public ProcessListEntry(final String procId, final GraphProcess process) {
-		this(procId, 
-				ProcessUtils.calculateWfId(process), 
+		this(procId,
+				ProcessUtils.calculateWfId(process),
 				ProcessUtils.calculateName(process),
 				ProcessUtils.calculateFamily(process),
 				ProcessUtils.calculateStatus(process),
 				ProcessUtils.calculateLastActivityDate(process),
-				ProcessUtils.calculateRepo(process));
+				ProcessUtils.calculateRepo(process),
+				ProcessUtils.calculateRepoId(process),
+				ProcessUtils.calculateApiId(process));
 	}
 
 	public String getProcId() {
@@ -45,7 +54,7 @@
 		return procId;
 	}
 
-	public void setProcId(String procId) {
+	public void setProcId(final String procId) {
 		this.procId = procId;
 	}
 
@@ -53,7 +62,7 @@
 		return name;
 	}
 
-	public void setName(String name) {
+	public void setName(final String name) {
 		this.name = name;
 	}
 
@@ -61,7 +70,7 @@
 		return status;
 	}
 
-	public void setStatus(String status) {
+	public void setStatus(final String status) {
 		this.status = status;
 	}
 
@@ -73,7 +82,7 @@
 		return wfId;
 	}
 
-	public void setWfId(String wfId) {
+	public void setWfId(final String wfId) {
 		this.wfId = wfId;
 	}
 
@@ -81,11 +90,11 @@
 		return date;
 	}
 
-	public void setDate(long date) {
+	public void setDate(final long date) {
 		this.date = date;
 	}
 
-	public void setFamily(String family) {
+	public void setFamily(final String family) {
 		this.family = family;
 	}
 
@@ -93,12 +102,28 @@
 		return repo;
 	}
 
-	public void setRepo(String repo) {
+	public void setRepo(final String repo) {
 		this.repo = repo;
 	}
-	
-	private static long dateToLong(Date date) {
-		return (date == null) ? Long.MAX_VALUE : date.getTime();
+
+	private static long dateToLong(final Date date) {
+		return date == null ? Long.MAX_VALUE : date.getTime();
 	}
 
+	public String getRepoId() {
+		return repoId;
+	}
+
+	public void setRepoId(final String repoId) {
+		this.repoId = repoId;
+	}
+
+	public String getApiId() {
+		return apiId;
+	}
+
+	public void setApiId(final String apiId) {
+		this.apiId = apiId;
+	}
+
 }
Index: modules/dnet-modular-workflows-ui/trunk/src/main/resources/eu/dnetlib/web/resources/js/dnet_wf_journal.js
===================================================================
--- modules/dnet-modular-workflows-ui/trunk/src/main/resources/eu/dnetlib/web/resources/js/dnet_wf_journal.js	(revision 58437)
+++ modules/dnet-modular-workflows-ui/trunk/src/main/resources/eu/dnetlib/web/resources/js/dnet_wf_journal.js	(revision 58438)
@@ -93,7 +93,7 @@
 			columnDefs: [{field: 'procId', displayName: 'Process ID'      , width: '15%', cellTemplate: '<div class="ngCellText"><a href="javascript:void(0)" ng-click="showProcess(row.getProperty(col.field))">{{row.getProperty(col.field)}}</a></div>'},
 			             {field: 'name'  , displayName: 'Workflow name'   , width: '20%',},
 			             {field: 'family', displayName: 'Workflow family' , width: '15%' },
-			             {field: 'repo'  , displayName: 'Datasource'  },
+			             {field: 'repo'  , displayName: 'Datasource', cellTemplate: '<div class="ngCellText"><a href="repoApis.do#/api/{{row.getProperty(\'repoId\')}}/{{row.getProperty(\'apiId\')}}/ALL/ALL" ng-if="row.getProperty(\'repoId\') && row.getProperty(\'apiId\') && row.getProperty(\'repo\')">{{row.getProperty(col.field)}}</a><span ng-if="!(row.getProperty(\'repoId\') && row.getProperty(\'apiId\'))">{{row.getProperty(col.field)}}</span></div>'},
 			             {field: 'status', displayName: 'Status'          , width: '10%', cellTemplate: '<div class="ngCellText"><span class="label label-default" ng-class="{ \'label-success\': row.getProperty(col.field) == \'SUCCESS\', \'label-danger\': row.getProperty(col.field) == \'FAILURE\', \'label-info\': row.getProperty(col.field) == \'EXECUTING\'}">{{row.getProperty(col.field)}}</span></div>'},
 			             {field: 'date'  , displayName: 'Date'            , width: '10%', cellTemplate: '<div class="ngCellText">{{ (row.getProperty("date") > 0 && row.getProperty("date") < 9999999999999) ? (row.getProperty("date") | date:"yyyy-MM-dd HH:mm:ss") : "not yet started" }}</div>'}
 			            ]
Index: modules/dnet-modular-workflows-ui/trunk/pom.xml
===================================================================
--- modules/dnet-modular-workflows-ui/trunk/pom.xml	(revision 58437)
+++ modules/dnet-modular-workflows-ui/trunk/pom.xml	(revision 58438)
@@ -22,7 +22,7 @@
 		<dependency>
 			<groupId>eu.dnetlib</groupId>
 			<artifactId>dnet-msro-service</artifactId>
-			<version>[3.0.0,4.0.0)</version>
+			<version>[3.2.7,4.0.0)</version>
 		</dependency>
 		<dependency>
 			<groupId>joda-time</groupId>
Index: modules/dnet-modular-workflows-ui/trunk
===================================================================
--- modules/dnet-modular-workflows-ui/trunk	(revision 58437)
+++ modules/dnet-modular-workflows-ui/trunk	(revision 58438)

Property changes on: modules/dnet-modular-workflows-ui/trunk
___________________________________________________________________
Modified: svn:ignore
## -2,4 +2,5 ##
 .settings
 .classpath
 .project
+.factorypath
 *.iml
