Skip to content

Commit 1643970

Browse files
author
Joerg Huber
committed
Fixed a bug with mime type and null pointer error on shutdown.
1 parent 428f356 commit 1643970

3 files changed

Lines changed: 115 additions & 108 deletions

File tree

SIF3InfraREST/sif3InfraREST/src/sif3/infra/rest/provider/ProviderFactory.java

Lines changed: 109 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -67,55 +67,58 @@ public class ProviderFactory
6767
*/
6868
public static synchronized ProviderFactory createFactory(AdvancedProperties adapterProps)
6969
{
70-
synchronized (locked)
71-
{
72-
logger.debug("Total Threads running before initialising provider Factory: " +Thread.activeCount()+" threads.");
73-
if (factory == null)
74-
{
75-
try
76-
{
77-
factory = new ProviderFactory(adapterProps);
78-
}
79-
catch (Exception ex)
80-
{
81-
logger.error("Failed to initialise provider factory. Provider won't run.", ex);
82-
factory = null;
83-
}
84-
}
85-
logger.debug("Total Threads running after initialising Provider Factory: " +Thread.activeCount()+" threads.");
86-
return factory;
87-
}
70+
synchronized (locked)
71+
{
72+
logger.debug("Total Threads running before initialising provider Factory: " + Thread.activeCount() + " threads.");
73+
if (factory == null)
74+
{
75+
try
76+
{
77+
factory = new ProviderFactory(adapterProps);
78+
}
79+
catch (Exception ex)
80+
{
81+
logger.error("Failed to initialise provider factory. Provider won't run.", ex);
82+
factory = null;
83+
}
84+
}
85+
logger.debug("Total Threads running after initialising Provider Factory: " + Thread.activeCount() + " threads.");
86+
return factory;
87+
}
8888
}
8989

9090
/**
9191
* This will shut down each provider class that make up this provider
9292
*/
9393
public static synchronized void shutdown()
9494
{
95-
synchronized (locked)
96-
{
97-
if (factory != null)
98-
{
99-
for (BaseProvider provider : factory.eventProviders.values())
100-
{
101-
try
102-
{
103-
logger.debug("Finalise provider "+provider.getMultiObjectClassInfo().getObjectName()+"...");
104-
provider.finalise();
105-
}
106-
catch (Exception ex)
107-
{
108-
// nothing we can really do. We are shutting down anyway...
109-
}
110-
}
111-
112-
// Shut down provider threads.
113-
logger.debug("Shut Down Provider Thread Pool...");
114-
factory.providerService.shutdownNow();
115-
logger.debug("Shut Down Provider Thread Pool: Done");
116-
}
117-
logger.info("All providers are shut down.");
118-
}
95+
synchronized (locked)
96+
{
97+
if (factory != null)
98+
{
99+
for (BaseProvider provider : factory.eventProviders.values())
100+
{
101+
try
102+
{
103+
logger.debug("Finalise provider " + provider.getMultiObjectClassInfo().getObjectName() + "...");
104+
provider.finalise();
105+
}
106+
catch (Exception ex)
107+
{
108+
// nothing we can really do. We are shutting down anyway...
109+
}
110+
}
111+
112+
// Shut down provider threads.
113+
logger.debug("Shut Down Provider Thread Pool...");
114+
if (factory.providerService != null)
115+
{
116+
factory.providerService.shutdownNow();
117+
}
118+
logger.debug("Shut Down Provider Thread Pool: Done");
119+
}
120+
logger.info("All providers are shut down.");
121+
}
119122
}
120123

121124
/**
@@ -138,37 +141,37 @@ public static ProviderFactory getInstance()
138141
*/
139142
public Provider getProvider(ModelObjectInfo objectInfo)
140143
{
141-
if ((objectInfo != null) && (StringUtils.notEmpty(objectInfo.getObjectName())))
142-
{
143-
ProviderClassInfo providerClassInfo = providerClasses.get(objectInfo);
144-
if (providerClassInfo != null)
145-
{
146-
try
147-
{
148-
return (BaseProvider)providerClassInfo.getClassInstance(null);
149-
}
150-
catch (Exception ex)
151-
{
152-
logger.error("Failed to instantiate a provider for "+objectInfo.getObjectName()+": "+ex.getMessage(), ex);
153-
return null;
154-
}
155-
}
156-
else // no known provider for the given Object Type
157-
{
158-
return null;
159-
}
160-
}
161-
else
162-
{
163-
logger.error("The ModelObjectInfo parameter is either null or does not have the ObjectName property set. This is required! No Provider returned.");
164-
return null;
165-
}
144+
if ((objectInfo != null) && (StringUtils.notEmpty(objectInfo.getObjectName())))
145+
{
146+
ProviderClassInfo providerClassInfo = providerClasses.get(objectInfo);
147+
if (providerClassInfo != null)
148+
{
149+
try
150+
{
151+
return (BaseProvider) providerClassInfo.getClassInstance(null);
152+
}
153+
catch (Exception ex)
154+
{
155+
logger.error("Failed to instantiate a provider for " + objectInfo.getObjectName() + ": " + ex.getMessage(), ex);
156+
return null;
157+
}
158+
}
159+
else // no known provider for the given Object Type
160+
{
161+
return null;
162+
}
163+
}
164+
else
165+
{
166+
logger.error("The ModelObjectInfo parameter is either null or does not have the ObjectName property set. This is required! No Provider returned.");
167+
return null;
168+
}
166169
}
167170

