001/* 
002 * Copyright 2018 Leibniz-Institut für Analytische Wissenschaften – ISAS – e.V..
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package uk.ac.ebi.pride.jmztab2.model;
017
018import de.isas.mztab2.model.IndexedElement;
019import de.isas.mztab2.model.Parameter;
020import de.isas.mztab2.model.SmallMoleculeSummary;
021import static de.isas.mztab2.model.SmallMoleculeSummary.Properties.*;
022import java.util.Arrays;
023import java.util.List;
024import java.util.stream.Collectors;
025
026/**
027 * Define the stable columns which have stable order in the small molecule header
028 * line.
029 *
030 *  * To create optional column mappings, see
031 * {@link uk.ac.ebi.pride.jmztab2.model.OptColumnMappingBuilder}.
032 *
033 * @author qingwei
034 * @author nilshoffmann
035 * @since 23/05/13
036 *
037 */
038public class SmallMoleculeColumn implements ISmallMoleculeColumn {
039
040    private final IMZTabColumn column;
041
042    SmallMoleculeColumn(String name, Class dataType, boolean optional,
043        String order) {
044        this.column = new MZTabColumn(name, dataType, optional, order);
045    }
046
047    SmallMoleculeColumn(String name, Class dataType, boolean optional,
048        String order, Integer id) {
049        this.column = new MZTabColumn(name, dataType, optional, order, id);
050    }
051
052    /**
053     * Stable {@link SmallMoleculeColumn} definition templates.
054     */
055    public static enum Stable {
056        SML_ID(smlId.toUpper(), String.class, false, "01"),
057        SMF_ID_REFS(smfIdRefs.toUpper(), SplitList.class, false, "02"),
058        DATABASE_IDENTIFIER(databaseIdentifier, SplitList.class, false, "03"),
059        CHEMICAL_FORMULA(chemicalFormula, String.class, false, "04"),
060        SMILES(smiles,
061            SplitList.class, false, "05"),
062        INCHI(inchi,
063            SplitList.class, false, "06"),
064        CHEMICAL_NAME(
065            chemicalName, SplitList.class, false, "07"),
066        URI(uri,
067            java.net.URI.class, false, "08"),
068        THEOR_NEUTRAL_MASS(
069            theoreticalNeutralMass, Double.class, false, "09"),
070        ADDUCT_IONS(
071            adductIons, SplitList.class, false, "10"),
072        RELIABILITY(
073            reliability, String.class, false, "11"),
074        BEST_ID_CONFIDENCE_MEASURE(
075            bestIdConfidenceMeasure, Parameter.class, false, "12"),
076        BEST_ID_CONFIDENCE_VALUE(
077            bestIdConfidenceValue, Double.class, false, "13");
078
079        private final ISmallMoleculeColumn column;
080
081        private Stable(SmallMoleculeSummary.Properties property,
082            Class columnType, boolean optional,
083            String order) {
084            this.column = new SmallMoleculeColumn(property.getPropertyName(),
085                columnType, optional,
086                order);
087        }
088
089        private Stable(String name, Class columnType, boolean optional,
090            String order) {
091            this.column = new SmallMoleculeColumn(name, columnType, optional,
092                order);
093        }
094
095        private Stable(String name, Class columnType, boolean optional,
096            String order, Integer id) {
097            this.column = new SmallMoleculeColumn(name, columnType, optional,
098                order, id);
099        }
100
101        /**
102         * Returns a stable column instance template.
103         *
104         * @param name the column name (lower case).
105         * @return the stable column instance template.
106         * @throws IllegalArgumentException for unknown column names.
107         */
108        public static SmallMoleculeColumn.Stable forName(String name) throws IllegalArgumentException {
109            SmallMoleculeColumn.Stable s = Arrays.stream(
110                SmallMoleculeColumn.Stable.values()).
111                filter((v) ->
112                    v.column.
113                        getName().
114                        equals(name)).
115                findFirst().
116                orElseThrow(() ->
117                    new IllegalArgumentException("Unknown key:" + name));
118            return s;
119        }
120
121        /**
122         * Returns a new {@link ISmallMoleculeColumn} instance for the
123         * given stable column template.
124         *
125         * @param s the small molecule stable column template.
126         * @return a new small molecule column instance
127         * {@link SmallMoleculeColumn}.
128         */
129        public static ISmallMoleculeColumn columnFor(Stable s) {
130            return new SmallMoleculeColumn(s.column.getName(), s.column.
131                getDataType(), s.column.isOptional(), s.column.getOrder());
132        }
133
134        /**
135         * Returns a new {@link ISmallMoleculeColumn} instance for the
136         * given stable column name.
137         *
138         * @param name the small molecule stable column template name (lower
139         * case).
140         * @return a new small molecule column instance
141         * {@link SmallMoleculeColumn}.
142         * @throws IllegalArgumentException for unknown column names.
143         */
144        public static ISmallMoleculeColumn columnFor(String name) throws IllegalArgumentException {
145            return columnFor(forName(name));
146        }
147
148        /**
149         * Returns all stable {@link ISmallMoleculeColumn} templates.
150         *
151         * @return the stable small molecule columns templates.
152         */
153        public static List<ISmallMoleculeColumn> columns() {
154            return Arrays.stream(SmallMoleculeColumn.Stable.values()).
155                map((s) ->
156                {
157                    return new SmallMoleculeColumn(s.column.getName(), s.column.
158                        getDataType(), s.column.isOptional(), s.column.
159                        getOrder());
160                }).
161                collect(Collectors.toList());
162        }
163
164    };
165
166    /**
167     * {@inheritDoc}
168     */
169    @Override
170    public Class<?> getDataType() {
171        return this.column.getDataType();
172    }
173
174    /**
175     * {@inheritDoc}
176     */
177    @Override
178    public IndexedElement getElement() {
179        return this.column.getElement();
180    }
181
182    /**
183     * {@inheritDoc}
184     */
185    @Override
186    public String getHeader() {
187        return this.column.getHeader();
188    }
189
190    /**
191     * {@inheritDoc}
192     */
193    @Override
194    public String getLogicPosition() {
195        return this.column.getLogicPosition();
196    }
197
198    /**
199     * {@inheritDoc}
200     */
201    @Override
202    public String getName() {
203        return this.column.getName();
204    }
205
206    /**
207     * {@inheritDoc}
208     */
209    @Override
210    public String getOrder() {
211        return this.column.getOrder();
212    }
213
214    /**
215     * {@inheritDoc}
216     */
217    @Override
218    public boolean isOptional() {
219        return this.column.isOptional();
220    }
221
222    /**
223     * {@inheritDoc}
224     */
225    @Override
226    public void setHeader(String header) {
227        this.column.setHeader(header);
228    }
229
230    /**
231     * {@inheritDoc}
232     */
233    @Override
234    public void setLogicPosition(String logicPosition) {
235        this.column.setLogicPosition(logicPosition);
236    }
237
238    /**
239     * {@inheritDoc}
240     */
241    @Override
242    public void setOrder(String order) {
243        this.column.setOrder(order);
244    }
245
246    /**
247     * {@inheritDoc}
248     */
249    @Override
250    public void setElement(IndexedElement element) {
251        this.column.setElement(element);
252    }
253}