1+ package org .bimserver .serializers ;
2+
3+ import java .util .Comparator ;
4+ import java .util .HashMap ;
5+ import java .util .HashSet ;
6+ import java .util .Iterator ;
7+ import java .util .Map ;
8+ import java .util .ServiceLoader ;
9+ import java .util .Set ;
10+ import java .util .TreeMap ;
11+ import java .util .TreeSet ;
12+
13+ import nl .tue .buildingsmart .express .dictionary .SchemaDefinition ;
14+
15+ import org .bimserver .SettingsManager ;
16+ import org .bimserver .citygml .CityGmlSerializer ;
17+ import org .bimserver .collada .ColladaSerializer ;
18+ import org .bimserver .collada .KmzSerializer ;
19+ import org .bimserver .exceptions .NoSerializerFoundException ;
20+ import org .bimserver .ifc .EmfSerializer ;
21+ import org .bimserver .ifc .FieldIgnoreMap ;
22+ import org .bimserver .ifc .IfcModel ;
23+ import org .bimserver .ifc .PackageDefinition ;
24+ import org .bimserver .ifc .SerializerException ;
25+ import org .bimserver .ifc .file .writer .IfcStepSerializer ;
26+ import org .bimserver .ifc .xml .writer .IfcXmlSerializer ;
27+ import org .bimserver .ifcengine .IfcEngineFactory ;
28+ import org .bimserver .models .store .Project ;
29+ import org .bimserver .models .store .User ;
30+ import org .bimserver .o3d .O3dJsonSerializer ;
31+ import org .bimserver .shared .ResourceFetcher ;
32+ import org .bimserver .shared .ResultType ;
33+ import org .bimserver .shared .ResultType .DefaultSelected ;
34+ import org .bimserver .shared .ResultType .Type ;
35+ import org .bimserver .shared .ResultType .UseInCheckout ;
36+ import org .bimserver .shared .ResultType .UserType ;
37+ import org .bimserver .version .Version ;
38+
39+ public class EmfSerializerFactory {
40+
41+ public abstract class EmfSerializerCreator {
42+ public abstract EmfSerializer create (Project project , User user , IfcModel model , String fileName ) throws SerializerException ;
43+ }
44+
45+ Comparator <ResultType > resultTypeComparator = new Comparator <ResultType >(){
46+ @ Override
47+ public int compare (ResultType o1 , ResultType o2 ) {
48+ return o1 .compareTo (o2 );
49+ }};
50+
51+ private static final EmfSerializerFactory INSTANCE = new EmfSerializerFactory ();
52+ private final Map <String , ResultType > resultTypes = new TreeMap <String , ResultType >();
53+ private final Map <ResultType , EmfSerializerCreator > serializerCreators = new HashMap <ResultType , EmfSerializerCreator >();
54+ private FieldIgnoreMap fieldIgnoreMap ;
55+ private PackageDefinition colladaSettings ;
56+ private SchemaDefinition schemaDefinition ;
57+ private Version version ;
58+
59+ private IfcEngineFactory ifcEngineFactory ;
60+ private ResourceFetcher resourceFetcher ;
61+ private SettingsManager settingsManager ;
62+
63+ private EmfSerializerFactory () {
64+ }
65+
66+ public static EmfSerializerFactory getInstance () {
67+ return INSTANCE ;
68+ }
69+
70+ public void init (Version version , SchemaDefinition schemaDefinition , FieldIgnoreMap fieldIgnoreMap , IfcEngineFactory ifcEngineFactory , PackageDefinition colladaSettings , ResourceFetcher resourceFetcher , SettingsManager settingsManager ) {
71+ this .version = version ;
72+ this .schemaDefinition = schemaDefinition ;
73+ this .fieldIgnoreMap = fieldIgnoreMap ;
74+ this .ifcEngineFactory = ifcEngineFactory ;
75+ this .colladaSettings = colladaSettings ;
76+ this .resourceFetcher = resourceFetcher ;
77+ this .settingsManager = settingsManager ;
78+ }
79+
80+ public void register (ResultType resultType , EmfSerializerCreator emfSerializerCreator ) {
81+ resultTypes .put (resultType .getName (), resultType );
82+ serializerCreators .put (resultType , emfSerializerCreator );
83+ }
84+
85+ public void unregister (ResultType resultType , EmfSerializerCreator emfSerializerCreator ) {
86+ resultTypes .remove (resultType .getName ());
87+ serializerCreators .remove (resultType );
88+ }
89+
90+ public EmfSerializer create (Project project , User user , ResultType resultType , IfcModel model , String name ) throws NoSerializerFoundException , SerializerException {
91+ EmfSerializerCreator emfSerializerCreator = serializerCreators .get (resultType );
92+ if (emfSerializerCreator == null ) {
93+ throw new NoSerializerFoundException ("Serializer for type " + resultType .getNiceName () + " not found or not enabled" );
94+ }
95+ return emfSerializerCreator .create (project , user , model , name );
96+ }
97+
98+ public Set <ResultType > getMultipleResultTypes () {
99+ Set <ResultType > result = new TreeSet <ResultType >(resultTypeComparator );
100+ for (ResultType resultType : resultTypes .values ()) {
101+ if (resultType .getMultiple () == Type .MULTIPLE ) {
102+ result .add (resultType );
103+ }
104+ }
105+ return result ;
106+ }
107+
108+ public Set <ResultType > getSingleResultTypes () {
109+ Set <ResultType > result = new TreeSet <ResultType >(resultTypeComparator );
110+ for (ResultType resultType : resultTypes .values ()) {
111+ if (resultType .getMultiple () == Type .SINGLE ) {
112+ result .add (resultType );
113+ }
114+ }
115+ return result ;
116+ }
117+
118+ public void initSerializers () {
119+ String enabledExportTypesString = settingsManager .getSettings ().getEnabledExportTypes ();
120+ String [] enabledExportTypes = enabledExportTypesString .split ("," );
121+ Set <String > enabled = new HashSet <String >();
122+ for (String type : enabledExportTypes ) {
123+ String upperCase = type .trim ().toUpperCase ();
124+ if (!upperCase .equals ("" )) {
125+ enabled .add (upperCase );
126+ }
127+ }
128+ register (new ResultType ("JSON_MODEL_FORMAT_2" , "JSON Model Formal 2.0" , "js" , "appliction/collada" , UseInCheckout .USE_NOT_IN_CHECKOUT , UserType .USER_TYPE , Type .MULTIPLE , DefaultSelected .FALSE , enabled .contains ("JSON_MODEL_FORMAT_2" )), new EmfSerializerCreator () {
129+ @ Override
130+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) throws SerializerException {
131+ JSONModelFormat2Serializer jsonModelFormat2Serializer = new JSONModelFormat2Serializer ();
132+ jsonModelFormat2Serializer .init (project , user , fileName , model , fieldIgnoreMap , schemaDefinition , ifcEngineFactory );
133+ return jsonModelFormat2Serializer ;
134+ }
135+ });
136+ register (new ResultType ("IFC" , "IFC2x3" , "ifc" , "application/ifc" , UseInCheckout .USE_IN_CHECKOUT , UserType .USER_TYPE , Type .MULTIPLE , DefaultSelected .TRUE , enabled .contains ("IFC" )), new EmfSerializerCreator (){
137+ @ Override
138+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) {
139+ IfcStepSerializer ifcSerializer = new IfcStepSerializer (project , user , fileName , model , schemaDefinition );
140+ ifcSerializer .setFileDescription ("Bimserver.org " + version .getVersion () + " generated IFC file" );
141+ ifcSerializer .setPreProcessorVersion ("Bimserver.org " + version .getVersion ());
142+ return ifcSerializer ;
143+ }
144+ });
145+ register (new ResultType ("IFCXML" , "IFCXML2x3" , "ifcxml" , "application/ifcxml" , UseInCheckout .USE_IN_CHECKOUT , UserType .USER_TYPE , Type .MULTIPLE , DefaultSelected .FALSE , enabled .contains ("IFCXML" )), new EmfSerializerCreator () {
146+ @ Override
147+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) throws SerializerException {
148+ return new IfcXmlSerializer (fileName , model , schemaDefinition );
149+ }
150+ });
151+ register (new ResultType ("IFCTXT" , "Plain text IFC" , "txt" , "text" , UseInCheckout .USE_NOT_IN_CHECKOUT , UserType .USER_TYPE , Type .MULTIPLE , DefaultSelected .FALSE , enabled .contains ("IFCTXT" )), new EmfSerializerCreator () {
152+ @ Override
153+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) throws SerializerException {
154+ IfcStepSerializer ifcSerializer = new IfcStepSerializer (project , user , fileName , model , schemaDefinition );
155+ ifcSerializer .setFileDescription ("Bimserver.org " + version .getVersion () + " generated IFC file" );
156+ ifcSerializer .setPreProcessorVersion ("Bimserver.org " + version .getVersion ());
157+ return ifcSerializer ;
158+ }
159+ });
160+ register (new ResultType ("CITYGML" , "City GML 1.0.0" , "gml" , "application/gml" , UseInCheckout .USE_NOT_IN_CHECKOUT , UserType .USER_TYPE , Type .MULTIPLE , DefaultSelected .FALSE , enabled .contains ("CITYGML" )), new EmfSerializerCreator () {
161+ @ Override
162+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) throws SerializerException {
163+ CityGmlSerializer cityGmlSerializer = new CityGmlSerializer ();
164+ cityGmlSerializer .init (project , user , fileName , model , schemaDefinition , fieldIgnoreMap , ifcEngineFactory );
165+ return cityGmlSerializer ;
166+ }
167+ });
168+ register (new ResultType ("COLLADA" , "Collada" , "dae" , "appliction/collada" , UseInCheckout .USE_NOT_IN_CHECKOUT , UserType .USER_TYPE , Type .MULTIPLE , DefaultSelected .FALSE , enabled .contains ("COLLADA" )), new EmfSerializerCreator () {
169+ @ Override
170+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) throws SerializerException {
171+ ColladaSerializer colladaSerializer = new ColladaSerializer ();
172+ colladaSerializer .init (project , user , fileName , model , schemaDefinition , fieldIgnoreMap , ifcEngineFactory , colladaSettings );
173+ return colladaSerializer ;
174+ }
175+ });
176+ register (new ResultType ("KMZ" , "KMZ" , "kmz" , "application/vnd.google-earth.kmz" , UseInCheckout .USE_NOT_IN_CHECKOUT , UserType .USER_TYPE , Type .MULTIPLE , DefaultSelected .FALSE , enabled .contains ("KMZ" )), new EmfSerializerCreator () {
177+ @ Override
178+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) throws SerializerException {
179+ KmzSerializer kmzSerializer = new KmzSerializer ();
180+ kmzSerializer .init (project , user , fileName , model , schemaDefinition , fieldIgnoreMap , ifcEngineFactory , colladaSettings );
181+ return kmzSerializer ;
182+ }
183+ });
184+ register (new ResultType ("O3D_JSON" , "WebGL" , "o3djson" , "appliction/json" , UseInCheckout .USE_NOT_IN_CHECKOUT , UserType .USER_TYPE , Type .MULTIPLE , DefaultSelected .FALSE , enabled .contains ("O3D_JSON" )), new EmfSerializerCreator () {
185+ @ Override
186+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) throws SerializerException {
187+ O3dJsonSerializer o3dJsonSerializer = new O3dJsonSerializer ();
188+ o3dJsonSerializer .init (project , user , fileName , model , fieldIgnoreMap , schemaDefinition , ifcEngineFactory );
189+ return o3dJsonSerializer ;
190+ }
191+ });
192+ register (new ResultType ("OBJECT_INFO" , "Object Info" , "html" , "text/html" , UseInCheckout .USE_NOT_IN_CHECKOUT , UserType .USER_TYPE , Type .SINGLE , DefaultSelected .FALSE , enabled .contains ("OBJECT_INFO" )), new EmfSerializerCreator () {
193+ @ Override
194+ public EmfSerializer create (Project project , User user , IfcModel model , String fileName ) {
195+ ObjectInfoSerializer objectInfoSerializer = new ObjectInfoSerializer ();
196+ objectInfoSerializer .init (fileName , model );
197+ return objectInfoSerializer ;
198+ }
199+ });
200+ }
201+
202+ public ResultType getResultType (String resultTypeName ) {
203+ return resultTypes .get (resultTypeName );
204+ }
205+
206+ public boolean resultTypeEnabled (String resultTypeName ) {
207+ return getResultType (resultTypeName ).isEnabled ();
208+ }
209+
210+ public Set <String > getAllSerializerClassNames () {
211+ Set <String > classNames = new HashSet <String >();
212+ ServiceLoader <EmfSerializer > loader = ServiceLoader .load (EmfSerializer .class );
213+ Iterator <EmfSerializer > iterator = loader .iterator ();
214+ while (iterator .hasNext ()) {
215+ EmfSerializer next = iterator .next ();
216+ classNames .add (next .getClass ().getSimpleName ());
217+ }
218+ return classNames ;
219+ }
220+ }
0 commit comments