168171
/*---------------------*/
169172
/*-- Private Methods --*/
170173
/*---------------------*/
171-
private ProviderFactory(AdvancedProperties adapterProps) throws Exception
174+
private ProviderFactory(AdvancedProperties adapterProps) throws Exception
172175
{
173176
super();
174177

@@ -177,48 +180,48 @@ private ProviderFactory(AdvancedProperties adapterProps) throws Exception
177180
startProviders(adapterProps);
178181
}
179182

180-
private void initialiseProviders(AdvancedProperties adapterProps)
183+
private void initialiseProviders(AdvancedProperties adapterProps)
181184
{
182-
List<String> classList = adapterProps.getFromCommaSeparated("provider.classes");
183-
String basePackageName = makePackageName(adapterProps.getPropertyAsString("provider.basePackageName", ""));
184-
for (String className : classList)
185-
{
186-
logger.debug("Provider class to initialse: " + className);
187-
try
188-
{
189-
Class<?> clazz = Class.forName(basePackageName + className);
190-
ProviderClassInfo providerClassInfo = new ProviderClassInfo(clazz, new Class[] {});
191-
192-
Object classObj = providerClassInfo.getClassInstance(null);
193-
194-
// Set properties and add it to correct structure
195-
if (classObj instanceof BaseProvider)
185+
List<String> classList = adapterProps.getFromCommaSeparated("provider.classes");
186+
String basePackageName = makePackageName(adapterProps.getPropertyAsString("provider.basePackageName", ""));
187+
for (String className : classList)
188+
{
189+
logger.debug("Provider class to initialse: " + className);
190+
try
196191
{
197-
BaseProvider provider = (BaseProvider)classObj;
198-
ModelObjectInfo objectInfo = provider.getMultiObjectClassInfo();
199-
if ((objectInfo != null) && (StringUtils.notEmpty(objectInfo.getObjectName())))
200-
{
201-
// First add it to the standard request/response hashmap
202-
providerClasses.put(objectInfo, providerClassInfo);
203-
204-
// Add it to hasmap for background threads
205-
eventProviders.put(objectInfo, provider);
206-
}
207-
else
208-
{
209-
logger.error("The ModelObjectInfo parameter is either null or does not have the ObjectName property set. This is required! Provider '"+provider.getClass().getSimpleName()+" not added to provider factory.");
210-
}
192+
Class<?> clazz = Class.forName(basePackageName + className);
193+
ProviderClassInfo providerClassInfo = new ProviderClassInfo(clazz, new Class[] {});
194+
195+
Object classObj = providerClassInfo.getClassInstance(null);
196+
197+
// Set properties and add it to correct structure
198+
if (classObj instanceof BaseProvider)
199+
{
200+
BaseProvider provider = (BaseProvider) classObj;
201+
ModelObjectInfo objectInfo = provider.getMultiObjectClassInfo();
202+
if ((objectInfo != null) && (StringUtils.notEmpty(objectInfo.getObjectName())))
203+
{
204+
// First add it to the standard request/response hashmap
205+
providerClasses.put(objectInfo, providerClassInfo);
206+
207+
// Add it to hasmap for background threads
208+
eventProviders.put(objectInfo, provider);
209+
}
210+
else
211+
{
212+
logger.error("The ModelObjectInfo parameter is either null or does not have the ObjectName property set. This is required! Provider '" + provider.getClass().getSimpleName() + " not added to provider factory.");
213+
}
214+
}
215+
else
216+
{
217+
logger.error("Provider class " + className + " doesn't extend BaseProvider. Cannot initialse the Provider.");
218+
}
211219
}
212-
else
220+
catch (Exception ex)
213221
{
214-
logger.error("Provider class " + className + " doesn't extend BaseProvider. Cannot initialse the Provider.");
222+
logger.error("Cannot create Provider Class " + basePackageName + className + ": " + ex.getMessage(), ex);
215223
}
216-
}
217-
catch (Exception ex)
218-
{
219-
logger.error("Cannot create Provider Class " + basePackageName + className + ": " + ex.getMessage(), ex);
220-
}
221-
}
224+
}
222225
}
223226

224227
private String makePackageName(String packageName)
@@ -240,7 +243,7 @@ private void startProviders(AdvancedProperties adapterProps) throws Exception
240243
// Ensure there is 10 seconds between the start of each publisher so that they don't hammer
241244
// the system at the same time during startup. Startup thread on thread pool.
242245
providerService.schedule(provider, i*delay, TimeUnit.SECONDS);
243-
i++;
246+
i++;
244247
}
245248
}
246249
}

SIF3InfraREST/sif3InfraREST/src/sif3/infra/rest/resource/BaseResource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,8 +1170,8 @@ protected void determineMediaTypes(MarshalFactory marshaller, UnmarshalFactory u
11701170

11711171
requestMediaType = validateAndExtractMimeType(unmarshaller, requestMediaType, urlPostfixMimeType, useDefaults);
11721172

1173-
// set it to the value of the request if it is not set
1174-
if (responseMediaType == null)
1173+
// set it to the value of the request if it is not set or wildcard
1174+
if ((responseMediaType == null) || (responseMediaType.isWildcardType()))
11751175
{
11761176
responseMediaType = requestMediaType;
11771177
}

SIF3InfraREST/sif3InfraREST/src/sif3/infra/rest/resource/DataModelResource.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,10 @@ public DataModelResource(@Context UriInfo uriInfo,
138138
if (provider != null)
139139
{
140140
determineMediaTypes(provider.getMarshaller(), provider.getUnmarshaller(), false);
141+
}
142+
else
143+
{
144+
determineMediaTypes(null, null, false);
141145
}
142146
if (logger.isDebugEnabled())
143147
{

0 commit comments

Comments
 (0)