Lines 68-180
Link Here
|
68 |
*/ |
68 |
*/ |
69 |
@ServiceProvider(service = Processor.class) |
69 |
@ServiceProvider(service = Processor.class) |
70 |
@SupportedSourceVersion(SourceVersion.RELEASE_6) |
70 |
@SupportedSourceVersion(SourceVersion.RELEASE_6) |
71 |
@SupportedAnnotationTypes("org.openide.loaders.DataObject.Registration") |
71 |
@SupportedAnnotationTypes({"org.openide.loaders.DataObject.Registration", "org.openide.loaders.DataObject.Registrations"}) |
72 |
public class DataObjectFactoryProcessor extends LayerGeneratingProcessor { |
72 |
public class DataObjectFactoryProcessor extends LayerGeneratingProcessor { |
|
|
73 |
|
73 |
@Override |
74 |
@Override |
74 |
protected boolean handleProcess(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) throws LayerGenerationException { |
75 |
protected boolean handleProcess(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) throws LayerGenerationException { |
75 |
if (roundEnv.processingOver()) { |
76 |
if (roundEnv.processingOver()) { |
76 |
return false; |
77 |
return false; |
77 |
} |
78 |
} |
78 |
TypeMirror dataObjectType = type(DataObject.class); |
|
|
79 |
TypeMirror fileObjectType = type(FileObject.class); |
80 |
TypeMirror multiFileLoaderType = type(MultiFileLoader.class); |
81 |
TypeMirror dataObjectFactoryType = type(DataObject.Factory.class); |
82 |
|
83 |
|
79 |
|
84 |
for (Element e : roundEnv.getElementsAnnotatedWith(DataObject.Registration.class)) { |
80 |
for (Element e : roundEnv.getElementsAnnotatedWith(DataObject.Registration.class)) { |
85 |
DataObject.Registration dfr = e.getAnnotation(DataObject.Registration.class); |
81 |
DataObject.Registration dfr = e.getAnnotation(DataObject.Registration.class); |
86 |
if (dfr == null) { |
82 |
if (dfr == null) { |
87 |
continue; |
83 |
continue; |
88 |
} |
84 |
} |
89 |
LayerBuilder builder = layer(e); |
85 |
process(e, dfr); |
90 |
//need class name to generate id and factory dataObjectClass parameter |
86 |
} |
91 |
String className = processingEnv.getElementUtils().getBinaryName((TypeElement)e).toString(); |
87 |
for (Element e : roundEnv.getElementsAnnotatedWith(DataObject.Registrations.class)) { |
92 |
String factoryId = className.replace(".", "-"); |
88 |
DataObject.Registrations dfrr = e.getAnnotation(DataObject.Registrations.class); |
|
|
89 |
if (dfrr == null) { |
90 |
continue; |
91 |
} |
92 |
for (DataObject.Registration t : dfrr.value()) { |
93 |
process(e, t); |
94 |
} |
95 |
} |
96 |
return true; |
97 |
} |
93 |
|
98 |
|
94 |
boolean useFactory = true; |
99 |
// |
|
|
100 |
private void process(Element e, DataObject.Registration dfr) throws LayerGenerationException { |
101 |
TypeMirror dataObjectType = type(DataObject.class); |
102 |
TypeMirror fileObjectType = type(FileObject.class); |
103 |
TypeMirror multiFileLoaderType = type(MultiFileLoader.class); |
104 |
TypeMirror dataObjectFactoryType = type(DataObject.Factory.class); |
105 |
LayerBuilder builder = layer(e); |
106 |
//need class name to generate id and factory dataObjectClass parameter |
107 |
String className = processingEnv.getElementUtils().getBinaryName((TypeElement) e).toString(); |
108 |
String factoryId = className.replace(".", "-"); |
95 |
|
109 |
|
96 |
// test if enclosing element is of DataObject type; |
110 |
boolean useFactory = true; |
97 |
|
111 |
|
98 |
if (isAssignable(e.asType(), dataObjectType)) { |
112 |
// test if enclosing element is of DataObject type; |
99 |
//attempt to use default factory |
|
|
100 |
List<Element> ee = new LinkedList<Element>(); |
101 |
// should be a public constructor with FileObject and MultiFileLoader as param |
102 |
for (ExecutableElement element : ElementFilter.constructorsIn(e.getEnclosedElements())) { |
103 |
|
113 |
|
104 |
if ((element.getKind() == ElementKind.CONSTRUCTOR) && (element.getModifiers().contains(Modifier.PUBLIC))) { // found a public constructor ; |
114 |
if (isAssignable(e.asType(), dataObjectType)) { |
105 |
if ((element.getParameters().size() == 2) // parameters of constructor ok |
115 |
//attempt to use default factory |
106 |
&& (isAssignable(element.getParameters().get(0).asType(), fileObjectType)) |
116 |
List<Element> ee = new LinkedList<Element>(); |
107 |
&& (isAssignable(element.getParameters().get(1).asType(), multiFileLoaderType))) { |
117 |
// should be a public constructor with FileObject and MultiFileLoader as param |
108 |
ee.add(element); |
118 |
for (ExecutableElement element : ElementFilter.constructorsIn(e.getEnclosedElements())) { |
109 |
} |
119 |
|
|
|
120 |
if ((element.getKind() == ElementKind.CONSTRUCTOR) && (element.getModifiers().contains(Modifier.PUBLIC))) { // found a public constructor ; |
121 |
if ((element.getParameters().size() == 2) // parameters of constructor ok |
122 |
&& (isAssignable(element.getParameters().get(0).asType(), fileObjectType)) |
123 |
&& (isAssignable(element.getParameters().get(1).asType(), multiFileLoaderType))) { |
124 |
ee.add(element); |
110 |
} |
125 |
} |
111 |
} |
126 |
} |
112 |
// nothing is found |
127 |
} |
113 |
if (ee.isEmpty()) { |
128 |
// nothing is found |
114 |
throw new LayerGenerationException("DataObject subclass with @DataObject.Registration needs a public constructor with FileObject and MultiFileLoader parameters", e, processingEnv, dfr); // NOI18N |
129 |
if (ee.isEmpty()) { |
115 |
} else { |
130 |
throw new LayerGenerationException("DataObject subclass with @DataObject.Registration needs a public constructor with FileObject and MultiFileLoader parameters", e, processingEnv, dfr); // NOI18N |
116 |
useFactory = true; |
131 |
} else { |
117 |
} |
132 |
useFactory = true; |
|
|
133 |
} |
118 |
|
134 |
|
119 |
} else if (isAssignable(e.asType(), dataObjectFactoryType)) { |
135 |
} else if (isAssignable(e.asType(), dataObjectFactoryType)) { |
120 |
List<Element> ee = new LinkedList<Element>(); |
136 |
List<Element> ee = new LinkedList<Element>(); |
121 |
for (ExecutableElement element : ElementFilter.constructorsIn(e.getEnclosedElements())) { |
137 |
for (ExecutableElement element : ElementFilter.constructorsIn(e.getEnclosedElements())) { |
122 |
if ((element.getKind() == ElementKind.CONSTRUCTOR) && (element.getModifiers().contains(Modifier.PUBLIC))) { // found a public constructor ; |
138 |
if ((element.getKind() == ElementKind.CONSTRUCTOR) && (element.getModifiers().contains(Modifier.PUBLIC))) { // found a public constructor ; |
123 |
if ((element.getParameters().isEmpty())) {// parameters of constructor ok |
139 |
if ((element.getParameters().isEmpty())) {// parameters of constructor ok |
124 |
ee.add(element); |
140 |
ee.add(element); |
125 |
} |
|
|
126 |
} |
141 |
} |
127 |
} |
142 |
} |
128 |
if (ee.isEmpty()) { |
143 |
} |
129 |
throw new LayerGenerationException("DataObject.Factory subclass with @DataObject.Registration needs a public default constructor", e, processingEnv, dfr); // NOI18N |
144 |
if (ee.isEmpty()) { |
130 |
} else { |
145 |
throw new LayerGenerationException("DataObject.Factory subclass with @DataObject.Registration needs a public default constructor", e, processingEnv, dfr); // NOI18N |
131 |
useFactory = false; |
|
|
132 |
factoryId = className.replace(".class", "").replace(".", "-"); |
133 |
} |
134 |
} else { |
146 |
} else { |
135 |
throw new LayerGenerationException("Usage @DataObject.Registration only on DataObject.Factory subclass or DataObject subclass", e, processingEnv, dfr); // NOI18N |
147 |
useFactory = false; |
|
|
148 |
factoryId = className.replace(".class", "").replace(".", "-"); |
149 |
} |
150 |
} else { |
151 |
throw new LayerGenerationException("Usage @DataObject.Registration only on DataObject.Factory subclass or DataObject subclass", e, processingEnv, dfr); // NOI18N |
152 |
} |
153 |
|
154 |
// check if mimeType annotation is set |
155 |
if (dfr.mimeType().length == 0) { |
156 |
throw new LayerGenerationException("@DataObject.Factory.Registration mimeTypes() cannot be null", e, processingEnv, dfr, "mimeTypes"); |
157 |
} |
158 |
// verify if all mimeType are valid |
159 |
for (String aMimeType : dfr.mimeType()) { |
160 |
if (aMimeType.isEmpty()) { |
161 |
throw new LayerGenerationException("@DataObject.Factory.Registration mimeTypes() cannot have a empty mimeType", e, processingEnv, dfr, "mimeTypes"); |
162 |
} |
163 |
} |
164 |
|
165 |
|
166 |
for (String aMimeType : dfr.mimeType()) { |
167 |
LayerBuilder.File f = builder.file("Loaders/" + aMimeType + "/Factories/" + factoryId + ".instance"); |
168 |
|
169 |
// iconBase is optional but if set then shoud be in classpath |
170 |
if (dfr.iconBase().length() > 0) { |
171 |
builder.validateResource(dfr.iconBase(), e.getEnclosingElement(), dfr, "icon", true); |
172 |
f.stringvalue("iconBase", dfr.iconBase()); |
173 |
} |
174 |
// position LayerBuilder |
175 |
f.position(dfr.position()); |
176 |
|
177 |
if (!dfr.displayName().isEmpty()) { |
178 |
f.bundlevalue("displayName", dfr.displayName(), dfr, "displayName"); |
136 |
} |
179 |
} |
137 |
|
180 |
|
138 |
// check if mimeType annotation is set |
181 |
if (useFactory) { |
139 |
if (dfr.mimeType().length == 0) { |
182 |
f.methodvalue("instanceCreate", "org.openide.loaders.DataLoaderPool", "factory"); |
140 |
throw new LayerGenerationException("@DataObject.Factory.Registration mimeTypes() cannot be null", e, processingEnv, dfr, "mimeTypes"); |
183 |
f.stringvalue("dataObjectClass", className); |
|
|
184 |
// if factory mimetype is needed otherwise not |
185 |
f.stringvalue("mimeType", aMimeType); |
186 |
|
141 |
} |
187 |
} |
142 |
// verify if all mimeType are valid |
188 |
f.write(); |
143 |
for (String aMimeType : dfr.mimeType()) { |
|
|
144 |
if (aMimeType.isEmpty()) { |
145 |
throw new LayerGenerationException("@DataObject.Factory.Registration mimeTypes() cannot have a empty mimeType", e, processingEnv, dfr, "mimeTypes"); |
146 |
} |
147 |
} |
148 |
|
149 |
|
150 |
for (String aMimeType : dfr.mimeType()) { |
151 |
LayerBuilder.File f = builder.file("Loaders/" + aMimeType + "/Factories/" + factoryId + ".instance"); |
152 |
|
153 |
// iconBase is optional but if set then shoud be in classpath |
154 |
if (dfr.iconBase().length() > 0) { |
155 |
builder.validateResource(dfr.iconBase(), e.getEnclosingElement(), dfr, "icon", true); |
156 |
f.stringvalue("iconBase", dfr.iconBase()); |
157 |
} |
158 |
// position LayerBuilder |
159 |
f.position(dfr.position()); |
160 |
|
161 |
if (!dfr.displayName().isEmpty()) { |
162 |
f.bundlevalue("displayName", dfr.displayName(), dfr, "displayName"); |
163 |
} |
164 |
|
165 |
if (useFactory) { |
166 |
f.methodvalue("instanceCreate", "org.openide.loaders.DataLoaderPool", "factory"); |
167 |
f.stringvalue("dataObjectClass", className); |
168 |
// if factory mimetype is needed otherwise not |
169 |
f.stringvalue("mimeType", aMimeType); |
170 |
|
171 |
} |
172 |
f.write(); |
173 |
} |
174 |
|
175 |
} |
189 |
} |
176 |
|
|
|
177 |
return true; |
178 |
} |
190 |
} |
179 |
|
191 |
|
180 |
// reuse from Action Processor |
192 |
// reuse from Action Processor |