Skip to main content
summaryrefslogtreecommitdiffstats
blob: e077166050a186306d343fc96f80338b475d0381 (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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*******************************************************************************
 * Copyright (c) 2006, 2012 Oracle. 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:
 *     Oracle - initial API and implementation
 ******************************************************************************/
package org.eclipse.jpt.jpa.core;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.jpt.common.core.JptResourceModel;

/**
 * A JPA Project contains JPA files for all files in the project that
 * are relevant to the JPA spec.
 * <p>
 * To retrieve the JPA file corresponding to an Eclipse file:
 * <pre>
 * IFile file = (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember("Foo.java");
 * JpaFile jpaFile = (JpaFile) file.getAdapter(JpaFile.class);
 * </pre>
 * This is a non-blocking call; and as a result it will return <code>null</code>
 * if the JPA file or its JPA project is currently under construction. Use a
 * {@link Reference JPA file reference} to retrieve a JPA file in a blocking
 * fashion that will return a JPA file once it and its JPA project have been
 * constructed.
 * <p>
 * See <code>org.eclipse.jpt.jpa.core/plugin.xml</code>.
 * <p>
 * Provisional API: This interface is part of an interim API that is still
 * under development and expected to change significantly before reaching
 * stability. It is available at this early stage to solicit feedback from
 * pioneering adopters on the understanding that any code that uses this API
 * will almost certainly be broken (repeatedly) as the API evolves.
 * 
 * @version 2.2
 * @since 2.0
 * 
 * @see Reference
 * @see org.eclipse.jpt.jpa.core.internal.FileAdapterFactory
 */
public interface JpaFile
	extends JpaNode
{
	/**
	 * Return the JPA file's Eclipse file.
	 */
	IFile getFile();
	
	/**
	 * Return the JPA file's content type.
	 */
	IContentType getContentType();
	
	/**
	 * Return the resource model corresponding to the JPA file; typically a JPA
	 * compilation unit, a JPA XML resource, or a JPA package fragment root (JAR).
	 */
	JptResourceModel getResourceModel();
	
	/**
	 * Convenience method. Return the resource model corresponding to the JPA
	 * file if the file's content is a "kind-of" the specified content type;
	 * otherwise, return null. This is useful when a client has looked up the
	 * JPA file via a file name [and assumed content type].
	 * @see #getResourceModel()
	 */
	JptResourceModel getResourceModel(IContentType contentType);
	
	
	// ********** root structure nodes **********

	/**
	 * Return the JPA file's root structure nodes.
	 */
	Iterable<JpaStructureNode> getRootStructureNodes();
		String ROOT_STRUCTURE_NODES_COLLECTION = "rootStructureNodes"; //$NON-NLS-1$

	/**
	 * Return the count of the JPA file's root context model objects.
	 */
	int getRootStructureNodesSize();

	/**
	 * Add a root structure node.
	 * There is the potential for multiple root structure nodes 
	 * for a particular key. For example, a Java type can be listed
	 * both as a {@code <class>} in the <code>persistence.xml</code> file
	 * and as an {@code <entity>} in
	 * an <code>orm.xml</code> file. In this case, the Jave type in
	 * the <code>orm.xml</code> file must set
	 * the root structure node <em>after</em> the Java type in the
	 * <code>persistence.xml</code> file.
	 * Last one in during project <em>update</em> wins.
	 */
	void addRootStructureNode(Object key, JpaStructureNode rootStructureNode);

	/**
	 * Remove the root structure node for the specified key if its current value
	 * is the same as the specified node.
	 * 
	 * @see #addRootStructureNode(Object, JpaStructureNode)
	 */
	void removeRootStructureNode(Object key, JpaStructureNode rootStructureNode);

	/**
	 * Return the structure node best corresponding to the location in the file.
	 */
	JpaStructureNode getStructureNode(int textOffset);


	// ********** reference **********

	/**
	 * Standard adapter for retrieving a {@link JpaFile JPA file}:
	 * <pre>
	 * IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject("Foo Project");
	 * IFile file = project.getFile("plugin.xml");
	 * JpaFile.Reference jpaFileRef = (JpaFile.Reference) file.getAdapter(JpaFile.Reference.class);
	 * JpaFile jpaFile = jpaFileRef.getValue();
	 * </pre>
	 * See <code>org.eclipse.jpt.jpa.core/plugin.xml</code>.
	 * @see org.eclipse.jpt.jpa.core.internal.FileAdapterFactory
	 */
	interface Reference {
		/**
		 * Return the JPA file corresponding to the reference's Eclipse file,
		 * or <code>null</code> if unable to associate the specified file with a
		 * JPA file. This method can be long-running.
		 */
		JpaFile getValue() throws InterruptedException;
	}
}

Back to the top